maple/storage/bot/plugins/base_plugin.py

569 lines
24 KiB
Python
Raw Normal View History

2022-09-05 20:30:29 +00:00
# -*- coding: utf-8 -*- ############################################################### SOF
2023-03-15 17:24:49 +00:00
###########################################################################################
2022-09-05 20:30:29 +00:00
from irc3.plugins.command import command
from irc3.utils import IrcString
import irc3
import os
import sys
import time
import re
import functools
2023-03-01 16:03:24 +00:00
from random import shuffle
import string
from irc3.plugins.cron import cron
2023-03-26 20:46:52 +00:00
from tool_colors_plugin import colorform as print
2023-03-15 17:24:49 +00:00
###########################################################################################
2022-09-05 20:30:29 +00:00
###########################################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
USER_STRING_MATCH = re.compile('(.+)!(.+)@(.+)')
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
###########################################################################################
2023-03-15 17:24:49 +00:00
###########################################################################################
2022-09-05 20:30:29 +00:00
@irc3.plugin
class Plugin:
2023-03-15 17:24:49 +00:00
#######################################################################################
#######################################################################################
2022-09-05 20:30:29 +00:00
def __init__(self,bot):
2023-03-26 20:46:52 +00:00
print('[ loaded ]')
2022-09-05 20:30:29 +00:00
self.bot=bot
staff_set=set()
self.bot.auto_kick_list = set(self.bot.db.getlist("auto_kick_list", []))
self.bot.ignore_list = set(self.bot.db.getlist("ignore_nicks_list", []))
self.bot.staff_list = set(self.bot.db.getlist("staff_list", []))
current_masks = self.bot.config.get('irc3.plugins.command.masks')
for k, v in current_masks.items():
if v in ["staff", "all_permissions"]:
staff_set.add(k)
if not self.bot.ignore_list:
self.bot.ignore_list = set(self.bot.config.get('irc3.plugins.command.masks', {}).get("ignore_list", []))
if not self.bot.staff_list:
self.bot.staff_list = set(staff_set)
self.bot.db.setlist("staff_list", self.bot.staff_list)
for hostname in self.bot.staff_list:
2023-03-01 16:03:24 +00:00
if not current_masks.get(hostname):
self.bot.config['irc3.plugins.command.masks'][hostname] = "staff"
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2022-09-05 20:30:29 +00:00
@irc3.extend
def check_if_ignored(self, hostmask):
global_hostmask = hostmask.replace(hostmask.nick, ".+")
nick_mask = hostmask.replace(hostmask.host,".+@.+")
host_pattern = re.compile(global_hostmask)
nick_pattern = re.compile(nick_mask)
for mask in self.bot.ignore_list:
if host_pattern.match(mask):
return True
if nick_pattern.match(mask):
return True
return False
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
#######################################################################################
#######################################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
@irc3.event(irc3.rfc.JOIN)
def auto_kick_handler(self, mask, channel, **kw):
msg = "g1mp'n ain't easy unless you're maple"
if mask.nick in self.bot.auto_kick_list:
cmd = f"MODE {channel} +b {mask.nick}!*@*"
self.bot.send(cmd)
self.bot.kick(channel, mask.nick, msg)
2023-03-15 17:24:49 +00:00
#######################################################################################
2022-09-05 20:30:29 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def mdeban(self, mask, target, args):
"""removes all present bans from channel
%%mdeban
"""
self.target=target
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
###############################################################################
2023-03-01 16:03:24 +00:00
def handle_bans(self, response):
result = response.result()
[ self.bot.send(f'MODE {self.target} -b {x["mask"]}') for x in result['bans'] ]
2023-03-15 17:24:49 +00:00
###############################################################################
2023-03-01 16:03:24 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
try:
task = self.bot.channel_bans(self.target)
task.add_done_callback(functools.partial(handle_bans, self))
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def lockdown(self, mask, target, args):
"""lockdown channel
%%lockdown
"""
try:
yek=list(string.ascii_letters+string.digits)
shuffle(yek)
self.bot.send(f'MODE {target} +mik {"".join(yek[0:32])}')
self.mv(mask,target,args)
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def unlockdown(self, mask, target, args):
"""unlockdown channel
%%unlockdown
"""
try:
self.bot.send(f'MODE {target} -mik')
except Exception as e:
pass
#######################################################################################
@command(permission='admin', public=True, show_in_help_list=False)
def unban(self, mask, target, args):
"""unbans hostmask from channel
%%unban <channel> <hostmask>
"""
channel=args.get('<channel>')
hostmask=args.get('<hostmask>')
try:
self.bot.send(f'MODE {channel} -b {hostmask}')
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def ban(self, mask, target, args):
"""bans user from channel
%%ban <nick>
"""
self.target=target
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
###############################################################################
2023-03-01 16:03:24 +00:00
def handle_who(self, response):
result = response.result()
self.bot.send(f"MODE {self.target} +b *!{result['user']}@*")
2023-03-15 17:24:49 +00:00
###############################################################################
2023-03-01 16:03:24 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
try:
USER=args['<nick>']
task = self.bot.who(USER)
task.add_done_callback(functools.partial(handle_who, self))
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def mban(self, mask, target, args):
"""Bans all present users from channel
%%mban
"""
self.target=target
2023-03-15 17:24:49 +00:00
###############################################################################
2023-03-01 16:03:24 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
def handle_who(self, response):
result = response.result()
self.bot.send(f"MODE {self.target} +b *!{result['user']}@*")
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
###############################################################################
2023-03-01 16:03:24 +00:00
try:
for USER in self.bot.channels[target]:
task = self.bot.who(USER)
task.add_done_callback(functools.partial(handle_who, self))
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def mkick(self, mask, target, args):
"""Kicks all present users from channel
%%mkick <noise>...
"""
msg = ' '.join(args.get('<noise>'))
try:
[self.bot.kick(target,x,self.bot.emo(msg)) for x in self.bot.channels[target]]
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def kick(self, mask, target, args):
"""Kicks user from channel
%%kick <noise>...
"""
nick=' '.join(args.get('<noise>')[:1])
msg=' '.join(args.get('<noise>')[1:])
try:
self.bot.kick(target,nick,self.bot.emo(msg))
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def mv(self, mask, target, args):
2022-09-05 20:30:29 +00:00
"""Voices all present users in channel
2023-03-01 16:03:24 +00:00
%%mv
"""
try:
[ self.bot.send(f'MODE {target} +v {x}') for x in self.bot.channels[target]]
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def mdv(self, mask, target, args):
"""DeVoices all present users in channel
%%mdv
2022-09-05 20:30:29 +00:00
"""
try:
2023-03-01 16:03:24 +00:00
[ self.bot.send(f'MODE {target} -v {x}') for x in self.bot.channels[target]]
except:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def v(self, mask, target, args):
"""Voices user in channel
%%v <nick>
"""
nick = args['<nick>']
try:
self.bot.send(f'MODE {target} +v {nick}')
2022-09-05 20:30:29 +00:00
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def dv(self, mask, target, args):
"""DeVoices user in channel
%%dv <nick>
"""
nick = args['<nick>']
try:
self.bot.send(f'MODE {target} -v {nick}')
except:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def mop(self, mask, target, args):
"""Ops all present users in channel
%%mop
"""
try:
[ self.bot.send(f'MODE {target} +o {x}') for x in self.bot.channels[target]]
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def mdeop(self, mask, target, args):
"""DeOps all present users in channel
%%mdeop
"""
try:
[ self.bot.send(f'MODE {target} -o {x}') for x in self.bot.channels[target]]
except:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
#######################################################################################
2022-09-05 20:30:29 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def op(self, mask, target, args):
"""Ops user
%%op <nick>
"""
2023-03-01 16:03:24 +00:00
nick = args['<nick>']
try:
self.bot.send(f'MODE {target} +o {nick}')
except:
pass
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2022-09-05 20:30:29 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def deop(self, mask, target, args):
"""Deops user
2023-03-01 16:03:24 +00:00
%%deop <nick>
2022-09-05 20:30:29 +00:00
"""
2023-03-01 16:03:24 +00:00
nick = args['<nick>']
try:
self.bot.send(f'MODE {target} -o {nick}')
except:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def mhop(self, mask, target, args):
"""Hops all present users in channel
%%mhop
"""
try:
[ self.bot.send(f'MODE {target} +h {x}') for x in self.bot.channels[target]]
except Exception as e:
pass
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def mdehop(self, mask, target, args):
"""DeHops all present users in channel
%%mdehop
"""
try:
[ self.bot.send(f'MODE {target} -h {x}') for x in self.bot.channels[target]]
except:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
#######################################################################################
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def hop(self, mask, target, args):
"""Hops user
%%hop <nick>
"""
nick = args['<nick>']
try:
self.bot.send(f'MODE {target} +h {nick}')
except:
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
2023-03-01 16:03:24 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2023-03-01 16:03:24 +00:00
@command(permission='admin', public=True, show_in_help_list=False)
def dehop(self, mask, target, args):
"""Dehops user
%%dehop <nick>
"""
nick = args['<nick>']
try:
self.bot.send(f'MODE {target} -h {nick}')
except:
pass
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2022-09-05 20:30:29 +00:00
@command(permission="admin", show_in_help_list=False)
def stats(self, mask, target, args):
"""Stats
%%stats
"""
channel = target
if channel in self.bot.channels:
channel = self.bot.channels[channel]
message = f'{len(channel)} users'
for mode, nicknames in sorted(channel.modes.items()):
message += f' - {mode}({len(nicknames)})'
self.bot.privmsg(target, message)
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
@command(permission='admin', show_in_help_list=False)
def reload(self, mask, target, args):
"""reload
%%reload <noise>
2022-09-05 20:30:29 +00:00
"""
2023-03-15 17:24:49 +00:00
noise = f"plugins.{args.get('<noise>')}_plugin"
self.bot.privmsg(target, f'reloading plugin: {noise}')
try:
self.bot.reload(noise)
except:
self.bot.privmsg(target, f'error: reloading plugin: {noise} failed')
#######################################################################################
2022-09-05 20:30:29 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
@command(permission='admin', public=False, show_in_help_list=False)
def uptime(self, mask, target, args):
pass
2023-03-15 17:24:49 +00:00
#######################################################################################
2022-09-05 20:30:29 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
@command(permission='admin', public=False, show_in_help_list=False)
def ping(self, mask, target, args):
pass
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
#######################################################################################
2023-03-15 17:24:49 +00:00
#######################################################################################
2022-09-05 20:30:29 +00:00
@command(permission='staff', public=True, show_in_help_list=False)
def staff(self, mask, target, args):
"""staff
%%staff <noise>...
"""
2023-03-15 17:24:49 +00:00
###################################################################################
2022-09-05 20:30:29 +00:00
###################################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
def __staff_list(self, mask, target, args):
current_masks = self.bot.config.get("irc3.plugins.command.masks", "")
current_staff_list = [k for k,v in current_masks.items() if v in ["all_permissions", "staff"]]
self.bot.privmsg(target, "\x02༺Staff List༻\x0F\x02\x0303 > \x0F\x0302{}".format(", ".join(current_staff_list)))
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
###################################################################################
2023-03-15 17:24:49 +00:00
###################################################################################
2022-09-05 20:30:29 +00:00
def __staff_del(self, mask, target, args):
2023-03-15 17:24:49 +00:00
###############################################################################
2022-09-05 20:30:29 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
def del_hostmask(self, host_string):
current_masks = self.bot.config.get("irc3.plugins.command.masks", "")
if host_string in current_masks.keys():
mask_list = current_masks.get(host_string, "").split(",")
if "all_permissions" in mask_list:
self.bot.privmsg(target, "Don't fuck with the admin")
return
elif "staff" in mask_list:
del(self.bot.config["irc3.plugins.command.masks"][host_string])
self.bot.staff_list.remove(host_string)
self.bot.db.setlist("staff_list", self.bot.staff_list)
self.bot.privmsg(target, f'{host_string} removed from staff')
return
else:
pass # pass for brevarity
else:
self.bot.privmsg(target, f'{host_string} is not a staff member')
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
###############################################################################
2022-09-05 20:30:29 +00:00
def handle_who(self, response):
result = response.result()
nick = result.get("nick")
mask = result.get('mask')
host_string = mask.replace(nick,"*")
del_hostmask(self, host_string)
2023-03-15 17:24:49 +00:00
###############################################################################
2022-09-05 20:30:29 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
nick = args.get("<nick>")
match_list = USER_STRING_MATCH.findall(nick)
if match_list and len(match_list[0]) == 3:
del_hostmask(self, nick)
return
else:
task = self.bot.who(nick)
task.add_done_callback(functools.partial(handle_who, self))
return
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
###################################################################################
2023-03-15 17:24:49 +00:00
###################################################################################
2022-09-05 20:30:29 +00:00
def __staff_add(self, mask, target, args):
2023-03-15 17:24:49 +00:00
###############################################################################
2022-09-05 20:30:29 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
def add_hostmask(self, host_string):
current_masks = self.bot.config.get("irc3.plugins.command.masks", "")
if host_string in current_masks.keys():
mask_list = current_masks.get(host_string, "").split(",")
if "staff" or "all_permissions" in mask_list:
self.bot.privmsg(target, f"{host_string} is already a staff member")
return
else:
self.bot.config["irc3.plugins.command.masks"][host_string] = "staff"
self.bot.staff_list.add(host_string)
self.bot.db.setlist("staff_list", self.bot.staff_list)
self.bot.privmsg(target, f'{host_string} added to staff')
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
###############################################################################
2022-09-05 20:30:29 +00:00
def handle_who(self, response):
result = response.result()
nick = result.get("nick")
mask = result.get('mask')
host_string = mask.replace(nick,"*")
add_hostmask(self, host_string)
2023-03-15 17:24:49 +00:00
###############################################################################
2022-09-05 20:30:29 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
nick = args.get("<nick>")
match_list = USER_STRING_MATCH.findall(nick)
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
###############################################################################
2023-03-15 17:24:49 +00:00
###############################################################################
2022-09-05 20:30:29 +00:00
if match_list and len(match_list[0]) == 3:
add_hostmask(self, nick)
return
else:
task = self.bot.who(nick)
task.add_done_callback(functools.partial(handle_who, self))
return
2023-03-15 17:24:49 +00:00
###################################################################################
2022-09-05 20:30:29 +00:00
###################################################################################
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
cmd = ' '.join(args['<noise>'])[0]
args = ' '.join(args['<noise>'])[1:]
2023-03-15 17:24:49 +00:00
2022-09-05 20:30:29 +00:00
###################################################################################
2023-03-15 17:24:49 +00:00
###################################################################################
2022-09-05 20:30:29 +00:00
if not cmd:
self.bot.privmsg(target, "please specify add/del/list")
elif cmd in ["d","del","delete","remove"]:
__staff_del(self, mask, target, args)
elif cmd in ["l", "list"]:
__staff_list(self, mask, target, args)
elif cmd in ["w", "write","a", "add"]:
__staff_add(self, mask, target, args)
2023-03-15 17:24:49 +00:00
###########################################################################################
####################################################################################### EOF