100 lines
3.6 KiB
Python
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
|