Mercurial > hg > rlgallery-misc
annotate py/rlgall.py @ 55:e421ea2519ec
dgamelaunch: define user/group by name instead of UID/GID.
The user and group might not be created with the UID and GID expected,
so it is better to use names. They can be changed to numeric values
after installation.
author | John "Elwin" Edwards |
---|---|
date | Sun, 11 May 2014 08:32:31 -0700 |
parents | 4549b3c0cd28 |
children | df7acc5653b3 |
rev | line source |
---|---|
33
25843238434a
Change the Python module's name back to rlgall.
John "Elwin" Edwards
parents:
31
diff
changeset
|
1 # rlgall.py |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
2 # Module for the Roguelike Gallery, using a postgres database |
30 | 3 # Requires Python 3.3 |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
4 |
42
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
5 import re |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
6 import os |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
7 import psycopg2 |
30 | 8 from datetime import datetime |
9 import pytz | |
49
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
10 import html |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
11 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
12 # Configuration |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
13 logdir = "/var/dgl/var/games/roguelike/" |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
14 webdir = "/var/www/lighttpd/scoring/" |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
15 ppagename = webdir + "players/{0}.html" |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
16 hpagename = webdir + "highscores.html" |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
17 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
18 # HTML fragments for templating |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
19 phead = """<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
20 <html><head> |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
21 <title>{0}</title> |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
22 <link rel="stylesheet" href="/scoring/scores.css" type="text/css"> |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
23 </head> |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
24 """ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
25 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
26 ptop = """<body> |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
27 <h1>Yendor Guild</h1> |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
28 """ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
29 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
30 navtop = '<div class="nav"><a href="/">rlgallery.org</a> -> {0}</div>\n' |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
31 navscore = '<div class="nav"><a href="/">rlgallery.org</a> -> \ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
32 <a href="/scoring/">Scores</a> -> {0}</div>\n' |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
33 navplayer = '<div class="nav"><a href="/">rlgallery.org</a> -> \ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
34 <a href="/scoring/">Scores</a> -> <a href="/scoring/players/">Players</a> \ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
35 -> {0}</div>' |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
36 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
37 pti = '<h2>{0}</h2>\n' |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
38 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
39 secthead = '<h3>{0}</h3>\n' |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
40 tblhead = '<div class="stable">\n' |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
41 rowstart = '<div class="sentry">\n' |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
42 rowend = '</div>\n' |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
43 cell = ' <span class="sdata">{0}</span>\n' |
31 | 44 rcell = ' <span class="sdatar">{0}</span>\n' |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
45 hcell = ' <span class="shdata">{0}</span>\n' |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
46 tblend = '</div>\n' |
34
86b616d88020
Add a footer with some links to the Web pages.
John "Elwin" Edwards
parents:
33
diff
changeset
|
47 pend = """<div class="foot"> |
86b616d88020
Add a footer with some links to the Web pages.
John "Elwin" Edwards
parents:
33
diff
changeset
|
48 <a href="/">rlgallery.org</a> |
86b616d88020
Add a footer with some links to the Web pages.
John "Elwin" Edwards
parents:
33
diff
changeset
|
49 <a href="/recent.cgi">Recent Games</a> |
36 | 50 <a href="/scoring/high.cgi">High Scores</a> |
34
86b616d88020
Add a footer with some links to the Web pages.
John "Elwin" Edwards
parents:
33
diff
changeset
|
51 </div> |
86b616d88020
Add a footer with some links to the Web pages.
John "Elwin" Edwards
parents:
33
diff
changeset
|
52 </body></html> |
86b616d88020
Add a footer with some links to the Web pages.
John "Elwin" Edwards
parents:
33
diff
changeset
|
53 """ |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
54 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
55 # This would be more useful if we had to do translation |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
56 headerbook = {"endt":"End time", "score":"Score", "name":"Name", "xl":"XL", |
19
78580bffc13d
Add high score list support for arogue5.
John "Elwin" Edwards <elwin@sdf.org>
parents:
18
diff
changeset
|
57 "fate":"Fate", "rank":"Rank", "game":"Game", "class": "Class"} |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
58 # Queries for the games table |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
59 offselstr = "SELECT offbytes FROM games WHERE gname = %s;" |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
60 newoffstr = "UPDATE games SET offbytes = %s WHERE gname = %s;" |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
61 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
62 def getconn(): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
63 "Returns a database connection, or None if the connection fails." |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
64 try: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
65 conn = psycopg2.connect("dbname=rlg") |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
66 except psycopg2.OperationalError: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
67 return None |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
68 return conn |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
69 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
70 def recnameToTS(filename): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
71 pattern = "%Y-%m-%d.%H:%M:%S.ttyrec" |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
72 try: |
30 | 73 dt = datetime.strptime(filename, pattern).replace(tzinfo=pytz.utc) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
74 return dt |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
75 except ValueError: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
76 return None |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
77 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
78 def playerlink(name): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
79 "Returns a link to a player's page" |
49
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
80 escname = html.escape(name) |
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
81 lstr = '<a href="/scoring/players/' + escname + '.html">' + escname + '</a>' |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
82 return lstr |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
83 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
84 def linktoArchive(entry): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
85 "Takes an entry dict and returns a link to the ttyrec archivist." |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
86 lstr = '<a href="/archive.cgi?name={0};game={1};time={2}">{3}</a>' |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
87 linktext = entry["endt"].strftime("%Y/%m/%d %H:%M:%S") |
30 | 88 stamp = int(entry["endt"].timestamp()) |
49
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
89 escname = html.escape(entry["name"]) |
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
90 return lstr.format(escname, entry["game"].uname, stamp, linktext) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
91 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
92 def maketablerow(cells, isheader=None): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
93 "Takes a list of strings and returns a HTML table row with each string \ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
94 in its own cell. isheader will make them header cells, obviously." |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
95 if isheader: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
96 celler = hcell |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
97 else: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
98 celler = cell |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
99 rowstr = rowstart |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
100 for entry in cells: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
101 rowstr = rowstr + celler.format(entry) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
102 rowstr = rowstr + rowend |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
103 return rowstr |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
104 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
105 def printTable(entries, fields, of): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
106 "Takes a list of entry dicts and a list of field strings and writes a \ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
107 HTML table to of." |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
108 of.write(tblhead) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
109 clist = [] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
110 for field in fields: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
111 if field in headerbook: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
112 clist.append(headerbook[field]) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
113 else: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
114 clist.append("{0}".format(field)) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
115 of.write(maketablerow(clist, True)) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
116 rnum = 0 |
35 | 117 for entry in entries: |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
118 clist = [] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
119 for field in fields: |
35 | 120 if field in entry: |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
121 thing = entry[field] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
122 if field == "game": |
31 | 123 clist.append((thing.name, cell)) |
35 | 124 elif field == "xl" or field == "score" or field == "rank": # Numerics |
31 | 125 clist.append((str(thing), rcell)) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
126 elif field == "name": |
31 | 127 clist.append((playerlink(thing), cell)) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
128 elif field == "fate": |
31 | 129 clist.append((thing, cell)) |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
130 elif field == "endt": |
31 | 131 clist.append((linktoArchive(entry), cell)) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
132 else: |
31 | 133 clist.append(("{0}".format(thing), cell)) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
134 else: |
31 | 135 clist.append(("N/A", cell)) |
136 rowstr = rowstart + "".join([ t.format(s) for (s, t) in clist ]) + rowend | |
137 of.write(rowstr) | |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
138 of.write(tblend) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
139 return |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
140 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
141 class Game: |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
142 def __init__(self, name, uname): |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
143 pass |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
144 def logtoDict(self, entry): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
145 "Processes a log entry string, returning a dict." |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
146 ndict = {"game": self} |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
147 entrylist = entry.strip().split(self.logdelim, len(self.logspec) - 1) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
148 for item, value in zip(self.logspec, entrylist): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
149 if self.sqltypes[item] == "int": |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
150 ndict[item] = int(value) |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
151 if self.sqltypes[item] == "bool": |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
152 ndict[item] = bool(int(value)) |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
153 elif self.sqltypes[item] == "timestamptz": |
30 | 154 ndict[item] = datetime.fromtimestamp(int(value), pytz.utc) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
155 else: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
156 ndict[item] = value |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
157 return ndict |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
158 def getEntryDicts(self, entfile, entlist): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
159 "Reads logfile entries from entfile, interprets them according to the \ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
160 instructions in self.logspec/logdelim, and adds them as dicts to entlist." |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
161 while True: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
162 nextentry = entfile.readline() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
163 if not nextentry: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
164 break |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
165 if nextentry[-1] != '\n': |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
166 break |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
167 entlist.append(self.logtoDict(nextentry)) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
168 return |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
169 def loadnew(self): |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
170 conn = getconn() |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
171 if conn == None: |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
172 return [] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
173 cur = conn.cursor() |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
174 # Get the previous offset |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
175 cur.execute(offselstr, [self.uname]) |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
176 offset = cur.fetchone()[0] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
177 newlist = [] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
178 try: |
30 | 179 scr = open(self.scores, encoding="utf-8") |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
180 scr.seek(offset) |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
181 self.getEntryDicts(scr, newlist) |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
182 except IOError: |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
183 noffset = offset # Can't read anything, assume no new games |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
184 else: |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
185 noffset = scr.tell() |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
186 scr.close() |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
187 cur.execute(newoffstr, [noffset, self.uname]) |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
188 # The new players must already be added to the players table. |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
189 updatenames = set([ e["name"] for e in newlist ]) |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
190 self.postprocess(newlist) |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
191 self.putIntoDB(newlist, conn) |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
192 cur.close() |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
193 conn.close() |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
194 return updatenames |
18
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
195 def postprocess(self, gamelist): |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
196 "Default postprocessing function: adds start time and ttyrec list" |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
197 names = set([ e["name"] for e in gamelist ]) |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
198 conn = getconn() |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
199 if conn == None: |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
200 return [] |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
201 cur = conn.cursor() |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
202 for nameF in names: |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
203 # Get all this player's games ordered by time |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
204 itsEntries = [ entry for entry in gamelist if entry["name"] == nameF ] |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
205 itsEntries.sort(key=lambda e: e["endt"]) |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
206 # Find the end time of the latest game already in the db |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
207 tquery = "SELECT endt FROM {0} WHERE name = %s ORDER BY endt DESC LIMIT 1;".format(self.uname) |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
208 cur.execute(tquery, [nameF]) |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
209 result = cur.fetchone() |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
210 if result: |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
211 prev = result[0] |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
212 else: |
30 | 213 prev = datetime.fromtimestamp(0, pytz.utc); |
18
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
214 ttyrecdir = "/var/dgl/dgldir/ttyrec/{0}/{1}/".format(nameF, self.uname) |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
215 allfilekeys = [ (recnameToTS(f), f) for f in os.listdir(ttyrecdir) ] |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
216 vfilekeys = [ e for e in allfilekeys if e[0] > prev ] |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
217 vfilekeys.sort(key=lambda e: e[0]) |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
218 # Now determine startt and ttyrecs for each game |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
219 for i in range(0, len(itsEntries)): |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
220 if i == 0: |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
221 lowlim = prev |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
222 else: |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
223 lowlim = itsEntries[i-1]["endt"] |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
224 hilim = itsEntries[i]["endt"] |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
225 recs = [ k[1] for k in vfilekeys if lowlim <= k[0] < hilim ] |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
226 itsEntries[i]["startt"] = recnameToTS(recs[0]) |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
227 itsEntries[i]["ttyrecs"] = recs |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
228 cur.close() |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
229 conn.close() |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
230 def putIntoDB(self, dictlist, conn): |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
231 cur = conn.cursor() |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
232 cur.executemany(self.insertq, [ d for d in dictlist if d["game"] == self ]) |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
233 conn.commit() |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
234 cur.close() |
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
235 return |
21
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
236 def tablerecent(self, of): |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
237 "Prints the most recent games from the logfile, NOT the database." |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
238 newest = [] |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
239 try: |
30 | 240 scr = open(self.scores, encoding="utf-8") |
241 except FileNotFoundError: | |
21
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
242 pass |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
243 else: |
30 | 244 # Text streams don't support random seeking. |
21
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
245 try: |
30 | 246 scr.buffer.seek(self.lookback, 2) |
247 except OSError: | |
248 scr.buffer.seek(0) # The file wasn't that long, start at the beginning | |
249 if scr.buffer.tell() != 0: | |
250 scr.buffer.readline() # Throw away the incomplete line | |
21
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
251 self.getEntryDicts(scr, newest) |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
252 newest.reverse() |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
253 scr.close() |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
254 of.write(secthead.format(self.name)) |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
255 if not newest: |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
256 of.write("<div>No one has braved this dungeon yet.</div>\n") |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
257 else: |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
258 printTable(newest, self.fields, of) |
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
259 return |
50
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
260 def getHigh(self, n=10, offset=0, inittime=None, finaltime=None): |
35 | 261 "Gets the n highest scores (starting at offset) from the database, \ |
262 returning a list of dicts." | |
263 qfields = [] | |
264 for f in self.rankfields: | |
265 if f == "rank": | |
266 qfields.append("rank(*) OVER (ORDER BY score DESC)") | |
267 else: | |
268 qfields.append(f) | |
50
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
269 qstr = "SELECT " + ", ".join(qfields) + " FROM {0}".format(self.uname) |
35 | 270 qvals = [] |
50
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
271 if isinstance(inittime, datetime): |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
272 qstr += " WHERE endt >= %s" |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
273 qvals.append(inittime) |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
274 if isinstance(finaltime, datetime): |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
275 if finaltime < inittime: |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
276 return [] |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
277 qstr += " AND endt < %s" |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
278 qvals.append(finaltime) |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
279 elif isinstance(finaltime, datetime): |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
280 qstr += " WHERE endt < %s" |
4549b3c0cd28
rlgall.py: add time selection to Game.getHigh().
John "Elwin" Edwards
parents:
49
diff
changeset
|
281 qvals.append(finaltime) |
35 | 282 try: |
283 n = int(n) | |
284 except (ValueError, TypeError): | |
285 return [] | |
286 if n <= 0: | |
287 return [] | |
288 qstr += " LIMIT %s" | |
289 qvals.append(n) | |
290 try: | |
291 offset = int(offset) | |
292 except (ValueError, TypeError): | |
293 return [] | |
294 if offset > 0: | |
295 qstr += " OFFSET %s" | |
296 qvals.append(offset) | |
297 qstr += ";" | |
298 conn = psycopg2.connect("dbname=rlg") | |
299 cur = conn.cursor() | |
300 cur.execute(qstr, qvals) | |
301 cols = [ col.name for col in cur.description ] | |
302 data = [ dict(zip(cols, row)) for row in cur.fetchall() ] | |
303 cur.close() | |
304 conn.close() | |
305 for d in data: | |
306 d["game"] = self | |
307 return data | |
45
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
308 def getXLCounts(self, nmax=15): |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
309 "Returns a list of (xlevel, gamecount) pairs." |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
310 lquery = "SELECT count(*) FROM {0} WHERE xl = %s;".format(self.uname) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
311 mquery = "SELECT count(*) FROM {0} WHERE xl >= %s;".format(self.uname) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
312 try: |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
313 nmax = int(nmax) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
314 except (ValueError, TypeError): |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
315 return [] |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
316 if nmax <= 0: |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
317 return [] |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
318 xlevels = range(1, nmax) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
319 results = [] |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
320 conn = psycopg2.connect("dbname=rlg") |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
321 cur = conn.cursor() |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
322 for xl in xlevels: |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
323 cur.execute(lquery, [xl]) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
324 results.append((xl, cur.fetchone()[0])) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
325 cur.execute(mquery, [nmax]) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
326 results.append((nmax, cur.fetchone()[0])) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
327 cur.close() |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
328 conn.close() |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
329 return results |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
330 def getDepthCounts(self, nmax=30): |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
331 "Returns a list of (maxdepth, gamecount) pairs." |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
332 dqry = "SELECT count(*) FROM {0} WHERE maxdepth = %s;".format(self.uname) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
333 mqry = "SELECT count(*) FROM {0} WHERE maxdepth >= %s;".format(self.uname) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
334 try: |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
335 nmax = int(nmax) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
336 except (ValueError, TypeError): |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
337 return [] |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
338 if nmax <= 0: |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
339 return [] |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
340 depths = range(1, nmax) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
341 results = [] |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
342 conn = psycopg2.connect("dbname=rlg") |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
343 cur = conn.cursor() |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
344 for lev in depths: |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
345 cur.execute(dqry, [lev]) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
346 results.append((lev, cur.fetchone()[0])) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
347 cur.execute(mqry, [nmax]) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
348 results.append((nmax, cur.fetchone()[0])) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
349 cur.close() |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
350 conn.close() |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
351 return results |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
352 def getScoreCounts(self, blocks=10, size=1000): |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
353 "Returns a list of (minscore, gamecount) pairs." |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
354 sqry = "SELECT count(*) FROM {0} WHERE score >= %s AND score < %s;".format(self.uname) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
355 mqry = "SELECT count(*) FROM {0} WHERE score >= %s;".format(self.uname) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
356 try: |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
357 blocks = int(blocks) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
358 size = int(size) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
359 except (ValueError, TypeError): |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
360 return [] |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
361 if blocks <= 0 or size <= 0: |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
362 return [] |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
363 marks = range(blocks - 1) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
364 results = [] |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
365 conn = psycopg2.connect("dbname=rlg") |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
366 cur = conn.cursor() |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
367 for m in marks: |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
368 cur.execute(sqry, [m * size, (m + 1) * size]) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
369 results.append((m * size, cur.fetchone()[0])) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
370 cur.execute(mqry, [(blocks - 1) * size]) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
371 results.append(((blocks - 1) * size, cur.fetchone()[0])) |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
372 cur.close() |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
373 conn.close() |
0f4163dbbafc
SVG charts: separate database-querying and chart-printing code.
John "Elwin" Edwards
parents:
42
diff
changeset
|
374 return results |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
375 # End Game class definition |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
376 |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
377 class RogueGame(Game): |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
378 def __init__(self, name, uname, suffix): |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
379 self.name = name |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
380 self.uname = uname |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
381 self.scores = logdir + uname + ".log" |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
382 self.logspec = ["endt", "score", "name", "xl", "fate"] |
42
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
383 self.sqltypes = {"endt": "timestamptz", "score": "int", "name": "text", |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
384 "xl": "int", "fate": "text", "ttyrecs": "text ARRAY", |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
385 "startt": "timestamptz", "depth": "int", "maxdepth": "int"} |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
386 self.logdelim = " " |
21
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
387 self.lookback = -1500 |
30 | 388 # Construct the insert query |
389 fields = self.sqltypes.keys() | |
390 colspec = ", ".join(fields) | |
391 valspec = ", ".join([ "%({})s".format(c) for c in fields ]) | |
392 self.insertq = "INSERT INTO {0} ({1}) VALUES ({2});".format(self.uname, | |
18
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
393 colspec, valspec) |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
394 # Class variables, used by some methods |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
395 fields = ["name", "score", "xl", "fate", "endt"] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
396 rankfields = ["rank", "score", "name", "xl", "fate", "endt"] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
397 pfields = ["score", "xl", "fate", "endt"] |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
398 def getRecent(self, n=20): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
399 "Gets the n most recent games out of the database, returning a list \ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
400 of dicts." |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
401 try: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
402 n = int(n) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
403 except (ValueError, TypeError): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
404 return [] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
405 if n <= 0: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
406 return [] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
407 dictlist = [] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
408 conn = psycopg2.connect("dbname=rlg") |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
409 cur = conn.cursor() |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
410 qstr = "SELECT endt, score, name, xl, fate, startt FROM {0} ORDER BY endt DESC \ |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
411 LIMIT %s;".format(self.uname) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
412 cur.execute(qstr, [n]) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
413 for record in cur: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
414 # This should be less hardcodish |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
415 ndict = {"game": self} |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
416 ndict["endt"] = record[0] |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
417 ndict["score"] = record[1] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
418 ndict["name"] = record[2] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
419 ndict["xl"] = record[3] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
420 ndict["fate"] = record[4] |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
421 ndict["startt"] = record[5] |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
422 dictlist.append(ndict) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
423 cur.close() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
424 conn.close() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
425 return dictlist |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
426 def getPlayer(self, player): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
427 "Gets all player's games from the database." |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
428 qstr = "SELECT endt, score, name, xl, fate, startt FROM " + self.uname + " WHERE name = %s;" |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
429 conn = getconn() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
430 if conn == None: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
431 return [] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
432 cur = conn.cursor() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
433 entries = [] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
434 cur.execute(qstr, [player]) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
435 for record in cur: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
436 ndict = {"game": self} |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
437 ndict["endt"] = record[0] |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
438 ndict["score"] = record[1] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
439 ndict["name"] = record[2] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
440 ndict["xl"] = record[3] |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
441 ndict["fate"] = record[4] |
1
def7fecbd437
Switch to SQL timestamps.
John "Elwin" Edwards <elwin@sdf.org>
parents:
0
diff
changeset
|
442 ndict["startt"] = record[5] |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
443 entries.append(ndict) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
444 cur.close() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
445 conn.close() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
446 return entries |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
447 def putIntoDB(self, dictlist, conn): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
448 "Add the entries in dictlist to the database through connection conn, \ |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
449 which needs the INSERT privilege." |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
450 cur = conn.cursor() |
30 | 451 cur.executemany(self.insertq, [ d for d in dictlist if d["game"] == self ]) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
452 conn.commit() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
453 cur.close() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
454 return |
42
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
455 def postprocess(self, gamelist): |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
456 lre = re.compile("^(quit|killed by (.*)) on level ([0-9]*)( \\[max ([0-9]*)\\] with the Amulet)?$") |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
457 wre = re.compile("^escaped with the Amulet \\[deepest level: ([0-9]*)\\]$") |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
458 for d in gamelist: |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
459 m = lre.match(d["fate"]) |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
460 if m: |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
461 d["depth"] = int(m.group(3)) |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
462 if m.group(4): |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
463 d["maxdepth"] = int(m.group(5)) |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
464 else: |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
465 d["maxdepth"] = d["depth"] |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
466 else: |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
467 m = wre.match(d["fate"]) |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
468 if m: |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
469 d["depth"] = 0 |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
470 d["maxdepth"] = int(m.group(1)) |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
471 else: |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
472 # Something went wrong |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
473 d["depth"] = -1 |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
474 d["maxdepth"] = -1 |
e1de8aeb5ed4
Add depth and maxdepth columns to the RogueGame tables.
John "Elwin" Edwards
parents:
41
diff
changeset
|
475 Game.postprocess(self, gamelist) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
476 # End RogueGame class definition |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
477 |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
478 class ARogueGame(Game): |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
479 def __init__(self, name, uname, suffix): |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
480 self.name = name |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
481 self.uname = uname |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
482 self.scores = logdir + uname + ".log" |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
483 self.logspec = ["endt", "score", "name", "xl", "class", "depth", |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
484 "maxdepth", "quest", "hadquest", "fate"] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
485 self.sqltypes = {"endt": "timestamptz", "score": "int", |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
486 "name": "varchar(20)", "xl": "int", "class": "text", "depth": "int", |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
487 "maxdepth": "int", "quest": "int", "hadquest": "bool", |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
488 "fate": "text", "ttyrecs": "text ARRAY", "startt": "timestamptz"} |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
489 self.logdelim = " " |
21
453278a81371
Add tablerecent() so recent.cgi will work as before.
John "Elwin" Edwards <elwin@sdf.org>
parents:
20
diff
changeset
|
490 self.lookback = -1800 |
30 | 491 # Construct the insert query |
492 fields = self.sqltypes.keys() | |
493 colspec = ", ".join(fields) | |
494 valspec = ", ".join([ "%({})s".format(c) for c in fields ]) | |
495 self.insertq = "INSERT INTO {0} ({1}) VALUES ({2});".format(self.uname, | |
18
5731d2ecaec4
Store arogue5 results in the database.
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
496 colspec, valspec) |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
497 # Class variables |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
498 fields = ["name", "score", "class", "xl", "fate", "endt"] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
499 rankfields = ["rank", "score", "name", "class", "xl", "fate", "endt"] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
500 pfields = ["score", "class", "xl", "fate", "endt"] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
501 def getRecent(self, n=20): |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
502 return [] |
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
503 def getPlayer(self, player): |
20
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
504 "Gets all player's games from the database." |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
505 qstr = "SELECT endt, score, name, xl, class, fate FROM " + self.uname + " WHERE name = %s;" |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
506 conn = getconn() |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
507 if conn == None: |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
508 return [] |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
509 cur = conn.cursor() |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
510 entries = [] |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
511 cur.execute(qstr, [player]) |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
512 for record in cur: |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
513 ndict = {"game": self} |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
514 ndict["endt"] = record[0] |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
515 ndict["score"] = record[1] |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
516 ndict["name"] = record[2] |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
517 ndict["xl"] = record[3] |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
518 ndict["class"] = record[4] |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
519 ndict["fate"] = record[5] |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
520 entries.append(ndict) |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
521 cur.close() |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
522 conn.close() |
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
523 return entries |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
524 |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
525 rogue3 = RogueGame("Rogue V3", "rogue3", "r3") |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
526 rogue4 = RogueGame("Rogue V4", "rogue4", "r4") |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
527 rogue5 = RogueGame("Rogue V5", "rogue5", "r5") |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
528 srogue = RogueGame("Super-Rogue", "srogue", "sr") |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
529 arogue5 = ARogueGame("Advanced Rogue 5", "arogue5", "ar5") |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
530 |
17
7f7b3da664d6
Begin adding arogue5 support to the recorder script.
John "Elwin" Edwards <elwin@sdf.org>
parents:
4
diff
changeset
|
531 gamelist = [rogue3, rogue4, rogue5, srogue, arogue5] |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
532 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
533 def playerpage(pname): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
534 "Generate a player's HTML page" |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
535 # Write the beginning of the page |
30 | 536 ppagefi = open(ppagename.format(pname), "w", encoding="utf-8") |
49
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
537 cleanpname = html.escape(pname) |
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
538 ppagefi.write(phead.format(cleanpname)) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
539 ppagefi.write(ptop) |
49
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
540 ppagefi.write(navplayer.format(cleanpname)) |
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
541 ppagefi.write(pti.format("Results for " + cleanpname)) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
542 for game in gamelist: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
543 ppagefi.write(secthead.format(game.name)) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
544 entries = game.getPlayer(pname) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
545 if not entries: |
49
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
546 ppagefi.write("<div>" + cleanpname + " has not yet completed an " + |
6138c27d1950
Escape the player's name when printing it into HTML.
John "Elwin" Edwards
parents:
45
diff
changeset
|
547 "expedition in this dungeon.</div>\n") |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
548 else: |
19
78580bffc13d
Add high score list support for arogue5.
John "Elwin" Edwards <elwin@sdf.org>
parents:
18
diff
changeset
|
549 entries.sort(key=lambda e: e["endt"]) |
20
c05050f78d81
Make arogue5 scores appear on the player pages too.
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
550 printTable(entries, game.pfields, ppagefi) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
551 scoresum = 0 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
552 for entry in entries: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
553 scoresum += int(entry["score"]) |
30 | 554 avgscr = scoresum // len(entries) |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
555 ppagefi.write("<p>Average score: {0}</p>\n".format(avgscr)) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
556 # That should settle it. Print the end; then stop. |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
557 ppagefi.write(pend) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
558 ppagefi.close() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
559 return |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
560 |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
561 def highpage(): |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
562 # open the page and print the beginning |
30 | 563 highpfi = open(hpagename, "w", encoding="utf-8") |
0
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
564 highpfi.write(phead.format("High Scores")) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
565 highpfi.write(ptop) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
566 highpfi.write(navscore.format("High Scores")) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
567 highpfi.write(pti.format("List of High Scores")) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
568 for game in gamelist: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
569 highpfi.write(secthead.format(game.name)) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
570 entries = game.getHigh(40) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
571 if not entries: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
572 highpfi.write("<div>No one has braved this dungeon yet.</div>\n") |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
573 else: |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
574 printTable(entries, game.rankfields, highpfi) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
575 # That should finish it. |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
576 highpfi.write(pend) |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
577 highpfi.close() |
5ba2123d2c20
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
578 return |