]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/batch/badges/gen_badges.py
Fixed gametype display in "minimal" skin
[xonotic/xonstat.git] / xonstat / batch / badges / gen_badges.py
1 #-*- coding: utf-8 -*-
2
3 import sys
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
11 from skin import Skin
12 from playerdata import PlayerData
13
14
15 # maximal number of query results (for testing, set to None to get all)
16 NUM_PLAYERS = None
17
18 # we look for players who have activity within the past DELTA hours
19 DELTA = 6
20
21
22 # classic skin WITHOUT NAME - writes PNGs into "output//###.png"
23 skin_classic = Skin( "",
24         bg              = "broken_noise",
25         overlay         = "overlay_classic",
26     )
27
28 # more fancy skin [** WIP **]- writes PNGs into "output/archer/###.png"
29 skin_archer = Skin( "archer",
30         bg              = "background_archer-v1",
31         overlay         = None,
32     )
33
34 # minimal skin - writes PNGs into "output/minimal/###.png"
35 skin_minimal = Skin( "minimal",
36         bg              = None,
37         bgcolor         = (0.04, 0.04, 0.04, 1.0),
38         overlay         = "overlay_minimal",
39         width           = 560,
40         height          = 40,
41         nick_fontsize   = 16,
42         nick_pos        = (36,16),
43         num_gametypes   = 3,
44         nick_maxwidth   = 300,
45         gametype_pos    = (70,30),
46         gametype_color  = (0.0, 0.0, 0.0),
47         gametype_text   = "%s:",
48         gametype_width  = 100,
49         gametype_fontsize = 10,
50         gametype_align  = -1,
51         gametype_upper  = False,
52         elo_pos         = (75,30),
53         elo_text        = "Elo %.0f",
54         elo_color       = (0.7, 0.7, 0.7),
55         elo_align       = 1,
56         rank_pos        = None,
57         nostats_pos     = None,
58         #nostats_pos     = (75,30),
59         #nostats_fontsize = 10,
60         #nostats_angle   = 0,
61         #nostats_text    = "no stats yet!",
62         #nostats_color   = (0.7, 0.4, 0.4),
63         kdr_pos         = (392,15),
64         kdr_fontsize    = 10,
65         kdr_colortop    = (0.6, 0.8, 0.6),
66         kdr_colormid    = (0.6, 0.6, 0.6),
67         kdr_colorbot    = (0.8, 0.6, 0.6),
68         kills_pos       = None,
69         deaths_pos      = None,
70         winp_pos        = (508,15),
71         winp_fontsize   = 10,
72         winp_colortop   = (0.6, 0.8, 0.8),
73         winp_colormid   = (0.6, 0.6, 0.6),
74         winp_colorbot   = (0.8, 0.8, 0.6),
75         wins_pos        = None,
76         loss_pos        = None,
77         ptime_pos       = (451,30),
78         ptime_color     = (0.7, 0.7, 0.7),
79     )
80
81
82 # parse cmdline parameters (for testing)
83
84 skins = []
85 for arg in sys.argv[1:]:
86     if arg.startswith("-"):
87         arg = arg[1:]
88         if arg == "force":
89             DELTA = 2**24   # large enough to enforce update, and doesn't result in errors
90         elif arg == "test":
91             NUM_PLAYERS = 100
92         else:
93             print """Usage:  gen_badges.py [options] [skin list]
94     Options:
95         -force      Force updating all badges (delta = 2^24)
96         -test       Limit number of players to 100 (for testing)
97         -help       Show this help text
98     Skin list:
99         Space-separated list of skins to use when creating badges.
100         Available skins:  classic, minimal, archer
101         If no skins are given, classic and minmal will be used by default.
102         NOTE: Output directories must exists before running the program!
103 """
104             sys.exit(-1)
105     else:
106         if arg == "classic":
107             skins.append(skin_classic)
108         elif arg == "minimal":
109             skins.append(skin_minimal)
110         elif arg == "archer":
111             skins.append(skin_archer)
112
113 if len(skins) == 0:
114     skins = [ skin_classic, skin_minimal ]
115
116
117 # environment setup
118 env = bootstrap('../../../development.ini')
119 req = env['request']
120 req.matchdict = {'id':3}
121
122 print "Requesting player data from db ..."
123 cutoff_dt = datetime.utcnow() - timedelta(hours=DELTA)
124 start = datetime.now()
125 players = []
126 if NUM_PLAYERS:
127     players = DBSession.query(distinct(Player.player_id)).\
128             filter(Player.player_id == PlayerElo.player_id).\
129             filter(Player.player_id == PlayerGameStat.player_id).\
130             filter(PlayerGameStat.create_dt > cutoff_dt).\
131             filter(Player.nick != None).\
132             filter(Player.player_id > 2).\
133             filter(Player.active_ind == True).\
134             limit(NUM_PLAYERS).all()
135 else:
136     players = DBSession.query(distinct(Player.player_id)).\
137             filter(Player.player_id == PlayerElo.player_id).\
138             filter(Player.player_id == PlayerGameStat.player_id).\
139             filter(PlayerGameStat.create_dt > cutoff_dt).\
140             filter(Player.nick != None).\
141             filter(Player.player_id > 2).\
142             filter(Player.active_ind == True).\
143             all()
144
145 playerdata = PlayerData()
146
147 if len(players) > 0:
148     stop = datetime.now()
149     td = stop-start
150     total_seconds = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
151     print "Query took %.2f seconds" % (total_seconds)
152
153     print "Creating badges for %d players ..." % len(players)
154     start = datetime.now()
155     data_time, render_time = 0,0
156     for player_id in players:
157         req.matchdict['id'] = player_id
158
159         sstart = datetime.now()
160         playerdata.get_data(player_id)
161         sstop = datetime.now()
162         td = sstop-sstart
163         total_seconds = float(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
164         data_time += total_seconds
165
166         sstart = datetime.now()
167         for sk in skins:
168             sk.render_image(playerdata, "output/%s/%d.png" % (str(sk), player_id[0]))
169         sstop = datetime.now()
170         td = sstop-sstart
171         total_seconds = float(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
172         render_time += total_seconds
173
174     stop = datetime.now()
175     td = stop-start
176     total_seconds = float(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
177     print "Creating the badges took %.1f seconds (%.3f s per player)" % (total_seconds, total_seconds/float(len(players)))
178     print "Total time for rendering images: %.3f s" % render_time
179     print "Total time for getting data: %.3f s" % data_time
180
181 else:
182     print "No active players found!"
183