@@ -350,19 +350,24 @@ async def squadrons(self, limit: int = Query(default=None), offset: int = Query(
350350 }))
351351 return squadrons
352352
353- async def leaderboard (self , what : Literal ['kills' , 'kdr' ], limit : Optional [int ] = 10 , offset : Optional [int ] = 0 ,
353+ async def leaderboard (self , what : Literal ['kills' , 'kdr' ], order : Literal ['ASC' , 'DESC' ] = 'DESC' ,
354+ query : Optional [str ] = None , limit : Optional [int ] = 10 , offset : Optional [int ] = 0 ,
354355 server_name : Optional [str ] = None ):
355356 if what == 'kills' :
356357 order_column = 3
357358 else :
358359 order_column = 6
360+ if server_name :
361+ join = "JOIN missions m ON s.mission_id = m.id AND m.server_name = %(server_name)s"
362+ else :
363+ join = ""
364+ if query :
365+ where = "WHERE p.name ILIKE %(query)s"
366+ else :
367+ where = ""
359368
360369 async with self .apool .connection () as conn :
361370 async with conn .cursor (row_factory = dict_row ) as cursor :
362- if server_name :
363- join = "JOIN missions m ON s.mission_id = m.id AND m.server_name = %(server_name)s"
364- else :
365- join = ""
366371 await cursor .execute (f"""
367372 WITH result_with_count AS (
368373 SELECT p.name AS "nick", DATE_TRUNC('second', p.last_seen) AS "date", SUM(s.kills) AS "kills",
@@ -380,13 +385,14 @@ async def leaderboard(self, what: Literal['kills', 'kdr'], limit: Optional[int]
380385 FROM statistics s
381386 JOIN players p ON s.player_ucid = p.ucid
382387 { join }
388+ { where }
383389 GROUP BY 1, 2
384- ORDER BY { order_column } DESC
390+ ORDER BY { order_column } { order }
385391 LIMIT %(limit)s
386392 OFFSET %(offset)s
387393 )
388394 SELECT * FROM result_with_count
389- """ , {"server_name" : server_name , "limit" : limit , "offset" : offset })
395+ """ , {"server_name" : server_name , "query" : f"% { query } %" , " limit" : limit , "offset" : offset })
390396 rows = await cursor .fetchall ()
391397 if not rows :
392398 return {
0 commit comments