"""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 log.info("initialized %s", self.__class__.__name__) def start(self): """Initialization stuff here --- global handlers, configs from database, so on.""" log.info("started %s", self.__class__.__name__) def stop(self): """Teardown stuff here --- unregister handlers, for example.""" log.info("stopped %s", self.__class__.__name__) def _unencode_xml(self, text): """Convert <, >, & to their real entities.""" text = text.replace('<', '<') text = text.replace('>', '>') text = text.replace('&', '&') 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