This commit is contained in:
deathbybandaid 2022-02-09 17:53:09 -05:00
parent e5a4d27c94
commit a3cce24352
4 changed files with 167 additions and 5 deletions

View File

@ -4,6 +4,7 @@ from .interface.versions import Versions
from .interface.logger import Logger from .interface.logger import Logger
from .interface.database import Database from .interface.database import Database
from .interface.comms import Comms from .interface.comms import Comms
from .interface.events import Events
class SpiceBotCore_OBJ(): class SpiceBotCore_OBJ():
@ -29,6 +30,10 @@ class SpiceBotCore_OBJ():
self.database = Database(self.config) self.database = Database(self.config)
self.logger.info("SpiceBot Database Interface Setup Complete.") 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 # Bypass Sopel's method for writing to IRC
self.comms = Comms(self.config) self.comms = Comms(self.config)
self.logger.info("SpiceBot Comms Interface Setup Complete.") 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 # Re-initialize the bot config properly during plugin setup routine
self.config.config = bot.config self.config.config = bot.config
# Set bot value for comms
self.comms.bot = bot
# OSD shortcut # OSD shortcut
def osd(self, messages, recipients=None, text_method='PRIVMSG', max_messages=-1): def osd(self, messages, recipients=None, text_method='PRIVMSG', max_messages=-1):
return self.comms.osd(messages, recipients, text_method, max_messages) return self.comms.osd(messages, recipients, text_method, max_messages)

View File

@ -22,8 +22,9 @@ class Comms():
self.sending = threading.RLock() self.sending = threading.RLock()
self.stack = {} self.stack = {}
def append_bot(self, bot): def ircbackend_initialize(self, bot):
self.bot = bot self.backend = bot.backend
self.dispatch = bot.dispatch
@property @property
def botnick(self): def botnick(self):

View File

@ -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

View File

@ -27,3 +27,15 @@ def sb_nickname_command(bot, trigger):
bot.say("%s" % sb.versions.dict) bot.say("%s" % sb.versions.dict)
sb.osd("test", trigger.sender) 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)