Advertisement
Guest User

Untitled

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