def setup(bot=None): global url_finder, exclusion_char if not bot: return if bot.config.has_option('url', 'exclude'): regexes = [re.compile(s) for s in bot.config.url.get_list('exclude')] else: regexes = [] # We're keeping these in their own list, rather than putting then in the # callbacks list because 1, it's easier to deal with modules that are still # using this list, and not the newer callbacks list and 2, having a lambda # just to pass is kinda ugly. if not bot.memory.contains('url_exclude'): bot.memory['url_exclude'] = regexes else: exclude = bot.memory['url_exclude'] if regexes: exclude.append(regexes) bot.memory['url_exclude'] = exclude # Ensure that url_callbacks and last_seen_url are in memory if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() if not bot.memory.contains('last_seen_url'): bot.memory['last_seen_url'] = tools.WillieMemory() if bot.config.has_option('url', 'exclusion_char'): exclusion_char = bot.config.url.exclusion_char url_finder = re.compile(r'(?u)(%s?(?:http|https|ftp)(?:://\S+))' % (exclusion_char))
def setup(bot): post_regex = re.compile(post_url) user_regex = re.compile(user_url) if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() bot.memory['url_callbacks'][post_regex] = rpost_info bot.memory['url_callbacks'][user_regex] = redditor_info
def setup(willie): user_regex = re.compile(r'player\.me\/(\w+)') feed_regex = re.compile(r'player\.me/feed/(\d+)') if not willie.memory.contains('url_callbacks'): willie.memory['url_callbacks'] = tools.WillieMemory() willie.memory['url_callbacks'][user_regex] = player_me_regex willie.memory['url_callbacks'][feed_regex] = player_me_feed
def setup(bot): bot.config.define_section('wikipedia', WikipediaSection) regex = re.compile('([a-z]+).(wikipedia.org/wiki/)([^ ]+)') if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() bot.memory['url_callbacks'][regex] = mw_info
def setup(bot): # To early to use the good logger logging.warning( "YouTube is deprecating the v2 API soon. This will break the YouTube " "module. See http://git.io/willie764") if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() bot.memory['url_callbacks'][regex] = ytinfo
def __init__(self, config): irc.Bot.__init__(self, config.core) self.config = config """The ``Config`` for the current Willie instance.""" self.doc = {} """ *Removed in 3.1.2* A dictionary of module functions to their docstring and example, if declared. As of 3.1.2, this dict will be empty, and not updated. """ self.stats = {} """ A dictionary which maps a tuple of a function name and where it was used to the nuber of times it was used there. """ self.times = {} """ A dictionary mapping lower-case'd nicks to dictionaries which map funtion names to the time which they were last used by that nick. """ self.acivity = {} self.db = WillieDB(config) if self.db.check_table('locales', ['name'], 'name'): self.settings = self.db.locales self.db.preferences = self.db.locales elif self.db.check_table('preferences', ['name'], 'name'): self.settings = self.db.preferences elif self.db.type is not None: self.db.add_table('preferences', ['name'], 'name') self.settings = self.db.preferences self.memory = tools.WillieMemory() """ A thread-safe dict for storage of runtime data to be shared between modules. See `WillieMemory <#tools.Willie.WillieMemory>`_ """ self.scheduler = Willie.JobScheduler(self) self.scheduler.start() #Set up block lists #Default to empty if not self.config.core.nick_blocks: self.config.core.nick_blocks = [] if not self.config.core.nick_blocks: self.config.core.host_blocks = [] #Add nicks blocked under old scheme, if present if self.config.core.other_bots: nicks = self.config.core.get_list('nick_blocks') bots = self.config.core.get_list('other_bots') nicks.extend(bots) self.config.core.nick_blocks = nicks self.config.core.other_bots = False self.config.save() self.setup()
def setup(bot): global pattern_url pattern_url = bot.config.redmine.base_url if not pattern_url.endswith('/'): pattern_url = pattern_url + '/' redmine = re.compile(pattern_url + '(\S+)\/(\w+)') if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() bot.memory['url_callbacks'][redmine] = redmine_url
def setup(willie): if not willie.memory.contains('url_callbacks'): willie.memory['url_callbacks'] = tools.WillieMemory() willie.memory['url_callbacks'][regex] = issue_info willie.memory['url_callbacks'][repoRegex] = data_url willie.memory['url_callbacks'][commitRegex] = commit_info if willie.config.has_section('github') and willie.config.github.webhook: setup_webhook(willie)
def setup(willie): if not willie.config.osu.api_key: raise ConfigurationError( 'Could not configure the osu! module. Is the API key configured properly?' ) user_regex = re.compile('osu\.ppy\.sh/(u)/(\w+)') map_regex = re.compile('osu\.ppy\.sh/(s|b)/(\d+)') if not willie.memory.contains('url_callbacks'): willie.memory['url_callbacks'] = tools.WillieMemory() willie.memory['url_callbacks'][user_regex] = osu_user willie.memory['url_callbacks'][map_regex] = osu_beatmap
def setup(willie): try: auth = tweepy.OAuthHandler(willie.config.twitter.consumer_key, willie.config.twitter.consumer_secret) auth.set_access_token(willie.config.twitter.access_token, willie.config.twitter.access_token_secret) api = tweepy.API(auth) except: raise ConfigurationError('Could not authenticate with Twitter. Are the' ' API keys configured properly?') regex = re.compile('twitter.com\/(\S*)\/status\/([\d]+)') if not willie.memory.contains('url_callbacks'): willie.memory['url_callbacks'] = tools.WillieMemory() willie.memory['url_callbacks'][regex] = gettweet
def setup(bot): regexes = [] if not (bot.config.has_option('bugzilla', 'domains') and bot.config.bugzilla.get_list('domains')): return if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() domains = '|'.join(bot.config.bugzilla.get_list('domains')) regex = re.compile((r'https?://(%s)' '(/show_bug.cgi\?\S*?)' '(id=\d+)') % domains) bot.memory['url_callbacks'][regex] = show_bug
def setup(bot): global regex bot.config.define_section('bugzilla', BugzillaSection) if not bot.config.bugzilla.domains: return if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() domains = '|'.join(bot.config.bugzilla.domains) regex = re.compile((r'https?://(%s)' '(/show_bug.cgi\?\S*?)' '(id=\d+)') % domains) bot.memory['url_callbacks'][regex] = show_bug
def setup(bot): """ Tests the validity of the client ID given in the configuration. If it is not, initializes willie's memory callbacks for imgur URLs, and uses them as the trigger for the link parsing function. """ try: client = ImgurClient(bot.config.imgur.client_id) client.request('gallery.json') except HTTPError: raise ConfigurationError( 'Could not validate the client ID with Imgur. \ Are you sure you set it up correctly?') imgur_regex = re.compile('(?:https?://)?(?:i\.)?imgur\.com/(.*)$') if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() bot.memory['url_callbacks'][imgur_regex] = imgur
def setup(bot): global url_finder, exclusion_char, api_url, api_key, api_user, api_private if bot.config.bookie.api_url: try: # say we have "https://example.com/prefix/api/v1/admin/account?api_key=XXXXXX" p = urlparse(bot.config.bookie.api_url) # "https://example.com" api_url = p.scheme + '://' + p.netloc # "/prefix" prefix = p.path.split(api_suffix)[0] if prefix: api_url += prefix # "/api/v1/" api_url += api_suffix # the path element after api_suffix # that is, "admin" api_user = p.path.split(api_suffix)[1].split('/')[0] # "XXXXXX" api_key = p.query.split('=')[1] except Exception as e: raise ConfigurationError('Bookie api_url badly formatted: %s' % str(e)) else: raise ConfigurationError('Bookie module not configured') api_private = validate_private(bot.config.bookie.private) if bot.config.has_option('url', 'exclusion_char'): exclusion_char = bot.config.url.exclusion_char url_finder = re.compile( r'(?u)(.*?)\s*(%s?(?:http|https|ftp)(?:://\S+)\s*(.*?))' % (exclusion_char)) if bot.config.bookie.auto: if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() bot.memory['url_callbacks'][re.compile('.*')] = bmark
def __init__(self, config): irc.Bot.__init__(self, config.core) self.config = config """The ``Config`` for the current Willie instance.""" self.doc = {} """ A dictionary of command names to their docstring and example, if declared. The first item in a callable's commands list is used as the key in version *3.2* onward. Prior to *3.2*, the name of the function as declared in the source code was used. """ self.stats = {} """ A dictionary which maps a tuple of a function name and where it was used to the nuber of times it was used there. """ self.times = {} """ A dictionary mapping lower-case'd nicks to dictionaries which map funtion names to the time which they were last used by that nick. """ self.acivity = {} self.server_capabilities = set() """A set containing the IRCv3 capabilities that the server supports. For servers that do not support IRCv3, this will be an empty set.""" self.enabled_capabilities = set() """A set containing the IRCv3 capabilities that the bot has enabled.""" self._cap_reqs = dict() """A dictionary of capability requests Maps the capability name to a list of tuples of the prefix ('-', '=', or ''), the name of the requesting module, and the function to call if the request is rejected.""" self.privileges = dict() """A dictionary of channels to their users and privilege levels The value associated with each channel is a dictionary of Identifiers to a bitwise integer value, determined by combining the appropriate constants from `module`.""" self.db = WillieDB(config) """The bot's database.""" self.memory = tools.WillieMemory() """ A thread-safe dict for storage of runtime data to be shared between modules. See `WillieMemory <#tools.Willie.WillieMemory>`_ """ self.scheduler = Willie.JobScheduler(self) self.scheduler.start() #Set up block lists #Default to empty if not self.config.core.nick_blocks: self.config.core.nick_blocks = [] if not self.config.core.nick_blocks: self.config.core.host_blocks = [] #Add nicks blocked under old scheme, if present if self.config.core.other_bots: nicks = self.config.core.get_list('nick_blocks') bots = self.config.core.get_list('other_bots') nicks.extend(bots) self.config.core.nick_blocks = nicks self.config.core.other_bots = False self.config.save() self.setup()
def __init__(self, config, daemon=False): irc.Bot.__init__(self, config) self._daemon = daemon # Used for iPython. TODO something saner here # `re.compile('.*') is re.compile('.*')` because of caching, so we need # to associate a list with each regex, since they are unexpectedly # indistinct. self._callables = { 'high': collections.defaultdict(list), 'medium': collections.defaultdict(list), 'low': collections.defaultdict(list) } self.config = config """The ``Config`` for the current Willie instance.""" self.doc = {} """ A dictionary of command names to their docstring and example, if declared. The first item in a callable's commands list is used as the key in version *3.2* onward. Prior to *3.2*, the name of the function as declared in the source code was used. """ self.stats = {} """ A dictionary which maps a tuple of a function name and where it was used to the nuber of times it was used there. """ self.times = {} """ A dictionary mapping lower-case'd nicks to dictionaries which map funtion names to the time which they were last used by that nick. """ self.acivity = {} self.server_capabilities = set() """A set containing the IRCv3 capabilities that the server supports. For servers that do not support IRCv3, this will be an empty set.""" self.enabled_capabilities = set() """A set containing the IRCv3 capabilities that the bot has enabled.""" self._cap_reqs = dict() """A dictionary of capability requests Maps the capability name to a list of tuples of the prefix ('-', '=', or ''), the name of the requesting module, and the function to call if the request is rejected.""" self.privileges = dict() """A dictionary of channels to their users and privilege levels The value associated with each channel is a dictionary of Identifiers to a bitwise integer value, determined by combining the appropriate constants from `module`.""" self.db = WillieDB(config) """The bot's database.""" self.memory = tools.WillieMemory() """ A thread-safe dict for storage of runtime data to be shared between modules. See `WillieMemory <#tools.Willie.WillieMemory>`_ """ self.scheduler = willie.tools.jobs.JobScheduler(self) self.scheduler.start() # Set up block lists # Default to empty if not self.config.core.nick_blocks: self.config.core.nick_blocks = [] if not self.config.core.nick_blocks: self.config.core.host_blocks = [] self.setup()
def setup(willie): regex = re.compile('safebooru.org.*(?:\?|&)id\=([-_a-zA-Z0-9]+)') if not willie.memory.contains('url_callbacks'): willie.memory['url_callbacks'] = tools.WillieMemory() willie.memory['url_callbacks'][regex] = safebooru_url
def setup(bot): regex = re.compile('(youtube.com/watch\S*v=|youtu.be/)([\w-]+)') if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() bot.memory['url_callbacks'][regex] = ytinfo
def setup(bot): if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() bot.memory['url_callbacks'][regex] = ytinfo
def setup(willie): regex = re.compile('((?:.+\.)?deviantart\.com/.*)') if not willie.memory.contains('url_callbacks'): willie.memory['url_callbacks'] = tools.WillieMemory() willie.memory['url_callbacks'][regex] = get_page_info
def setup(bot): regex = re.compile(issueURL) if not bot.memory.contains('url_callbacks'): bot.memory['url_callbacks'] = tools.WillieMemory() bot.memory['url_callbacks'][regex] = issue_info
def setup(willie): regex = re.compile('((www\.)?amazon\.com/[^ ]+)') if not willie.memory.contains('url_callbacks'): willie.memory['url_callbacks'] = tools.WillieMemory() willie.memory['url_callbacks'][regex] = amazon_url