Mercurial > hg > rlgallery-misc
comparison py/rlgalldb.py @ 17:7f7b3da664d6
Begin adding arogue5 support to the recorder script.
rlgalldb.py's arogue5 object is a nonfunctional stub, but at least it
doesn't crash and the other games still work.
author | John "Elwin" Edwards <elwin@sdf.org> |
---|---|
date | Sun, 16 Sep 2012 20:44:22 -0700 |
parents | f5a37cc7f41f |
children | 5731d2ecaec4 |
comparison
equal
deleted
inserted
replaced
16:5297ccba4e70 | 17:7f7b3da664d6 |
---|---|
141 clist.append("N/A") | 141 clist.append("N/A") |
142 of.write(maketablerow(clist)) | 142 of.write(maketablerow(clist)) |
143 of.write(tblend) | 143 of.write(tblend) |
144 return | 144 return |
145 | 145 |
146 def readentries(entfile, entlist): | |
147 "Reads a list of entries from a file object" | |
148 while True: | |
149 nextentry = entfile.readline() | |
150 if not nextentry: | |
151 break | |
152 if nextentry[-1] != '\n': # The line is incomplete | |
153 break | |
154 entlist.append(nextentry.split(None, 4)) | |
155 return | |
156 | |
157 class Game: | 146 class Game: |
158 pass | 147 def __init__(self, name, uname): |
159 | 148 pass |
160 class RogueGame(Game): | |
161 def __init__(self, name, uname, suffix): | |
162 self.name = name | |
163 self.uname = uname | |
164 self.scores = logdir + uname + ".log" | |
165 self.logspec = ["endt", "score", "name", "xl", "fate"] | |
166 self.sqltypes = {"endt": "timestamptz", "score": "int", | |
167 "name": "varchar(20)", "xl": "int", "fate": "text", | |
168 "ttyrecs": "text ARRAY", "startt": "timestamptz"} | |
169 self.logdelim = " " | |
170 # Class variables, used by some methods | |
171 fields = ["name", "score", "xl", "fate", "endt"] | |
172 rankfields = ["rank", "score", "name", "xl", "fate", "endt"] | |
173 pfields = ["score", "xl", "fate", "endt"] | |
174 def logtoDict(self, entry): | 149 def logtoDict(self, entry): |
175 "Processes a log entry string, returning a dict." | 150 "Processes a log entry string, returning a dict." |
176 ndict = {"game": self} | 151 ndict = {"game": self} |
177 entrylist = entry.strip().split(self.logdelim, len(self.logspec) - 1) | 152 entrylist = entry.strip().split(self.logdelim, len(self.logspec) - 1) |
178 for item, value in zip(self.logspec, entrylist): | 153 for item, value in zip(self.logspec, entrylist): |
179 if self.sqltypes[item] == "int": | 154 if self.sqltypes[item] == "int": |
180 ndict[item] = int(value) | 155 ndict[item] = int(value) |
156 if self.sqltypes[item] == "bool": | |
157 ndict[item] = bool(int(value)) | |
181 elif self.sqltypes[item] == "timestamptz": | 158 elif self.sqltypes[item] == "timestamptz": |
182 ndict[item] = datetime.fromtimestamp(int(value), utc) | 159 ndict[item] = datetime.fromtimestamp(int(value), utc) |
183 else: | 160 else: |
184 ndict[item] = value | 161 ndict[item] = value |
185 return ndict | 162 return ndict |
192 break | 169 break |
193 if nextentry[-1] != '\n': | 170 if nextentry[-1] != '\n': |
194 break | 171 break |
195 entlist.append(self.logtoDict(nextentry)) | 172 entlist.append(self.logtoDict(nextentry)) |
196 return | 173 return |
174 # TODO how does this work with postprocess? | |
175 def loadnew(self): | |
176 conn = getconn() | |
177 if conn == None: | |
178 return [] | |
179 cur = conn.cursor() | |
180 # Get the previous offset | |
181 cur.execute(offselstr, [self.uname]) | |
182 offset = cur.fetchone()[0] | |
183 newlist = [] | |
184 try: | |
185 scr = open(self.scores) | |
186 scr.seek(offset) | |
187 self.getEntryDicts(scr, newlist) | |
188 except IOError: | |
189 noffset = offset # Can't read anything, assume no new games | |
190 else: | |
191 noffset = scr.tell() | |
192 scr.close() | |
193 cur.execute(newoffstr, [noffset, self.uname]) | |
194 # The new players must already be added to the players table. | |
195 updatenames = set([ e["name"] for e in newlist ]) | |
196 self.postprocess(newlist) | |
197 self.putIntoDB(newlist, conn) | |
198 cur.close() | |
199 conn.close() | |
200 return updatenames | |
201 # End Game class definition | |
202 | |
203 class RogueGame(Game): | |
204 def __init__(self, name, uname, suffix): | |
205 self.name = name | |
206 self.uname = uname | |
207 self.scores = logdir + uname + ".log" | |
208 self.logspec = ["endt", "score", "name", "xl", "fate"] | |
209 self.sqltypes = {"endt": "timestamptz", "score": "int", | |
210 "name": "varchar(20)", "xl": "int", "fate": "text", | |
211 "ttyrecs": "text ARRAY", "startt": "timestamptz"} | |
212 self.logdelim = " " | |
213 # Class variables, used by some methods | |
214 fields = ["name", "score", "xl", "fate", "endt"] | |
215 rankfields = ["rank", "score", "name", "xl", "fate", "endt"] | |
216 pfields = ["score", "xl", "fate", "endt"] | |
197 def getRecent(self, n=20): | 217 def getRecent(self, n=20): |
198 "Gets the n most recent games out of the database, returning a list \ | 218 "Gets the n most recent games out of the database, returning a list \ |
199 of dicts." | 219 of dicts." |
200 try: | 220 try: |
201 n = int(n) | 221 n = int(n) |
323 recs = [ k[1] for k in vfilekeys if lowlim <= k[0] < hilim ] | 343 recs = [ k[1] for k in vfilekeys if lowlim <= k[0] < hilim ] |
324 itsEntries[i]["startt"] = recnameToTS(recs[0]) | 344 itsEntries[i]["startt"] = recnameToTS(recs[0]) |
325 itsEntries[i]["ttyrecs"] = recs | 345 itsEntries[i]["ttyrecs"] = recs |
326 cur.close() | 346 cur.close() |
327 conn.close() | 347 conn.close() |
328 def loadnew(self): | |
329 conn = getconn() | |
330 if conn == None: | |
331 return [] | |
332 cur = conn.cursor() | |
333 # Get the previous offset | |
334 cur.execute(offselstr, [self.uname]) | |
335 offset = cur.fetchone()[0] | |
336 newlist = [] | |
337 try: | |
338 scr = open(self.scores) | |
339 scr.seek(offset) | |
340 self.getEntryDicts(scr, newlist) | |
341 except IOError: | |
342 noffset = offset # Can't read anything, assume no new games | |
343 else: | |
344 noffset = scr.tell() | |
345 scr.close() | |
346 cur.execute(newoffstr, [noffset, self.uname]) | |
347 # The new players must already be added to the players table. | |
348 updatenames = set([ e["name"] for e in newlist ]) | |
349 self.postprocess(newlist) | |
350 self.putIntoDB(newlist, conn) | |
351 cur.close() | |
352 conn.close() | |
353 return updatenames | |
354 # End RogueGame class definition | 348 # End RogueGame class definition |
349 | |
350 class ARogueGame(Game): | |
351 def __init__(self, name, uname, suffix): | |
352 self.name = name | |
353 self.uname = uname | |
354 self.scores = logdir + uname + ".log" | |
355 self.logspec = ["endt", "score", "name", "xl", "class", "depth", | |
356 "maxdepth", "quest", "hadquest", "fate"] | |
357 self.sqltypes = {"endt": "timestamptz", "score": "int", | |
358 "name": "varchar(20)", "xl": "int", "class": "text", "depth": "int", | |
359 "maxdepth": "int", "quest": "int", "hadquest": "bool", | |
360 "fate": "text", "ttyrecs": "text ARRAY", "startt": "timestamptz"} | |
361 self.logdelim = " " | |
362 # Class variables | |
363 fields = ["name", "score", "class", "xl", "fate", "endt"] | |
364 rankfields = ["rank", "score", "name", "class", "xl", "fate", "endt"] | |
365 pfields = ["score", "class", "xl", "fate", "endt"] | |
366 def postprocess(self, gamelist): | |
367 "Not Implemented" | |
368 return | |
369 def putIntoDB(self, dictlist, conn): | |
370 "Not Implemented" | |
371 conn.commit() | |
372 return | |
373 def getHigh(self, n=10, offset=0): | |
374 return [] | |
375 def getRecent(self, n=20): | |
376 return [] | |
377 def getPlayer(self, player): | |
378 return [] | |
355 | 379 |
356 rogue3 = RogueGame("Rogue V3", "rogue3", "r3") | 380 rogue3 = RogueGame("Rogue V3", "rogue3", "r3") |
357 rogue4 = RogueGame("Rogue V4", "rogue4", "r4") | 381 rogue4 = RogueGame("Rogue V4", "rogue4", "r4") |
358 rogue5 = RogueGame("Rogue V5", "rogue5", "r5") | 382 rogue5 = RogueGame("Rogue V5", "rogue5", "r5") |
359 srogue = RogueGame("Super-Rogue", "srogue", "sr") | 383 srogue = RogueGame("Super-Rogue", "srogue", "sr") |
360 | 384 arogue5 = ARogueGame("Advanced Rogue 5", "arogue5", "ar5") |
361 gamelist = [rogue3, rogue4, rogue5, srogue] | 385 |
386 gamelist = [rogue3, rogue4, rogue5, srogue, arogue5] | |
362 | 387 |
363 def playerpage(pname): | 388 def playerpage(pname): |
364 "Generate a player's HTML page" | 389 "Generate a player's HTML page" |
365 # Write the beginning of the page | 390 # Write the beginning of the page |
366 ppagefi = open(ppagename.format(pname), "w") | 391 ppagefi = open(ppagename.format(pname), "w") |