mirror of
https://github.com/oddluck/limnoria-plugins.git
synced 2025-04-25 12:31:07 -05:00
161 lines
6.1 KiB
Python
161 lines
6.1 KiB
Python
###
|
|
# Copyright (c) 2015, butterscotchstallion
|
|
# Copyright (c) 2020, oddluck <oddluck@riseup.net>
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions are met:
|
|
#
|
|
# * Redistributions of source code must retain the above copyright notice,
|
|
# this list of conditions, and the following disclaimer.
|
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
# this list of conditions, and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
# * Neither the name of the author of this software nor the name of
|
|
# contributors to this software may be used to endorse or promote products
|
|
# derived from this software without specific prior written consent.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
###
|
|
|
|
import supybot.utils as utils
|
|
from supybot.commands import *
|
|
import supybot.ircmsgs as ircmsgs
|
|
import supybot.callbacks as callbacks
|
|
import random
|
|
import datetime
|
|
import os
|
|
import requests
|
|
import json
|
|
|
|
try:
|
|
from supybot.i18n import PluginInternationalization
|
|
|
|
_ = PluginInternationalization("Cayenne")
|
|
except ImportError:
|
|
# Placeholder that allows to run the plugin on a bot
|
|
# without the i18n module
|
|
_ = lambda x: x
|
|
|
|
|
|
class Cayenne(callbacks.Plugin):
|
|
"""Displays cat facts or cat gifs based on probability"""
|
|
|
|
threaded = True
|
|
last_message_timestamp = False
|
|
cat_facts = []
|
|
|
|
def __init__(self, irc):
|
|
self.__parent = super(Cayenne, self)
|
|
self.__parent.__init__(irc)
|
|
|
|
def get_fact(self):
|
|
"""
|
|
Get a random cat fact
|
|
"""
|
|
data = requests.get("https://catfact.ninja/fact")
|
|
data = json.loads(data.content)
|
|
return data["fact"]
|
|
|
|
def message_contains_trigger_word(self, message):
|
|
"""
|
|
Check prefined list of trigger words and return
|
|
which one was found, if any
|
|
"""
|
|
words = self.registryValue("triggerWords")
|
|
if words:
|
|
words = [word.strip() for word in words]
|
|
if words:
|
|
for word in words:
|
|
if word and word in message:
|
|
return word
|
|
else:
|
|
self.log.error("Cayenne: no trigger words set apparently")
|
|
return False
|
|
|
|
def get_link(self):
|
|
"""
|
|
Query cat URL to get a random link
|
|
"""
|
|
try:
|
|
link_url = self.registryValue("linkURL")
|
|
response = utils.web.getUrl(link_url).decode("utf8")
|
|
# Expecting a link
|
|
if "http" in response:
|
|
return response
|
|
else:
|
|
self.log.error(
|
|
"Received unexpected response from http://edgecats.net/random"
|
|
)
|
|
except:
|
|
self.log.exception("Error fetching URL")
|
|
|
|
def doPrivmsg(self, irc, msg):
|
|
"""
|
|
Checks each channel message to see if it contains a trigger word
|
|
"""
|
|
channel = msg.args[0]
|
|
is_channel = irc.isChannel(channel)
|
|
is_ctcp = ircmsgs.isCtcp(msg)
|
|
message = msg.args[1]
|
|
bot_nick = irc.nick
|
|
# Check origin nick to make sure the trigger
|
|
# didn"t come from the bot.
|
|
origin_nick = msg.nick
|
|
is_message_from_self = origin_nick.lower() == bot_nick.lower()
|
|
# Only react to messages/actions in a channel and to messages that aren't from
|
|
# the bot itself.
|
|
if (
|
|
is_channel
|
|
and not is_ctcp
|
|
and not is_message_from_self
|
|
and self.registryValue("enable", channel)
|
|
):
|
|
if type(message) is str and len(message):
|
|
fact_chance = int(self.registryValue("factChance"))
|
|
link_chance = int(self.registryValue("linkChance"))
|
|
throttle_seconds = int(self.registryValue("throttleInSeconds"))
|
|
triggered = self.message_contains_trigger_word(message)
|
|
now = datetime.datetime.now()
|
|
seconds = 0
|
|
if self.last_message_timestamp:
|
|
seconds = (now - self.last_message_timestamp).total_seconds()
|
|
throttled = seconds < throttle_seconds
|
|
else:
|
|
throttled = False
|
|
if triggered is not False:
|
|
self.log.debug(
|
|
"Cayenne triggered because message contained %s" % (triggered)
|
|
)
|
|
fact_rand = random.randrange(0, 100) <= fact_chance
|
|
link_rand = random.randrange(0, 100) <= link_chance
|
|
if fact_rand or link_rand:
|
|
if throttled:
|
|
self.log.info(
|
|
"Cayenne throttled. Not meowing: it has been %s seconds"
|
|
% (round(seconds, 1))
|
|
)
|
|
else:
|
|
self.last_message_timestamp = now
|
|
if fact_rand:
|
|
output = self.get_fact()
|
|
if link_rand:
|
|
output = self.get_link()
|
|
if output:
|
|
irc.sendMsg(ircmsgs.privmsg(channel, output))
|
|
else:
|
|
self.log.error("Cayenne: error retrieving output")
|
|
|
|
|
|
Class = Cayenne
|