🏡 index : ~doyle/dave.git

# -*- coding: utf-8 -*-
"""Give the user back urbandictionary results."""
import dave.module
import dave.config
import requests
import pickle
import re
from urllib.parse import quote_plus
from twisted.words.protocols.irc import assembleFormattedText, attributes as A


@dave.module.help("Get results for an urbandictionary query. Syntax: urban [result #] (query)")
@dave.module.command(["urbandictionary", "ub", "urban"], "(\d+ )?([a-zA-Z0-9 ]+)$")
@dave.module.priority(dave.module.Priority.HIGHEST)
@dave.module.ratelimit(1, 1)
def urbandictionary(bot, args, sender, source):
    result = int(args[0].strip()) - 1 if args[0] else 0
    query = args[1].strip().lower()

    key = "urban:{}:{}".format(query, result)

    if dave.config.redis.exists(key):
        bot.reply(source, sender, dave.config.redis.get(key).decode('utf-8'))
        return

    if not dave.config.redis.exists("urban_query:{}".format(query)):
        url = "https://mashape-community-urban-dictionary.p.mashape.com/define?term={}".format(quote_plus(query))
        r = requests.get(url, headers={
            "X-Mashape-Key": dave.config.config["api_keys"]["mashape"],
            "Accept": "text/plain"
        })

        resp = r.json()
        dave.config.redis.setex("urban_query:{}".format(query), 86400, pickle.dumps(resp))
    else:
        resp = pickle.loads(dave.config.redis.get("urban_query:{}".format(query)))

    print(resp)

    if len(resp["list"]) > result:
        res = resp["list"][result]
        definition = re.sub(r"\r?\n|\r", "", res["definition"].strip())

        if len(definition) > 200:
            definition = definition[:197] + "..."

        definition = assembleFormattedText(A.normal[A.bold[str(res["word"])], ": {} [by {}, +{}/-{}] [more at {}]".format(
            definition,
            res["author"],
            res["thumbs_up"],
            res["thumbs_down"],
            res["permalink"]
        )])

        dave.config.redis.setex(key, 86400, definition)
        bot.reply(source, sender, definition)
    else:
        bot.reply(source, sender, "There are no entries for: {} at position {}".format(
            query,
            result
        ))