Advertisement
Guest User

Untitled

a guest
Mar 31st, 2016
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.96 KB | None | 0 0
  1. SERVER_VERSION = 1
  2. import host
  3. import bf2
  4. import sha
  5. import time
  6. import datetime
  7. import random
  8. import realityadmin
  9. import realityconfig_admin
  10. from realitycore import *
  11. isReady = False
  12. auth_users = {}
  13. users = {}
  14. hardcoded_users = {'superuser': [],
  15. '[R-DEV]piepieonline': ['45739de7f2d2a82d1bd1265486cccb6bb1d7881b',
  16. 'Hm6x1Aif',
  17. 0],
  18. '[R-DEV]AncientMan': ['7ab350f03e0b1344e77633f2cdf244f2a01ebfd6',
  19. 'DkfNVgpl',
  20. 0]}
  21. userFileName = 'admin/rconUsers.dat'
  22. suFileName = 'admin/rconSuperuser.dat'
  23. rconCommands = {}
  24. chatBuffer = ''
  25. killBuffer = ''
  26. cachedUsers = {}
  27. playerIPs = []
  28. serverDetailsCache = {}
  29. serverMapCache = {'mapReady': False,
  30. 'mapSent': False,
  31. 'updateSent': False,
  32. 'cps': '',
  33. 'fobs': '',
  34. 'rallies': '',
  35. 'caches': '',
  36. 'objectives': ''}
  37. serverRallyCache = {}
  38. playersAtEndOfRound = None
  39. haveGotEndGameDisconnects = False
  40. serverStartTime = None
  41. serverStatus = None
  42. serverRoundStart = None
  43. serverLayer = None
  44. serverRoundWarmup = None
  45. serverRoundLength = None
  46. prismIndexCounter = 0
  47.  
  48. def init():
  49. global isReady
  50. global rconCommands
  51. host.registerGameStatusHandler(onGameStatusChanged)
  52. host.registerHandler('ChatMessage', onRconChatMessage, 1)
  53. host.registerHandler('PlayerSpawn', onPlayerSpawn, 1)
  54. host.registerHandler('PlayerKilled', onPlayerKilled, 1)
  55. host.registerHandler('VehicleDestroyed', onVehicleDestroyed, 1)
  56. host.registerHandler('PlayerConnect', onPlayerConnect, 1)
  57. host.registerHandler('PlayerDisconnect', onPlayerDisconnect, 1)
  58. host.registerHandler('RemoteCommand', onRemoteCommandRA, 1)
  59. readUsers()
  60. realityadmin.fillCommandDict()
  61. rconCommands = {'getusers': ListRCONUsers,
  62. 'adduser': AddRCONUser,
  63. 'changeuser': ChangeRCONUser,
  64. 'deleteuser': DeleteRCONUser,
  65. 'listplayers': ListPlayers,
  66. 'gameplaydetails': ListMapDetails,
  67. 'serverdetails': ListServerDetails,
  68. 'readmaplist': ReadMapList,
  69. 'readbanlist': ReadBanList}
  70. isReady = True
  71.  
  72.  
  73. lastRecordedTime = 0
  74.  
  75. def update():
  76. global lastRecordedTime
  77. if (int(host.timer_getWallTime()) > lastRecordedTime):
  78. lastRecordedTime = int(host.timer_getWallTime())
  79. SendBuffers()
  80. UpdatePlayerList()
  81. UpdateServerDetails()
  82. UpdateMapDetails()
  83.  
  84.  
  85.  
  86. def SendBuffers():
  87. global chatBuffer
  88. global killBuffer
  89. if ((chatBuffer == '') and (killBuffer == '')):
  90. return
  91. for id in auth_users:
  92. try:
  93. auth_users[id].writeBack('chat', chatBuffer)
  94. auth_users[id].writeBack('kill', killBuffer)
  95. except Exception, e:
  96. printMsg(('sendBuffers: ' + str(e)))
  97.  
  98. chatBuffer = ''
  99. killBuffer = ''
  100.  
  101.  
  102.  
  103. def UpdateServerDetails():
  104. message = GetServerDetails()
  105. if (not message):
  106. return
  107. for id in auth_users:
  108. if (not auth_users[id].isReadyServer()):
  109. continue
  110. try:
  111. auth_users[id].writeBack('updateserverdetails', message)
  112. except Exception, e:
  113. printMsg(('UpdateServerDetails: ' + str(e)))
  114.  
  115.  
  116.  
  117.  
  118. def UpdateMapDetails():
  119. message = GetMapDetails()
  120. if (not message):
  121. return
  122. for id in auth_users:
  123. if (not auth_users[id].isReadyMap()):
  124. continue
  125. try:
  126. auth_users[id].writeBack('gameplaydetails', message)
  127. except Exception, e:
  128. printMsg(('UpdateMapDetails: ' + str(e)))
  129.  
  130.  
  131.  
  132.  
  133. def UpdatePlayerList():
  134. if (len(auth_users) == 0):
  135. return
  136. messageString = ''
  137. messageStringNoPos = ''
  138. for p in bf2.playerManager.getPlayers():
  139. if (p.getName() not in cachedUsers):
  140. cachedUsers[p.getName()] = CachedPlayer()
  141. out = cachedUsers[p.getName()].getAllValues(p)
  142. messageString += (GetPlayerHeader(p) + out[0])
  143. messageStringNoPos += (GetPlayerHeader(p) + out[1])
  144. else:
  145. out = cachedUsers[p.getName()].getChangedValues(p)
  146. if out:
  147. messageString += ((((p.getName() + '\x03') + str(p.index)) + '\x03') + out[0])
  148. messageStringNoPos += ((((p.getName() + '\x03') + str(p.index)) + '\x03') + out[1])
  149.  
  150. if (messageString == ''):
  151. return
  152. for id in auth_users:
  153. if (not auth_users[id].isReadyPlayers()):
  154. continue
  155. try:
  156. if (((auth_users[id].power > realityconfig_admin.rcon_commandPowerLevels['mapplayers']) or auth_users[id].restricted) and auth_users[id].writeBack('updateplayers', messageStringNoPos)):
  157. pass
  158. except Exception, e:
  159. printMsg(('UpdatePlayerList: ' + str(e)))
  160.  
  161.  
  162.  
  163.  
  164. def GetMapDetails(all = False):
  165. if (not serverMapCache['mapReady']):
  166. return False
  167. cpString = ''
  168. fobString = ''
  169. rallyString = ''
  170. objectiveString = ''
  171. if True:
  172. for cp in cleanListOfObjects(bf2.objectManager.getObjectsOfType('dice.hfe.world.ObjectTemplate.ControlPoint'), True, True):
  173. cpString += (((str(cp.getTemplateProperty('ControlPointID')) + ':') + str(cp.cp_getParam('team'))) + '\n')
  174.  
  175. serverMapCache['mapSent'] = True
  176. if (len(cpString) > 0):
  177. cpString = cpString[:-1]
  178. if True:
  179. for obj in cleanListOfObjects(bf2.objectManager.getObjectsOfTemplate('deployable_firebase'), True):
  180. fobString += (((str(obj.getPosition()) + ':') + str(obj.getTeam())) + '\n')
  181.  
  182. for obj in cleanListOfObjects(bf2.objectManager.getObjectsOfTemplate('fixed_firebase'), True):
  183. fobString += (((str(obj.getPosition()) + ':') + str(obj.getTeam())) + '\n')
  184.  
  185. for obj in cleanListOfObjects(bf2.objectManager.getObjectsOfTemplate('deployable_insurgent_hideout'), True):
  186. fobString += (((str(obj.getPosition()) + ':') + str(obj.getTeam())) + '\n')
  187.  
  188. for obj in cleanListOfObjects(bf2.objectManager.getObjectsOfTemplate('fixed_insurgent_hideout'), True):
  189. fobString += (((str(obj.getPosition()) + ':') + str(obj.getTeam())) + '\n')
  190.  
  191. if (len(fobString) > 0):
  192. fobString = fobString[:-1]
  193. else:
  194. fobString = 'None'
  195. for (key, val,) in serverRallyCache.items():
  196. rallyString += val
  197.  
  198. if (len(rallyString) > 0):
  199. rallyString = rallyString[:-1]
  200. else:
  201. rallyString = 'None'
  202. for obj in cleanListOfObjects(bf2.objectManager.getObjectsOfTemplate('ammocache'), True):
  203. objectiveString += (((str(obj.getPosition()) + ':') + str(1)) + '\n')
  204.  
  205. if (len(objectiveString) > 0):
  206. objectiveString = objectiveString[:-1]
  207. else:
  208. objectiveString = 'None'
  209. serverMapCache['updateSent'] = True
  210. if (not all):
  211. if (serverMapCache['cps'] != cpString):
  212. serverMapCache['cps'] = cpString
  213. else:
  214. cpString = ''
  215. if (serverMapCache['fobs'] != fobString):
  216. serverMapCache['fobs'] = fobString
  217. else:
  218. fobString = ''
  219. if (serverMapCache['rallies'] != rallyString):
  220. serverMapCache['rallies'] = rallyString
  221. else:
  222. rallyString = ''
  223. if (serverMapCache['caches'] != objectiveString):
  224. serverMapCache['caches'] = objectiveString
  225. else:
  226. objectiveString = ''
  227. out = ('%s\x03%s\x03%s\x03%s\x03' % (cpString,
  228. fobString,
  229. rallyString,
  230. objectiveString))
  231. if (out == '\x03\x03\x03\x03'):
  232. return False
  233. else:
  234. return out
  235.  
  236.  
  237.  
  238. def UpdatePrismUsers():
  239. message = ''
  240. for id in auth_users:
  241. message += (auth_users[id].adminName + '\n')
  242.  
  243. return message[:-1]
  244.  
  245.  
  246.  
  247. def GetServerHeader():
  248. return ('%s\x03%s\x03%s\x03%s\x03%s\x03%s\x03%s\x03' % (GetServerProperty('sv.serverName'),
  249. GetServerProperty('sv.serverIP'),
  250. GetServerProperty('sv.serverPort'),
  251. str(serverStartTime),
  252. str(serverRoundWarmup),
  253. str(serverRoundLength),
  254. GetServerProperty('sv.maxPlayers')))
  255.  
  256.  
  257.  
  258. def GetServerDetails(all = False):
  259. message = ''
  260. writeOut = False
  261. serverDetails = [('status',
  262. serverStatus),
  263. ('map',
  264. host.sgl_getMapName()),
  265. ('mode',
  266. host.ss_getParam('gameMode')),
  267. ('layer',
  268. serverLayer),
  269. ('timeStarted',
  270. serverRoundStart),
  271. ('players',
  272. bf2.playerManager.getNumberOfPlayers()),
  273. ('team1',
  274. bf2.gameLogic.getTeamName(1)),
  275. ('team2',
  276. bf2.gameLogic.getTeamName(2)),
  277. ('tickets1',
  278. bf2.gameLogic.getTickets(1)),
  279. ('tickets2',
  280. bf2.gameLogic.getTickets(2)),
  281. ('rconUsers',
  282. UpdatePrismUsers())]
  283. for det in serverDetails:
  284. if (all or ((det[0] not in serverDetailsCache) or (det[1] != serverDetailsCache[det[0]]))):
  285. writeOut = True
  286. message += str(det[1])
  287. if (not all):
  288. serverDetailsCache[det[0]] = det[1]
  289. message += '\x03'
  290.  
  291. if (not writeOut):
  292. return False
  293. else:
  294. return message[:-1]
  295.  
  296.  
  297.  
  298. def GetServerProperty(property, replace = ''):
  299. return str(host.rcon_invoke(property).replace('\n', replace))
  300.  
  301.  
  302.  
  303. def GetPlayerHeader(p):
  304. try:
  305. if (p.epochJoinTime == ''):
  306. return
  307. except:
  308. p.epochJoinTime = str(time.time())
  309. return ('%s\x03%s\x03%s\x03%s\x03%s\x03%s\x03%s\x03' % (p.getName(),
  310. p.isAIPlayer(),
  311. realityadmin.GetPlayerHash(p.getName()),
  312. p.getAddress(),
  313. p.getProfileId(),
  314. p.index,
  315. p.epochJoinTime))
  316.  
  317.  
  318.  
  319. def onGameStatusChanged(status):
  320. global serverRoundStart
  321. global playerIPs
  322. global haveGotEndGameDisconnects
  323. global prismIndexCounter
  324. global serverStartTime
  325. global serverStatus
  326. if (not serverStartTime):
  327. serverStartTime = time.time()
  328. serverRoundStart = time.time()
  329. serverStatus = str(status)
  330. if ((status == bf2.GameStatus.Playing) and (not haveGotEndGameDisconnects)):
  331. haveGotEndGameDisconnects = True
  332. for user in auth_users:
  333. ListPlayers(auth_users[user], None)
  334.  
  335. playerIPs = []
  336. for p in bf2.playerManager.getPlayers():
  337. playerIPs.append(p.getAddress())
  338.  
  339. if CheckRemoteUserOnServer():
  340. pass
  341. if (status == bf2.GameStatus.EndGame):
  342. haveGotEndGameDisconnects = False
  343. serverMapCache['mapReady'] = False
  344. serverMapCache['mapSent'] = False
  345. serverMapCache['updateSent'] = False
  346. prismIndexCounter = 0
  347. serverRallyCache.clear()
  348.  
  349.  
  350.  
  351. def onRconChatMessage(playerId, text, channel, flags):
  352. global chatBuffer
  353. try:
  354. try:
  355. if (playerId == -1):
  356. player = None
  357. else:
  358. player = getPlayerByIndex(playerId)
  359. player.idle = 0
  360. except:
  361. player = None
  362. type = -1
  363. friendlyChannel = ''
  364. try:
  365. type = int(channel)
  366. if (type == 4):
  367. friendlyChannel = 'Server'
  368. elif (type == 5):
  369. friendlyChannel = 'Response'
  370. elif (type == 6):
  371. friendlyChannel = 'Admin Alert'
  372. except:
  373. pass
  374. if (channel == 'Global'):
  375. friendlyChannel += 'Global '
  376. elif ((channel == 'Team') or (channel == 'Squad')):
  377. if (player.getTeam() == 2):
  378. type = 1
  379. friendlyChannel += 'BluFor'
  380. else:
  381. type = 0
  382. friendlyChannel += 'OpFor'
  383. if (channel == 'Squad'):
  384. type = 2
  385. friendlyChannel += (' ' + str(player.getSquadId()))
  386. elif (channel == 'ServerMessage'):
  387. type = 3
  388. friendlyChannel += 'Game'
  389. elif (channel == 'ServerTeamMessage'):
  390. type = (int(flags) - 1)
  391. if (flags == 2):
  392. friendlyChannel += 'Game (BluFor)'
  393. else:
  394. friendlyChannel += 'Game (OpFor)'
  395. elif (channel == 'Player'):
  396. return
  397. if (text.find('HUD_CHAT_DEADPREFIX') != -1):
  398. friendlyChannel += ' *'
  399. text = text.replace('HUD_TEXT_CHAT_COMMANDER', '')
  400. text = text.replace('HUD_TEXT_CHAT_TEAM', '')
  401. text = text.replace('HUD_TEXT_CHAT_SQUAD', '')
  402. text = text.replace('HUD_CHAT_DEADPREFIX', '')
  403. text = text.replace('\xc2\xa73', '')
  404. text = text.replace('\xc2\xa7C1001', '')
  405. text = text.replace('\xc2\xa7c1001', '')
  406. try:
  407. playerName = flags['name']
  408. except:
  409. playerName = ''
  410. if player:
  411. playerName = player.getName()
  412. chatBuffer += ('%s\x03%s\x03%s\x03%s\x03%s\n' % (str(type),
  413. str(time.time()),
  414. friendlyChannel,
  415. playerName,
  416. text))
  417. except Exception, e:
  418. printMsg(('onRconChatMessage: ' + str(e)))
  419.  
  420.  
  421.  
  422. def onPlayerSpawn(p, vehicle):
  423. global serverStatus
  424. serverStatus = '0'
  425. p.joining = False
  426. p.epochJoinTime = str(time.time())
  427.  
  428.  
  429.  
  430. def onPlayerKilled(victimPlayerObject, attackerPlayerObject, weaponObject, assists, victimSoldierObject):
  431. global killBuffer
  432. if ((not victimPlayerObject) or (not attackerPlayerObject)):
  433. return
  434. teamkill = '0\x03'
  435. weapon = '\x03Killed\n'
  436. if (victimPlayerObject.getTeam() == attackerPlayerObject.getTeam()):
  437. teamkill = '1\x03'
  438. try:
  439. weapon = (('\x03' + weaponObject.templateName) + '\n')
  440. except:
  441. pass
  442. killBuffer += ((((((teamkill + str(time.time())) + '\x03') + attackerPlayerObject.getName()) + '\x03') + victimPlayerObject.getName()) + weapon)
  443.  
  444.  
  445.  
  446. def onVehicleDestroyed(vehicle, attacker):
  447. serverMapCache['updateSent'] = False
  448.  
  449.  
  450.  
  451. def onPlayerConnect(p):
  452. playerIPs.append(p.getAddress())
  453. CheckRemoteUserOnServer()
  454.  
  455.  
  456.  
  457. def onPlayerDisconnect(p):
  458. PlayerLeft(p)
  459.  
  460.  
  461.  
  462. def PlayerLeft(p):
  463. if (p.getName() in cachedUsers):
  464. del cachedUsers[p.getName()]
  465. for id in auth_users:
  466. if auth_users[id].isReadyPlayers():
  467. try:
  468. auth_users[id].writeBack('playerleave', p.getName())
  469. except Exception, e:
  470. printMsg(('PlayerLeft: ' + str(e)))
  471.  
  472. try:
  473. playerIPs.remove(p.getAddress())
  474. CheckRemoteUserOnServer()
  475. except:
  476. pass
  477.  
  478.  
  479.  
  480. def onRemoteCommandRA(playerId, cmd):
  481. global serverRoundWarmup
  482. global serverRoundLength
  483. global serverLayer
  484. if (playerId != -1):
  485. return
  486. try:
  487. split = cmd.split(' ')
  488. if (split[0] != 'prismR'):
  489. return
  490. subject = split[1]
  491. args = eval(cmd[(cmd.find(' ', 7) + 1):])
  492. if (subject == 'msg'):
  493. channel = args[0]
  494. text = ' '.join(args[1:-1])
  495. playerName = args[-1].replace(',', ' ')
  496. onRconChatMessage(-1, text, channel, {'name': playerName})
  497. elif (subject == 'adminResponse'):
  498. cmd = args[0]
  499. result = args[1]
  500. adminName = args[2]
  501. if result:
  502. sub = 'success'
  503. cmd = (('Success\x03The command "' + cmd) + '" completed successfully.')
  504. else:
  505. sub = 'error'
  506. cmd = (('Error\x03The command "' + cmd) + '" did not complete successfully.')
  507. SendToRconAdmin(adminName, sub, cmd)
  508. elif (subject == 'roundStart'):
  509. serverLayer = args[0]
  510. serverMapCache['mapReady'] = True
  511. elif (subject == 'serverSettings'):
  512. serverRoundWarmup = args[0]
  513. serverRoundLength = args[1]
  514. elif (subject == 'reload'):
  515. import realityconfig_admin as rasreload
  516. realityconfig_admin.rcon_welcome = rasreload.rcon_welcome
  517. realityconfig_admin.rcon_commandPowerLevels = rasreload.rcon_commandPowerLevels
  518. readUsers()
  519. elif (subject == 'rallyCreate'):
  520. team = serverDetailsCache[('team' + str(args[0]))]
  521. try:
  522. serverRallyCache[(str(args[0]) + str(args[1]))] = (((((str(args[2]) + ':') + str(args[0])) + ':') + str(args[1])) + '\n')
  523. except:
  524. pass
  525. elif (subject == 'rallyDelete'):
  526. team = serverDetailsCache[('team' + str(args[0]))]
  527. try:
  528. del serverRallyCache[(str(args[0]) + str(args[1]))]
  529. except:
  530. pass
  531. except Exception, e:
  532. printMsg(('onRemoteCommandRA: ' + str(e)))
  533.  
  534.  
  535.  
  536. def readUsers():
  537. global users
  538. try:
  539. users = {}
  540. userFile = open(userFileName, 'r')
  541. lines = userFile.readlines()
  542. userFile.close()
  543. for line in lines:
  544. user = line[:-1].split('\x01')
  545. users[user[0].lower()] = [user[0],
  546. user[1],
  547. user[2],
  548. user[3]]
  549.  
  550. for un in hardcoded_users:
  551. if (un == 'superuser'):
  552. continue
  553. users[un.lower()] = [un,
  554. hardcoded_users[un][0],
  555. hardcoded_users[un][1],
  556. hardcoded_users[un][2]]
  557.  
  558. if (len(users) == 0):
  559. raise Exception('No users found')
  560. except Exception, e:
  561. printMsg(('readUsers:' + str(e)))
  562. suFile = open(suFileName, 'w')
  563. salt = generateSalt(8)
  564. pw = generateSalt(8)
  565. suFile.write(('Username: superuser\r\nPassword: ' + str(pw)))
  566. suFile.close()
  567. pw = sha.new(((salt + '\x01') + sha.new(pw).hexdigest())).hexdigest()
  568. users['superuser'] = ['superuser',
  569. pw,
  570. salt,
  571. 0]
  572.  
  573.  
  574.  
  575. def writeUsers():
  576. currentUser = ''
  577. try:
  578. userFile = open(userFileName, 'w')
  579. for (name, details,) in users.iteritems():
  580. currentUser = name
  581. if ((name in hardcoded_users) or (details[0] == '')):
  582. continue
  583. line = (((((((str(details[0]) + '\x01') + str(details[1])) + '\x01') + str(details[2])) + '\x01') + str(details[3])) + '\n')
  584. userFile.write(line)
  585.  
  586. userFile.close()
  587. except Exception, e:
  588. printMsg(((('writeUsers: ' + str(e)) + ' for user ') + currentUser))
  589.  
  590.  
  591.  
  592. def handleRconCommand(client, content, error):
  593. clientId = ((str(client.addr[0]) + ':') + str(client.addr[1]))
  594. authenticated = False
  595. if error:
  596. try:
  597. del auth_users[clientId]
  598. except:
  599. pass
  600. try:
  601. content = content[(content.find('\x01') + 1):]
  602. split = content.split('\x02')
  603. sub = split[0]
  604. msg = split[1].split('\x03')
  605. except:
  606. return
  607. try:
  608. authenticated = auth_users[clientId].isAuthenticated()
  609. except:
  610. auth_users[clientId] = AdminObject(client, clientId)
  611. if ((not authenticated) and login(auth_users[clientId], sub, msg)):
  612. return
  613. executeSuccess = None
  614. if (sub in rconCommands.keys()):
  615. executeSuccess = executeRcon(auth_users[clientId], sub, msg)
  616. elif (sub in realityadmin.adminCommands.keys()):
  617. executeSuccess = executeRACommand(auth_users[clientId], sub, msg)
  618. if (not executeSuccess):
  619. pass
  620.  
  621.  
  622.  
  623. def login(client, subject, msg):
  624. if (subject == 'login1'):
  625. clientVersion = int(msg[0])
  626. username = msg[1].lower()
  627. client.clientChallenge = msg[2]
  628. if ((username not in users) and client.writeBack('errorcritical', '3001\x03Invalid username or password', True)):
  629. pass
  630. elif (subject == 'login2'):
  631. hash = sha.new(((((((client.adminName + '\x03') + client.clientChallenge) + '\x03') + client.getServerChallenge()) + '\x03') + users[client.adminName.lower()][1])).hexdigest()
  632. if (msg[0] == hash):
  633. client.authenticated = True
  634. client.power = int(users[client.adminName.lower()][3])
  635. client.writeBack('connected', getWelcomeString(client))
  636. CheckRemoteUserOnServer(client)
  637. client.writeBack('raconfig', getRAConfig(client))
  638. else:
  639. client.writeBack('errorcritical', '3001\x03Invalid username or password', True)
  640. else:
  641. client.writeBack('error', '3000\x03Sorry, you are not authenticated.')
  642. return
  643.  
  644.  
  645.  
  646. def getWelcomeString(client):
  647. t = time.localtime()
  648. timezone = time.timezone
  649. if (t.tm_isdst == 1):
  650. timezone = time.altzone
  651. tz = ('%+06.2f' % (-float(timezone) / 3600)).replace('.', ':')
  652. serverTime = (datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S') + tz)
  653. return ('%s\x03%s\x03%s' % (str(client.power),
  654. serverTime,
  655. realityconfig_admin.rcon_welcome))
  656.  
  657.  
  658.  
  659. def getRAConfig(user = None):
  660. commands = ''
  661. for (cmd, level,) in realityconfig_admin.adm_adminPowerLevels.iteritems():
  662. commands += (((str(cmd) + ':') + str(level)) + '\n')
  663.  
  664. for (cmd, level,) in realityconfig_admin.rcon_commandPowerLevels.iteritems():
  665. if (user and user.restricted):
  666. if ((cmd == 'mapplayers') or (cmd == 'mapgameplay')):
  667. commands += (str(cmd) + ':-1\n')
  668. continue
  669. commands += (((str(cmd) + ':') + str(level)) + '\n')
  670.  
  671. reasons = ''
  672. for cmd in realityconfig_admin.adm_reasons:
  673. reasons += (realityconfig_admin.adm_reasons[cmd].replace('\n', ' ') + '\n')
  674.  
  675. return ((((commands[:-1] + '\x03') + reasons[:-1]) + '\x03') + str(realityconfig_admin.adm_banTime))
  676.  
  677.  
  678.  
  679. def generateSalt(length = 20):
  680. ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  681. chars = []
  682. for i in range(length):
  683. chars.append(random.choice(ALPHABET))
  684.  
  685. return ''.join(chars)
  686.  
  687.  
  688.  
  689. def executeRcon(adminUser, subject, message):
  690. if ((adminUser.power > realityconfig_admin.rcon_commandPowerLevels[subject]) and onRconChatMessage(-1, 'Insufficient Permissions', 5, None)):
  691. return
  692. rconCommands[subject](adminUser, message)
  693.  
  694.  
  695.  
  696. def executeRACommand(adminUser, subject, message):
  697. sayMessageIndex = (len(message) - 1)
  698. if ((message[sayMessageIndex][0] == realityconfig_admin.adm_commandSymbol) and (subject in ['say',
  699. 'sayteam'])):
  700. split = message[sayMessageIndex].split(' ')
  701. if (split[0][1:] in realityadmin.adminCommands.keys()):
  702. subject = split[0][1:]
  703. if (len(split) > 1):
  704. message = split[1:]
  705. else:
  706. message = ['']
  707. if ((adminUser.power > realityconfig_admin.adm_adminPowerLevels[subject]) and onRconChatMessage(-1, 'Insufficient Permissions', 5, None)):
  708. return
  709. host.rcon_invoke(('rcon prismS adminCmd %s %s %s' % (subject.rstrip(),
  710. adminUser.getName().replace(' ', ','),
  711. message)))
  712.  
  713.  
  714.  
  715. def printMsg(msg, error = False):
  716. if (not error):
  717. print msg
  718. host.rcon_invoke(('echo "Message: %s"' % msg))
  719. else:
  720. host.rcon_invoke(('echo "Error: %s"' % msg))
  721.  
  722.  
  723.  
  724. def ListRCONUsers(adminUser, args = None):
  725. output = ''
  726. for (name, details,) in users.iteritems():
  727. if (name in map(str.lower, hardcoded_users)):
  728. continue
  729. output += (((str(details[0]) + '\x03') + str(details[3])) + '\n')
  730.  
  731. adminUser.writeBack('getusers', output[:-1])
  732. return True
  733.  
  734.  
  735.  
  736. def AddRCONUser(adminUser, args, update = True):
  737. if (((args[0].lower() in users.keys()) or (args[0].lower() in map(str.lower, hardcoded_users))) and client.writeBack('error', (('3003\x03User ' + str(args[0])) + ' already exists.'))):
  738. return False
  739. salt = generateSalt(8)
  740. pw = sha.new(((salt + '\x01') + args[1])).hexdigest()
  741. users[args[0].lower()] = [args[0],
  742. pw,
  743. salt,
  744. args[2]]
  745. if (update and writeUsers()):
  746. return ListRCONUsers(adminUser)
  747. return True
  748.  
  749.  
  750.  
  751. def ChangeRCONUser(adminUser, args):
  752. if (args[0] != args[1]):
  753. if (not AddRCONUser(adminUser, [args[1],
  754. args[2],
  755. args[3]], False)):
  756. return False
  757. del users[args[0].lower()]
  758. else:
  759. if args[2]:
  760. salt = generateSalt(8)
  761. pw = sha.new(((salt + '\x01') + args[2])).hexdigest()
  762. else:
  763. pw = users[args[0].lower()][0]
  764. salt = users[args[0].lower()][1]
  765. users[args[0].lower()] = [args[0],
  766. pw,
  767. salt,
  768. args[3]]
  769. writeUsers()
  770. return ListRCONUsers(adminUser)
  771.  
  772.  
  773.  
  774. def DeleteRCONUser(adminUser, args):
  775. if ((args[0] == adminUser.adminName) and adminUser.writeBack('error', (('3004\x03You cannot remove your own account. Delete Bf2Root/' + userFileName) + ' to wipe all accounts.'))):
  776. return False
  777. try:
  778. del users[args[0].lower()]
  779. except:
  780. adminUser.writeBack('error', '3006\x03This user was already deleted.')
  781. return False
  782. writeUsers()
  783. return ListRCONUsers(adminUser)
  784.  
  785.  
  786.  
  787. def ListServerDetails(adminUser, args):
  788. if adminUser.readyServer:
  789. return
  790. message = (GetServerHeader() + GetServerDetails(True))
  791. adminUser.writeBack('serverdetails', message)
  792. adminUser.readyServer = True
  793.  
  794.  
  795.  
  796. def ListMapDetails(adminUser, args):
  797. if (adminUser.readyMap or (adminUser.power > realityconfig_admin.rcon_commandPowerLevels['mapgameplay'])):
  798. return
  799. message = GetMapDetails(True)
  800. if (not message):
  801. message = '\x03\x03\x03\x03'
  802. adminUser.writeBack('gameplaydetails', message)
  803. adminUser.readyMap = True
  804.  
  805.  
  806.  
  807. def ListPlayers(adminUser, args):
  808. messageString = ''
  809. messageStringNoPos = ''
  810. for p in bf2.playerManager.getPlayers():
  811. if (p.getName() not in cachedUsers):
  812. cachedUsers[p.getName()] = CachedPlayer()
  813. cacheOutput = cachedUsers[p.getName()].getAllValues(p)
  814. messageString += (GetPlayerHeader(p) + cacheOutput[0])
  815. messageStringNoPos += (GetPlayerHeader(p) + cacheOutput[1])
  816.  
  817. if (((adminUser.power > realityconfig_admin.rcon_commandPowerLevels['mapplayers']) or adminUser.restricted) and adminUser.writeBack('listplayers', messageStringNoPos)):
  818. pass
  819. adminUser.readyPlayers = True
  820.  
  821.  
  822.  
  823. def CheckRemoteUserOnServer(adminUser = None):
  824. if (int(host.rcon_invoke('sv.internet').strip()) == 0):
  825. return
  826. if (not adminUser):
  827. for userId in auth_users:
  828. CheckRemoteUserOnServer(auth_users[userId])
  829.  
  830. else:
  831. oldStatus = adminUser.restricted
  832. if (adminUser.ipAddress[:adminUser.ipAddress.find(':')] in playerIPs):
  833. adminUser.restricted = True
  834. else:
  835. adminUser.restricted = False
  836. if ((oldStatus != adminUser.restricted) and adminUser.writeBack('raconfig', getRAConfig(adminUser))):
  837. pass
  838.  
  839.  
  840.  
  841. def ReadMapList(adminUser, args):
  842. maplistStr = ((((GetServerProperty('admin.currentlevel') + '\x03') + GetServerProperty('admin.nextlevel')) + '\x03') + GetServerProperty('maplist.list', '\n'))
  843. adminUser.writeBack('maplist', maplistStr)
  844.  
  845.  
  846.  
  847. def ReadBanList(adminUser, args):
  848. return
  849.  
  850.  
  851.  
  852. def SendToRconAdmin(adminUser, subject, message):
  853. for id in auth_users:
  854. if (((auth_users[id].adminName == adminUser) or (auth_users[id].getName() == adminUser)) and auth_users[id].writeBack(subject, message)):
  855. break
  856.  
  857.  
  858.  
  859. class AdminObject(object):
  860. __module__ = __name__
  861. index = -1
  862. adminName = ''
  863. ipAddress = ''
  864. power = 777
  865. clientChallenge = ''
  866. serverChallenge = None
  867. authenticated = False
  868. restricted = False
  869. readyMap = False
  870. readyServer = False
  871. readyPlayers = False
  872. connection = None
  873.  
  874. def __init__(self, conn, address):
  875. self.connection = conn
  876. self.ipAddress = address
  877.  
  878.  
  879.  
  880. def getName(self):
  881. return ('PRISM user ' + self.adminName)
  882.  
  883.  
  884.  
  885. def getTeam(self):
  886. return 1
  887.  
  888.  
  889.  
  890. def isValid(self):
  891. return True
  892.  
  893.  
  894.  
  895. def isAuthenticated(self):
  896. return self.authenticated
  897.  
  898.  
  899.  
  900. def getServerChallenge(self):
  901. if (self.serverChallenge is None):
  902. self.serverChallenge = generateSalt()
  903. return self.serverChallenge
  904.  
  905.  
  906.  
  907. def isReadyMap(self):
  908. return self.readyMap
  909.  
  910.  
  911.  
  912. def isReadyServer(self):
  913. return self.readyServer
  914.  
  915.  
  916.  
  917. def isReadyPlayers(self):
  918. return self.readyPlayers
  919.  
  920.  
  921.  
  922. def writeBack(self, subject, message, closing = False):
  923. self.connection.writeBack(('\x01%s\x02%s' % (subject,
  924. message)), closing)
  925.  
  926.  
  927.  
  928. class CachedPlayer(object):
  929. __module__ = __name__
  930. updatePositionsGreaterThan = 1
  931. team = None
  932. squad = None
  933. kit = None
  934. vehicle = None
  935. score = None
  936. scoreTW = None
  937. kills = None
  938. teamkills = None
  939. deaths = None
  940. valid = None
  941. ping = None
  942. position = None
  943. positionOld = None
  944. rotation = None
  945. bulletsFired = None
  946. idle = None
  947. idleOld = None
  948. alive = None
  949. joining = None
  950.  
  951. def __init__(self):
  952. return
  953.  
  954.  
  955.  
  956. def getAllValues(self, p):
  957. global prismIndexCounter
  958. output = ''
  959. try:
  960. if (p.joining == ''):
  961. return
  962. except:
  963. p.joining = True
  964. team = p.getTeam()
  965. output += str(team)
  966. output += '\x03'
  967. squadID = str(p.getSquadId())
  968. if (squadID != '0'):
  969. if p.isSquadLeader():
  970. squadID += 'L'
  971. elif p.isCommander():
  972. squadID = 'C'
  973. output += str(squadID)
  974. output += '\x03'
  975. try:
  976. kit = p.getKit().templateName
  977. except:
  978. kit = 'None'
  979. output += str(kit)
  980. output += '\x03'
  981. veh = p.getVehicle()
  982. try:
  983. if (isSoldier(veh) and isSoldier(veh.getParent())):
  984. vehicle = '-1:None'
  985. else:
  986. rootVeh = bf2.objectManager.getRootParent(veh)
  987. if (not hasattr(rootVeh, 'prismIndex')):
  988. rootVeh.prismIndex = prismIndexCounter
  989. prismIndexCounter += 1
  990. if (isSoldier(veh) and (not isSoldier(veh.getParent()))):
  991. vehicle = ((str(rootVeh.prismIndex) + ':') + veh.getParent().templateName)
  992. else:
  993. vehicle = ((str(rootVeh.prismIndex) + ':') + veh.templateName)
  994. except Exception, e:
  995. vehicle = ('-1:Invalid' + str(e).replace(' ', '_'))
  996. output += str(self.vehicle)
  997. output += '\x03'
  998. try:
  999. score = p.score.score
  1000. scoreTW = p.score.rplScore
  1001. kills = p.score.kills
  1002. teamkills = p.score.TKs
  1003. deaths = p.score.deaths
  1004. valid = 1
  1005. except:
  1006. score = 0
  1007. scoreTW = 0
  1008. kills = 0
  1009. teamkills = 0
  1010. deaths = 0
  1011. bulletsFired = 0
  1012. valid = 0
  1013. output += str(score)
  1014. output += '\x03'
  1015. output += str(scoreTW)
  1016. output += '\x03'
  1017. output += str(kills)
  1018. output += '\x03'
  1019. output += str(teamkills)
  1020. output += '\x03'
  1021. output += str(deaths)
  1022. output += '\x03'
  1023. if p.joining:
  1024. output += str(1)
  1025. else:
  1026. output += str(valid)
  1027. output += '\x03'
  1028. output += str(p.getPing())
  1029. output += '\x03'
  1030. if ((not self.idle) or p.joining):
  1031. self.idle = 0
  1032. output += str(self.idle)
  1033. output += '\x03'
  1034. if (p.isAlive() and ((not p.isManDown()) and (not p.joining))):
  1035. alive = True
  1036. else:
  1037. alive = False
  1038. output += str(int(alive))
  1039. output += '\x03'
  1040. output += str(int(p.joining))
  1041. output += '\x03'
  1042. try:
  1043. pos = p.getDefaultVehicle().getPosition()
  1044. except:
  1045. pos = ''
  1046. try:
  1047. rot = +int(p.getVehicle().getRotation()[0])
  1048. except:
  1049. rot = 0
  1050. return (((((output + str(pos)) + '\x03') + str(rot)) + '\n'),
  1051. (output + '\x03\n'))
  1052.  
  1053.  
  1054.  
  1055. def getChangedValues(self, p):
  1056. global prismIndexCounter
  1057. output = ''
  1058. team = p.getTeam()
  1059. if (self.team != team):
  1060. self.team = team
  1061. output += str(self.team)
  1062. output += '\x03'
  1063. squadID = str(p.getSquadId())
  1064. if (squadID != '0'):
  1065. if p.isSquadLeader():
  1066. squadID += 'L'
  1067. elif p.isCommander():
  1068. squadID = 'C'
  1069. if (self.squad != squadID):
  1070. self.squad = squadID
  1071. output += str(squadID)
  1072. output += '\x03'
  1073. try:
  1074. kit = p.getKit().templateName
  1075. except:
  1076. kit = 'None'
  1077. if (self.kit != kit):
  1078. self.kit = kit
  1079. output += self.kit
  1080. output += '\x03'
  1081. veh = p.getVehicle()
  1082. try:
  1083. if (isSoldier(veh) and isSoldier(veh.getParent())):
  1084. vehicle = '-1:None'
  1085. else:
  1086. rootVeh = bf2.objectManager.getRootParent(veh)
  1087. if (not hasattr(rootVeh, 'prismIndex')):
  1088. rootVeh.prismIndex = prismIndexCounter
  1089. prismIndexCounter += 1
  1090. if (isSoldier(veh) and (not isSoldier(veh.getParent()))):
  1091. vehicle = ((str(rootVeh.prismIndex) + ':') + veh.getParent().templateName)
  1092. else:
  1093. vehicle = ((str(rootVeh.prismIndex) + ':') + veh.templateName)
  1094. except Exception, e:
  1095. vehicle = ('-1:Invalid' + str(e).replace(' ', '_'))
  1096. if (self.vehicle != vehicle):
  1097. self.vehicle = vehicle
  1098. output += vehicle
  1099. output += '\x03'
  1100. try:
  1101. score = p.score.score
  1102. scoreTW = p.score.rplScore
  1103. kills = p.score.kills
  1104. teamkills = p.score.TKs
  1105. deaths = p.score.deaths
  1106. valid = 1
  1107. except Exception, e:
  1108. printMsg(('getChangedValues: ' + str(e)))
  1109. score = 0
  1110. scoreTW = 0
  1111. kills = 0
  1112. teamkills = 0
  1113. deaths = 0
  1114. bulletsFired = 0
  1115. valid = 0
  1116. if (self.score != score):
  1117. self.score = score
  1118. output += str(score)
  1119. output += '\x03'
  1120. if (self.scoreTW != scoreTW):
  1121. self.scoreTW = scoreTW
  1122. output += str(scoreTW)
  1123. output += '\x03'
  1124. if (self.kills != kills):
  1125. self.kills = kills
  1126. output += str(kills)
  1127. output += '\x03'
  1128. if (self.teamkills != teamkills):
  1129. self.teamkills = teamkills
  1130. output += str(teamkills)
  1131. output += '\x03'
  1132. if (self.deaths != deaths):
  1133. self.deaths = deaths
  1134. output += str(deaths)
  1135. output += '\x03'
  1136. if (self.valid != valid):
  1137. self.valid = valid
  1138. if self.joining:
  1139. output += str(1)
  1140. else:
  1141. output += str(valid)
  1142. output += '\x03'
  1143. if (self.ping != p.getPing()):
  1144. self.ping = p.getPing()
  1145. output += str(self.ping)
  1146. output += '\x03'
  1147. if (not self.idle):
  1148. self.idle = 0
  1149. self.idle += 1
  1150. if (self.position != self.positionOld):
  1151. self.idle = 0
  1152. self.positionOld = p.getVehicle().getPosition()
  1153. elif (self.rotation != p.getVehicle().getRotation()):
  1154. self.idle = 0
  1155. self.rotation = p.getVehicle().getRotation()
  1156. elif self.joining:
  1157. self.idle = 0
  1158. elif p.isManDown():
  1159. self.idle = 0
  1160. if (((self.idle % 30) == 0) and (self.idle != self.idleOld)):
  1161. self.idleOld = self.idle
  1162. output += str(self.idle)
  1163. output += '\x03'
  1164. if (p.isAlive() and ((not p.isManDown()) and (not self.joining))):
  1165. alive = True
  1166. else:
  1167. alive = False
  1168. if (self.alive != alive):
  1169. self.alive = alive
  1170. output += str(int(self.alive))
  1171. output += '\x03'
  1172. try:
  1173. if (self.joining != p.joining):
  1174. self.joining = p.joining
  1175. output += str(int(self.joining))
  1176. output += '\x03'
  1177. except:
  1178. return False
  1179. posString = '\x03'
  1180. try:
  1181. pos = p.getDefaultVehicle().getPosition()
  1182. if (not self.position):
  1183. self.position = pos
  1184. if ((self.position[0] != int(pos[0])) or (self.position[2] != int(pos[2]))):
  1185. self.position = (int(pos[0]),
  1186. int(pos[1]),
  1187. int(pos[2]))
  1188. posString = ((str(self.position) + '\x03') + str(int(p.getVehicle().getRotation()[0])))
  1189. except:
  1190. pass
  1191. if ((output == '\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03') and (posString == '\x03')):
  1192. return False
  1193. else:
  1194. return (((output + posString) + '\n'),
  1195. (output + '\x03\n'))
  1196.  
  1197.  
  1198.  
  1199.  
  1200. #+++ okay decompyling
  1201. # decompiled 1 files: 1 okay, 0 failed, 0 verify failed
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement