archive

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

hugecock.py (8800B)

      1 #!/usr/bin/env python
      2 # HUGECOCK (as seen in #efnetnews)
      3 # Developed by acidvegas/vap0r in Python 3
      4 # https://github.com/acidvegas/random
      5 # hugecock.py
      6 
      7 '''
      8 Patreon : https://www.patreon.com/efnetnews
      9 Twitter : https://twitter.com/pp4l
     10 YouTube : https://www.youtube.com/channel/UCrB3e00DBKTyVhGLrrGuhOw
     11 '''
     12 
     13 import os
     14 import random
     15 import socket
     16 import ssl
     17 import time
     18 import threading
     19 
     20 # Connection
     21 server   = 'irc.efnet.org'
     22 port     = 6667
     23 use_ipv6 = False
     24 use_ssl  = False
     25 vhost    = None
     26 password = None
     27 channel  = '#efnetnews'
     28 key      = None
     29 
     30 # Identity
     31 nickname = 'HUGECOCK'
     32 username = 'HUGECOCK'
     33 realname = 'HUGECOCK'
     34 
     35 # Globals (DO NOT EDIT)
     36 random_file  = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'random.txt')
     37 
     38 # Formatting Control Characters / Color Codes
     39 bold        = '\x02'
     40 italic      = '\x1D'
     41 underline   = '\x1F'
     42 reverse     = '\x16'
     43 reset       = '\x0f'
     44 white       = '00'
     45 black       = '01'
     46 blue        = '02'
     47 green       = '03'
     48 red         = '04'
     49 brown       = '05'
     50 purple      = '06'
     51 orange      = '07'
     52 yellow      = '08'
     53 light_green = '09'
     54 cyan        = '10'
     55 light_cyan  = '11'
     56 light_blue  = '12'
     57 pink        = '13'
     58 grey        = '14'
     59 light_grey  = '15'
     60 
     61 def debug(msg):
     62     print(f'{get_time()} | [~] - {msg}')
     63 
     64 def error(msg, reason=None):
     65     if reason:
     66         print(f'{get_time()} | [!] - {msg} ({reason})')
     67     else:
     68         print(f'{get_time()} | [!] - {msg}')
     69 
     70 def get_time():
     71     return time.strftime('%I:%M:%S')
     72 
     73 class IRC(object):
     74     server    = server
     75     port      = port
     76     use_ipv6  = use_ipv6
     77     use_ssl   = use_ssl
     78     vhost     = vhost
     79     password  = password
     80     channel   = channel
     81     key       = key
     82     username  = username
     83     realname  = realname
     84 
     85     def __init__(self):
     86         self.nickname  = nickname
     87         self.connected = False
     88         self.last_time = 0
     89         self.sock      = None
     90 
     91     def action(self, chan, msg):
     92         self.sendmsg(chan, f'\x01ACTION {msg}\x01')
     93 
     94     def color(self, msg, foreground, background=None):
     95         if background:
     96             return f'\x03{foreground},{background}{msg}{reset}'
     97         else:
     98             return f'\x03{foreground}{msg}{reset}'
     99 
    100     def connect(self):
    101         try:
    102             self.create_socket()
    103             self.sock.connect((self.server, self.port))
    104             if self.password:
    105                 self.raw('PASS ' + self.password)
    106             self.raw(f'USER {self.username} 0 * :{self.realname}')
    107             self.nick(self.nickname)
    108         except socket.error as ex:
    109             error('Failed to connect to IRC server.', ex)
    110             self.event_disconnect()
    111         else:
    112             self.listen()
    113 
    114     def create_socket(self):
    115         if self.use_ipv6:
    116             self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
    117         else:
    118             self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    119         if self.vhost:
    120             self.sock.bind((self.vhost, 0))
    121         if self.use_ssl:
    122             self.sock = ssl.wrap_socket(self.sock)
    123 
    124     def event_connect(self):
    125         self.connected = True
    126         self.join(self.channel, self.key)
    127         threading.Thread(target=self.loop).start()
    128 
    129     def event_disconnect(self):
    130         self.connected = False
    131         self.sock.close()
    132         time.sleep(10)
    133         self.connect()
    134 
    135     def event_join(self, nick, chan):
    136         if nick.lower() == 'zardoz':
    137             self.sendmsg(chan, nick)
    138         self.notice(nick, f'Thank you for joining #EFNetNews, you have {0} memos waiting. Please type /server MemoServ read to check your messages.'.format(color('3', red)))
    139 
    140     def event_kick(self, nick, chan, kicked):
    141         if kicked == self.nickname and chan == self.channel:
    142             time.sleep(3)
    143             self.join(self.channel, self.key)
    144 
    145     def event_message(self, nick, chan, msg):
    146         if random.choice((True,False,False,False)):
    147             if 'http://' in msg or 'https://' in msg or 'www.' in msg:
    148                 self.sendmsg(chan, underline + 'not clicking')
    149             elif msg == 'h':
    150                 self.sendmsg(chan, 'h')
    151             elif msg == 'pump':
    152                 self.sendmsg(chan, 'penis')
    153             elif msg == 'penis':
    154                 self.sendmsg(chan, 'pump')
    155             elif 'ddos' in msg:
    156                 self.sendmsg(chan, 'Dudes Drink Owl Sperm')
    157             elif 'fag' in msg:
    158                 self.sendmsg(chan, 'i hate faggots more than i hate war in this world')
    159             elif self.nickname in msg:
    160                 self.action(chan, '8=================================================================D')
    161             elif msg.lower() == 'lol':
    162                 self.sendmsg(chan, 'lol')
    163             elif msg == '%%':
    164                 self.sendmsg(chan, '%%')
    165             elif 'supernets' in msg.lower():
    166                 self.sendmsg(chan, self.color('HAVE YOU HEARD ABOUT IRC.SUPERNETS.ORG ???', light_blue))
    167             elif 'readerr' in msg.lower():
    168                 if random.choice((True,False)):
    169                     self.sendmsg(chan, 'can we kill ReadErr')
    170                 else:
    171                     self.sendmsg(chan, 'can we ban ReadErr')
    172 
    173     def event_nick_in_use(self):
    174         self.nickname = self.nickname + '_'
    175         self.nick(self.nickname)
    176 
    177     def event_part(self, nick, chan):
    178         self.sendmsg(nick, 'bet u wont come back pussy')
    179         self.sendmsg(chan, self.color('EMOPART DETECTED', red, yellow))
    180 
    181     def event_quit(self, nick):
    182         if time.time() - self.last_time > 15:
    183             self.nick(nick)
    184             self.nickname = nick
    185             self.sendmsg(self.channel, 'GOT EEEEEm')
    186             self.last_time = time.time()
    187 
    188     def handle_events(self, data):
    189         args = data.split()
    190         if args[0] == 'PING':
    191             self.raw('PONG ' + args[1][1:])
    192         elif args[1] == '001':
    193             self.event_connect()
    194         elif args[1] == '433':
    195             self.event_nick_in_use()
    196         elif args[1] in ('JOIN','KICK','PART','PRIVMSG','QUIT'):
    197             nick  = args[0].split('!')[0][1:]
    198             if nick != self.nickname:
    199                 if args[1] == 'JOIN':
    200                     chan = args[2][1:]
    201                     self.event_join(nick, chan)
    202                 elif args[1] == 'KICK':
    203                     chan   = args[2]
    204                     kicked = args[3]
    205                     self.event_kick(nick, chan, kicked)
    206                 elif args[1] == 'PART':
    207                     chan = args[2]
    208                     self.event_part(nick, chan)
    209                 elif args[1] == 'PRIVMSG':
    210                     chan = args[2]
    211                     msg  = data.split(f'{args[0]} PRIVMSG {chan} :')[1]
    212                     if chan != self.nickname:
    213                         self.event_message(nick, chan, msg)
    214                 elif args[1] == 'QUIT':
    215                     self.event_quit(nick)
    216 
    217     def join(self, chan, key=None):
    218         if key:
    219             self.raw(f'JOIN {chan} {key}')
    220         else:
    221             self.raw('JOIN ' + chan)
    222 
    223     def listen(self):
    224         while True:
    225             try:
    226                 data = self.sock.recv(1024).decode('utf-8')
    227                 if data:
    228                     for line in (line for line in data.split('\r\n') if line):
    229                         debug(line)
    230                         if len(line.split()) >= 2:
    231                             if line.startswith('ERROR :Closing Link:'):
    232                                 raise Exception('Connection has closed.')
    233                             else:
    234                                 self.handle_events(line)
    235                 else:
    236                     error('No data recieved from server.')
    237                     break
    238             except (UnicodeDecodeError,UnicodeEncodeError):
    239                 pass
    240             except Exception as ex:
    241                 error('Unexpected error occured.', ex)
    242                 break
    243         self.event_disconnect()
    244 
    245     def loop(self):
    246         while self.connected:
    247             try:
    248                 time.sleep(60 * random_int(20,60))
    249                 self.sendmsg(self.channel, random.choice(random_lines))
    250             except Exception as ex:
    251                 error('Error occured in the loop!', ex)
    252                 break
    253 
    254     def nick(self, nick):
    255         self.raw('NICK ' + nick)
    256 
    257     def notice(self, target, msg):
    258         self.raw(f'NOTICE {target} :{msg}')
    259 
    260     def part(self, chan, msg=None):
    261         if msg:
    262             self.raw(f'PART {chan} {msg}')
    263         else:
    264             self.raw('PART ' + chan)
    265 
    266     def raw(self, msg):
    267         self.sock.send(bytes(msg + '\r\n', 'utf-8'))
    268 
    269     def sendmsg(self, target, msg):
    270         self.raw(f'PRIVMSG {target} :{msg}')
    271 
    272 # Main
    273 if os.path.isfile(random_file):
    274     random_lines = [line.rstrip() for line in open(random_file, mode='r', encoding='utf8', errors='replace').readlines() if line]
    275 else:
    276     error_exit('Missing random file!')
    277 IRC().connect()