wikipediagame - annna - Annna the nice friendly bot. HTML git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/annna/ DIR Log DIR Files DIR Refs DIR Tags DIR README --- wikipediagame (4569B) --- 1 #!/usr/bin/env python 2 # coding=utf-8 3 # 4 # Idea from: https://github.com/izabera/izabot/blob/master/cus_lib.py#L89 5 # 6 7 import os 8 import sys 9 import getopt 10 import wikipedia as w 11 import json 12 import random 13 from difflib import SequenceMatcher 14 15 def usage(app): 16 app = os.path.basename(app) 17 print("usage: %s [-h] cmd" % (app), file=sys.stderr) 18 sys.exit(1) 19 20 def concealtitle(s, title): 21 splittitle = title.replace(",", " ").replace("-", " ") 22 for titlepart in splittitle.split(): 23 s = s.replace(titlepart, "*" * len(titlepart)) 24 return s 25 26 def geturi(wpage): 27 wuri = wpage.url 28 return wuri.replace("https://en.wikipedia.org/wiki", "gopher://gopherpedia.com/0") 29 30 def endgame(hintpath, titlepath): 31 if os.path.exists(hintpath): 32 os.remove(hintpath) 33 if os.path.exists(titlepath): 34 os.remove(titlepath) 35 36 def main(args): 37 try: 38 opts, largs = getopt.getopt(args[1:], "h") 39 except getopt.GetoptError as err: 40 print(str(err)) 41 usage(args[0]) 42 43 basepath = "/home/annna/bin/modules/wikipediagame" 44 printsummary = 0 45 newtitle = 0 46 title = None 47 48 for o, a in opts: 49 if o == "-h": 50 usage(args[0]) 51 else: 52 assert False, "unhandled option" 53 54 if len(largs) < 1: 55 usage(args[0]) 56 57 titlepath = "%s/lasttitle" % (basepath) 58 hintpath = "%s/hintsize" % (basepath) 59 60 cmd = largs[0] 61 if cmd == "init": 62 if len(largs) > 1: 63 searchresults = w.search(largs[1]) 64 while len(searchresults) > 0: 65 title = random.choice(searchresults) 66 try: 67 summary = w.summary(title) 68 break 69 except w.exceptions.DisambiguationError: 70 searchresults.remove(title) 71 continue 72 73 if title == None: 74 summary = None 75 while summary == None: 76 title = str(w.random()) 77 try: 78 summary = w.summary(title) 79 except (w.exceptions.DisambiguationError, w.exceptions.PageError): 80 continue 81 82 if os.path.exists(hintpath): 83 os.remove(hintpath) 84 if os.path.exists(titlepath): 85 os.remove(titlepath) 86 newtitle = 1 87 printsummary = 1 88 else: 89 if os.path.exists(titlepath): 90 titlefd = open(titlepath, "r") 91 title = str(json.load(titlefd)) 92 titlefd.close() 93 else: 94 title = "" 95 96 if len(title) == 0: 97 print("There is no game started. Please run init.") 98 return 0 99 100 if newtitle == 1: 101 titlefd = open(titlepath, "w+") 102 json.dump(title, titlefd) 103 titlefd.close() 104 105 if cmd == "summary": 106 printsummary = 1 107 108 if printsummary == 1: 109 summary = w.summary(title).replace("\n", " ") 110 print(concealtitle(summary, title)) 111 112 if os.path.exists(hintpath): 113 hintfd = open(hintpath, "r") 114 try: 115 hintsize = int(json.load(hintfd)) 116 except json.decoder.JSONDecodeError: 117 hintsize = 0 118 hintfd.close() 119 else: 120 hintsize = 0 121 122 if cmd == "hint": 123 hintsize += 3 124 hint = title[:hintsize] \ 125 + "".join(["*" if c != ' ' else ' ' for c in title[hintsize:]]) 126 print("Hint: %s" % (hint)) 127 128 hintfd = open(hintpath, "w+") 129 json.dump(hintsize, hintfd) 130 hintfd.close() 131 132 if cmd == "more": 133 wpage = w.page(title) 134 images = [item for item in wpage.images if item.find('/commons/')] 135 if len(images) > 0 and random.random() < 0.5: 136 print(random.choice(images)) 137 else: 138 paragraphs = wpage.content.split('\n') 139 paragraph = random.choice([item for item in paragraphs if len(item) > 5 and item[0] != '=']) 140 print(concealtitle(paragraph, title)) 141 142 if cmd == "guess": 143 if len(largs) < 2: 144 usage(args[0]) 145 trytext = largs[1] 146 if title.strip().lower() == trytext.strip().lower(): 147 print("Congrats! You have found the right title! :: %s" % (geturi(w.page(title)))) 148 endgame(hintpath, titlepath) 149 else: 150 print("Sorry, wrong guess. (%.0f%% correct)" % \ 151 (SequenceMatcher(None, title.strip().lower(), trytext.strip().lower()).ratio() * 100)) 152 153 if cmd == "giveup": 154 print("The correct title was: %s" % (geturi(w.page(title)))) 155 endgame(hintpath, titlepath) 156 157 return 0 158 159 if __name__ == "__main__": 160 sys.exit(main(sys.argv)) 161