From a3cce24352ae4433c16acb659a749dffbe1879da Mon Sep 17 00:00:00 2001 From: deathbybandaid Date: Wed, 9 Feb 2022 17:53:09 -0500 Subject: [PATCH] test --- SpiceBot/SpiceBotCore/__init__.py | 8 +- .../SpiceBotCore/interface/comms/__init__.py | 5 +- .../SpiceBotCore/interface/events/__init__.py | 147 ++++++++++++++++++ SpiceBot/__init__.py | 12 ++ 4 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 SpiceBot/SpiceBotCore/interface/events/__init__.py diff --git a/SpiceBot/SpiceBotCore/__init__.py b/SpiceBot/SpiceBotCore/__init__.py index dc0cad2..e3e45c8 100644 --- a/SpiceBot/SpiceBotCore/__init__.py +++ b/SpiceBot/SpiceBotCore/__init__.py @@ -4,6 +4,7 @@ from .interface.versions import Versions from .interface.logger import Logger from .interface.database import Database from .interface.comms import Comms +from .interface.events import Events class SpiceBotCore_OBJ(): @@ -29,6 +30,10 @@ class SpiceBotCore_OBJ(): self.database = Database(self.config) self.logger.info("SpiceBot Database Interface Setup Complete.") + # SpiceBots manual event system + self.events = Events(self.logger) + self.logger.info("SpiceBot Events Interface Setup Complete.") + # Bypass Sopel's method for writing to IRC self.comms = Comms(self.config) self.logger.info("SpiceBot Comms Interface Setup Complete.") @@ -42,9 +47,6 @@ class SpiceBotCore_OBJ(): # Re-initialize the bot config properly during plugin setup routine self.config.config = bot.config - # Set bot value for comms - self.comms.bot = bot - # OSD shortcut def osd(self, messages, recipients=None, text_method='PRIVMSG', max_messages=-1): return self.comms.osd(messages, recipients, text_method, max_messages) diff --git a/SpiceBot/SpiceBotCore/interface/comms/__init__.py b/SpiceBot/SpiceBotCore/interface/comms/__init__.py index 5f9c7c0..d323e63 100644 --- a/SpiceBot/SpiceBotCore/interface/comms/__init__.py +++ b/SpiceBot/SpiceBotCore/interface/comms/__init__.py @@ -22,8 +22,9 @@ class Comms(): self.sending = threading.RLock() self.stack = {} - def append_bot(self, bot): - self.bot = bot + def ircbackend_initialize(self, bot): + self.backend = bot.backend + self.dispatch = bot.dispatch @property def botnick(self): diff --git a/SpiceBot/SpiceBotCore/interface/events/__init__.py b/SpiceBot/SpiceBotCore/interface/events/__init__.py new file mode 100644 index 0000000..78175e7 --- /dev/null +++ b/SpiceBot/SpiceBotCore/interface/events/__init__.py @@ -0,0 +1,147 @@ +# coding=utf8 +from __future__ import unicode_literals, absolute_import, division, print_function +""" +This is the SpiceBot events system. +We utilize the Sopel code for event numbers and +self-trigger the bot into performing actions +""" + +import sopel +import functools +import threading +import time + + +class Events(object): + """A dynamic listing of all the notable Bot numeric events. + Events will be assigned a 4-digit number above 1000. + This allows you to do, ``@module.event(events.BOT_WELCOME)```` + Triggers handled by this module will be processed immediately. + Others will be placed into a queue. + Triggers will be logged by ID and content + """ + + def __init__(self, logger): + self.logger = logger + self.lock = threading.Lock() + + # This is a defined IRC event + self.RPL_WELCOME = '001' + self.RPL_MYINFO = '004' + self.RPL_ISUPPORT = '005' + self.RPL_WHOREPLY = '352' + self.RPL_NAMREPLY = '353' + + # this is an unrealircd event + self.RPL_WHOISREGNICK = '307' + + # These Are Speicebot generated events + self.BOT_UPTIME = time.time() + self.BOT_WELCOME = '1001' + self.BOT_READY = '1002' + self.BOT_CONNECTED = '1003' + self.BOT_LOADED = '1004' + self.BOT_RECONNECTED = '1005' + + self.defaultevents = [self.BOT_WELCOME, self.BOT_READY, self.BOT_CONNECTED, self.BOT_LOADED, self.BOT_RECONNECTED] + self.dict = { + "assigned_IDs": {1000: "BOT_UPTIME", 1001: "BOT_WELCOME", 1002: "BOT_READY", 1003: "BOT_CONNECTED", 1004: "BOT_LOADED", 1005: "BOT_RECONNECTED"}, + "triggers_recieved": {}, + "trigger_queue": [], + "startup_required": [self.BOT_WELCOME, self.BOT_READY, self.BOT_CONNECTED], + "RPL_WELCOME_Count": 0 + } + + def __getattr__(self, name): + ''' will only get called for undefined attributes ''' + self.lock.acquire() + eventnumber = max(list(self.dict["assigned_IDs"].keys())) + 1 + self.dict["assigned_IDs"][eventnumber] = str(name) + setattr(self, name, str(eventnumber)) + self.lock.release() + return str(eventnumber) + + def trigger(self, bot, number, message="SpiceBot_Events"): + pretriggerdict = {"number": str(number), "message": message} + if number in self.defaultevents: + self.dispatch(bot, pretriggerdict) + else: + self.dict["trigger_queue"].append(pretriggerdict) + + def dispatch(self, bot, pretriggerdict): + number = pretriggerdict["number"] + message = pretriggerdict["message"] + pretrigger = sopel.trigger.PreTrigger( + bot.nick, + ":SpiceBot_Events " + str(number) + " " + str(bot.nick) + " :" + message + ) + bot.dispatch(pretrigger) + self.recieved({"number": number, "message": message}) + + def recieved(self, trigger): + self.lock.acquire() + + if isinstance(trigger, dict): + eventnumber = str(trigger["number"]) + message = str(trigger["message"]) + else: + eventnumber = str(trigger.event) + message = trigger.args[1] + self.logger('SpiceBot_Events', str(eventnumber) + " " + str(message)) + if eventnumber not in self.dict["triggers_recieved"]: + self.dict["triggers_recieved"][eventnumber] = [] + self.dict["triggers_recieved"][eventnumber].append(message) + self.lock.release() + + def check(self, checklist): + if not isinstance(checklist, list): + checklist = [str(checklist)] + for number in checklist: + if str(number) not in list(self.dict["triggers_recieved"].keys()): + return False + return True + + def startup_add(self, startlist): + self.lock.acquire() + if not isinstance(startlist, list): + startlist = [str(startlist)] + for eventitem in startlist: + if eventitem not in self.dict["startup_required"]: + self.dict["startup_required"].append(eventitem) + self.lock.release() + + def startup_check(self): + for number in self.dict["startup_required"]: + if str(number) not in list(self.dict["triggers_recieved"].keys()): + return False + return True + + def startup_debug(self): + not_done = [] + for number in self.dict["startup_required"]: + if str(number) not in list(self.dict["triggers_recieved"].keys()): + not_done.append(int(number)) + reference_not_done = [] + for item in not_done: + reference_not_done.append(str(self.dict["assigned_IDs"][item])) + return reference_not_done + + def check_ready(self, checklist): + def actual_decorator(function): + @functools.wraps(function) + def _nop(*args, **kwargs): + while not self.check(checklist): + pass + return function(*args, **kwargs) + return _nop + return actual_decorator + + def startup_check_ready(self): + def actual_decorator(function): + @functools.wraps(function) + def _nop(*args, **kwargs): + while not self.startup_check(): + pass + return function(*args, **kwargs) + return _nop + return actual_decorator diff --git a/SpiceBot/__init__.py b/SpiceBot/__init__.py index d959974..79d74c6 100644 --- a/SpiceBot/__init__.py +++ b/SpiceBot/__init__.py @@ -27,3 +27,15 @@ def sb_nickname_command(bot, trigger): bot.say("%s" % sb.versions.dict) sb.osd("test", trigger.sender) + + +@plugin.event("001") +@plugin.rule('.*') +def welcome_setup_start(bot, trigger): + sb.comms.ircbackend_initialize(bot) + + +@plugin.event(sb.events.BOT_CONNECTED) +@plugin.rule('.*') +def bot_events_start(bot, trigger): + sb.comms.hostmask_set(bot)