@@ -91,17 +91,17 @@ def announce():
91
91
92
92
if action == "update" and not old :
93
93
if app .config ["ALLOW_UPDATE_WITHOUT_OLD" ]:
94
- old = server
95
- old ["start" ] = time .time ()
96
- old ["clients_top" ] = 0
97
- old ["updates" ] = 0
98
- old ["total_clients" ] = 0
94
+ action = "start"
99
95
else :
100
96
return "Server to update not found."
101
97
102
- server ["update_time" ] = time .time ()
98
+ server ["update_time" ] = int ( time .time () )
103
99
104
- server ["start" ] = time .time () if action == "start" else old ["start" ]
100
+ if action == "start" :
101
+ server ["start" ] = int (time .time ())
102
+ tracker .push ("%s:%d" % (server ["ip" ], server ["port" ]), server ["start" ])
103
+ else :
104
+ server ["start" ] = old ["start" ]
105
105
106
106
if "clients_list" in server :
107
107
server ["clients" ] = len (server ["clients_list" ])
@@ -301,6 +301,29 @@ def asyncFinishThread(server):
301
301
serverList .update (server )
302
302
303
303
304
+ class UptimeTracker :
305
+ def __init__ (self ):
306
+ self .d = {}
307
+ self .cleanTime = 0
308
+ self .lock = RLock ()
309
+ def push (self , id , ts ):
310
+ with self .lock :
311
+ if time .time () >= self .cleanTime : # clear once in a while
312
+ self .d .clear ()
313
+ self .cleanTime = time .time () + 48 * 60 * 60
314
+
315
+ if id in self .d :
316
+ self .d [id ] = self .d [id ][- 1 :] + [ts ]
317
+ else :
318
+ self .d [id ] = [0 , ts ]
319
+ # returns the before-last start time, in bulk
320
+ def getStartTimes (self ):
321
+ ret = {}
322
+ with self .lock :
323
+ for k , v in self .d .items ():
324
+ ret [k ] = v [0 ]
325
+ return ret
326
+
304
327
class ServerList :
305
328
def __init__ (self ):
306
329
self .list = []
@@ -329,6 +352,8 @@ def remove(self, server):
329
352
pass
330
353
331
354
def sort (self ):
355
+ start_times = tracker .getStartTimes ()
356
+
332
357
def server_points (server ):
333
358
points = 0
334
359
@@ -366,10 +391,13 @@ def server_points(server):
366
391
points -= (server ["ping" ] - 0.4 ) * 8
367
392
368
393
# Up to -8 for less than an hour of uptime (penalty linearly decreasing)
394
+ # only if the server has restarted before within the last 2 hours
369
395
HOUR_SECS = 60 * 60
370
396
uptime = server ["uptime" ]
371
397
if uptime < HOUR_SECS :
372
- points -= ((HOUR_SECS - uptime ) / HOUR_SECS ) * 8
398
+ start_time = start_times .get ("%s:%d" % (server ["ip" ], server ["port" ]), 0 )
399
+ if start_time >= time .time () - 2 * HOUR_SECS :
400
+ points -= ((HOUR_SECS - uptime ) / HOUR_SECS ) * 8
373
401
374
402
# reduction to 40% for servers that support both legacy (v4) and v5 clients
375
403
if server ["proto_min" ] <= 32 and server ["proto_max" ] > 36 :
@@ -446,6 +474,10 @@ def run(self):
446
474
time .sleep (60 )
447
475
serverList .purgeOld ()
448
476
477
+ # Globals / Startup
478
+
479
+ tracker = UptimeTracker ()
480
+
449
481
serverList = ServerList ()
450
482
451
483
PurgeThread ().start ()
0 commit comments