]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/playerstats.qc
Merge remote branch 'origin/fruitiex/bots'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / playerstats.qc
1 float playerstats_db;
2 string playerstats_last;
3 string events_last;
4 .float playerstats_addedglobalinfo;
5 float playerstats_requested;
6
7 void PlayerStats_Init()
8 {
9         string uri;
10         playerstats_db = -1;
11         playerstats_waitforme = TRUE;
12         uri = autocvar_g_playerstats_uri;
13         if(uri == "")
14                 return;
15         playerstats_db = db_create();
16         if(playerstats_db >= 0)
17                 playerstats_waitforme = FALSE; // must wait for it at match end
18         
19         PlayerStats_AddEvent(PLAYERSTATS_ALIVETIME);
20         PlayerStats_AddEvent(PLAYERSTATS_KILLS);
21 }
22
23 void PlayerStats_AddPlayer(entity e)
24 {
25         if(!e.crypto_idfp || playerstats_db < 0)
26                 return;
27         
28         string key;
29         key = sprintf("%s:*", e.crypto_idfp);
30         
31         string p;
32         p = db_get(playerstats_db, key);
33         if(p == "")
34         {
35                 if(playerstats_last)
36                 {
37                         db_put(playerstats_db, key, playerstats_last);
38                         strunzone(playerstats_last);
39                 }
40                 else
41                         db_put(playerstats_db, key, "#");
42                 playerstats_last = strzone(e.crypto_idfp);
43         }
44 }
45
46 void PlayerStats_AddEvent(string event_id)
47 {
48         if(playerstats_db < 0)
49                 return;
50         
51         string key;
52         key = sprintf("*:%s", event_id);
53         
54         string p;
55         p = db_get(playerstats_db, key);
56         if(p == "")
57         {
58                 if(events_last)
59                 {
60                         db_put(playerstats_db, key, events_last);
61                         strunzone(events_last);
62                 }
63                 else
64                         db_put(playerstats_db, key, "#");
65                 events_last = strzone(event_id);
66         }
67 }
68
69 void PlayerStats_Event(entity e, string event_id, float value)
70 {
71         if(!e.crypto_idfp || playerstats_db < 0)
72                 return;
73         
74         string key;
75         float val;
76         key = sprintf("%s:%s", e.crypto_idfp, event_id);
77         val = stof(db_get(playerstats_db, key));
78         val += value;
79         db_put(playerstats_db, key, ftos(val));
80 }
81
82 void PlayerStats_Sent_URI_Get_Callback(float id, float status, string data)
83 {
84         if(playerstats_requested)
85                 playerstats_waitforme = TRUE;
86 }
87
88 //#NO AUTOCVARS START
89 void PlayerStats_Shutdown()
90 {
91         string p, pn;
92         string e, en;
93         string nn;
94         float b;
95         float i;
96         string uri;
97
98         if(playerstats_db < 0)
99                 return;
100
101         uri = autocvar_g_playerstats_uri;
102         if(uri != "")
103         {
104                 b = buf_create();
105                 i = 0;
106
107                 db_dump(playerstats_db, "foo.db");
108
109                 bufstr_set(b, i++, "V 1");
110                 bufstr_set(b, i++, sprintf("T %s.%06d", strftime(FALSE, "%s"), floor(random() * 1000000)));
111                 bufstr_set(b, i++, sprintf("G %s", GetGametype()));
112                 bufstr_set(b, i++, sprintf("M %s", GetMapname()));
113                 bufstr_set(b, i++, sprintf("S %s", cvar_string("hostname")));
114                 bufstr_set(b, i++, sprintf("C %d", cvar_purechanges_count));
115                 for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
116                 {
117                         bufstr_set(b, i++, sprintf("P %s", p));
118                         nn = db_get(playerstats_db, sprintf("%s:_netname", p));
119                         if(nn != "")
120                                 bufstr_set(b, i++, sprintf("n %s", nn));
121                         for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
122                         {
123                                 float v;
124                                 v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e)));
125                                 bufstr_set(b, i++, sprintf("e %s %f", e, v));
126                         }
127                 }
128                 bufstr_set(b, i++, "");
129
130                 if(crypto_uri_postbuf(uri, URI_GET_PLAYERSTATS_SENT, "text/plain", "\n", b, 0))
131                         playerstats_requested = TRUE;
132                 else
133                         playerstats_waitforme = TRUE; // if posting fails, we must continue anyway
134
135                 buf_del(b);
136         }
137         else
138                 playerstats_waitforme = TRUE;
139
140         db_close(playerstats_db);
141         playerstats_db = -1;
142 }
143 //#NO AUTOCVARS END
144
145 void PlayerStats_AddGlobalInfo(entity p)
146 {
147         if(playerstats_db < 0)
148                 return;
149         if(!p.crypto_idfp || playerstats_db < 0)
150                 return;
151         p.playerstats_addedglobalinfo = TRUE;
152
153         // add global info!
154         if(p.alivetime)
155                 PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
156         
157         if(p.cvar_cl_allow_uid2name == 1)
158                 db_put(playerstats_db, sprintf("%s:_netname", p.crypto_idfp), p.netname);
159 }