wikipediagame - annna - Annna the nice friendly bot. | |
git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws6… | |
Log | |
Files | |
Refs | |
Tags | |
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://gophe… | |
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.P… | |
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 le… | |
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" % (g… | |
148 endgame(hintpath, titlepath) | |
149 else: | |
150 print("Sorry, wrong guess. (%.0f%% correct)" % \ | |
151 (SequenceMatcher(None, title.strip().low… | |
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 |