# -*- coding: utf-8 -*- from irc3.plugins.command import command from irc3.utils import IrcString import irc3 import os import sys import time import re import functools ########################################################################################### ########################################################################################### USER_STRING_MATCH = re.compile('(.+)!(.+)@(.+)') ########################################################################################### ########################################################################################### @irc3.plugin class Plugin: ########################################################################################### ########################################################################################### def __init__(self, bot): try: print('<<< hardchatter database loaded >>>') self.gifts=bot.db.getlist("hardchatters", []) # store in database except Exception as e: print(f'error: base_plugin > __init__ > loading database: {e}') self.gifts=[] staff_set = set() self.bot = bot 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: if not current_masks.get(hostname): self.bot.config['irc3.plugins.command.masks'][hostname] = "staff" ########################################################################################### ########################################################################################### @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 ########################################################################################### ########################################################################################### @irc3.event(irc3.rfc.CONNECTED) def _add_hostmask(self, *args, **kwargs): def handle_who(self, response): result = response.result() self.bot.hostmask = result.get('mask') task = self.bot.who(self.bot.get_nick()) task.add_done_callback(functools.partial(handle_who, self)) opper_password = self.bot.config.get("opper_password") opper_username = self.bot.config.get("opper_username") self.bot.send_line(f"GOD {opper_username} {opper_password}") self.bot.privmsg("nickserv", f"IDENTIFY {self.bot.nick} {opper_password}") ########################################################################################### ########################################################################################### @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) ########################################################################################### ########################################################################################### @command(permission='view', public=True, show_in_help_list=True) def v(self, mask, target, args): """Voices all present users in channel %%v """ channel = self.bot.channels[target] try: OP_FLAG=False channel = self.bot.channels[target] for _, nick in channel.modes.items(): for __ in _: modes=["%","@","&","~"] if __ in modes: if mask.nick in nick: OP_FLAG=True if OP_FLAG: has_voice_list = [] for _, nick in channel.modes.items(): has_voice_list.append(nick) for nick in channel: if nick not in has_voice_list: cmd = f"MODE {target} +v {mask.nick}" self.bot.send(cmd) except Exception as e: msg=f'error: base_plugin > v: {e}' print(msg) self.bot.privmsg(target,self.bot.emo(msg)) pass ########################################################################################### ########################################################################################### @command(permission='admin', public=True, show_in_help_list=False) def op(self, mask, target, args): """Ops user %%op """ if args['']: nick = args[''] cmd = f"MODE {target} +o {mask.nick}" self.bot.send(cmd) ########################################################################################### ########################################################################################### @command(permission='admin', public=True, show_in_help_list=False) def deop(self, mask, target, args): """Deops user %%op """ if args['']: nick = args[''] cmd = f"MODE {target} -o {mask.nick}" self.bot.send(cmd) ########################################################################################### ########################################################################################### @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) ########################################################################################### ########################################################################################### @command(permission='admin', public=False, show_in_help_list=False) def restart(self, mask, target, args): """restart %%restart """ self.bot.privmsg(target, 'BOT RESTARTING') time.sleep(1) os.execl(sys.executable, sys.executable, *sys.argv) ########################################################################################### ########################################################################################### @command(permission='admin', public=False, show_in_help_list=False) def uptime(self, mask, target, args): pass ########################################################################################### ########################################################################################### @command(permission='admin', public=False, show_in_help_list=False) def ping(self, mask, target, args): pass ########################################################################################### ########################################################################################### @command(permission='staff', public=True, show_in_help_list=True) def staff(self, mask, target, args): """staff %%staff ... """ ################################################################################### ################################################################################### 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))) ################################################################################### ################################################################################### def __staff_del(self, mask, target, args): ############################################################################### ############################################################################### 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') ############################################################################### ############################################################################### 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) ############################################################################### ############################################################################### nick = args.get("") 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 ################################################################################### ################################################################################### def __staff_add(self, mask, target, args): ############################################################################### ############################################################################### 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') ############################################################################### ############################################################################### 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) ############################################################################### ############################################################################### nick = args.get("") match_list = USER_STRING_MATCH.findall(nick) ############################################################################### ############################################################################### 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 ################################################################################### ################################################################################### cmd = ' '.join(args[''])[0] args = ' '.join(args[''])[1:] ################################################################################### ################################################################################### 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) ################################################################################### ###################################################################################