Advertisement
Guest User

Untitled

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