# -*- coding: utf-8 -*- # # Public domain, 2013 Legoktm; 2013, 2018 Ben Kurtovic # from json import loads import re from urllib import quote from urllib2 import urlopen from earwigbot.commands import Command class UrbanDictionary(Command): """Get the definition of a word or phrase using Urban Dictionary.""" name = "urban" commands = ["urban", "urbandictionary", "dct", "ud"] @staticmethod def _normalize_term(term): return re.sub(r"\W", "", term.lower()) @staticmethod def _normalize_text(text): return re.sub(r"\[(.*?)\]", "\\1", re.sub(r"\s+", " ", text)) def process(self, data): if not data.args: self.reply(data, "What do you want to define?") return url = "http://api.urbandictionary.com/v0/define?term={0}" arg = " ".join(data.args) query = urlopen(url.format(quote(arg, safe=""))).read() res = loads(query) results = res.get("list") if not results: self.reply(data, 'Sorry, no results found.') return result = results[0] definition = self._normalize_text(result["definition"]) example = self._normalize_text(result["example"]) url = result["permalink"].rsplit("/", 1)[0] if definition and definition[-1] not in (".", "!", "?"): definition += "." msg = "{0} \x02Example\x0F: {1} {2}".format( definition.encode("utf8"), example.encode("utf8"), url) if self._normalize_term(result["word"]) != self._normalize_term(arg): msg = "\x02{0}\x0F: {1}".format(result["word"].encode("utf8"), msg) self.reply(data, msg)