Advertisement
Guest User

Untitled

a guest
Jul 10th, 2016
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.20 KB | None | 0 0
  1. import socket
  2. import struct
  3. import random
  4. import threading
  5.  
  6. class SABot:
  7. def __init__(self, Username, Password, IP, Port):
  8. self.NullByte = struct.pack('B', 0)
  9. self.BufSize = 4096
  10. self.CommandChar = '*'
  11. self.InLobby = False
  12. self.OnlineUsers = {}
  13. self.OnlineUserMap = {}
  14. self.Dead = []
  15.  
  16. self.NameToIP = {'2D Central': '74.86.43.9:1138', 'Paper Thin City': '74.86.43.8:1138', 'Fine Line Island': '198.58.106.101:1138', 'U of SA': '69.164.207.72:1138',
  17. 'Amsterdam': '139.162.151.57:1138', 'Mobius Metro': '45.56.72.83:1138', 'Cartesian': '198.58.106.101:1139'}
  18.  
  19. self.IPToName = {'74.86.43.9:1138': '2D Central', '74.86.43.8:1138': 'Paper Thin City', '198.58.106.101:1138': 'Fine Line Island', '69.164.207.72:1138': 'U of SA',
  20. '139.162.151.57:1138': 'Amsterdam', '45.56.72.83:1138': 'Mobius Metro', '198.58.106.101:1139': 'Cartesian'}
  21.  
  22. self.ServerIP = IP
  23. self.ServerPort = Port
  24. self.Commands = True
  25. self.BotServer = self.IPToName[ '{}:{}'.format(self.ServerIP, self.ServerPort)]
  26. self.BotPassword = Password
  27.  
  28. self.connectToServer(Username, Password, self.ServerIP, self.ServerPort)
  29.  
  30. def sendPacket(self, Socket, PacketData, Receive = False):
  31. Packet = bytes(PacketData, 'utf-8')
  32.  
  33. if Socket:
  34. Socket.send(Packet + self.NullByte)
  35.  
  36. if Receive:
  37. return Socket.recv(self.BufSize).decode('utf-8')
  38.  
  39. def startKeepAlive(self, TimerSeconds = 20):
  40. if hasattr(self, 'SocketConn'):
  41. KeepAliveTimer = threading.Timer(TimerSeconds, self.startKeepAlive)
  42. KeepAliveTimer.daemon = True
  43. KeepAliveTimer.start()
  44.  
  45. self.sendPacket(self.SocketConn, '0')
  46.  
  47. def sendPrivateMessage(self, UserID, Message):
  48. if UserID != self.BotID:
  49. if UserID in self.OnlineUsers:
  50. self.sendPacket(self.SocketConn, '00' + UserID + 'P' + Message)
  51.  
  52. def sendPublicMessage(self, Message):
  53. self.sendPacket(self.SocketConn, '9' + Message)
  54.  
  55. def connectionHandler(self):
  56. Buffer = b''
  57.  
  58. while hasattr(self, 'SocketConn'):
  59. try:
  60. Buffer += self.SocketConn.recv(self.BufSize)
  61. except ConnectionAbortedError:
  62. return
  63.  
  64. if len(Buffer) == 0:
  65. print('{} has disconnected'.format(self.BotUsername))
  66. self.SocketConn.shutdown(socket.SHUT_RD)
  67. self.SocketConn.close()
  68.  
  69. break
  70. elif Buffer.endswith(self.NullByte):
  71. Receive = Buffer.split(self.NullByte)
  72. Buffer = b''
  73.  
  74. for Data in Receive:
  75. Data = Data.decode('utf-8')
  76.  
  77. if Data.startswith('U'):
  78. UserID = Data[1:][:3]
  79. Username = Data[4:][:20].replace('#', '')
  80.  
  81. self.parseUserData(Data)
  82. elif Data.startswith('D'):
  83. UserID = Data[1:][:3]
  84. Username = self.OnlineUsers[UserID]
  85.  
  86. del self.OnlineUserMap[Username]
  87. del self.OnlineUsers[UserID]
  88. elif Data.startswith('M'):
  89. UserID = Data[1:][:3]
  90.  
  91. self.parseUserMessage(UserID, Data)
  92. elif Data.startswith('0g') or Data.startswith('0j'):
  93. print('{{Server}}: {}'.format(Data[2:]))
  94. elif Data.startswith('0f') or Data.startswith('0e'):
  95. Time, Reason = Data[2:].split(';')
  96. print('This account has just been banned [Time: {} / Reason: {}]'.format(Time, Reason))
  97.  
  98. def connectToServer(self, Username, Password, ServerIP, ServerPort):
  99. try:
  100. self.SocketConn = socket.create_connection((self.ServerIP, self.ServerPort))
  101. except Exception as Error:
  102. print(Error)
  103. return
  104.  
  105. Handshake = self.sendPacket(self.SocketConn, '08HxO9TdCC62Nwln1P', True).strip(self.NullByte.decode('utf-8'))
  106.  
  107. if Handshake == '08':
  108. Credentials = '09{};{}'.format(Username, Password)
  109. RawData = self.sendPacket(self.SocketConn, Credentials, True).split(self.NullByte.decode('utf-8'))
  110.  
  111. for Data in RawData:
  112. if Data.startswith('A'):
  113. self.InLobby = True
  114. self.BotID = Data[1:][:3]
  115. self.BotUsername = Data[4:][:20].replace('#', '')
  116. self.BotCred = Data[43:].split(';')[8]
  117.  
  118. print('Bot Username: {} | Bot ID: {} | Bot Cred: {} | Located in {}'.format(self.BotID, self.BotUsername, self.BotCred, self.BotServer))
  119.  
  120. EntryPackets = ['02Z900_', '03_', '0a', '01']
  121.  
  122. for Packet in EntryPackets:
  123. self.sendPacket(self.SocketConn, Packet)
  124.  
  125. self.startKeepAlive()
  126. ConnectionThread = threading.Thread(target=self.connectionHandler)
  127. ConnectionThread.start()
  128. break
  129. elif Data == '09':
  130. print('Incorrect password')
  131. break
  132. elif Data == '091':
  133. print('Currently banned')
  134. break
  135. else:
  136. print('Server capacity check failed')
  137.  
  138. def parseUserData(self, Packet, Password = None):
  139. StatsString = Packet.replace('\x00', '')
  140. UserID = StatsString[1:][:3]
  141. Type = StatsString[:1]
  142.  
  143. if Type == 'U':
  144. if self.InLobby == True:
  145. Username = StatsString[4:][:20].replace('#', '')
  146. StatsString = StatsString[24:]
  147.  
  148. self.OnlineUsers[UserID] = Username
  149. self.OnlineUserMap[Username] = UserID
  150. else:
  151. Username = StatsString[9:][:20].replace('#', '')
  152.  
  153. self.OnlineUsers[UserID] = Username
  154. self.OnlineUserMap[Username] = UserID
  155.  
  156. def parseUserMessage(self, SenderID, Packet):
  157. if SenderID in self.OnlineUsers:
  158. Sender = self.OnlineUsers[SenderID]
  159.  
  160. NoUseTypes = ['1', '2', '4', '5', '6', '7', '8', '~']
  161. MessageType = Packet[4:][:1]
  162. SenderMessage = Packet[5:]
  163. RawMessage = Packet[1:].replace(SenderID, '')
  164.  
  165. if MessageType in NoUseTypes:
  166. return
  167. elif MessageType == '9':
  168. if self.Commands:
  169. self.handleCommand(SenderID, Sender, SenderMessage, False)
  170. elif MessageType == 'P':
  171. if self.Commands:
  172. self.handleCommand(SenderID, Sender, SenderMessage, True)
  173. else:
  174. self.handleCommand(SenderID, Sender, RawMessage, True)
  175.  
  176. try:
  177. print('[' + Sender + ']: ' + RawMessage)
  178. except:
  179. pass
  180.  
  181. def handleCommand(self, SenderID, Sender, SenderMessage, Private):
  182. RespondByPM = (False if Private == False else True)
  183. Message = SenderMessage.strip()
  184. MessageCheck = Message.split()
  185.  
  186. if Message.startswith(self.CommandChar):
  187. Command = MessageCheck[0][1:].lower()
  188. HasArguments = (True if len(MessageCheck) > 1 else False)
  189. Arguments = (' '.join(MessageCheck[1:]) if HasArguments else None)
  190.  
  191. if Command == 'reset':
  192. RespondByPM = True
  193. self.Dead = []
  194. self.BotAdmin = None
  195.  
  196. Response = 'RR list has been reset.'
  197. elif Command == 'users':
  198. RespondByPM = True
  199. UserList = []
  200.  
  201. for User in self.OnlineUserMap:
  202. UserList .append(User)
  203.  
  204. Response = 'There are {} people in the lobby. Users: {}'.format(len(UserList), ', '.join(UserList))
  205. elif Command == 'addcol' or Command == 'getcol':
  206. RespondByPM = True
  207.  
  208. if Private:
  209. if HasArguments:
  210. SpinnerType = Arguments.split()[0]
  211. RGB = Arguments.split()[1]
  212. Password = Arguments.replace(' ', '')[12:]
  213. Response = 'Attempting to add the requested RGB to your account...'
  214.  
  215. ColorRequest = threading.Thread(target=self.handleColorRequest, args=(SenderID, Sender, SpinnerType, RGB, Password))
  216. ColorRequest.daemon = True
  217. ColorRequest.start()
  218. elif Command == 'rr':
  219. if Sender not in self.Dead:
  220. GoodNumber = random.randint(0, 2)
  221. BadNumber = random.randint(0, 2)
  222.  
  223. if GoodNumber == BadNumber:
  224. self.Dead.append(Sender)
  225. Response = 'You\'re a faggot, {}'.format(Sender)
  226. else:
  227. Response = 'You arn\'t a ghost, {}'.format(Sender)
  228. elif Command == 'say':
  229. RespondByPM = False
  230.  
  231. if not Private:
  232. Response = Arguments
  233. else:
  234. if Sender == 'stickarecool':
  235. Response = Arguments
  236.  
  237. if 'Response' in locals():
  238. if Private:
  239. print('[PM from {} in {}] Response: {}'.format(Sender, self.BotServer, Response))
  240. else:
  241. print('[{} in {}] Response: {}'.format(Sender, self.BotServer, Response))
  242.  
  243. if RespondByPM:
  244. self.sendPrivateMessage(SenderID, Response)
  245. else:
  246. self.sendPublicMessage(Response)
  247.  
  248. def handleColorRequest(self, SenderID, Sender, SpinnerType, RGB, Password):
  249. SocketConn = socket.create_connection((self.ServerIP, self.ServerPort))
  250. Handshake = self.sendPacket(SocketConn, '08HxO9TdCC62Nwln1P', True).strip(self.NullByte.decode('utf-8'))
  251.  
  252. if Handshake == '08':
  253. Credentials = '09{};{}'.format(Sender, Password)
  254. RawData = self.sendPacket(SocketConn, Credentials, True)
  255.  
  256. for Data in RawData:
  257. if Data.startswith('A'):
  258. self.sendPacket(SocketConn, '02Z900_')
  259. self.sendPacket(SocketConn, '03_')
  260.  
  261. self.sendPacket(SocketConn, '0b' + SpinnerType + RGB + RGB)
  262. elif Data == '09':
  263. SentMessage = False
  264.  
  265. while not SentMessage:
  266. if SenderID in self.OnlineUsers:
  267. SentMessage = True
  268. self.sendPrivateMessage(SenderID, 'Incorrect password')
  269. break
  270.  
  271. break
  272.  
  273. SocketConn.shutdown(socket.SHUT_RD)
  274. SocketConn.close()
  275. del SocketConn
  276.  
  277. if __name__ == '__main__':
  278. Username = 'funkseason'
  279. Password = 'password'
  280.  
  281. SABot(Username, Password, '74.86.43.9', 1138)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement