update
This commit is contained in:
parent
d48dd44e6e
commit
f93b7aee5c
160
bot.py
160
bot.py
|
@ -1,127 +1,69 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
import socket, rich, asyncio, time, re, ssl
|
import socket, rich, asyncio, time, re, ssl, ircstates
|
||||||
from config import *
|
from config import *
|
||||||
|
|
||||||
class bot:
|
|
||||||
def raw(msg):
|
|
||||||
"""
|
|
||||||
Sends a raw message using the socket s
|
|
||||||
"""
|
|
||||||
s.send(f"{msg}\n".encode('utf-8'))
|
|
||||||
|
|
||||||
class logger:
|
def _send(msg: str, log=True):
|
||||||
async def log(msg=None, level=0, color=False):
|
s.send(f"{msg}\n".encode('utf-8'))
|
||||||
if level <= DebugLVL:
|
if log == True: print(f"> {msg}")
|
||||||
if color:
|
|
||||||
rich.print(msg);
|
|
||||||
else:
|
|
||||||
print(msg);
|
|
||||||
async def handle(line):
|
|
||||||
if (line[0].endswith('.tilde.chat') and (line[1] == 'NOTICE' or line[1] == '001' or line[1] == '002' or line[1] == '003' or line[1] == '004' or line[1] == '005' or line[1] == '372' or line[1] == '251' or line[1] == '252' or line[1] == '253' or line[1] == '254' or line[1] == '255' or line[1] == '265' or line[1] == '266' or line[1] == '375' or line[1] == '376' or line[1] == '396') ):
|
|
||||||
loglevel = 450
|
|
||||||
elif line[0].endswith('.tilde.chat'):
|
|
||||||
loglevel = 441
|
|
||||||
elif line[0] == ':NickServ!services@services.tilde.chat':
|
|
||||||
if (line[3] == ':This' or line[3] == ':nick,' or line[2] == ':please' or line[3] == ':If' or line[3] == ':Password'):
|
|
||||||
loglevel = 450
|
|
||||||
else:
|
|
||||||
loglevel = 441
|
|
||||||
elif line[0] == ':ChanServ!services@services.tilde.chat':
|
|
||||||
loglevel = 442
|
|
||||||
elif line[0] == 'PING':
|
|
||||||
loglevel = 443
|
|
||||||
else:
|
|
||||||
loglevel = 440
|
|
||||||
await bot.logger.log(f"{' '.join(line)}", loglevel);
|
|
||||||
|
|
||||||
class get:
|
def usermodes(chan, user):
|
||||||
def nick(hostmask):
|
try:
|
||||||
return hostmask[1:].split('!')[0]
|
return srv.channels[chan].users[user].modes
|
||||||
def ident(hostmask):
|
except:
|
||||||
return hostmask[1:].split('!')[1].split('@')[0]
|
return []
|
||||||
def host(hostmask):
|
|
||||||
return hostmask[1:].split('!')[1].split('@')[1]
|
|
||||||
|
|
||||||
def nslogin():
|
def is_admin(source):
|
||||||
bot.raw(f"PRIVMSG NickServ@services.tilde.chat :IDENTIFY {NICK} {SERVICES_PW}")
|
return 'julian@envs.net' == source.split('!')[1]
|
||||||
bot.raw(f"MODE {NICK} +B")
|
|
||||||
|
|
||||||
async def joinchans():
|
def nslogin():
|
||||||
bot.raw(f"JOIN {CHANNELS}")
|
_send(f"PRIVMSG NickServ@services.tilde.chat :IDENTIFY {NICK} {SERVICES_PW}", log=False)
|
||||||
await bot.logger.log(f"[bold]Joined channels: [magenta]{CHANNELS}[/magenta] per request of [magenta]-!-[/magenta][/bold]", color=True)
|
print("Logged into services")
|
||||||
|
_send(f"MODE {NICK} +B")
|
||||||
async def join(channel, requser="-!-", prefixmsg="Joined"):
|
_send(f"JOIN {CHANNELS}")
|
||||||
bot.raw(f"JOIN :{channel}")
|
for i in db['chan'].all():
|
||||||
await bot.logger.log(f"[bold]{prefixmsg} [magenta]{channel}[/magenta] per request of [magenta]{requser}[/magenta][/bold]", color=True)
|
_send(f"JOIN {[i['name']]}")
|
||||||
|
|
||||||
async def part(channel, msg="Bye, I'be worked enough", requser="-!-"):
|
|
||||||
bot.raw(f"PART {channel} :{msg}")
|
|
||||||
await bot.logger.log(f"[bold]Leaved [magenta]{channel}[/magenta] per request of [magenta]{requser}[/magenta][/bold]", color=True)
|
|
||||||
|
|
||||||
async def topic(channel, topic="You should set a topic", requser="-!-"):
|
|
||||||
bot.raw(f"TOPIC {channel} :{topic}")
|
|
||||||
await bot.logger.log(f"[bold]Topic of [magenta]{channel}[/magenta] channeged to [blue]{topic}[/blue] per request of [magenta]{requser}[/magenta][/bold]", color=True)
|
|
||||||
time.sleep(1)
|
|
||||||
bot.raw(f"PRIVMSG {channel} :Changed topic of {channel}")
|
|
||||||
|
|
||||||
async def quit(msg="Bye, I'be worked enough", requser="-!-"):
|
|
||||||
bot.raw(f"QUIT :{msg}")
|
|
||||||
await bot.logger.log(f"[bold]Exiting per request of [magenta]{requser}[/magenta] with message of [magenta]{msg}[/magenta][/bold]", color=True)
|
|
||||||
|
|
||||||
async def setup():
|
|
||||||
bot.nslogin()
|
|
||||||
await bot.joinchans()
|
|
||||||
async def ConnectionSetup():
|
|
||||||
bot.raw(f"NICK {NICK}")
|
|
||||||
bot.raw(f"USER {NICK} 0 * :{REALNAME}")
|
|
||||||
class Handeler:
|
|
||||||
async def newmsg(line):
|
|
||||||
if (line[0] == "PING"):
|
|
||||||
bot.raw(f"PONG {line[1]}")
|
|
||||||
elif (line[0] == ':NickServ!services@services.tilde.chat' and line[1] == 'NOTICE' and line[2] == 'util' and line[3] == ':If'):
|
|
||||||
await bot.setup()
|
|
||||||
elif (line[1] == "INVITE" and line[2] == NICK):
|
|
||||||
await bot.join(line[3][1:], line[0][1:], prefixmsg="Invited to");
|
|
||||||
time.sleep(1)
|
|
||||||
bot.raw(f"PRIVMSG {line[3][1:]} :Hello, I'm a bot that joined because {line[0][1:]} invited me.")
|
|
||||||
elif (line[1] == 'PRIVMSG' and line[2] != NICK and line[3] == ":*.help"):
|
|
||||||
bot.raw(f"PRIVMSG {line[2]} :I am a utility bot.")
|
|
||||||
elif (line[1] == 'PRIVMSG' and line[3] == ":*.join"):
|
|
||||||
await bot.join(line[4], line[0][1:]);
|
|
||||||
time.sleep(1)
|
|
||||||
bot.raw(f"PRIVMSG {line[4]} :Hello, I'm a bot that joined because {bot.get.nick(line[0])} told me to.")
|
|
||||||
elif (line[1] == 'PRIVMSG' and line[3] == ":*.part" and ( (line[4] != "#lounge" and line[4] != "#lounge-ops" and line[4] != "#airstrip") or line[0][1:] == 'julian!julian@envs.net') ):
|
|
||||||
await bot.part(line[4], f"Leaving per request of {bot.get.nick(line[0])}", line[0][1:]);
|
|
||||||
elif (line[1] == 'PRIVMSG' and line[2] != NICK and line[3] == ":*.topic" and ((line[2]!="#lounge" and line[2]!="#lounge-ops" and line[2]!="#airstrip") or line[0][1:]=='julian!julian@envs.net') ):
|
|
||||||
await bot.topic(line[2], ' '.join(line[4:]) ,line[0][1:])
|
|
||||||
elif (line[1] == 'PRIVMSG' and line[2] != NICK and line[3] == ":*.echo"):
|
|
||||||
bot.raw(f"PRIVMSG {line[2]} :\x033[Echo]\x0F \x032{bot.get.nick(line[0])}\x0F said: \x039{' '.join(line[4:])}")
|
|
||||||
elif (line[1] == 'PRIVMSG' and line[2] != NICK and line[3] == ":*.psa" and ((line[4]!="#lounge" and line[4]!="#lounge-ops" and line[4]!="#airstrip") or line[0][1:]=='julian!julian@envs.net') ):
|
|
||||||
if (line[4].startswith('#')):
|
|
||||||
bot.raw(f"PRIMSG {line[4]} :\x0307[Public Service Anouncement]\x0F {' '.join(line[5:])}")
|
|
||||||
await bot.logger.log(f"[bold]PSA by [magenta]{line[0][1:]}[/magenta] -> [magenta]{line[4]}[/magenta] -> [blue]{' '.join(line[5:])}[/blue][/bold]", color=True)
|
|
||||||
else:
|
|
||||||
bot.raw(f"PRIVMSG {bot.get.nick(line[0])} :Sorry, the syntax for PSA is: *.psa <channel> <MESSAGE>")
|
|
||||||
|
|
||||||
readbuffer=""
|
|
||||||
|
|
||||||
|
def joinchannel(channel):
|
||||||
|
_send(f"JOIN {channel}")
|
||||||
|
db['chan'].insert(dict(name=i))
|
||||||
|
|
||||||
|
|
||||||
|
srv = ircstates.Server(NETNAME)
|
||||||
s = socket.socket()
|
s = socket.socket()
|
||||||
ctx = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)
|
ctx = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)
|
||||||
if tls == True:
|
if tls == True:
|
||||||
s = ctx.wrap_socket(s)
|
s = ctx.wrap_socket(s)
|
||||||
s.connect((HOST, PORT))
|
s.connect((HOST, PORT))
|
||||||
asyncio.run(bot.ConnectionSetup())
|
_send(f"NICK {NICK}")
|
||||||
|
_send(f"USER {NICK} 0 * :{REALNAME}")
|
||||||
|
|
||||||
while True:
|
try:
|
||||||
readbuffer = readbuffer + s.recv(2048).decode('utf-8')
|
while True:
|
||||||
temp = str.split(readbuffer, "\n")
|
recv_data = s.recv(1024)
|
||||||
readbuffer = temp.pop()
|
recv_lines = srv.recv(recv_data)
|
||||||
|
|
||||||
for line in temp:
|
for line in recv_lines:
|
||||||
line = str.rstrip(line)
|
srv.parse_tokens(line)
|
||||||
line = str.split(line)
|
|
||||||
|
|
||||||
asyncio.run(bot.Handeler.newmsg(line))
|
if line.command == "PING": _send(f"PONG :{line.params[0]}", log=False)
|
||||||
asyncio.run(bot.logger.handle(line))
|
elif (line.source == f"NickServ!{SERVICES_HOSTMASK}" and line.command == 'NOTICE' and line.params == ['util','If you do not change within 1 minute, I will change your nick.']): nslogin()
|
||||||
|
elif (line.command == "INVITE" and line.params[0] == NICK): joinchannel(line.params[1])
|
||||||
|
elif line.command == "!botlist": _send(f"PRIVMSG {line.source} :I am a utility bot. Public commands *.echo | Ran by ~julian@~team/~jmjl@{~town,~club}")
|
||||||
|
elif (line.command == "PRIVMSG" and line.params[1].startswith('*.') ):
|
||||||
|
commandargs = line.params[1].split(' ')
|
||||||
|
command = ''.join(commandargs[0].split('*.')[1:])
|
||||||
|
args = commandargs[1:]
|
||||||
|
usernick = line.source.split('!')[0]
|
||||||
|
chan = line.params[0]
|
||||||
|
if command == "join" and is_admin(line.source): joinchannel(args[0])
|
||||||
|
elif command == "help": _send(f"PRIVMSG {chan} :I am a utility bot. Ran by ~julian@~team/~jmjl@{~town,~club}")
|
||||||
|
elif command == "echo": _send(f"PRIVMSG {chan} :\x033[Echo]\x0F \x032{usernick}\x0F said: \x039{' '.join(args[0:])}")
|
||||||
|
elif command == "psa" and args[0].startswith('#'):
|
||||||
|
if 'o' in usermodes(args[0], usernick) or 'q' in usermodes(args[0], usernick): _send(f"PRIVMSG {args[0]} :\x0307**PSA:\x0F {' '.join(args[1:])}")
|
||||||
|
else: _send(f"PRIVMSG {usernick} :Sorry, you aren't allowed to make public service anouncements.")
|
||||||
|
elif command == "psa" and not args[0].startswith('#'): _send(f"PRIVMSG {usernick} :Sorry, the syntax for PSA is: *.psa <channel> <MESSAGE>")
|
||||||
|
elif ('o' in usermodes(chan, usernick) or 'q' in usermodes(chan, usernick)) or is_admin(line.source):
|
||||||
|
if command == "part": _send(f"PART {args[0]} :Leaving per request of {usernick}")
|
||||||
|
if command == "topic": _send(f"TOPIC {chan} :{' '.join(args[0:])}")
|
||||||
|
except KeyboardInterrupt: _send("QUIT :^C")
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
from fileread import fileload
|
from fileread import fileload
|
||||||
|
import dataset
|
||||||
|
|
||||||
DebugLVL = 442
|
DebugLVL = 442
|
||||||
HOST = fileload('conf/host')
|
HOST = fileload('conf/host')
|
||||||
|
@ -8,4 +9,7 @@ NICK = fileload('conf/nick')
|
||||||
REALNAME = fileload('conf/realname')
|
REALNAME = fileload('conf/realname')
|
||||||
SERVICES_PW = fileload('conf/pw')
|
SERVICES_PW = fileload('conf/pw')
|
||||||
CHANNELS = fileload('conf/chans')
|
CHANNELS = fileload('conf/chans')
|
||||||
|
NETNAME = fileload('conf/net')
|
||||||
|
SERVICES_HOSTMASK = fileload('conf/services')
|
||||||
tls = fileload('conf/port') == '6697'
|
tls = fileload('conf/port') == '6697'
|
||||||
|
db = dataset.connect('sqlite:///conf/database.db')
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
rich
|
ircstates
|
||||||
|
dataset
|
||||||
|
|
Loading…
Reference in New Issue