Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import math
- import json
- import time
- import socks
- import socket
- import struct
- import random
- import hashlib
- import sqlite3
- import requests
- import datetime
- import threading
- from xml.dom import minidom
- # http://api.xgenstudios.com/?method=xgen.stickarena.stats.get&username={}
- # http://api.xgenstudios.com/?method=xgen.users.changeName&username={}&password={}&new_username={}
- # http://api.xgenstudios.com/?method=xgen.users.add&username={}&password={}&email_address={}&v=2
- # http://api.xgenstudios.com/?method=xgen.users.addEmail&username={}&password={}&email={}
- # http://api.xgenstudios.com/?method=xgen.users.changePassword&username={}&password={}&new_password={}
- class SABot:
- def __init__(self, Username, Password, IP, Port, Commands):
- self.DatabaseFile = 'SABot.db'
- self.DatabaseConn = sqlite3.connect(self.DatabaseFile, check_same_thread=False)
- self.Database = self.DatabaseConn.cursor()
- self.Database.execute("""CREATE TABLE IF NOT EXISTS users
- (username VARCHAR(20) UNIQUE COLLATE NOCASE NOT NULL,
- rgb VARCHAR(9) NOT NULL,
- hex VARCHAR(6) NOT NULL,
- kills VARCHAR(30) NOT NULL,
- deaths VARCHAR(30) NOT NULL,
- wins VARCHAR(30) NOT NULL,
- losses VARCHAR(30) NOT NULL,
- rounds VARCHAR(30) NOT NULL,
- ballistick BOOLEAN NOT NULL,
- access BOOLEAN NOT NULL,
- lastseen VARCHAR(30) NULL,
- status BOOLEAN NOT NULL DEFAULT 0)
- """)
- self.Database.execute("""CREATE TABLE IF NOT EXISTS blacklist
- (username VARCHAR(20) UNIQUE COLLATE NOCASE NOT NULL,
- color BOOLEAN NOT NULL,
- location BOOLEAN NOT NULL)
- """)
- self.DatabaseConn.commit()
- self.NullByte = struct.pack('B', 0)
- self.BufSize = 4096
- self.CommandChar = '.'
- self.InLobby = False
- self.AutoRespond = True
- self.OnlineUsers = {}
- self.OnlineUserMap = {}
- self.BotAdmin = '' # set
- self.Dead = []
- self.Blacklist = [] # will ignore from specified users
- self.BadStatusCodes = [400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413,
- 414, 415, 416, 417, 500, 501, 502, 503, 504, 505]
- self.BotResponses = ['It is certain', 'It is decidedly so', 'Without a doubt', 'Yes, definitely', 'You may rely on it',
- 'As I see it, yes', 'Most likely', 'Outlook good', 'Yes', 'Signs point to yes', 'No, but at least I still love you',
- 'My sources say no', 'Outlook not so good', 'Very doubtful', 'Ask someone who cares', 'Not in a million years',
- 'As if', 'Dumb question, ask another', 'Yeah and I\'m the pope', 'Ask me if I care', 'All signs point to you sucking actually',
- 'Please for the love of god leave me alone, you must be lonely', 'All signs point to yes, or maybe no']
- 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',
- 'Amsterdam': '139.162.151.57:1138', 'Mobius Metro': '45.56.72.83:1138', 'Cartesian': '198.58.106.101:1139'}
- 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',
- '139.162.151.57:1138': 'Amsterdam', '45.56.72.83:1138': 'Mobius Metro', '198.58.106.101:1139': 'Cartesian'}
- self.ServerIP = IP
- self.ServerPort = Port
- self.Commands = Commands
- self.BotServer = self.IPToName[ '{}:{}'.format(self.ServerIP, self.ServerPort)]
- socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, 'localhost', 9150)
- socket.create_connection = socks.create_connection
- socket.socket = socks.socksocket
- self.connectToServer(Username, Password, self.ServerIP, self.ServerPort)
- def executeDatabaseQuery(self, Query, Parameters = None, ExecuteMany = False, ReturnResults = False):
- QueryFinished = False
- while not QueryFinished:
- try:
- if ExecuteMany and Parameters:
- self.Database.executemany(Query, Parameters)
- else:
- if Parameters:
- self.Database.execute(Query, Parameters)
- else:
- self.Database.execute(Query)
- if ReturnResults:
- QueryFinished = True
- Results = self.Database.fetchall()
- self.DatabaseConn.commit()
- if 'Results' in locals():
- return Results
- else:
- return
- except sqlite3.OperationalError:
- pass
- except Exception as Error:
- QueryFinished = True
- print('[could not save query]: ' + Error)
- def changeUsername(self, Username, Password, NewUsername): # not implemented with bot commands
- APIData = {'username': Username, 'password': Password, 'new_username': NewUsername}
- RequestData = minidom.parseString(requests.get('http://api.xgenstudios.com/?method=xgen.users.changeName', params=APIData).text)
- Response = RequestData.getElementsByTagName('rsp')[0].attributes['stat'].value
- if Response == 'fail':
- return RequestData.getElementsByTagName('err')[0].attributes['msg'].value
- else:
- return 'Username successfully changed'
- def createAccount(self, Username, Password, UseAPI = False): # also not implemented with commands
- if UseAPI:
- APIData = {'username': Username, 'password': Password, 'v': '2'}
- URLData = requests.get('http://api.xgenstudios.com/?method=xgen.users.add', params=APIData).text
- Response = minidom.parseString(URLData).getElementsByTagName('rsp')[0].attributes['stat'].value
- if Response == 'fail':
- Returned = 'Could not create ' + Username
- else:
- Returned = 'Successfully created ' + Username
- else:
- PostData = {'username': Username, 'userpass': Password, 'usercol': '090090190', 'action': 'create'}
- URLData = requests.post('http://www.xgenstudios.com/stickarena/stick_arena.php', data=PostData).text
- if 'success' in URLData:
- Returned = 'Successfully created ' + Username
- else:
- Returned = 'Could not create ' + Username
- return Returned
- def sendPacket(self, Socket, PacketData, Receive = False):
- Packet = bytes(PacketData, 'utf-8')
- if Socket:
- Socket.send(Packet + self.NullByte)
- if Receive:
- return Socket.recv(self.BufSize).decode('utf-8')
- def startKeepAlive(self, TimerSeconds = 20):
- if hasattr(self, 'SocketConn'):
- KeepAliveTimer = threading.Timer(TimerSeconds, self.startKeepAlive)
- KeepAliveTimer.daemon = True
- KeepAliveTimer.start()
- self.sendPacket(self.SocketConn, '0')
- def sendPrivateMessage(self, UserID, Message):
- if UserID != self.BotID:
- if UserID in self.OnlineUsers:
- self.sendPacket(self.SocketConn, '00' + UserID + 'P' + Message)
- def sendPublicMessage(self, Message):
- self.sendPacket(self.SocketConn, '9' + Message)
- def connectionHandler(self):
- Buffer = b''
- while hasattr(self, 'SocketConn'):
- try:
- Buffer += self.SocketConn.recv(self.BufSize)
- except OSError:
- if hasattr(self, 'SocketConn'):
- self.SocketConn.shutdown(socket.SHUT_RD)
- self.SocketConn.close()
- if len(Buffer) == 0:
- print('Disconnected')
- self.executeDatabaseQuery("UPDATE users SET status = 0")
- self.DatabaseConn.close()
- break
- elif Buffer.endswith(self.NullByte):
- Receive = Buffer.split(self.NullByte)
- Buffer = b''
- for Data in Receive:
- Data = Data.decode('utf-8')
- if Data.startswith('U'):
- UserID = Data[1:][:3]
- Username = Data[4:][:20].replace('#', '')
- self.parseUserData(Data)
- elif Data.startswith('D'):
- UserID = Data[1:][:3]
- Username = self.OnlineUsers[UserID]
- self.executeDatabaseQuery("UPDATE users SET status = 0 WHERE username = ?", [(Username)])
- CurrentInfo = '{}:{};{}'.format(self.ServerIP, self.ServerPort, time.strftime('%m/%d/%Y at %H:%M (EST)'))
- self.executeDatabaseQuery("UPDATE users SET lastseen = ? WHERE username = ?", [(CurrentInfo, Username)], True)
- del self.OnlineUserMap[Username]
- del self.OnlineUsers[UserID]
- elif Data.startswith('M'):
- UserID = Data[1:][:3]
- self.parseUserMessage(UserID, Data)
- elif Data.startswith('0g') or Data.startswith('0j'):
- print('{{Server}}: {}'.format(Data[2:]))
- elif Data.startswith('093'):
- print('Secondary login')
- break
- elif Data.startswith('0f') or Data.startswith('0e'):
- Time, Reason = Data[2:].split(';')
- print('This account has just been banned [Time: {} / Reason: {}]'.format(Time, Reason))
- elif Data.startswith('0c'):
- print(Data[2:])
- def connectToServer(self, Username, Password, ServerIP, ServerPort):
- if Username.lower() == '': # if running multiple bots, set to first one to ensure it doesn't reset the db users status
- self.executeDatabaseQuery("UPDATE users SET status = 0")
- try:
- self.SocketConn = socket.create_connection((ServerIP, ServerPort), socks.PROXY_TYPE_SOCKS5, 'localhost', 9150)
- except Exception as Error:
- print(Error)
- return
- Handshake = self.sendPacket(self.SocketConn, '08HxO9TdCC62Nwln1P', True).strip(self.NullByte.decode('utf-8'))
- if Handshake == '08':
- Credentials = '09{};{}'.format(Username, Password)
- RawData = self.sendPacket(self.SocketConn, Credentials, True).split(self.NullByte.decode('utf-8'))
- for Data in RawData:
- if Data.startswith('A'):
- self.InLobby = True
- self.BotID = Data[1:][:3]
- self.BotUsername = Data[4:][:20].replace('#', '')
- print('Bot Username: {} / Bot ID: {} / Located in {}'.format(self.BotUsername, self.BotID, self.BotServer))
- EntryPackets = ['02Z900_', '03_', '0a', '01']
- for Packet in EntryPackets:
- self.sendPacket(self.SocketConn, Packet)
- self.startKeepAlive()
- ConnectionThread = threading.Thread(target=self.connectionHandler)
- ConnectionThread.start()
- break
- elif Data == '09':
- print('Incorrect password')
- break
- elif Data == '091':
- print('Currently banned')
- break
- else:
- print('Server capacity check failed')
- def parseUserData(self, Packet, Password = None):
- StatsString = Packet.replace('\x00', '')
- UserID = StatsString[1:][:3]
- Type = StatsString[:1]
- if Type == 'U':
- if self.InLobby == True:
- Username = StatsString[4:][:20].replace('#', '')
- StatsString = StatsString[24:]
- self.OnlineUsers[UserID] = Username
- self.OnlineUserMap[Username] = UserID
- RGBString = StatsString[:9]
- R = int(RGBString[:3])
- G = int(RGBString[3:][:3])
- B = int(RGBString[6:][:3])
- HexString = '#%02x%02x%02x' % (R, G, B)
- Stats = StatsString[9:].split(';')
- CurrentInfo = '{}:{};{}'.format(self.ServerIP, self.ServerPort, time.strftime('%m/%d/%Y at %H:%M (EST)'))
- Data = [(Username, RGBString, HexString, Stats[0], Stats[1], Stats[2], Stats[3], Stats[4], Stats[5], Stats[6], CurrentInfo, '1')]
- self.executeDatabaseQuery("INSERT OR REPLACE INTO users VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", Data, True)
- self.executeDatabaseQuery("INSERT OR IGNORE INTO blacklist VALUES (?, ?, ?)", [(Username, '0', '0')], True)
- else:
- Username = StatsString[9:][:20].replace('#', '')
- self.OnlineUsers[UserID] = Username
- self.OnlineUserMap[Username] = UserID
- def parseUserMessage(self, SenderID, Packet):
- if SenderID in self.OnlineUsers:
- Sender = self.OnlineUsers[SenderID]
- if Sender in self.Blacklist:
- return
- NoUseTypes = ['1', '2', '4', '5', '6', '7', '8', '~']
- MessageType = Packet[4:][:1]
- SenderMessage = Packet[5:]
- RawMessage = Packet[1:].replace(SenderID, '')
- if MessageType in NoUseTypes:
- return
- elif MessageType == '9':
- if self.Commands:
- self.handleCommand(SenderID, Sender, SenderMessage, False)
- elif MessageType == 'P':
- if self.Commands:
- self.handleCommand(SenderID, Sender, SenderMessage, True)
- elif MessageType == 'K':
- Kicker = Sender
- KickerID = SenderID
- if SenderMessage == self.BotID:
- self.sendPublicMessage('{} is trying to kick me'.format(Kicker))
- return
- ToKick = self.OnlineUsers[SenderMessage]
- ToKickID = SenderMessage
- if ToKick == self.BotAdmin:
- self.sendPublicMessage('Do not kick {}, {}.'.format(self.BotAdmin, Kicker))
- else:
- if Kicker == self.BotAdmin:
- self.sendPublicMessage('Autokicking {}'.format(ToKick))
- self.sendPacket(self.SocketConn, 'K{}'.format(ToKickID))
- else:
- self.sendPublicMessage('{} is trying to kick {}'.format(Kicker, ToKick))
- else:
- self.handleCommand(SenderID, Sender, RawMessage, True)
- try:
- print('[' + Sender + ']: ' + RawMessage)
- except:
- pass
- def handleCommand(self, SenderID, Sender, SenderMessage, Private):
- RespondByPM = (False if Private == False else True)
- Message = SenderMessage.strip()
- MessageCheck = Message.split()
- if Message.startswith(self.CommandChar):
- Command = MessageCheck[0][1:].lower()
- HasArguments = (True if len(MessageCheck) > 1 else False)
- Arguments = (' '.join(MessageCheck[1:]) if HasArguments else None)
- if Sender == self.BotAdmin:
- if Command == 'exec':
- if HasArguments:
- try:
- exec(Arguments)
- except Exception as Error:
- print('{}'.format(Error))
- elif Command == 'reset':
- RespondByPM = True
- if HasArguments:
- ResetTarget = MessageCheck[1].lower()
- if ResetTarget == 'rr':
- self.Dead = []
- Response = 'Reset the list of the dead.'
- elif ResetTarget == 'owner':
- self.BotAdmin = None
- Response = 'Reset bot owner.'
- else:
- Response = 'Invalid reset target.'
- else:
- self.Dead = []
- self.BotAdmin = None
- Response = 'Reset all items. You are no longer the current bot owner.'
- elif Command == 'users':
- RespondByPM = True
- UserList = []
- for User in self.OnlineUserMap:
- UserList .append(User)
- Response = 'There are {} people in the lobby. Users: {}'.format(len(UserList), ', '.join(UserList))
- if Command == 'blacklist':
- RespondByPM = True
- if HasArguments:
- Target = Arguments.replace(' ', '').lower()
- Username = Sender
- Results = self.executeDatabaseQuery("SELECT * FROM blacklist WHERE username = ?", [(Username)], False, True)
- if Results:
- if Target == 'color':
- Blacklisted = Results[0][1]
- if Blacklisted:
- self.executeDatabaseQuery("UPDATE blacklist SET color = 0 WHERE username = ?", [(Username)])
- Response = 'Your color codes can now be publicly requested.'
- else:
- self.executeDatabaseQuery("UPDATE blacklist SET color = 1 WHERE username = ?", [(Username)])
- Response = 'Your color codes can no longer be publicly requested.'
- elif Target == 'location':
- Blacklisted = Results[0][2]
- if Blacklisted:
- self.executeDatabaseQuery("UPDATE blacklist SET location = 0 WHERE username = ?", [(Username)])
- Response = 'Your location can now be publicly requested.'
- else:
- self.executeDatabaseQuery("UPDATE blacklist SET location = 1 WHERE username = ?", [(Username)])
- Response = 'Your location can no longer be publicly requested.'
- else:
- Username = Sender
- Results = self.executeDatabaseQuery("SELECT * FROM blacklist WHERE username = ?", [(Username)], False, True)
- if Results:
- ColorBlacklisted = Results[0][1]
- LocationBlacklisted = Results[0][2]
- if ColorBlacklisted:
- ColorBlacklisted = 0
- self.executeDatabaseQuery("UPDATE blacklist SET color = 0 WHERE username = ?", [(Username)])
- else:
- ColorBlacklisted = 1
- self.executeDatabaseQuery("UPDATE blacklist SET color = 1 WHERE username = ?", [(Username)])
- if LocationBlacklisted:
- LocationBlacklisted = 0
- self.executeDatabaseQuery("UPDATE blacklist SET location = 0 WHERE username = ?", [(Username)])
- else:
- LocationBlacklisted = 1
- self.executeDatabaseQuery("UPDATE blacklist SET location = 1 WHERE username = ?", [(Username)])
- ColorBlacklisted = ('Your color codes can no longer be publicly requested' if ColorBlacklisted else 'Your color codes can be publicly requested')
- LocationBlacklisted = ('Your location can no longer be publicly requested' if LocationBlacklisted else 'Your location can be publicly requested')
- Response = '{}; {}'.format(ColorBlacklisted, LocationBlacklisted)
- elif Command == 'hex' or Command == 'rgb':
- RespondByPM = True
- if HasArguments:
- Arguments = Arguments.replace(' ', '')
- Target = Arguments
- else:
- Target = Sender
- Results = self.executeDatabaseQuery("SELECT * FROM blacklist WHERE lower(username) = ?", [(Target.lower())], False, True)
- if Results:
- Username = Results[0][0]
- Blacklisted = Results[0][1]
- else:
- Username = Target
- Blacklisted = 0
- Results = self.executeDatabaseQuery("SELECT * FROM users WHERE lower(username) = ?", [(Username.lower())], False, True)
- if Results:
- RGB = Results[0][1]
- Hex = Results[0][2]
- if Sender.lower() == Username.lower():
- BlacklistCheck = ('blacklisted.' if Blacklisted else 'not blacklisted.')
- Response = 'Your color codes: [RGB]: {} | [Hex]: {} / You are {}'.format(RGB, Hex, BlacklistCheck)
- else:
- if Blacklisted:
- if Sender == self.BotAdmin:
- Response = '[Blacklisted] {}\'s color codes: [RGB]: {} | [Hex]: {}'.format(Username, RGB, Hex)
- else:
- Response = '{} isn\'t allowing requests for their color.'.format(Username)
- else:
- Response = '{}\'s color codes: [RGB]: {} | [Hex]: {}'.format(Username, RGB, Hex)
- else:
- Response = 'There are currently no color codes stored for "{}"'.format(Target)
- elif Command == 'addcol' or Command == 'getcol':
- RespondByPM = True
- if Private:
- if HasArguments:
- try:
- SpinnerType = Arguments.split()[0]
- RGB = Arguments.split()[1]
- Password = Arguments.replace(' ', '')[12:]
- Response = 'Attempting to add the requested RGB to your account...'
- ColorRequest = threading.Thread(target=self.handleColorRequest, args=(SenderID, Sender, SpinnerType, RGB, Password))
- ColorRequest.daemon = True
- ColorRequest.start()
- except Exception as Error:
- print(Error)
- Response = 'Incorrect usage of this command. Example: .getcol 100 255000000 Password'
- else:
- Response = 'This command can not be used in the public chat.'
- elif Command == 'stats':
- RespondByPM = True
- if HasArguments:
- Arguments = Arguments.replace(' ', '')
- if len(Arguments) <= 20:
- Target = Arguments
- Valid = True
- else:
- Response = 'Invalid username.'
- Valid = False
- else:
- Target = Sender
- Valid = True
- if Valid:
- APIURL = 'http://api.xgenstudios.com/?method=xgen.stickarena.stats.get&username={}'.format(Target)
- APIData = minidom.parseString(requests.get(APIURL).text)
- URLResp = APIData.getElementsByTagName('rsp')[0].attributes['stat'].value
- Username = APIData.getElementsByTagName('user')[0].attributes['username'].value
- if URLResp == 'ok':
- if Username != '':
- StatTag = APIData.getElementsByTagName('stat')
- Wins = StatTag[0].firstChild.nodeValue
- Losses = StatTag[1].firstChild.nodeValue
- Kills = StatTag[2].firstChild.nodeValue
- Deaths = StatTag[3].firstChild.nodeValue
- Rounds = StatTag[4].firstChild.nodeValue
- Ballistick = StatTag[5].firstChild.nodeValue
- UserStatus = int(APIData.getElementsByTagName('user')[0].attributes['perms'].value)
- BanCheck = ('Yes' if UserStatus < 0 else 'No')
- ModCheck = ('Yes' if UserStatus > 0 else 'No')
- LabpassCheck = ('Yes' if Ballistick == '1' else 'No')
- StatsString = 'Wins: {} / Losses: {} / Kills: {} / Deaths: {} / Rounds: {}/ Labpass: {} / Banned: {} / Mod: {}'.format(Wins, Losses, Kills, Deaths, Rounds, LabpassCheck, BanCheck, ModCheck)
- if len(StatsString) <= 135:
- Response = StatsString
- else:
- print('Stats string was too long to send') # should never happen but Justin Case hahaha... no..? ok.
- else:
- Response = '{} does not exist.'.format(Target)
- elif Command == 'rr':
- if Sender not in self.Dead:
- GoodNumber = random.randint(0, 2)
- BadNumber = random.randint(0, 2)
- if GoodNumber == BadNumber:
- self.Dead.append(Sender)
- Response = 'You\'re dead, {}'.format(Sender)
- else:
- Response = 'You live, {}'.format(Sender)
- elif Command == 'find':
- RespondByPM = True
- if HasArguments:
- Target = Arguments.replace(' ', '').lower()
- if Target.startswith('*mod'): # will search for any user listed in db as status online and access level > 0
- Results = self.executeDatabaseQuery("SELECT * FROM users WHERE access != 0", None, False, True)
- if Results:
- OnlineMods = []
- for Mod in Results:
- if Mod[11] == 1:
- OnlineMods.append(Mod[0])
- if len(OnlineMods) == 0:
- Response = 'There are currently no mods online in any lobby I am located in.'
- else:
- Response = 'Online Mods: {}'.format(', '.join(OnlineMods))
- else:
- Results = self.executeDatabaseQuery("SELECT * FROM blacklist WHERE lower(username) = ?", [(Target.lower())], False, True)
- if Results:
- Username = Results[0][0]
- Blacklisted = Results[0][2]
- if Blacklisted and Sender != self.BotAdmin:
- Response = '{} is not allowing requests for their location.'.format(Username)
- Retrieve = False
- else:
- Retrieve = True
- else:
- Retrieve = True
- if Retrieve:
- Results = self.executeDatabaseQuery("SELECT * FROM users WHERE lower(username) = ?", [(Target)], False, True)
- if Results:
- Username = Results[0][0]
- LastSeen = Results[0][10]
- Status = Results[0][11]
- if LastSeen != None:
- Server, Time = LastSeen.split(';')
- ServerName = self.IPToName[Server]
- if Status == 1:
- Response = '{} is currently online in {}'.format(Username, ServerName)
- else:
- Response = '{} was last seen in {} on {}'.format(Username, ServerName, Time)
- else:
- Response = '{} has no last seen record.'.format(Username)
- else:
- Response = 'No record is stored for "{}"'.format(Target)
- elif '8ball' in SenderMessage:
- if len(MessageCheck) >= 2 and len(MessageCheck[1]) >= 2:
- Response = '{}, {}'.format(random.choice(self.BotResponses), Sender)
- else:
- if self.AutoRespond and Private:
- Response = 'Hello, {}!'.format(Sender)
- if 'Response' in locals():
- if Private:
- print('[PM from {} in {}] Response: {}'.format(Sender, self.BotServer, Response))
- else:
- print('[{} in {}] Response: {}'.format(Sender, self.BotServer, Response))
- if RespondByPM:
- self.sendPrivateMessage(SenderID, Response)
- else:
- self.sendPublicMessage(Response)
- def handleColorRequest(self, SenderID, Sender, SpinnerType, RGB, Password):
- SocketConn = socket.create_connection((self.ServerIP, self.ServerPort), socks.PROXY_TYPE_SOCKS5, 'localhost', 9150)
- Handshake = self.sendPacket(SocketConn, '08HxO9TdCC62Nwln1P', True).strip(self.NullByte.decode('utf-8'))
- if Handshake == '08':
- Credentials = '09{};{}'.format(Sender, Password)
- RawData = self.sendPacket(SocketConn, Credentials, True)
- for Data in RawData:
- if Data.startswith('A'):
- self.sendPacket(SocketConn, '02Z900_')
- self.sendPacket(SocketConn, '03_')
- self.sendPacket(SocketConn, '0b' + SpinnerType + RGB + RGB)
- break
- elif Data == '09':
- self.sendPrivateMessage(SenderID, 'Incorrect password')
- break
- SocketConn.shutdown(socket.SHUT_RD)
- SocketConn.close()
- del SocketConn
- if __name__ == '__main__': # rest in pieces
- SABot('machiev', 'cat', '74.86.43.8', 1138, True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement