Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.12 KB | None | 0 0
  1. import re
  2. import hashlib
  3. import time
  4. import os
  5. import logging, logging.handlers
  6. import thread, threading
  7. import sqlite3
  8. import struct
  9. import random
  10. import unicodedata
  11. from datetime import datetime
  12. from twisted.internet import reactor, protocol
  13.  
  14. import warnings
  15. from zope.interface import implements
  16.  
  17. class TFMClientProtocol(protocol.Protocol):
  18.  
  19. recvd = ""
  20. structFormat = "!I"
  21.  
  22. def stringReceived(self, string):
  23. raise NotImplementedError
  24.  
  25. def inforequestReceived(self, string):
  26. raise NotImplementedError
  27.  
  28. def dataReceived(self, data):
  29. self.recvd += data
  30. while not self.recvd == "":
  31. datalength = len(self.recvd)
  32. if datalength>=4:
  33. packetlength = int((struct.unpack("%sL" % "!", self.recvd[:4]))[0])
  34. if datalength == packetlength:
  35. self.stringReceived(self.recvd[4:])
  36. self.recvd = ""
  37. elif datalength < packetlength:
  38. break
  39. else:
  40. self.stringReceived(self.recvd[4:packetlength])
  41. self.recvd = self.recvd[packetlength:]
  42. else:
  43. break
  44.  
  45. def sendString(self, string):
  46. if len(string) >= 2 ** (8 * 4):
  47. raise StringTooLongError(
  48. "Try to send %s bytes whereas maximum is %s" % (
  49. len(string), 2 ** (8 * 4)))
  50. self.transport.write(
  51. struct.pack(self.structFormat, len(string)) + string)
  52.  
  53. class BotClient(TFMClientProtocol):
  54.  
  55. def __init__(self):
  56. self.username = "racebot" #Put its name here
  57. self.password = "xxxxxxx1" #Put its password here
  58. self.startroom = "racing" #Put its starting room here
  59. self.controlmouse="bob" #And put your name here
  60.  
  61. self.controlplayercode = ""
  62. self.currentmap = ""
  63. self.requestinginfo = False
  64. self.parsingmaps = False
  65. self.recievedmap = False
  66. self.follow = False
  67. self.room = False
  68.  
  69. self.maps = ["@16","@22", "@29", "@42", "@18", "@93", "@94", "@95", "@96", "@97", "@98" , "@99", "@100" ]
  70.  
  71. self.position = 0
  72.  
  73. def connectionMade(self):
  74. self.transport.write("\x00\x00\x00\x0C\x00\x00\x00\x00" + "\x1C" + "\x01" + struct.pack("!h", 164))
  75. self.TempsZeroBR = (time.time() * 1000)
  76. reactor.callLater(11, self.pingThread)
  77.  
  78. def stringReceived(self, data):
  79. self.parseData(data)
  80.  
  81. def sendOutput(self, string):
  82. print str(datetime.today())+" "+string
  83.  
  84. def sendTZAT(self):
  85. self.sendData("\x1A" + "\x1A", True)
  86.  
  87. def pingThread(self):
  88. Lasttime = int(time.time() * 1000)
  89. self.sendData("\x1A" + "\x02" + "\x01" + str(int(time.time() * 1000) - int(self.TempsZeroBR)), True)
  90. self.TempsZeroBR = Lasttime
  91. reactor.callLater(11, self.pingThread)
  92.  
  93. def login(self):
  94. self.sendData("\x1A" + "\x04" + "\x01" + self.username + "\x01" + str(hashlib.sha256(self.password).hexdigest()) + "\x01" + self.startroom, True)
  95.  
  96. def magic(self, obj, x, y, rotation, dx, dy, solid):
  97. self.sendData("\x05\x14"+struct.pack("!hhhhbbb",obj,x,y,rotation,dx,dy,solid), False)
  98.  
  99. def getName(self, playerCode):
  100. playerdbcur.execute("select name from players where playercode = \""+str(playerCode)+"\"")
  101. try:
  102. result = playerdbcur.fetchall()[0][0].encode('ascii','ignore')
  103. except:
  104. result = False
  105. return result
  106.  
  107. def getPlayerCode(self, name):
  108. playerdbcur.execute("select playercode from players where name = \""+str(name)+"\"")
  109. try:
  110. result = playerdbcur.fetchall()[0][0].encode('ascii','ignore')
  111. except:
  112. result = False
  113. return result
  114.  
  115. def pfo(self, obj):
  116. if obj == 0:
  117. need = 0
  118. elif obj == 24:
  119. need = 1
  120. else:
  121. need = 2
  122. return need
  123. def sendData(self, data, isUTF):
  124. Pos = int((self.CMDTEC)%9000 + 1000)
  125. d1 = int(Pos / 1000)
  126. d2 = int(Pos / 100) % 10
  127. d3 = int(Pos / 10) % 10
  128. d4 = int(Pos % 10)
  129. mdtprefix = chr(int(self.MDT[d1])) + chr(int(self.MDT[d2])) + chr(int(self.MDT[d3])) + chr(int(self.MDT[d4]))
  130. self.CMDTEC += 1
  131. if isUTF:
  132. packetlength = struct.pack("!l", (len(data)+12))
  133. utflength = struct.pack("!h", len(data))
  134. self.transport.write(packetlength + mdtprefix + "\x01" + "\x01" + utflength + data)
  135. else:
  136. packetlength = struct.pack("!l", (len(data)+8))
  137. self.transport.write(packetlength + mdtprefix + data)
  138.  
  139. def nextMap(self, reason):
  140. if reason == 1:
  141. self.sendData("\x06\x1A\x01"+"mm "+"Too few mice left.", True)
  142. else:
  143. self.sendData("\x06\x1A\x01"+"mm "+"Time limit reached.", True)
  144. self.sendData("\x06\x1A\x01"+"np")
  145. self.timer.cancel()
  146.  
  147.  
  148. def parseData(self, data):
  149.  
  150. if data[0] == "\x01" and data[1] == "\x01":
  151. eventutflength = data[2:4]
  152. data = data[4:struct.unpack("!h", eventutflength)[0]+4]
  153. values = data.split("\x01")
  154. prefix = values.pop(0)
  155.  
  156. else:
  157. prefix = data[:2]
  158. data = data[2:]
  159.  
  160.  
  161.  
  162.  
  163. if prefix[0] == "\x04":
  164. self.sendData("\x04\x0A",True)
  165.  
  166.  
  167.  
  168.  
  169. elif prefix[0] == "\x05":
  170. #05 05 prefix
  171. if prefix[1] == "\x05":
  172. self.gamecode = values[2]
  173. self.sendData("\x06\x1A\x01"+"ch "+self.username, True)
  174. self.sendData("\x06\x1A\x01"+"npp "+random.choice(self.maps), True)
  175. playerdbcur.execute("update game set points = points + 1 where 1 = 1")
  176. self.timer=reactor.callLater(60,self.nextMap,0)
  177. self.position = 1
  178. elif prefix[1] == "\x14":
  179. self.itemnotrecieved = False
  180. else:
  181. pass
  182.  
  183. elif prefix[0] == "\x06":
  184. if prefix[1] == "\x06":
  185. #Chat Message
  186. #Here's how to send a chat message:
  187. #message="Hi"
  188. #self.sendData("\x06\x06"+struct.pack('!h', len(message))+message, False)
  189. playercode=struct.unpack("!l", data[:4])[0]
  190. data=data[4:]
  191. utflength=struct.unpack("!h", data[:2])[0]
  192. name=str(data[2:int(utflength)+2])
  193. data=data[utflength+2:]
  194. utflength=struct.unpack("!h", data[:2])[0]
  195. message=data[2:utflength+2]
  196. self.sendOutput(name + ": " + message)
  197.  
  198.  
  199. elif prefix [1] == "\x07":
  200. #Whisper
  201. #Here's how to send a whisper:
  202. #name="Playername"
  203. #message="Hi"
  204. #self.sendData("\x06\x07"+struct.pack('!h', len(name))+name+struct.pack('!h', len(message))+message, False)
  205. msgtype=data[:1]
  206. data=data[1:]
  207. if msgtype == "\x00":
  208. utflength=struct.unpack("!h", data[:2])[0]
  209. name=str(data[2:int(utflength)+2])
  210. data=data[utflength+2:]
  211. utflength=struct.unpack("!h", data[:2])[0]
  212. message=data[2:utflength+2]
  213. self.sendOutput("To " + name + ": " + message)
  214. elif msgtype == "\x01":
  215. utflength=struct.unpack("!h", data[:2])[0]
  216. name=str(data[2:int(utflength)+2])
  217. data=data[utflength+2:]
  218. utflength=struct.unpack("!h", data[:2])[0]
  219. message=data[2:utflength+2]
  220. self.sendOutput("From " + name + ": " + message)
  221. else:
  222. print "Problably the player doesn't exist..."
  223.  
  224. elif prefix [1] == "\x08":
  225. #Tribe Message
  226. #And here's how to send a tribe message:
  227. #message="Hi"
  228. #self.sendData("\x06\x08"+struct.pack('!h', len(message))+message, False)
  229. utflength=struct.unpack("!h", data[:2])[0]
  230. message=data[2:int(utflength)+2]
  231. data=data[utflength+2:]
  232. utflength=struct.unpack("!h", data[:2])[0]
  233. name=data[2:utflength+2]
  234. self.sendOutput("[Tribe] " + name + ": " + message)
  235. elif prefix [1] == "\x14":
  236. pass
  237. else:
  238. pass
  239.  
  240. elif prefix[0] == "\x08":
  241. if prefix[1] == "\x05":
  242. #Player Died
  243. playerCode, AliveMiceCount, score = values
  244.  
  245. elif prefix[1] == "\x06":
  246. #Player got in hole
  247. if self.position == 1:
  248. bonus = "Well done, you came 1st!"
  249.  
  250. elif self.position == 2:
  251. bonus = "Awww, so close!"
  252. else:
  253. bonus = "Better luck next time!"
  254.  
  255. self.position = self.position + 1
  256. playerCode, AliveMiceCount, score, place, timeTaken = values
  257. name = self.getName(playerCode)
  258. mess=(bonus)
  259. self.sendData("\x06\x07"+struct.pack('!h', len(name))+name.encode('ascii','ignore')+struct.pack('!h', len(mess))+mess, False)
  260. self.sendData("\x06\x1A\x01"+"mm "+name+" got a time of "+ str(int(timeTaken) / float(10)) + " seconds.", True)
  261.  
  262.  
  263.  
  264. elif prefix[1] == "\x09":
  265.  
  266. playerdbcur.execute("delete from players")
  267. for player in values:
  268. playerdata = player.split("\x23")
  269. name = playerdata[0]
  270. playercode = playerdata[1]
  271. playerdbcur.execute("insert into players (name, playercode) values (?, ?)", (name, playercode))
  272. playerdbcur.execute("update game set playercode = \""+playercode+"\" where name = \""+name+"\"")
  273. elif prefix[1] == "\x15":
  274. if str(values[0])==str(self.playerCode):
  275. pass
  276. else:
  277. pass
  278.  
  279. elif prefix[0] == "\x10":
  280. if prefix[1] == "\x05":
  281. self.sendOutput("[Tribe] " + values[0] + ": " + values[1])
  282. else:
  283. pass
  284.  
  285.  
  286. elif prefix[0] == "\x1A":
  287. if prefix[1] == "\x1A":
  288. reactor.callLater(10, self.sendTZAT)
  289. elif prefix[1] == "\x1B":
  290. self.MDT = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  291. LCDMT = values[1]
  292. self.CMDTEC = int(values[2])
  293. i = 0
  294. while(i < 10):
  295. self.CMDT = LCDMT[i]
  296. if self.CMDT == "0":
  297. self.MDT[i] = "10"
  298. else:
  299. self.MDT[i] = self.CMDT
  300. i = (i+1)
  301. self.login()
  302. elif prefix [1] == "\x08":
  303. self.playerCode=values[1]
  304. else:
  305. pass
  306. else:
  307. pass
  308.  
  309. class BotFactory(protocol.ClientFactory):
  310. protocol = BotClient
  311. def clientConnectionLost(self, connector, reason):
  312. reactor.stop()
  313. print "Connection Lost :("
  314. def clientConnectionFailed(self, connector, reason):
  315. reactor.stop()
  316.  
  317. if __name__ == '__main__':
  318. playerdb = sqlite3.connect(":memory:", check_same_thread = False)
  319. playerdb.isolation_level = None
  320. playerdbcur = playerdb.cursor()
  321. playerdb.row_factory = sqlite3.Row
  322. playerdbcur.execute("""create table players(name text, playercode text)""")
  323. playerdbcur.execute("""create table game(name text,posx int,posy int ,points int ,obj int ,whshot text,solid int,rotation int ,playercode text, lstime int)""")
  324.  
  325. f = BotFactory()
  326. reactor.connectTCP("cheeseforlife.no-ip.org", 443, f)
  327. print "\033[31;49;1mI'm online!\033[0m"
  328. reactor.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement