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") |
