]> de.git.xonotic.org Git - xonotic/xonstat.git/blob - xonstat/batch/badges/gen_badges.py
86725620c6312b6a0a3a1b495100a59d5272a4da
[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 render import Skin
12
13
14 # maximal number of query results (for testing, set to 0 to get all)
15 #NUM_PLAYERS = 100
16
17 # we look for players who have activity within the past DELTA hours
18 DELTA = 6
19
20 skin_classic = Skin(
21         bg              = "asfalt",
22     )
23
24 skin_archer = Skin(
25         bg              = "background_archer-v1",
26         overlay         = "",
27     )
28
29 skin_minimal = Skin(
30         bg              = None,
31         bgcolor         = (0.04, 0.04, 0.04, 1.0),
32         overlay         = "overlay_minimal",
33         width           = 560,
34         height          = 40,
35         num_gametypes   = 4,
36         gametype_pos    = (25,30),
37         gametype_text   = "%s :",
38         gametype_width  = 120,
39         gametype_fontsize = 10,
40         elo_pos         = (75,30),
41         elo_text        = "Elo %.0f",
42         elo_color       = (1.0, 1.0, 0.6),
43         rank_pos        = None,
44         nostats_pos     = (80,30),
45         nostats_fontsize = 10,
46         nostats_angle   = 0,
47         nostats_text    = "no stats!",
48         kdr_pos         = (392,15),
49         kills_pos       = None,
50         deaths_pos      = None,
51         winp_pos        = (508,15),
52         wins_pos        = None,
53         loss_pos        = None,
54         ptime_pos       = (458,30),
55         ptime_color     = (0.8, 0.8, 0.9),
56     )
57
58 # parse cmdline parameters (for testing)
59 skin = skin_classic
60 if len(sys.argv) > 1:
61     arg = sys.argv[1].lower()
62     if arg == "classic":
63         skin = skin_classic
64     elif arg == "minimal":
65         skin = skin_minimal
66     elif arg == "archer":
67         skin = skin_archer
68
69
70 # environment setup
71 env = bootstrap('../../../development.ini')
72 req = env['request']
73 req.matchdict = {'id':3}
74
75 print "Requesting player data from db ..."
76 cutoff_dt = datetime.utcnow() - timedelta(hours=DELTA)
77 start = datetime.now()
78 players = []
79 if locals().has_key('NUM_PLAYERS'):
80     players = DBSession.query(distinct(Player.player_id)).\
81             filter(Player.player_id == PlayerElo.player_id).\
82             filter(Player.player_id == PlayerGameStat.player_id).\
83             filter(PlayerGameStat.create_dt > cutoff_dt).\
84             filter(Player.nick != None).\
85             filter(Player.player_id > 2).\
86             filter(Player.active_ind == True).\
87             limit(NUM_PLAYERS).all()
88 else:
89     players = DBSession.query(distinct(Player.player_id)).\
90             filter(Player.player_id == PlayerElo.player_id).\
91             filter(Player.player_id == PlayerGameStat.player_id).\
92             filter(PlayerGameStat.create_dt > cutoff_dt).\
93             filter(Player.nick != None).\
94             filter(Player.player_id > 2).\
95             filter(Player.active_ind == True).\
96             all()
97
98 stop = datetime.now()
99 td = stop-start
100 total_seconds = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
101 print "Query took %.2f seconds" % (total_seconds)
102
103 print "Creating badges for %d players ..." % len(players)
104 start = datetime.now()
105 data_time, render_time = 0,0
106 for player_id in players:
107     req.matchdict['id'] = player_id
108
109     sstart = datetime.now()
110     skin.get_data(player_id)
111     sstop = datetime.now()
112     td = sstop-sstart
113     total_seconds = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
114     data_time += total_seconds
115
116     sstart = datetime.now()
117     skin.render_image("output/%d.png" % player_id)
118     sstop = datetime.now()
119     td = sstop-sstart
120     total_seconds = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
121     render_time += total_seconds
122
123 stop = datetime.now()
124 td = stop-start
125 total_seconds = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
126 print "Creating the badges took %.1f seconds (%.3f s per player)" % (total_seconds, total_seconds/float(len(players)))
127 print "Total time for redering images: %.3f s" % render_time
128 print "Total time for getting data: %.3f s" % data_time
129