archive

- Random tools & helpful resources for IRC
git clone git://git.acid.vegas/archive.git
Log | Files | Refs | Archive

anythinggoes.py (11650B)

      1 # -*- coding: utf-8 -*-
      2 #!/usr/bin/env python
      3 # THEGAME IRC Bot - Developed by acidvegas in Python (https://acid.vegas/random)
      4 import random,socket,ssl,threading,time
      5 
      6 # Config
      7 admin_ident       = 'acidvegas!*@*'
      8 channel           = '#anythinggoes'
      9 nickserv_password = 'CHANGEME'
     10 operator_password = 'CHANGEME'
     11 throttle_msg      = 0.15
     12 
     13 # Formatting Control Characters / Color Codes
     14 bold        = '\x02'
     15 italic      = '\x1D'
     16 underline   = '\x1F'
     17 reverse     = '\x16'
     18 reset       = '\x0f'
     19 white       = '00'
     20 black       = '01'
     21 blue        = '02'
     22 green       = '03'
     23 red         = '04'
     24 brown       = '05'
     25 purple      = '06'
     26 orange      = '07'
     27 yellow      = '08'
     28 light_green = '09'
     29 cyan        = '10'
     30 light_cyan  = '11'
     31 light_blue  = '12'
     32 pink        = '13'
     33 grey        = '14'
     34 light_grey  = '15'
     35 
     36 def color(msg,foreground,background=None):return f'\x03{foreground},{background}{msg}{reset}' if background else f'\x03{foreground}{msg}{reset}'
     37 def error(msg,reason):print(f'{get_time()} | [!] - {msg} ({reason})')
     38 def get_time():return time.strftime('%I:%M:%S')
     39 def random_str(size):return ''.join(random.choice('aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ') for _ in range(size))
     40 
     41 class Functions:
     42 	def banana_bomb():
     43 		for i in range(random.randint(5,10)):
     44 			spaces=random.randint(1,120)
     45 			for line in banana_data:
     46 				Bot.sendmsg(channel,' '*spaces+line)
     47 
     48 	def chat_rain(amount):
     49 		words = ('ok','tru','same','wow','nice','XD','ok','np','sup','cool','nmu','lol','ah','srry','jk')
     50 		for i in range(amount):
     51 			Bot.sendmsg(channel,' '*random.randint(3,25)+random.choice(words)+' '*random.randint(10,50)+random.choice(words)+' '*random.randint(10,50)+random.choice(words))
     52 
     53 	def crab_flood(amount):
     54 		counter=1
     55 		notify=random.randint(100,999)
     56 		if amount>=1000000:
     57 			amount=1000000
     58 			Bot.sendmsg(channel,color('GENTLEMEN! BEHOLD!',red))
     59 			Bot.sendmsg(channel,color('THE MILLION CRAB MARCH!',red))
     60 		for i in range(amount):
     61 			spaces=random.randint(1,120)
     62 			for line in crab_data:
     63 				Bot.sendmsg(channel,' '*spaces+line)
     64 			counter+=1
     65 			if counter==notify:
     66 				spaces=random.randint(1,120)
     67 				Bot.sendmsg(channel,color(' '*spaces+str(i)+' MOTHER FUCKING CRABS !!!',red))
     68 				counter=1
     69 
     70 	def grave(nick):
     71 		length=len(nick)
     72 		Bot.sendmsg(channel,color(' '*(length+8),light_blue,light_blue))
     73 		Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color('    ',light_blue,light_blue),color(' ',grey,grey),color(' '*length,light_grey,light_grey),color('    ',light_blue,light_blue)))
     74 		Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color('   ',light_blue,light_blue),color(' ', grey),color(' '*(length+2),light_grey,light_grey),color('   ',light_blue,light_blue)))
     75 		Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color('   ',light_green,light_green),color(' ', grey),color('R I P'.center(length+2),black,light_grey),color('   ',light_green,light_green)))
     76 		Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color('   ',green,green),color(' ', grey),color(nick.upper().center(length+2),black,light_grey),color('   ',light_green,light_green)))
     77 		Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color('   ',green,green),color(' ', grey),color(' '*(length+2),light_grey,light_grey),color('   ',light_green,light_green)))
     78 		Bot.sendmsg(channel,'{0}{1}{2}{3}{4}'.format(color(' ',light_green,light_green),color('  ',green,green),color(' ',grey),color('2018'.center(length+2),black,light_grey),color('   ', light_green,light_green)))
     79 		Bot.sendmsg(channel,'{0}{1}{2}{3}{4}'.format(color('  ',light_green,light_green),color(' ',green,green),color(' ',grey),color(' '*(length+2),light_grey,light_grey),color('   ',light_green,light_green)))
     80 		Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color('   ',light_green,light_green),color(' ', grey),color(' '*(length+2),light_grey,light_grey),color('   ', light_green,light_green)))
     81 
     82 	def rain(word,amount):
     83 		for i in range(amount):
     84 			Bot.sendmsg(channel,' '*random.randint(3,25)+word+' '*random.randint(10,50)+word+' '*random.randint(10,50)+word)
     85 
     86 	def rope(length):
     87 		spaces=50
     88 		prev=None
     89 		for i in range(length):
     90 			if random.choice((True,False)):
     91 				if prev!='╱':spaces+=1
     92 				char='╲'
     93 			else:
     94 				if prev!='╲':spaces-=1
     95 				char='╱'
     96 			Bot.sendmsg(channel,' '*spaces+char)
     97 			prev=char
     98 		Bot.sendmsg(channel,' '*(spaces-2)+'(;))')
     99 
    100 	def wave(msg,lines,spaces,hilite):
    101 		rainbow=['04','08','09','11','12','13']
    102 		spacer=15
    103 		spaces+=spacer
    104 		toggle=True
    105 		data=list()
    106 		for i in range(lines):
    107 			if hilite:
    108 				Bot.sendmsg(channel,'{0}{1}{2}{3}'.format((Bot.nicks[0]+': ').ljust(spacer),color('░▒▓',rainbow[1]),color(f' {msg} ',rainbow[0],rainbow[1]),color('▓▒░',rainbow[1])))
    109 				Bot.nicks.append(Bot.nicks.pop(0))
    110 			else:
    111 				Bot.sendmsg(channel, '{0}{1}{2}{3}'.format(' '*spacer,color('░▒▓',rainbow[1]),color(f' {msg} ',rainbow[0],rainbow[1]),color('▓▒░',rainbow[1])))
    112 			rainbow.append(rainbow.pop(0))
    113 			if toggle:spacer+=1
    114 			else:spacer-=1
    115 			if spacer==spaces:toggle=False
    116 			elif spacer==15:toggle=True
    117 
    118 	def worm(length):
    119 		spacer=random.randint(10,100)
    120 		Bot.sendmsg(channel,'{0}   {1}{2}'.format(' '*spacer,color('░▒▓',pink),color('▓▒░',pink)))
    121 		Bot.sendmsg(channel,'{0}  {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color('  ',black,pink),color('▓▒░',pink)))
    122 		Bot.sendmsg(channel,'{0} {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color('    ',black,pink),color('▓▒░',pink)))
    123 		for i in range(length):
    124 			Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color('      ',black,pink),color('▓▒░',pink)))
    125 			if random.choice((True,False)):spacer += 1
    126 			else:spacer-=1
    127 		Bot.sendmsg(channel,'{0} {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color('_  _',black,pink),color('▓▒░',pink)))
    128 		Bot.sendmsg(channel,'{0} {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color('o  o',black,pink),color('▓▒░',pink)))
    129 		Bot.sendmsg(channel,'{0}  {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color('  ',black,pink),color('▓▒░',pink)))
    130 
    131 class WormNet(threading.Thread):
    132 	def __init__(self):
    133 		self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    134 		threading.Thread.__init__(self)
    135 	def run(self):
    136 		Bot.wormnet=True
    137 		try:
    138 			self.sock.connect(('wormnet1.team17.com',6667))
    139 			self.raw('PASS ELSILRACLIHP')
    140 			self.raw('USER Username hostname servername :48 0 US 3.7.2.1')
    141 			self.raw('NICK SUPERNETS')
    142 			while True:
    143 				data=self.sock.recv(1024).decode('utf-8')
    144 				for line in (line for line in data.split('\r\n') if len(line.split())>=2):
    145 					Bot.sendmsg_wormnet('raw',cyan,line)
    146 					args=line.split()
    147 					if line.startswith('ERROR :Closing Link:'):raise Exception('Connection has closed.')
    148 					elif args[0]=='PING':self.raw('PONG '+args[1][1:])
    149 					elif args[1]=='001':self.raw('JOIN '+channel)
    150 					elif args[1]=='366':Bot.sendmsg_wormnet('join',green,'Joined #anythinggoes channel!')
    151 		except (UnicodeDecodeError,UnicodeEncodeError):pass
    152 		except Exception as ex:
    153 			Bot.sendmsg_wormnet('error',red,'Unknown error occured!',ex)
    154 			self.sock.close()
    155 			Bot.wormnet=False
    156 			Bot.sendmsg_wormnet('disconnected',red,'Lost connection to the WormNet relay!')
    157 	def raw(self,msg):self.sock.send(bytes(msg+'\r\n','utf-8'))
    158 	def sendmsg(self,target,msg):self.raw(f'PRIVMSG {target} :{msg}')
    159 
    160 class IRC(object):
    161 	def __init__(self):
    162 		self.nicks=list()
    163 		self.echo=False
    164 		self.sock=None
    165 		self.wormnet=False
    166 
    167 	def connect(self):
    168 		try:
    169 			self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    170 			self.sock.connect(('irc.supernets.org',6667))
    171 			self.raw(f'USER THEG 0 * :YOU LOST THE GAME')
    172 			self.raw('NICK THEGAME')
    173 			while True:
    174 				data = self.sock.recv(1024).decode('utf-8')
    175 				print(data)
    176 				for line in (line for line in data.split('\r\n') if len(line.split()) >= 2):
    177 					print(f'{get_time()} | [~] - {line}')
    178 					args = line.split()
    179 					if args[0]=='PING':
    180 						self.raw('PONG '+args[1][1:])
    181 					elif args[1]=='001':
    182 						self.raw('MODE THEGAME +BDd')
    183 						self.sendmsg('NickServ','IDENTIFY THEGAME '+nickserv_password)
    184 						self.raw(f'OPER thegame {operator_password}')
    185 						self.raw('JOIN '+channel)
    186 					elif args[1]=='433':self.raw('NICK THE_GAME_'+str(random.randint(10,99)))
    187 					elif args[1]=='353' and len(args)>=6:self.nicks+=' '.join(args[5:])[2:].split()
    188 					elif args[1]=='JOIN' and len(args)==3:self.raw('NOTICE {0} :Thank you for joining #AnythingGoes, you have {1} memo(s) waiting. Please type /server MemoServ read to check your messages.'.format(args[0].split('!')[0][1:],color(random.randint(1,3),red)))
    189 					elif args[1]=='PART' and len(args)>=3:
    190 						self.sendmsg(args[2],color('EMO-PART DETECTED',red))
    191 						self.sendmsg(args[0].split('!')[0][1:],'bet u wont come back pussy...')
    192 					elif args[1]=='PRIVMSG' and len(args)>=4:
    193 						ident=args[0][1:]
    194 						nick=args[0].split('!')[0][1:]
    195 						chan=args[2]
    196 						msg= ' '.join(args[3:])[1:]
    197 						if chan==channel:self.event_message(ident,nick,chan,msg)
    198 					elif args[1]=='QUIT':Functions.grave(args[0].split('!')[0][1:])
    199 		except(UnicodeDecodeError,UnicodeEncodeError):pass
    200 		except Exception as ex:
    201 			print(ex)
    202 			self.sock.close()
    203 		time.sleep(15)
    204 		self.connect()
    205 
    206 	def event_message(self,ident,nick,chan,msg):
    207 		args=msg.split()
    208 		if msg[:1]=='!':
    209 			if msg=='!bananabomb':Functions.banana_bomb()
    210 			elif msg=='!crate':
    211 				for line in crate_data:self.sendmsg(channel,line)
    212 			elif msg=='!echo':
    213 				self.echo=False if self.echo else True
    214 			elif msg=='refresh':
    215 				self.nicks=list()
    216 				self.raw('NAMES #anythinggoes')
    217 			elif msg=='!wormnet':WORMS.start()
    218 			elif msg=='!worms':
    219 				for line in worms_data:self.sendmsg(channel, line)
    220 			elif len(args)==2:
    221 				if args[1].isdigit():
    222 					amount=int(args[1])
    223 					if args[0]=='!chatrain':
    224 						if amount<=100 or ident==admin_ident:Functions.chat_rain(amount)
    225 						else:self.sendmsg(chan,'Max: 100')
    226 					elif msg.startswith('!crabflood'):
    227 						if amount<=10 or ident==admin_ident:Functions.crab_flood(amount)
    228 						else:self.sendmsg(chan,'Max: 10')
    229 					elif msg.startswith('!rope'):
    230 						if amount<=100 or ident==admin_ident:Functions.rope(amount)
    231 						else:self.sendmsg(chan,'Max: 100')
    232 					elif msg.startswith('!worm'):
    233 						if amount<=100 or ident==admin_ident:Functions.worm(amount)
    234 						else:self.sendmsg(chan,'Max: 100')
    235 			elif args[0]=='!rain' and len(args)>=3:
    236 				amount=args[1]
    237 				data=' '.join(args[2:])
    238 				if args[1].isdigit():
    239 					if int(args[1])<=100 or ident==admin_ident:Functions.rain(data,int(args[1]))
    240 					else:self.sendmsg(chan,'Max: 100')
    241 			elif args[0] in ('!wave','!wavehl') and len(args)>=4:
    242 				lines =args[1]
    243 				spaces=args[2]
    244 				data=' '.join(args[3:])
    245 				if lines.isdigit() and spaces.isdigit():
    246 					if int(lines)<=100 or ident==admin_ident:
    247 						if args[0]=='!wave':
    248 							Functions.wave(data,int(lines),int(spaces),False)
    249 						else:
    250 							Functions.wave(data,int(lines),int(spaces),True)
    251 					else:self.sendmsg(chan,'Max: 100')
    252 		elif self.echo:self.sendmsg(chan,msg)
    253 
    254 	def raw(self,msg):self.sock.send(bytes(msg+'\r\n','utf-8'))
    255 	def sendmsg(self,target,msg):
    256 		time.sleep(throttle_msg)
    257 		self.raw(f'PRIVMSG {target} :{msg}')
    258 	def sendmsg_wormnet(self,title,title_color,msg,extra=None):
    259 		if extra:self.sendmsg(channel,'[{0}] [{1}] {2} {3}'.format(color('WORMNET',pink),color(title,title_color),msg,color('({0})'.format(extra),grey)))
    260 		else:self.sendmsg(channel,'[{0}] [{1}] {2}'.format(color('WORMNET',pink),color(title,title_color),msg))
    261 
    262 # Main
    263 banana_data=open('data/banana.txt').readlines()
    264 crab_data=open('data/crab.txt').readlines()
    265 crate_data=open('data/crate.txt').readlines()
    266 worms_data=open('data/worms.txt').readlines()
    267 Bot=IRC()
    268 WORMS=WormNet()
    269 Bot.connect()