mirror of
git://git.acid.vegas/archive.git
synced 2024-11-14 12:16:40 +00:00
277 lines
8.6 KiB
Python
277 lines
8.6 KiB
Python
#!/usr/bin/env python
|
|
# HUGECOCK (as seen in #efnetnews)
|
|
# Developed by acidvegas/vap0r in Python 3
|
|
# https://github.com/acidvegas/random
|
|
# hugecock.py
|
|
|
|
'''
|
|
Patreon : https://www.patreon.com/efnetnews
|
|
Twitter : https://twitter.com/pp4l
|
|
YouTube : https://www.youtube.com/channel/UCrB3e00DBKTyVhGLrrGuhOw
|
|
'''
|
|
|
|
import os
|
|
import random
|
|
import socket
|
|
import ssl
|
|
import time
|
|
import threading
|
|
|
|
# Connection
|
|
server = 'irc.efnet.org'
|
|
port = 6667
|
|
use_ipv6 = False
|
|
use_ssl = False
|
|
vhost = None
|
|
password = None
|
|
channel = '#efnetnews'
|
|
key = None
|
|
|
|
# Identity
|
|
nickname = 'HUGECOCK'
|
|
username = 'HUGECOCK'
|
|
realname = 'HUGECOCK'
|
|
|
|
# Globals (DO NOT EDIT)
|
|
random_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'random.txt')
|
|
|
|
# Formatting Control Characters / Color Codes
|
|
bold = '\x02'
|
|
italic = '\x1D'
|
|
underline = '\x1F'
|
|
reverse = '\x16'
|
|
reset = '\x0f'
|
|
white = '00'
|
|
black = '01'
|
|
blue = '02'
|
|
green = '03'
|
|
red = '04'
|
|
brown = '05'
|
|
purple = '06'
|
|
orange = '07'
|
|
yellow = '08'
|
|
light_green = '09'
|
|
cyan = '10'
|
|
light_cyan = '11'
|
|
light_blue = '12'
|
|
pink = '13'
|
|
grey = '14'
|
|
light_grey = '15'
|
|
|
|
def debug(msg):
|
|
print(f'{get_time()} | [~] - {msg}')
|
|
|
|
def error(msg, reason=None):
|
|
if reason:
|
|
print(f'{get_time()} | [!] - {msg} ({reason})')
|
|
else:
|
|
print(f'{get_time()} | [!] - {msg}')
|
|
|
|
def get_time():
|
|
return time.strftime('%I:%M:%S')
|
|
|
|
class IRC(object):
|
|
server = server
|
|
port = port
|
|
use_ipv6 = use_ipv6
|
|
use_ssl = use_ssl
|
|
vhost = vhost
|
|
password = password
|
|
channel = channel
|
|
key = key
|
|
username = username
|
|
realname = realname
|
|
|
|
def __init__(self):
|
|
self.nickname = nickname
|
|
self.connected = False
|
|
self.last_time = 0
|
|
self.sock = None
|
|
|
|
def action(self, chan, msg):
|
|
self.sendmsg(chan, f'\x01ACTION {msg}\x01')
|
|
|
|
def color(self, msg, foreground, background=None):
|
|
if background:
|
|
return f'\x03{foreground},{background}{msg}{reset}'
|
|
else:
|
|
return f'\x03{foreground}{msg}{reset}'
|
|
|
|
def connect(self):
|
|
try:
|
|
self.create_socket()
|
|
self.sock.connect((self.server, self.port))
|
|
if self.password:
|
|
self.raw('PASS ' + self.password)
|
|
self.raw(f'USER {self.username} 0 * :{self.realname}')
|
|
self.nick(self.nickname)
|
|
except socket.error as ex:
|
|
error('Failed to connect to IRC server.', ex)
|
|
self.event_disconnect()
|
|
else:
|
|
self.listen()
|
|
|
|
def create_socket(self):
|
|
if self.use_ipv6:
|
|
self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
|
|
else:
|
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
if self.vhost:
|
|
self.sock.bind((self.vhost, 0))
|
|
if self.use_ssl:
|
|
self.sock = ssl.wrap_socket(self.sock)
|
|
|
|
def event_connect(self):
|
|
self.connected = True
|
|
self.join(self.channel, self.key)
|
|
threading.Thread(target=self.loop).start()
|
|
|
|
def event_disconnect(self):
|
|
self.connected = False
|
|
self.sock.close()
|
|
time.sleep(10)
|
|
self.connect()
|
|
|
|
def event_join(self, nick, chan):
|
|
if nick.lower() == 'zardoz':
|
|
self.sendmsg(chan, nick)
|
|
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)))
|
|
|
|
def event_kick(self, nick, chan, kicked):
|
|
if kicked == self.nickname and chan == self.channel:
|
|
time.sleep(3)
|
|
self.join(self.channel, self.key)
|
|
|
|
def event_message(self, nick, chan, msg):
|
|
if random.choice((True,False,False,False)):
|
|
if 'http://' in msg or 'https://' in msg or 'www.' in msg:
|
|
self.sendmsg(chan, underline + 'not clicking')
|
|
elif msg == 'h':
|
|
self.sendmsg(chan, 'h')
|
|
elif msg == 'pump':
|
|
self.sendmsg(chan, 'penis')
|
|
elif msg == 'penis':
|
|
self.sendmsg(chan, 'pump')
|
|
elif 'ddos' in msg:
|
|
self.sendmsg(chan, 'Dudes Drink Owl Sperm')
|
|
elif 'fag' in msg:
|
|
self.sendmsg(chan, 'i hate faggots more than i hate war in this world')
|
|
elif self.nickname in msg:
|
|
self.action(chan, '8=================================================================D')
|
|
elif msg.lower() == 'lol':
|
|
self.sendmsg(chan, 'lol')
|
|
elif msg == '%%':
|
|
self.sendmsg(chan, '%%')
|
|
elif 'supernets' in msg.lower():
|
|
self.sendmsg(chan, self.color('HAVE YOU HEARD ABOUT IRC.SUPERNETS.ORG ???', light_blue))
|
|
elif 'readerr' in msg.lower():
|
|
if random.choice((True,False)):
|
|
self.sendmsg(chan, 'can we kill ReadErr')
|
|
else:
|
|
self.sendmsg(chan, 'can we ban ReadErr')
|
|
|
|
def event_nick_in_use(self):
|
|
self.nickname = self.nickname + '_'
|
|
self.nick(self.nickname)
|
|
|
|
def event_part(self, nick, chan):
|
|
self.sendmsg(nick, 'bet u wont come back pussy')
|
|
self.sendmsg(chan, self.color('EMOPART DETECTED', red, yellow))
|
|
|
|
def event_quit(self, nick):
|
|
if time.time() - self.last_time > 15:
|
|
self.nick(nick)
|
|
self.nickname = nick
|
|
self.sendmsg(self.channel, 'GOT EEEEEm')
|
|
self.last_time = time.time()
|
|
|
|
def handle_events(self, data):
|
|
args = data.split()
|
|
if args[0] == 'PING':
|
|
self.raw('PONG ' + args[1][1:])
|
|
elif args[1] == '001':
|
|
self.event_connect()
|
|
elif args[1] == '433':
|
|
self.event_nick_in_use()
|
|
elif args[1] in ('JOIN','KICK','PART','PRIVMSG','QUIT'):
|
|
nick = args[0].split('!')[0][1:]
|
|
if nick != self.nickname:
|
|
if args[1] == 'JOIN':
|
|
chan = args[2][1:]
|
|
self.event_join(nick, chan)
|
|
elif args[1] == 'KICK':
|
|
chan = args[2]
|
|
kicked = args[3]
|
|
self.event_kick(nick, chan, kicked)
|
|
elif args[1] == 'PART':
|
|
chan = args[2]
|
|
self.event_part(nick, chan)
|
|
elif args[1] == 'PRIVMSG':
|
|
chan = args[2]
|
|
msg = data.split(f'{args[0]} PRIVMSG {chan} :')[1]
|
|
if chan != self.nickname:
|
|
self.event_message(nick, chan, msg)
|
|
elif args[1] == 'QUIT':
|
|
self.event_quit(nick)
|
|
|
|
def join(self, chan, key=None):
|
|
if key:
|
|
self.raw(f'JOIN {chan} {key}')
|
|
else:
|
|
self.raw('JOIN ' + chan)
|
|
|
|
def listen(self):
|
|
while True:
|
|
try:
|
|
data = self.sock.recv(1024).decode('utf-8')
|
|
if data:
|
|
for line in (line for line in data.split('\r\n') if line):
|
|
debug(line)
|
|
if len(line.split()) >= 2:
|
|
if line.startswith('ERROR :Closing Link:'):
|
|
raise Exception('Connection has closed.')
|
|
else:
|
|
self.handle_events(line)
|
|
else:
|
|
error('No data recieved from server.')
|
|
break
|
|
except (UnicodeDecodeError,UnicodeEncodeError):
|
|
pass
|
|
except Exception as ex:
|
|
error('Unexpected error occured.', ex)
|
|
break
|
|
self.event_disconnect()
|
|
|
|
def loop(self):
|
|
while self.connected:
|
|
try:
|
|
time.sleep(60 * random_int(20,60))
|
|
self.sendmsg(self.channel, random.choice(random_lines))
|
|
except Exception as ex:
|
|
error('Error occured in the loop!', ex)
|
|
break
|
|
|
|
def nick(self, nick):
|
|
self.raw('NICK ' + nick)
|
|
|
|
def notice(self, target, msg):
|
|
self.raw(f'NOTICE {target} :{msg}')
|
|
|
|
def part(self, chan, msg=None):
|
|
if msg:
|
|
self.raw(f'PART {chan} {msg}')
|
|
else:
|
|
self.raw('PART ' + chan)
|
|
|
|
def raw(self, msg):
|
|
self.sock.send(bytes(msg + '\r\n', 'utf-8'))
|
|
|
|
def sendmsg(self, target, msg):
|
|
self.raw(f'PRIVMSG {target} :{msg}')
|
|
|
|
# Main
|
|
if os.path.isfile(random_file):
|
|
random_lines = [line.rstrip() for line in open(random_file, mode='r', encoding='utf8', errors='replace').readlines() if line]
|
|
else:
|
|
error_exit('Missing random file!')
|
|
IRC().connect() |