Advertisement
Flyer

Untitled

Jan 9th, 2013
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.19 KB | None | 0 0
  1. # -*- coding: UTF-8 -*-
  2. import socket
  3. import sys
  4. import os
  5. import time
  6. from packet import *
  7. import struct
  8. import urllib2
  9. import hashlib
  10. import threading
  11. import config
  12. from debug import *
  13.  
  14. class Irc:
  15. def __init__(self):
  16. self.activeConnexion = None
  17. self.ircUsername = ''
  18. self.ircChannel = ''
  19. self.ircChannels = []
  20. self.ircServeur = ''
  21. self.ircGreeting = "Hi im Imrubot. bye"
  22. self.ircWhoIm = "IDK"
  23. self.ircLogger = open('logs.txt', 'a')
  24. self.ircSpliter = {'name':'Íèê','tribe':'Ïëåìÿ','title':'Òèòóë','rounds':'Ðàóíäû','cheese':'Ñûð','sham_':'Øàìàí ','saves':'Ñåéâû','hard_':'Ãîëä ','first':'Ôåñòû','rank':'Ðàíã'}
  25. self.ircList = ['name', 'tribe', 'title', 'rounds', 'cheese', 'sham_', 'saves', 'hard_', 'first', 'rank']
  26. def ircConnexion(self, host, port):
  27. self.ircServeur = host
  28. self.activeConnexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  29. debug('Connection to:%s:%s'%(host, port))
  30. self.activeConnexion.connect( (host, port) )
  31.  
  32. def ircAurh(self, username, password, privatechannel, channels, logchannel):
  33. self.ircChannel = privatechannel
  34. self.ircChannels = channels
  35. self.ircChannels.append(self.ircChannel)
  36. debug('auth...')
  37. debug("USER %s %s bla :%s\r\n"%(username, self.ircServeur, username))
  38. self.activeConnexion.send("USER %s %s bla :%s\r\n"%(username, self.ircServeur, username))
  39. self.activeConnexion.send("NICK %s\n"%username)
  40. debug("NICK %s\n"%username)
  41. self.ircSendMessage(self.ircChannel, self.ircGreeting)
  42. self.activeConnexion.send("JOIN %s\n"%self.ircChannel)
  43. debug("JOIN %s\n"%self.ircChannel)
  44. for channel in channels:
  45. self.activeConnexion.send("JOIN %s\n"%channel)
  46. debug("JOIN %s\n"%channel)
  47. self.ircSendMessage(channel, self.ircGreeting)
  48.  
  49. def ircSendMessage(self, channel, message):
  50. self.activeConnexion.send("PRIVMSG %s :%s\r\n"%(channel, message))
  51. debug("PRIVMSG %s :%s\r\n"%(channel, message))
  52.  
  53. def ircRecvMessage(self, user, message):
  54. bot.private(user, message)
  55.  
  56. def ircLog(self, string):
  57. now = time.localtime(time.time())
  58. datetime = time.strftime("%y/%m/%d %H:%M", now)
  59. self.ircLogger.write('[%s] %s'%(datetime, string) )
  60. self.ircLogger.close()
  61.  
  62. def ircParser(self, packet):
  63. #select type
  64. if 'PRIVMSG' in packet:
  65. try:
  66. packet = packet.split(' ')
  67. print packet
  68. user = packet[0].split('!')[0].strip(':')
  69. channel = packet[2]
  70. #message = ':'.join(packet[2])
  71. message = ' '.join(packet[3:]).strip('\n\r').strip(':')
  72. print bytes([message])
  73. debug('%s:%s'%( user, message ))
  74. if '!stat' in message:
  75. self.ircTFMAPI(message.split(' ')[1], channel)
  76. elif '!c' in message:
  77. who = message.split(' ')[1]
  78. text = ' '.join(message.split(' ')[2:])
  79. debug('[MODERATION]: %s > %s'%(who, text))
  80. if 'irc.' not in message:self.ircRecvMessage(who, text)
  81. except:debug('Error unpacking')
  82. elif "PING :" in packet:self.ircPingPong(packet.split(' ')[1])
  83.  
  84. def ircTFMAPI(self, nick, channel):
  85. tfmAPI = urllib2.urlopen("http://api.formice.com/mouse/stats.json?n=%s"%nick)
  86. statapi = tfmAPI.read()
  87. tfmAPI.close()
  88. statapi = statapi.replace('"', '').replace('}', '').replace('{' , '').replace(':', '::')
  89. for i in self.ircList:
  90. try:statapi = statapi.replace(i, self.ircSpliter[i])
  91. except:pass
  92. statapi = ' | '.join(statapi.split(','))
  93. self.ircSendMessage(channel, 'Profile %s: %s'%(nick, statapi))
  94. print statapi
  95.  
  96. def ircPingPong(self, packet):
  97. self.activeConnexion.send("PONG %s\n"%packet)
  98. debug("PONG %s\n"%packet)
  99.  
  100. def ircListener(self):
  101. data = ''
  102. try:data = self.activeConnexion.recv(4096)
  103. except:self.debug('Socket problem...')
  104. if data!='':
  105. debug(data)
  106. self.ircParser(data)
  107.  
  108. class MyBot:
  109. def __init__(self, login, password,
  110. room, comm):
  111. self.login = login
  112. self.password = password
  113. self.room = room
  114. self.community = comm
  115. self.Bulle_diconnexion = False
  116. self.Main_diconnexion = False
  117. self.Bulle_connexion = False
  118. self.Main_socket = None
  119. self.Bulle_cocket = None
  120. self.Dummy_time = time.time()
  121. self.Null_Prefix = struct.pack('!l', 0)
  122. self.state = None
  123. self.read_data = ""
  124. self.Main_fingerprint = None
  125. self.Bulle_fingerprint = None
  126. self.dummy_last_time = time.time()
  127. self.mstate = None
  128. self.r_data = ''
  129. self.afk_last_time = time.time()
  130. self.b = RawData()
  131. self.community = {0:"en", 1:"fr", 2:"ru", 3:"br", 4:"es", 5:"cn", 6:"tr", 7:"vk", 8:"pl", 9:"hu", 10:"nl"}
  132. self.modlist = {}
  133. self.command = {'en':['modlist', 'helperlist', 'event', 'update', 'badmap', 'mod', 'help'], 'ru':['ìîäëèñò', 'õåëïåðû', 'ýâåíò', 'îáíîâëåíèå', 'êàðòà', 'ìîä', 'ïîìîùü']}
  134. self.helperlist = {}
  135.  
  136. def GetVK(self):
  137. data = urllib2.urlopen('http://kikoo.formice.com/data.txt').readline()
  138. recvkikoo = data.split('\x20')
  139. kikoo = []
  140. kikoo.append(recvkikoo[1])
  141. kikoo.append(recvkikoo[2])
  142. return kikoo
  143.  
  144. def Main_Connexion(self, serveur):
  145. self.Main_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  146. try:self.Main_socket.connect(serveur)
  147. except: debug("Main connexion failed!", Exit=True)
  148. Data = self.GetVK()
  149. try:self.First_Packet_data(Data[0], Data[1])
  150. except:debug("Failed to send First Packet", Exit=True)
  151. self.Main_socket.setblocking(False)
  152. debug("Done", Exit=False)
  153. return True
  154.  
  155. def Bulle_Connexion(self, key, ip):
  156. self.Bulle_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  157. portwithip = (ip[1:], 443)
  158. try:self.Bulle_socket.connect(portwithip)
  159. except: debug("Bulle connexion Failed!", Exit=True)
  160. debug("Bulle connexion completed!", Exit=False)
  161. self.Bulle_send_key(key)
  162. debug("In game!", Exit=False)
  163. self.Bulle_socket.setblocking(False)
  164. self.Bulle_diconnexion = False
  165. self.Bulle_connexion = True
  166.  
  167. def First_Packet_data(self, Version, Key):
  168. Packet = MyPack()
  169. Packet.add('\x1c\x01')
  170. Packet.addint(int(Version), 2)
  171. Packet.addstr(Key.replace('\x0A', ''))
  172. Packet.add('\x17\xed')
  173. self.send(Packet, Prefix=False, serveur="Main")
  174.  
  175. def Bulle_send_key(self, key):
  176. Bulle_Packet = MyPack()
  177. Bulle_Packet.add(key)
  178. self.send(Bulle_Packet, Prefix=False, serveur="Bulle")
  179.  
  180. def send(self, packet, Prefix=True,
  181. serveur="Main", RawBytes = ''):
  182. p_size = packet.size() + 8
  183. if packet.Protocol == 'old': p_size += 4
  184. data = MyPack()
  185. data.addint(p_size, 4)
  186. if Prefix:
  187. if serveur == 'Main': prefix = self.Main_fingerprint()
  188. else: prefix = self.Bulle_fingerprint()
  189. data.add(prefix)
  190. else: data.add(self.Null_Prefix)
  191. if packet.Protocol == 'old':
  192. data.add(RawBytes)
  193. data.addint(packet.size(), 2)
  194. data.add(packet.data)
  195. debug(serveur.upper() + " SENDING >%s"% bytes([data.data]), Exit=False)
  196. try:
  197. if serveur == 'Main': self.Main_socket.send(data.data)
  198. else: self.Bulle_socket.send(data.data)
  199. except: debug("'%s' server error. Sending failed!"% serveur, Exit=True)
  200.  
  201. def auth(self):
  202. passhash = hashlib.sha256(self.password).hexdigest()
  203. packet = MyPack()
  204. packet.add('\x1A\x04')
  205. packet.add('\x01')
  206. packet.add(self.login)
  207. packet.add('\x01')
  208. packet.add(passhash)
  209. packet.add('\x01')
  210. packet.add(self.room)
  211. packet.add('\x01')
  212. packet.add('http://www.transformice.com/Transformice.swf?d='+str(time.time()).split('.')[0])
  213. #packet.add('StandAlone\x00\x01-')
  214. packet.Protocol = 'old'
  215. self.send(packet, Prefix=True, serveur="Main", RawBytes=self.b.login)
  216. self.state = "not"
  217. self.mstate = 'logIn'
  218.  
  219. def change_community(self):
  220. community = MyPack()
  221. community.add(self.b.community)
  222. #community.addint(self.community, 1)
  223. community.add('\x02')
  224. self.send(community, Prefix=True, serveur="Main")
  225.  
  226. def antiAFK_die(self):
  227. afk = MyPack(self.b.die)
  228. afk.add(struct.pack('!l', 1))
  229. self.send(afk, Prefix=True, serveur="Bulle")
  230. self.afk_last_time = time.time()
  231.  
  232. def DUMMY(self):
  233. self.dummy_last_time = time.time()
  234. Pack = MyPack(self.b.login)
  235. Pack.add('\x00\x02')
  236. Pack.add('\x1A\x02')
  237. self.send(Pack, Prefix=True, serveur="Main")
  238. self.send(Pack, Prefix=True, serveur="Bulle")
  239.  
  240. def Parsing(self, packet):
  241. Packet_type = packet.seek(2)
  242. if Packet_type == "\x1a\x1b":
  243. packet_finish = packet.oldProtocolSplit()
  244. debug('Mice on server: %s'%packet_finish[1], Exit=False)
  245. debug('MDT: %s'%packet_finish[2], Exit=False)
  246. debug('CMDTEC: %s'%packet_finish[3], Exit=False)
  247. self.Main_fingerprint = MainPrefixGen(packet.data)
  248. try:self.change_community()
  249. except: debug("Change community error")
  250. self.mstate = 'ready'
  251. elif Packet_type == '\x2c\x01':
  252. data_e = packet.data.split('\x00')
  253. debug(data_e[0], Exit=False)
  254. self.Bulle_Connexion(data_e[0], data_e[1])
  255. self.state = 'logged'
  256. elif Packet_type == '\x2c\x02':
  257. p_fin = packet.oldProtocolSplit()
  258. p_fin = p_fin[0][2:]
  259. CMDTEC = p_fin[1:11]
  260. MDT = str(struct.unpack('!h', p_fin[11:]))
  261. MDT = int(MDT[1:len(MDT)-2])
  262. self.Bulle_fingerprint = BullePrefixGen(CMDTEC, MDT)
  263. self.mstate = 'logged'
  264. self.state = 'logged'
  265. debug('In Game *-*', Exit=False)
  266. elif Packet_type == '\x06\x07':
  267. packet.read(2)
  268. sent_by_me = not bool(packet.readint(1))
  269. who = packet.readstring()
  270. comm = packet.read(1)
  271. comm = struct.unpack('!b', comm)[0]
  272. try:whispered = packet.readstring()
  273. except:whispered = ""
  274. if not sent_by_me:self.e_private(who, whispered, comm)
  275. if Packet_type == '\x06\x14':
  276. msg = packet.oldProtocolSplit()
  277. self.e_servermessage(msg[1])
  278. if Packet_type == '\x1A\x05':
  279. msg = packet.oldProtocolSplit()
  280. self.e_servermessage(msg[2])
  281. if Packet_type == '\x1A\x06':
  282. msg = packet.oldProtocolSplit()
  283. self.e_servermessage(msg[2])
  284. if Packet_type == '\x1C\x58':
  285. msg = packet.oldProtocolSplit()
  286. self.e_serverrestart(msg[0])
  287.  
  288. #@arg1 Array of string -> [username, community]
  289. #@arg2 Array of string -> [type, argument]
  290. def functionMsgSplitter(self, arg1, arg2):
  291. print type(self.command['en'])
  292. print self.command['en']
  293. if arg2[0]==self.command['en'][0] or self.command['ru'][0]:
  294. if len(arg2)==2:self.getModlist(arg1[0], arg2[1])
  295. else:self.getModlist(arg1[0], arg1[1])
  296. elif arg2[0]==self.command['en'][1] or self.command['ru'][1]:
  297. if len(arg2)==2:self.getHelpers(arg1, arg2[1])
  298. else:self.getHelpers(arg1[0], arg1[1])
  299. elif arg2[0]==self.command['en'][2] or self.command['ru'][2]:self.getEvent(arg1[0]) #Now one argument
  300. elif arg2[0]==self.command['en'][3] or self.command['ru'][3]:self.getVersion(arg1[0])
  301. elif arg2[0]==self.command['en'][4] or self.command['ru'][4]:
  302. if len(arg2) == '3':self.getBadmap(arg1, arg2[1], arg2[2])
  303. else:self.getError(arg1[0], args=True)
  304. elif arg2[0]==self.command['en'][5] or self.command['ru'][5]:
  305. if len(arg2) == '3':self.getIrc(arg1, arg2[1])
  306. else:self.getError(arg1[0], args=True)
  307.  
  308. #@arg1 String - username
  309. #@arg2 String - community
  310. def getModlist(self, arg1, arg2):
  311. self.returnUnawaible(arg1, 'modlist')
  312.  
  313. #@arg1 String - username
  314. #@arg2 String - community
  315. def getHelpers(self, arg1, arg2):
  316. self.returnUnawaible(arg1, 'helpers')
  317.  
  318. #@arg1 String - username
  319. def getEvent(self, arg1):
  320. self.returnUnawaible(arg1, 'event')
  321.  
  322. #@arg1 String - username
  323. def getVersion(self, arg1):
  324. self.returnUnawaible(arg1, 'version')
  325.  
  326. #@arg1 Array of string - username, community
  327. #@arg2 String - number
  328. #@arg3 String - reason
  329. def getBadmap(self, arg1, arg2, arg3):
  330. Ircbott.ircSendMessage(Ircbott.ircChannel, '\x038\x02 • [Imrubot] Ïëîõàÿ êàðòà äåòåêòåä! Íîìåð: %s, ïîæàëîâàëñÿ: [%s]%s, ïðè÷èíà: %s'%(arg2, arg1[0], arg1[1], arg3))
  331. self.private(arg1, 'Ñïàñèáî çà ïîìîùü. <3')
  332.  
  333. #@arg1 Array os string - username, community
  334. #@args boolean - Erro type
  335. #@selector boolean - same
  336. def getError(self, arg1, args=False, selector=False):
  337. if args: self.private(arg1, 'Wrong arguments...')
  338. if selector: self.private(arg1, 'Wrong community...')
  339.  
  340. #@arg1 - Array of string - username, community
  341. #@arg2 - String - text
  342. def getIrc(self, arg1, arg2):
  343. Ircbott.ircSendMessage(Ircbott.ircChannel, '\x037\x02> [' + self.community[arg1[0]].upper() + '][' + str(arg1[1]) + '] ' + str(arg2))
  344. self.private(arg1, 'Æäèòå, âàì îòâåòÿò...')
  345.  
  346. #@arg1 String - username
  347. #@arg2 String - command
  348. def returnUnawaible(self, arg1, arg2):
  349. print arg1
  350. print arg2
  351. self.private(arg1, 'Êîìàíäà "%s" âðåìåííî íåäîñòóïíà :('%arg2)
  352.  
  353.  
  354. def e_private(self, who, text, comm):
  355. print who
  356. print text
  357. arg1 = []
  358. arg2 = []
  359. arg1.append(who); arg1.append(comm)
  360. arg2.append(text)
  361. if text == 'make':
  362. for channels in Ircbott.ircChannels:
  363. Ircbott.ircSendMessage(channels, '\x0310[TFM] \x0313\x02 • [SERVER] The server will restart in 2 minutes')
  364. #else:Ircbott.ircSendMessage(Ircbott.ircChannel, '\x037\x02> [' + self.community[comm].upper() + '][' + str(who) + '] ' + str(text))
  365. else:
  366. print arg2
  367. if text in self.command['en'] or self.command['ru']:self.functionMsgSplitter(arg1, arg2)
  368. else:self.private(who, 'Ñåðâèñ âðåìåííî íåäîñòóïåí :(')
  369.  
  370. def e_servermessage(self, msg):
  371. for channels in Ircbott.ircChannels:
  372. Ircbott.ircSendMessage(channels, msg)
  373.  
  374. def e_serverrestart(self, time):
  375. for channels in Ircbott.ircChannels:
  376. Ircbott.ircSendMessage(channels, '\x0310[TFM] \x0313\x02 • [SERVER] The server will restart in '+str(time)+' minutes')
  377.  
  378. def private(self, who, text):
  379. try:text = text.decode('cp1251').encode('utf-8')
  380. except:print 'bad charset'
  381. Pack = MyPack(self.b.chat)
  382. Pack.addstr(who)
  383. Pack.addstr(text)
  384. self.send(Pack, Prefix=True, serveur="Main")
  385. self.command('c ' + who + '\x20' + text)
  386.  
  387. def command(self, str):
  388. Pack = MyPack(self.b.login)
  389. Pack.addstr(str)
  390. self.send(Pack, Prefix=True, serveur="Main")
  391.  
  392. def Mainrecv(self):
  393. data = ''
  394. try:
  395. data = self.Main_socket.recv(2*1024)
  396. except socket.error:
  397. pass
  398. self.r_data += data
  399. if self.r_data != "":
  400. try:
  401. packet_size = struct.unpack('!L', self.r_data[:4])[0]
  402. except:
  403. self.r_data = ""
  404. return
  405. if packet_size <= len(self.r_data):
  406. p_data = self.r_data[:packet_size]
  407. self.r_data = self.r_data[packet_size:]
  408.  
  409. p = Packet(p_data)
  410. p.read(4)
  411. if p.seek(2) == '\x01\x01':
  412. p.read(4)
  413. p.setProtocol('old')
  414. if not (p.seek(2) in ['\x04\x03']):
  415. pass
  416. self.Parsing(p)
  417.  
  418. def Bullerecv(self):
  419. data = ''
  420. if self.mstate == "logged" and time.time()-self.dummy_last_time >= 10:self.DUMMY()
  421. if self.mstate == "logged" and time.time()-self.afk_last_time >=100:self.antiAFK_die()
  422. try:
  423. data = self.Bulle_socket.recv(2*1024)
  424. except socket.error:
  425. pass
  426. self.r_data += data
  427. if self.r_data != "":
  428. try:
  429. packet_size = struct.unpack('!L', self.r_data[:4])[0]
  430. except:
  431. self.r_data = ""
  432. return
  433. if packet_size <= len(self.r_data):
  434. p_data = self.r_data[:packet_size]
  435. self.r_data = self.r_data[packet_size:]
  436. p = Packet(p_data)
  437. p.read(4)
  438. if p.seek(2) == '\x01\x01':
  439. p.read(4)
  440. p.setProtocol('old')
  441. if not (p.seek(2) in ['\x04\x03']):
  442. pass
  443. self.Parsing(p)
  444.  
  445. if __name__ == '__main__':
  446. class Start(MyBot):
  447. def __init__(self, *args, **kwargs):
  448. MyBot.__init__(self, *args, **kwargs)
  449. def Okay():
  450. while True:
  451. Ircbott.ircListener()
  452. server = ('37.59.43.48', 443)
  453. Ircbott = Irc()
  454. Ircbott.ircConnexion(config.accountData[3], config.accountData[4])
  455. Ircbott.ircAurh(config.accountData[0], 'password', config.privatechannel, config.channels, config.logchannel)
  456. IrcTrue = threading.Thread(target=Okay)
  457. IrcTrue.start()
  458. bot = Start(config.accountData[0], config.accountData[1], config.accountData[2], 2)
  459. success = bot.Main_Connexion(server)
  460. if not success:
  461. raw_input("Press Enter to continue...")
  462. sys.exit(1)
  463. while True:
  464. time.sleep(0.001)
  465. if bot.state == 'logged':
  466. bot.Bullerecv()
  467. bot.Mainrecv()
  468. else: bot.Mainrecv()
  469. if bot.mstate == "ready":
  470. bot.auth()
  471. if bot.Main_diconnexion or bot.Bulle_diconnexion:
  472. time.sleep(15)
  473. success = bot.connect(server)
  474. if not success:
  475. print "error"
  476. bot.sock.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement