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