dr.botzo/ircbot/lib.py

85 lines
2.6 KiB
Python
Raw Normal View History

"""Library and convenience methods for the IRC bot and plugins."""
import logging
import irc.client
from django.core.exceptions import ObjectDoesNotExist
from ircbot.models import BotUser
log = logging.getLogger('ircbot.lib')
class Plugin(object):
"""Plugin base class."""
def __init__(self, bot, connection, event):
"""Initialization stuff here --- global handlers, configs from database, so on."""
self.bot = bot
self.connection = connection
self.event = event
2016-01-16 17:58:11 -06:00
log.info("initialized %s", self.__class__.__name__)
def start(self):
"""Initialization stuff here --- global handlers, configs from database, so on."""
2016-01-16 17:58:11 -06:00
log.info("started %s", self.__class__.__name__)
def stop(self):
"""Teardown stuff here --- unregister handlers, for example."""
2016-01-16 17:58:11 -06:00
log.info("stopped %s", self.__class__.__name__)
def _unencode_xml(self, text):
"""Convert <, >, & to their real entities."""
text = text.replace('&lt;', '<')
text = text.replace('&gt;', '>')
text = text.replace('&amp;', '&')
return text
def has_permission(source, permission):
"""Check if the provided event source is a bot admin."""
try:
bot_user = BotUser.objects.get(nickmask=source)
log.debug("found bot user %s", bot_user)
except BotUser.DoesNotExist:
log.debug("could not find bot user for %s", source)
return False
try:
django_user = bot_user.user
if django_user.has_perm(permission):
log.debug("bot user %s has requested permission %s", bot_user, permission)
return True
except ObjectDoesNotExist:
log.error("could not find django user for bot user %s", bot_user)
return False
log.debug("bot user %s does not have requested permission %s", bot_user, permission)
return False
def reply_destination_for_event(event):
"""Get the "natural" reply destination for an event.
If the event appears to be from a person within a channel, the channel
is the reply destination. Otherwise, the source (assumed to be the speaker
in a privmsg)'s nick is the reply destination.
"""
if irc.client.is_channel(event.target):
return event.target
else:
return irc.client.NickMask(event.source).nick
def most_specific_message(event):
"""Provides the "most specific" message for a pubmsg/privmsg.
Specificity is defined as the raw message, or the message after a "bot: blah" address.
"""
if event.addressed:
return event.addressed_msg
else:
return event.original_msg