Mercurial > hg > rlgallery-misc
comparison py/rlgall.py @ 35:6592cdd1fceb
Add a high score CGI script.
/scoring/high.cgi shows a score list, with a configurable length,
offset, and game list.
| author | John "Elwin" Edwards |
|---|---|
| date | Fri, 03 Jan 2014 11:11:07 -0500 |
| parents | 86b616d88020 |
| children | 09ef92dc4439 |
comparison
equal
deleted
inserted
replaced
| 34:86b616d88020 | 35:6592cdd1fceb |
|---|---|
| 113 clist.append(headerbook[field]) | 113 clist.append(headerbook[field]) |
| 114 else: | 114 else: |
| 115 clist.append("{0}".format(field)) | 115 clist.append("{0}".format(field)) |
| 116 of.write(maketablerow(clist, True)) | 116 of.write(maketablerow(clist, True)) |
| 117 rnum = 0 | 117 rnum = 0 |
| 118 for i, entry in enumerate(entries): | 118 for entry in entries: |
| 119 clist = [] | 119 clist = [] |
| 120 for field in fields: | 120 for field in fields: |
| 121 if field == "rank": | 121 if field in entry: |
| 122 clist.append(("{0}".format(i + 1), rcell)) | |
| 123 elif field in entry: | |
| 124 thing = entry[field] | 122 thing = entry[field] |
| 125 if field == "game": | 123 if field == "game": |
| 126 clist.append((thing.name, cell)) | 124 clist.append((thing.name, cell)) |
| 127 elif field == "xl" or field == "score": # Numerics | 125 elif field == "xl" or field == "score" or field == "rank": # Numerics |
| 128 clist.append((str(thing), rcell)) | 126 clist.append((str(thing), rcell)) |
| 129 elif field == "name": | 127 elif field == "name": |
| 130 clist.append((playerlink(thing), cell)) | 128 clist.append((playerlink(thing), cell)) |
| 131 elif field == "fate": | 129 elif field == "fate": |
| 132 clist.append((thing, cell)) | 130 clist.append((thing, cell)) |
| 258 if not newest: | 256 if not newest: |
| 259 of.write("<div>No one has braved this dungeon yet.</div>\n") | 257 of.write("<div>No one has braved this dungeon yet.</div>\n") |
| 260 else: | 258 else: |
| 261 printTable(newest, self.fields, of) | 259 printTable(newest, self.fields, of) |
| 262 return | 260 return |
| 261 def getHigh(self, n=10, offset=0): | |
| 262 "Gets the n highest scores (starting at offset) from the database, \ | |
| 263 returning a list of dicts." | |
| 264 qfields = [] | |
| 265 for f in self.rankfields: | |
| 266 if f == "rank": | |
| 267 qfields.append("rank(*) OVER (ORDER BY score DESC)") | |
| 268 else: | |
| 269 qfields.append(f) | |
| 270 qstr = "SELECT " + ", ".join(qfields) + " FROM {0} ".format(self.uname) | |
| 271 qvals = [] | |
| 272 try: | |
| 273 n = int(n) | |
| 274 except (ValueError, TypeError): | |
| 275 return [] | |
| 276 if n <= 0: | |
| 277 return [] | |
| 278 qstr += " LIMIT %s" | |
| 279 qvals.append(n) | |
| 280 try: | |
| 281 offset = int(offset) | |
| 282 except (ValueError, TypeError): | |
| 283 return [] | |
| 284 if offset > 0: | |
| 285 qstr += " OFFSET %s" | |
| 286 qvals.append(offset) | |
| 287 qstr += ";" | |
| 288 conn = psycopg2.connect("dbname=rlg") | |
| 289 cur = conn.cursor() | |
| 290 cur.execute(qstr, qvals) | |
| 291 cols = [ col.name for col in cur.description ] | |
| 292 data = [ dict(zip(cols, row)) for row in cur.fetchall() ] | |
| 293 cur.close() | |
| 294 conn.close() | |
| 295 for d in data: | |
| 296 d["game"] = self | |
| 297 return data | |
| 263 # End Game class definition | 298 # End Game class definition |
| 264 | 299 |
| 265 class RogueGame(Game): | 300 class RogueGame(Game): |
| 266 def __init__(self, name, uname, suffix): | 301 def __init__(self, name, uname, suffix): |
| 267 self.name = name | 302 self.name = name |
| 309 ndict["startt"] = record[5] | 344 ndict["startt"] = record[5] |
| 310 dictlist.append(ndict) | 345 dictlist.append(ndict) |
| 311 cur.close() | 346 cur.close() |
| 312 conn.close() | 347 conn.close() |
| 313 return dictlist | 348 return dictlist |
| 314 def getHigh(self, n=10, offset=0): | |
| 315 "Gets the n highest scores (starting at offset) from the database, \ | |
| 316 returning a list of dicts." | |
| 317 qstr = "SELECT endt, score, name, xl, fate, startt FROM {0} ORDER BY score DESC ".format(self.uname) | |
| 318 qvals = [] | |
| 319 try: | |
| 320 n = int(n) | |
| 321 except (ValueError, TypeError): | |
| 322 return [] | |
| 323 if n <= 0: | |
| 324 return [] | |
| 325 qstr += " LIMIT %s" | |
| 326 qvals.append(n) | |
| 327 try: | |
| 328 offset = int(offset) | |
| 329 except (ValueError, TypeError): | |
| 330 return [] | |
| 331 if n > 0: | |
| 332 qstr += " OFFSET %s" | |
| 333 qvals.append(offset) | |
| 334 qstr += ";" | |
| 335 conn = psycopg2.connect("dbname=rlg") | |
| 336 cur = conn.cursor() | |
| 337 cur.execute(qstr, qvals) | |
| 338 dictlist = [] | |
| 339 for record in cur: | |
| 340 ndict = {"game": self} | |
| 341 ndict["endt"] = record[0] | |
| 342 ndict["score"] = record[1] | |
| 343 ndict["name"] = record[2] | |
| 344 ndict["xl"] = record[3] | |
| 345 ndict["fate"] = record[4] | |
| 346 ndict["startt"] = record[5] | |
| 347 dictlist.append(ndict) | |
| 348 cur.close() | |
| 349 conn.close() | |
| 350 return dictlist | |
| 351 def getPlayer(self, player): | 349 def getPlayer(self, player): |
| 352 "Gets all player's games from the database." | 350 "Gets all player's games from the database." |
| 353 qstr = "SELECT endt, score, name, xl, fate, startt FROM " + self.uname + " WHERE name = %s;" | 351 qstr = "SELECT endt, score, name, xl, fate, startt FROM " + self.uname + " WHERE name = %s;" |
| 354 conn = getconn() | 352 conn = getconn() |
| 355 if conn == None: | 353 if conn == None: |
| 404 colspec, valspec) | 402 colspec, valspec) |
| 405 # Class variables | 403 # Class variables |
| 406 fields = ["name", "score", "class", "xl", "fate", "endt"] | 404 fields = ["name", "score", "class", "xl", "fate", "endt"] |
| 407 rankfields = ["rank", "score", "name", "class", "xl", "fate", "endt"] | 405 rankfields = ["rank", "score", "name", "class", "xl", "fate", "endt"] |
| 408 pfields = ["score", "class", "xl", "fate", "endt"] | 406 pfields = ["score", "class", "xl", "fate", "endt"] |
| 409 def getHigh(self, n=10, offset=0): | |
| 410 "Gets the n highest scores (starting at offset) from the database, \ | |
| 411 returning a list of dicts." | |
| 412 qstr = "SELECT endt, score, name, xl, class, fate FROM {0} ORDER BY score DESC ".format(self.uname) | |
| 413 qvals = [] | |
| 414 try: | |
| 415 n = int(n) | |
| 416 except (ValueError, TypeError): | |
| 417 return [] | |
| 418 if n <= 0: | |
| 419 return [] | |
| 420 qstr += " LIMIT %s" | |
| 421 qvals.append(n) | |
| 422 try: | |
| 423 offset = int(offset) | |
| 424 except (ValueError, TypeError): | |
| 425 return [] | |
| 426 if n > 0: | |
| 427 qstr += " OFFSET %s" | |
| 428 qvals.append(offset) | |
| 429 qstr += ";" | |
| 430 conn = psycopg2.connect("dbname=rlg") | |
| 431 cur = conn.cursor() | |
| 432 cur.execute(qstr, qvals) | |
| 433 dictlist = [] | |
| 434 for record in cur: | |
| 435 ndict = {"game": self} | |
| 436 ndict["endt"] = record[0] | |
| 437 ndict["score"] = record[1] | |
| 438 ndict["name"] = record[2] | |
| 439 ndict["xl"] = record[3] | |
| 440 ndict["class"] = record[4] | |
| 441 ndict["fate"] = record[5] | |
| 442 dictlist.append(ndict) | |
| 443 cur.close() | |
| 444 conn.close() | |
| 445 return dictlist | |
| 446 def getRecent(self, n=20): | 407 def getRecent(self, n=20): |
| 447 return [] | 408 return [] |
| 448 def getPlayer(self, player): | 409 def getPlayer(self, player): |
| 449 "Gets all player's games from the database." | 410 "Gets all player's games from the database." |
| 450 qstr = "SELECT endt, score, name, xl, class, fate FROM " + self.uname + " WHERE name = %s;" | 411 qstr = "SELECT endt, score, name, xl, class, fate FROM " + self.uname + " WHERE name = %s;" |
