4 from datetime import datetime
5 import sqlalchemy as sa
6 import sqlalchemy.sql.functions as func
7 from sqlalchemy import distinct
8 from pyramid.paster import bootstrap
9 from xonstat.models import *
10 from xonstat.util import datetime_seconds
13 from playerdata import PlayerData
16 # maximal number of query results (for testing, set to None to get all)
19 # we look for players who have activity within the past DELTA hours
25 # classic skin WITHOUT NAME - writes PNGs into "output//###.png"
26 skin_classic = Skin( "",
28 overlay = "overlay_classic",
31 # more fancy skin [** WIP **]- writes PNGs into "output/archer/###.png"
32 skin_archer = Skin( "archer",
33 #bg = "background_archer-v2_full",
34 bg = "background_archer-v3",
37 gametype_pos = (91,33),
38 nostats_pos = (91,59),
46 deaths_pos = (392,45),
47 ptime_color = (0.05, 0.05, 0.1),
50 # minimal skin - writes PNGs into "output/minimal/###.png"
51 skin_minimal = Skin( "minimal",
53 bgcolor = (0.04, 0.04, 0.04, 1.0),
54 overlay = "overlay_minimal",
61 gametype_pos = (70,30),
62 gametype_color = (0.0, 0.0, 0.0),
63 gametype_text = "%s:",
65 gametype_fontsize = 10,
67 gametype_upper = False,
69 elo_text = "Elo %.0f",
70 elo_color = (0.7, 0.7, 0.7),
74 #nostats_pos = (75,30),
75 #nostats_fontsize = 10,
77 #nostats_text = "no stats yet!",
78 #nostats_color = (0.7, 0.4, 0.4),
81 kdr_colortop = (0.6, 0.8, 0.6),
82 kdr_colormid = (0.6, 0.6, 0.6),
83 kdr_colorbot = (0.8, 0.6, 0.6),
88 winp_colortop = (0.6, 0.8, 0.8),
89 winp_colormid = (0.6, 0.6, 0.6),
90 winp_colorbot = (0.8, 0.8, 0.6),
94 ptime_color = (0.7, 0.7, 0.7),
98 # parse cmdline parameters (for testing)
101 for arg in sys.argv[1:]:
102 if arg.startswith("-"):
105 DELTA = 2**24 # large enough to enforce update, and doesn't result in errors
108 elif arg == "verbose":
111 print """Usage: gen_badges.py [options] [skin list]
113 -force Force updating all badges (delta = 2^24)
114 -test Limit number of players to 100 (for testing)
115 -help Show this help text
117 Space-separated list of skins to use when creating badges.
118 Available skins: classic, minimal, archer
119 If no skins are given, classic and minmal will be used by default.
120 NOTE: Output directories must exists before running the program!
125 skins.append(skin_classic)
126 elif arg == "minimal":
127 skins.append(skin_minimal)
128 elif arg == "archer":
129 skins.append(skin_archer)
132 skins = [ skin_classic, skin_minimal, skin_archer ]
135 env = bootstrap('../../../development.ini')
137 req.matchdict = {'id':3}
139 print "Requesting player data from db ..."
140 cutoff_dt = datetime.utcnow() - timedelta(hours=DELTA)
141 start = datetime.now()
144 players = DBSession.query(distinct(Player.player_id)).\
145 filter(Player.player_id == PlayerElo.player_id).\
146 filter(Player.player_id == PlayerGameStat.player_id).\
147 filter(PlayerGameStat.create_dt > cutoff_dt).\
148 filter(Player.nick != None).\
149 filter(Player.player_id > 2).\
150 filter(Player.active_ind == True).\
151 limit(NUM_PLAYERS).all()
153 players = DBSession.query(distinct(Player.player_id)).\
154 filter(Player.player_id == PlayerElo.player_id).\
155 filter(Player.player_id == PlayerGameStat.player_id).\
156 filter(PlayerGameStat.create_dt > cutoff_dt).\
157 filter(Player.nick != None).\
158 filter(Player.player_id > 2).\
159 filter(Player.active_ind == True).\
162 playerdata = PlayerData
165 stop = datetime.now()
167 print "Query took %.2f seconds" % (datetime_seconds(td))
169 print "Creating badges for %d players ..." % len(players)
170 start = datetime.now()
171 data_time, render_time = 0,0
172 for player_id in players:
173 req.matchdict['id'] = player_id
175 sstart = datetime.now()
176 playerdata.get_data(player_id)
177 sstop = datetime.now()
179 data_time += datetime_seconds(td)
181 sstart = datetime.now()
183 sk.render_image(playerdata.data, "output/%s/%d.png" % (str(sk), player_id[0]))
184 sstop = datetime.now()
186 render_time += datetime_seconds(td)
189 print player_id, unicode(playerdata.data['player'].nick)
191 stop = datetime.now()
193 total_seconds = datetime_seconds(td)
194 print "Creating the badges took %.1f seconds (%.3f s per player)" % (total_seconds, total_seconds/float(len(players)))
195 print "Total time for rendering images: %.3f s" % render_time
196 print "Total time for getting data: %.3f s" % data_time
199 print "No active players found!"