test
This commit is contained in:
parent
e5a4d27c94
commit
a3cce24352
@ -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)
|
||||
|
||||
@ -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):
|
||||
|
||||
147
SpiceBot/SpiceBotCore/interface/events/__init__.py
Normal file
147
SpiceBot/SpiceBotCore/interface/events/__init__.py
Normal 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
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user