@ -3,19 +3,21 @@ import discord
class Extension :
def __init__ ( self , core ) :
@core . tree . command ( name = " servers " , description = " Показать статистику с серверов " )
@discord . app_commands . describe ( server = " ид сервера в формате srv1 " )
@discord . app_commands . describe ( server = " Название сервера " )
@discord . app_commands . choices ( server = core . GetServersChoice ( ) )
async def get_servers (
interaction : discord . Interaction ,
server : str = " "
server : discord . app_commands . Choice [ str ] = None
) :
await interaction . response . defer ( thinking = True )
steam64 = await core . GetSteam64OfDiscord ( interaction . user )
embed = discord . Embed ( )
if server :
server = server . value
if not server in core . stats . get ( " servers " , { } ) . keys ( ) :
return await interaction . followup . send ( f " Сервер с таким индификатором не существует, введи существующий из предложенных: \n { ' ' . join ( core . stats . get ( ' servers ' , { } ) . keys ( ) ) } " , ephemeral = False )
embed . add_field ( name = core . stats [ ' servers ' ] [ server ] [ ' name ' ] , value = str _server( core . stats [ ' servers ' ] [ server ] ) , inline = False )
embed = single _server ( core . stats [ ' servers ' ] [ server ] )
else :
servers = [ server for server in core . stats [ " servers " ] . values ( ) if server [ ' status ' ] == True and server [ ' player_count ' ] > 0 ]
if servers :
@ -38,8 +40,7 @@ class Extension:
return await interaction . followup . send ( embed = embed , ephemeral = False )
def str_server ( data ) :
def str_server ( data , with_profiles = False ) :
message = " "
addr = data [ ' address ' ] . split ( " : " )
message + = f " https:// { addr [ 0 ] } /connect/ { addr [ 1 ] } \n "
@ -49,6 +50,28 @@ def str_server(data):
message + = f " Карта: { data [ ' map ' ] } \n "
message + = f " Игроков: { data [ ' player_count ' ] } / { data [ ' max_players ' ] } \n "
message + = " \n "
for player in data [ ' players ' ] :
message + = f " { player [ ' duration ' ] : 7 } | { player [ ' score ' ] : 3 } | { player [ ' name ' ] } \n "
return message
for player in sorted ( data [ ' players ' ] , key = lambda player : player [ " score " ] , reverse = True ) :
message + = f " { player [ ' duration ' ] : 7 } | { player [ ' score ' ] : 3 } | { player [ ' name ' ] } { ( ' | ' + player [ ' steam ' ] [ ' community_url ' ] ) if with_profiles else ' ' } \n "
return message
def single_server ( server ) - > discord . Embed :
addr = server [ ' address ' ] . split ( " : " )
embed = discord . Embed (
title = server [ ' name ' ] ,
description = f " Карта: { server [ ' map ' ] } \n Игроков: { server [ ' player_count ' ] } / { server [ ' max_players ' ] } " ,
url = f " https:// { addr [ 0 ] } /connect/ { addr [ 1 ] } " )
if len ( server [ ' players ' ] ) > 24 :
count = 0
value = " "
for player in sorted ( server [ ' players ' ] , key = lambda player : player [ " score " ] , reverse = True ) :
if count > = 24 :
value + = f " { player [ ' duration ' ] : 7 } | { player [ ' score ' ] : 3 } | { player [ ' name ' ] } \n { player [ ' steam ' ] [ ' community_url ' ] } \n \n "
continue
embed . add_field ( name = f " { player [ ' duration ' ] : 7 } | { player [ ' score ' ] : 3 } | { player [ ' name ' ] } " , value = player [ ' steam ' ] [ ' community_url ' ] , inline = False )
count + = 1
if value :
embed . add_field ( name = f " Прочие игроки " , value = value , inline = False )
else :
for player in sorted ( server [ ' players ' ] , key = lambda player : player [ " score " ] , reverse = True ) :
embed . add_field ( name = f " { player [ ' duration ' ] : 7 } | { player [ ' score ' ] : 3 } | { player [ ' name ' ] } " , value = player [ ' steam ' ] [ ' community_url ' ] , inline = False )
return embed