Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.94 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 parseData(self, data):
  140.  
  141. if data[0] == "\x01" and data[1] == "\x01":
  142. eventutflength = data[2:4]
  143. data = data[4:struct.unpack("!h", eventutflength)[0]+4]
  144. values = data.split("\x01")
  145. prefix = values.pop(0)
  146.  
  147. else:
  148. prefix = data[:2]
  149. data = data[2:]
  150.  
  151. def nextMap(self, reason):
  152. if reason == 1:
  153. ("\x06\x1A\x01"+"mm "+"Too few mice left.", True)
  154. ("\x06\x1A\x01"+"mm "+"Time limit reached.", True)
  155. else:
  156.  
  157.  
  158.  
  159. if prefix[0] == "\x04":
  160. self.sendData("\x04\x0A",True)
  161.  
  162.  
  163.  
  164.  
  165. elif prefix[0] == "\x05":
  166. #05 05 prefix
  167. if prefix[1] == "\x05":
  168. self.gamecode = values[2]
  169. self.sendData("\x06\x1A\x01"+"ch "+self.username, True)
  170. self.sendData("\x06\x1A\x01"+"npp "+random.choice(self.maps), True)
  171. playerdbcur.execute("update game set points = points + 1 where 1 = 1")
  172. self.position = 1
  173. elif prefix[1] == "\x14":
  174. self.itemnotrecieved = False
  175. else:
  176. pass
  177.  
  178. elif prefix[0] == "\x06":
  179. if prefix[1] == "\x06":
  180. #Chat Message
  181. #Here's how to send a chat message:
  182. #message="Hi"
  183. #self.sendData("\x06\x06"+struct.pack('!h', len(message))+message, False)
  184. playercode=struct.unpack("!l", data[:4])[0]
  185. data=data[4:]
  186. utflength=struct.unpack("!h", data[:2])[0]
  187. name=str(data[2:int(utflength)+2])
  188. data=data[utflength+2:]
  189. utflength=struct.unpack("!h", data[:2])[0]
  190. message=data[2:utflength+2]
  191. self.sendOutput(name + ": " + message)
  192.  
  193.  
  194. elif prefix [1] == "\x07":
  195. #Whisper
  196. #Here's how to send a whisper:
  197. #name="Playername"
  198. #message="Hi"
  199. #self.sendData("\x06\x07"+struct.pack('!h', len(name))+name+struct.pack('!h', len(message))+message, False)
  200. msgtype=data[:1]
  201. data=data[1:]
  202. if msgtype == "\x00":
  203. utflength=struct.unpack("!h", data[:2])[0]
  204. name=str(data[2:int(utflength)+2])
  205. data=data[utflength+2:]
  206. utflength=struct.unpack("!h", data[:2])[0]
  207. message=data[2:utflength+2]
  208. self.sendOutput("To " + name + ": " + message)
  209. elif msgtype == "\x01":
  210. utflength=struct.unpack("!h", data[:2])[0]
  211. name=str(data[2:int(utflength)+2])
  212. data=data[utflength+2:]
  213. utflength=struct.unpack("!h", data[:2])[0]
  214. message=data[2:utflength+2]
  215. self.sendOutput("From " + name + ": " + message)
  216. else:
  217. print "Problably the player doesn't exist..."
  218.  
  219. elif prefix [1] == "\x08":
  220. #Tribe Message
  221. #And here's how to send a tribe message:
  222. #message="Hi"
  223. #self.sendData("\x06\x08"+struct.pack('!h', len(message))+message, False)
  224. utflength=struct.unpack("!h", data[:2])[0]
  225. message=data[2:int(utflength)+2]
  226. data=data[utflength+2:]
  227. utflength=struct.unpack("!h", data[:2])[0]
  228. name=data[2:utflength+2]
  229. self.sendOutput("[Tribe] " + name + ": " + message)
  230. elif prefix [1] == "\x14":
  231. pass
  232. else:
  233. pass
  234.  
  235. elif prefix[0] == "\x08":
  236. if prefix[1] == "\x05":
  237. #Player Died
  238. playerCode, AliveMiceCount, score = values
  239.  
  240. elif prefix[1] == "\x06":
  241. #Player got in hole
  242. if self.position == 1:
  243. bonus = "Well done, you came 1st!"
  244.  
  245. elif self.position == 2:
  246. bonus = "Awww, so close!"
  247. else:
  248. bonus = "Better luck next time!"
  249.  
  250. self.position = self.position + 1
  251. playerCode, AliveMiceCount, score, place, timeTaken = values
  252. name = self.getName(playerCode)
  253. mess=(bonus)
  254. self.sendData("\x06\x07"+struct.pack('!h', len(name))+name.encode('ascii','ignore')+struct.pack('!h', len(mess))+mess, False)
  255. self.sendData("\x06\x1A\x01"+"mm "+name+" got a time of "+ str(int(timeTaken) / float(10)) + " seconds.", True)
  256.  
  257.  
  258.  
  259. elif prefix[1] == "\x09":
  260.  
  261. playerdbcur.execute("delete from players")
  262. for player in values:
  263. playerdata = player.split("\x23")
  264. name = playerdata[0]
  265. playercode = playerdata[1]
  266. playerdbcur.execute("insert into players (name, playercode) values (?, ?)", (name, playercode))
  267. playerdbcur.execute("update game set playercode = \""+playercode+"\" where name = \""+name+"\"")
  268. elif prefix[1] == "\x15":
  269. if str(values[0])==str(self.playerCode):
  270. pass
  271. else:
  272. pass
  273.  
  274. elif prefix[0] == "\x10":
  275. if prefix[1] == "\x05":
  276. self.sendOutput("[Tribe] " + values[0] + ": " + values[1])
  277. else:
  278. pass
  279.  
  280. elif prefix[0] == "\x1A":
  281. if prefix[1] == "\x1A":
  282. reactor.callLater(10, self.sendTZAT)
  283. elif prefix[1] == "\x1B":
  284. self.MDT = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  285. LCDMT = values[1]
  286. self.CMDTEC = int(values[2])
  287. i = 0
  288. while(i < 10):
  289. self.CMDT = LCDMT[i]
  290. if self.CMDT == "0":
  291. self.MDT[i] = "10"
  292. else:
  293. self.MDT[i] = self.CMDT
  294. i = (i+1)
  295. self.login()
  296. elif prefix [1] == "\x08":
  297. self.playerCode=values[1]
  298. else:
  299. pass
  300. else:
  301. pass
  302.  
  303. class BotFactory(protocol.ClientFactory):
  304. protocol = BotClient
  305. def clientConnectionLost(self, connector, reason):
  306. reactor.stop()
  307. print "Connection Lost :("
  308. def clientConnectionFailed(self, connector, reason):
  309. reactor.stop()
  310.  
  311. if __name__ == '__main__':
  312. playerdb = sqlite3.connect(":memory:", check_same_thread = False)
  313. playerdb.isolation_level = None
  314. playerdbcur = playerdb.cursor()
  315. playerdb.row_factory = sqlite3.Row
  316. playerdbcur.execute("""create table players(name text, playercode text)""")
  317. 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)""")
  318.  
  319. f = BotFactory()
  320. reactor.connectTCP("cheeseforlife.no-ip.org", 443, f)
  321. print "\033[31;49;1mI'm online!\033[0m"
  322. reactor.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement