tilde-projects/Code/irc/acronymFinder.py

100 lines
3.6 KiB
Python

#!/usr/bin/python3
import urllib
from bs4 import BeautifulSoup
import random
import string
dict = "/usr/share/dict/american-english"
(userId, token) = open("/home/krowbar/.secret/s4token").readline().rstrip().split(",")
def get_acros(word, silly, short):
acros = []
url = "http://www.stands4.com/services/v2/abbr.php?uid={}&tokenid={}&term={}".format(
userId, token, word
)
soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html5lib")
results = soup.find_all("result")
# there are lots of cases where the same definition is repeated multiple times under different categories. this is dumb so we should do a little more work
defs = []
for r in results:
rdef = r.find("definition").text
match = next((x for x in defs if x["definition"].lower() == rdef.lower()), None)
if match is not None:
# if we find a match, add the category to the existing categories and increase the score
match["categories"].append(
(
(r.find("parentcategoryname").text + "\\")
if r.find("parentcategoryname")
else ""
)
+ r.find("categoryname").text
)
match["score"] = str(float(match["score"]) + float(r.find("score").text))
else: # add a new item
defs.append(
{
"term": r.find("term").text,
"definition": r.find("definition").text,
"categories": [
(
(r.find("parentcategoryname").text + "\\")
if r.find("parentcategoryname")
else ""
)
+ r.find("categoryname").text
],
"score": r.find("score").text,
}
)
for d in sorted(defs, key=lambda x: float(x["score"]), reverse=True):
# print d;
if short is True:
acros.append('"%s"' % d["definition"])
else:
acros.append(
(
'{}: "{}" ({}, score: {})'.format(
d["term"],
d["definition"],
", ".join(d["categories"]),
d["score"],
)
)
)
if silly is True:
newDef = []
words = open(dict, "r").readlines()
try:
for idx, letter in enumerate(word):
newWord = random.choice(
list(filter(
lambda w: (idx is 0 or not w.strip().lower().endswith("'s"))
and w.lower().startswith(letter.lower()),
words,
))
).strip()
print(str(idx) + " -> " + newWord)
newDef.append(newWord)
newWord = string.capwords(" ".join(newDef))
if short is True:
acros.append('"%s"' % newWord)
else:
acros.append(
(
'{}: "{}" ({}, score: {})'.format(
word.upper(), newWord, "Tilde.town Original", "0"
)
)
)
except IndexError:
acros.append("Future hazy, try again later: Tilde.town Error")
if short is True:
shortList = acros[0:5]
if len(acros) > 5:
shortList.append(acros[-1])
return [word.upper() + ": " + ", ".join(shortList)]
else:
return acros