"""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
))