2021-09-16 17:35:06 +00:00
|
|
|
import irctokens
|
2021-09-19 16:56:17 +00:00
|
|
|
from config import config as Config
|
2021-09-16 17:35:06 +00:00
|
|
|
from util import Util
|
2021-09-19 16:56:17 +00:00
|
|
|
from commands import Command
|
2021-10-07 19:36:09 +00:00
|
|
|
import sys, importlib, time
|
2021-10-04 12:48:10 +00:00
|
|
|
|
|
|
|
def stuff(bot, sock):
|
|
|
|
config = Config
|
|
|
|
util = Util(config, sock)
|
|
|
|
command = Command(config)
|
|
|
|
server = bot.server
|
|
|
|
send = util.send
|
|
|
|
|
|
|
|
def mesg(msg: str, t=None):
|
|
|
|
util.mesg(msg, t)
|
|
|
|
|
|
|
|
# mesg=util.mesg
|
|
|
|
server_caps = []
|
|
|
|
wanted_caps = config.capabilities
|
|
|
|
chan = config.server.channel # autojoin channel
|
|
|
|
is_pm = False
|
|
|
|
mode = "init"
|
|
|
|
|
2021-09-19 18:33:30 +00:00
|
|
|
def configure():
|
2021-10-04 12:48:10 +00:00
|
|
|
config = importlib.reload(sys.modules["config"]).config
|
|
|
|
util = Util(config, sock)
|
|
|
|
command = importlib.reload(sys.modules["commands"]).Command(config)
|
|
|
|
command.util = util
|
|
|
|
prefixes = config.cmd.prefixes
|
|
|
|
admin_accounts = config.admin.accounts
|
|
|
|
admin_users = config.admin.hostmasks
|
|
|
|
admin_only = config.cmd.admin_only
|
|
|
|
return (
|
|
|
|
command,
|
|
|
|
command.util,
|
|
|
|
config,
|
|
|
|
util,
|
|
|
|
prefixes,
|
|
|
|
admin_accounts,
|
|
|
|
admin_users,
|
|
|
|
admin_only,
|
|
|
|
)
|
2021-09-19 18:33:30 +00:00
|
|
|
|
2021-10-04 12:48:10 +00:00
|
|
|
command, command.util, config, util, prefixes, admin_accounts, admin_users, admin_only = (
|
|
|
|
configure()
|
|
|
|
)
|
2021-10-04 15:49:05 +00:00
|
|
|
send = util.send
|
2021-09-16 17:35:06 +00:00
|
|
|
|
|
|
|
send(irctokens.build("NICK", [config.self.nick]).format())
|
2021-10-04 12:48:10 +00:00
|
|
|
send(
|
|
|
|
irctokens.build(
|
|
|
|
"USER", [config.self.username, "0", "*", config.self.realname]
|
|
|
|
).format()
|
|
|
|
)
|
2021-09-16 17:35:06 +00:00
|
|
|
while True:
|
|
|
|
self_nick = server.nickname
|
2021-10-04 12:48:10 +00:00
|
|
|
recv_data = sock.recv(1024)
|
2021-09-16 17:35:06 +00:00
|
|
|
recv_lines = server.recv(recv_data)
|
|
|
|
|
|
|
|
for line in recv_lines:
|
|
|
|
server.parse_tokens(line)
|
2021-10-04 15:49:05 +00:00
|
|
|
stri = line.format()
|
|
|
|
for k, v in util.dict.items():
|
|
|
|
stri = stri.replace(k, v)
|
2021-10-07 19:36:09 +00:00
|
|
|
print(f"{time.strftime('%H:%M:%S')} < {stri}")
|
2021-10-04 15:49:05 +00:00
|
|
|
del stri
|
2021-09-16 17:35:06 +00:00
|
|
|
|
|
|
|
if line.command == "PING":
|
|
|
|
send(f"PONG :{line.params[0]}")
|
|
|
|
|
2021-10-04 12:48:10 +00:00
|
|
|
if mode == "init":
|
2021-09-21 17:41:31 +00:00
|
|
|
if line.command == "433":
|
2021-10-04 12:48:10 +00:00
|
|
|
util.nick(config.self.nick + "_")
|
2021-09-16 17:35:06 +00:00
|
|
|
if line.command == "376":
|
2021-10-04 12:48:10 +00:00
|
|
|
send(irctokens.build("CAP", ["LS", "302"]).format())
|
|
|
|
elif line.command == "CAP" and line.params[1] == "LS":
|
|
|
|
if server_caps == []:
|
|
|
|
server_caps = line.params[2].split()
|
|
|
|
caps = [value for value in wanted_caps if value in server_caps]
|
|
|
|
# single-send is more efficient
|
|
|
|
# BUT a single invalid cap == no caps enabled at all!!!
|
|
|
|
send(irctokens.build("CAP", ["REQ", " ".join(caps)]).format())
|
|
|
|
# for i in caps:
|
2021-09-16 17:35:06 +00:00
|
|
|
# send(irctokens.build("CAP", ["REQ",i]).format())
|
|
|
|
send(irctokens.build("CAP", ["END"]).format())
|
2021-10-04 12:48:10 +00:00
|
|
|
mode = "boot"
|
|
|
|
elif mode == "boot":
|
2021-09-16 17:35:06 +00:00
|
|
|
send(irctokens.build("JOIN", [chan]).format())
|
2021-10-04 12:48:10 +00:00
|
|
|
mode = "normal"
|
|
|
|
elif mode == "normal":
|
2021-09-19 18:33:30 +00:00
|
|
|
if line.command == "433":
|
2021-10-04 12:48:10 +00:00
|
|
|
mesg("nick in use!", chan)
|
2021-09-19 18:33:30 +00:00
|
|
|
util.nick(config.self.nick)
|
2021-09-16 17:35:06 +00:00
|
|
|
if line.command == "INVITE":
|
|
|
|
send(irctokens.build("JOIN", [line.params[1]]).format())
|
|
|
|
elif line.command == "PRIVMSG":
|
2021-10-07 19:22:45 +00:00
|
|
|
if line.tags == None or "batch" not in line.tags:
|
2021-10-04 12:48:10 +00:00
|
|
|
is_pm = False
|
|
|
|
target = line.params[0]
|
|
|
|
if target == self_nick:
|
|
|
|
target = line.source.split("!")[0]
|
|
|
|
is_pm = True
|
|
|
|
util.target = target
|
|
|
|
command.util.target = target
|
|
|
|
if (
|
|
|
|
is_pm
|
|
|
|
or line.params[1].startswith(self_nick)
|
|
|
|
or line.params[1][0] in prefixes
|
2021-10-05 13:18:25 +00:00
|
|
|
or line.params[1].startswith("https://")
|
2021-10-04 12:48:10 +00:00
|
|
|
):
|
2021-09-21 17:41:31 +00:00
|
|
|
try:
|
2021-10-04 12:48:10 +00:00
|
|
|
cmd = line.params[1]
|
|
|
|
# if message in a channel, remove prefixes
|
2021-10-05 13:18:25 +00:00
|
|
|
if is_pm:
|
|
|
|
command.prefix = None
|
|
|
|
else:
|
2021-09-21 17:41:31 +00:00
|
|
|
if cmd[0] in prefixes:
|
2021-10-04 12:48:10 +00:00
|
|
|
cmd = cmd.replace(cmd[0], "", 1)
|
|
|
|
command.prefix = cmd[0]
|
|
|
|
elif cmd.startswith(self_nick + ":"):
|
|
|
|
cmd = cmd.replace(self_nick + ":", "", 1)
|
|
|
|
command.prefix = self_nick
|
2021-09-21 17:41:31 +00:00
|
|
|
elif cmd.startswith(self_nick):
|
2021-10-04 12:48:10 +00:00
|
|
|
cmd = cmd.replace(self_nick, "", 1)
|
|
|
|
command.prefix = self_nick
|
2021-10-05 13:18:25 +00:00
|
|
|
else:
|
|
|
|
command.prefix = None
|
2021-09-21 17:41:31 +00:00
|
|
|
except IndexError:
|
2021-10-04 12:48:10 +00:00
|
|
|
continue # skip to next command
|
|
|
|
cmd = "echo IndexError or something"
|
2021-10-04 15:49:05 +00:00
|
|
|
try:
|
2021-10-05 13:18:25 +00:00
|
|
|
prefix = command.prefix or None
|
|
|
|
except UnboundLocalError or AttributeError:
|
2021-10-04 15:49:05 +00:00
|
|
|
prefix = None
|
2021-10-05 13:18:25 +00:00
|
|
|
command.prefix = prefix
|
2021-10-04 12:48:10 +00:00
|
|
|
cmd = cmd.strip()
|
|
|
|
try:
|
|
|
|
is_adm = (
|
|
|
|
line.tags["account"] in admin_accounts
|
|
|
|
or line.source in admin_users
|
|
|
|
)
|
2021-11-07 10:27:04 +00:00
|
|
|
except (KeyError, TypeError): #either no account tag, or no tags at all
|
2021-10-04 12:48:10 +00:00
|
|
|
is_adm = line.source in admin_users
|
2021-10-04 15:49:05 +00:00
|
|
|
|
|
|
|
# update command module's info dynamically for line info
|
2021-10-04 12:48:10 +00:00
|
|
|
command.util.target = target
|
|
|
|
command._line = line
|
|
|
|
command.pm = is_pm
|
|
|
|
command.line = cmd
|
|
|
|
command.admin = is_adm
|
|
|
|
command.config = config
|
|
|
|
command.self_nick = self_nick
|
|
|
|
command.prefix = prefix
|
2021-10-04 15:49:05 +00:00
|
|
|
|
2021-10-03 21:36:22 +00:00
|
|
|
if is_adm and cmd.startswith("reload"):
|
2021-10-04 12:48:10 +00:00
|
|
|
command, command.util, config, util, prefixes, admin_accounts, admin_users, admin_only = (
|
|
|
|
configure()
|
|
|
|
)
|
|
|
|
util.target = target
|
2021-10-04 15:49:05 +00:00
|
|
|
send = util.send
|
2021-10-04 12:48:10 +00:00
|
|
|
command._line = line
|
|
|
|
command.pm = is_pm
|
|
|
|
command.line = cmd
|
|
|
|
command.admin = is_adm
|
|
|
|
command.config = config
|
|
|
|
command.self_nick = self_nick
|
|
|
|
command.prefix = prefix
|
2021-10-04 15:49:05 +00:00
|
|
|
command.util = util
|
2021-10-04 12:48:10 +00:00
|
|
|
command.util.target = target
|
2021-09-19 16:56:17 +00:00
|
|
|
mesg("reloaded")
|
2021-10-04 12:48:10 +00:00
|
|
|
elif (
|
|
|
|
cmd.startswith("eval ")
|
|
|
|
and "eval" not in config.cmd.disabled
|
|
|
|
):
|
|
|
|
if is_adm:
|
2021-09-16 17:35:06 +00:00
|
|
|
try:
|
2021-10-04 12:48:10 +00:00
|
|
|
result = eval(
|
|
|
|
cmd[len("eval ") :].strip() or "None"
|
|
|
|
)
|
2021-09-16 17:35:06 +00:00
|
|
|
except Exception as e:
|
2021-10-04 12:48:10 +00:00
|
|
|
mesg("Error: " + str(e))
|
|
|
|
else:
|
|
|
|
mesg("Error: you're not authorized to eval")
|
|
|
|
elif (
|
|
|
|
cmd.startswith("exec ")
|
|
|
|
and "exec" not in config.cmd.disabled
|
|
|
|
):
|
|
|
|
if is_adm:
|
2021-09-19 18:33:30 +00:00
|
|
|
try:
|
2021-10-04 12:48:10 +00:00
|
|
|
result = exec(
|
|
|
|
cmd[len("exec ") :].strip() or "None"
|
|
|
|
)
|
2021-09-19 18:33:30 +00:00
|
|
|
except Exception as e:
|
2021-10-04 12:48:10 +00:00
|
|
|
mesg("Error: " + str(e))
|
|
|
|
else:
|
|
|
|
mesg("Error: you're not authorized to exec")
|
2021-10-03 13:22:50 +00:00
|
|
|
|
2021-10-04 12:48:10 +00:00
|
|
|
# handle normal commands
|
|
|
|
else:
|
|
|
|
command.preq_cmd()
|