Show percentage of loaded rcon commands

closed #7769
This commit is contained in:
ChillerDragon 2024-05-11 12:04:29 +08:00
parent 3887eea18d
commit f3a686bc62
6 changed files with 60 additions and 8 deletions

View file

@ -208,6 +208,7 @@ public:
virtual bool UseTempRconCommands() const = 0;
virtual void Rcon(const char *pLine) = 0;
virtual bool ReceivingRconCommands() const = 0;
virtual float GotRconCommandsPercentage() const = 0;
// server info
virtual void GetServerInfo(class CServerInfo *pServerInfo) const = 0;

View file

@ -217,6 +217,16 @@ void CClient::Rcon(const char *pCmd)
SendMsgActive(&Msg, MSGFLAG_VITAL);
}
float CClient::GotRconCommandsPercentage() const
{
if(m_ExpectedRconCommands < 1)
return -1.0f;
if(m_GotRconCommands > m_ExpectedRconCommands)
return -1.0f;
return (float)m_GotRconCommands / (float)m_ExpectedRconCommands;
}
bool CClient::ConnectionProblems() const
{
return m_aNetClient[g_Config.m_ClDummy].GotProblems(MaxLatencyTicks() * time_freq() / GameTickSpeed()) != 0;
@ -552,7 +562,8 @@ void CClient::DisconnectWithReason(const char *pReason)
mem_zero(m_aRconPassword, sizeof(m_aRconPassword));
m_ServerSentCapabilities = false;
m_UseTempRconCommands = 0;
m_ReceivingRconCommands = false;
m_ExpectedRconCommands = -1;
m_GotRconCommands = 0;
m_pConsole->DeregisterTempAll();
m_aNetClient[CONN_MAIN].Disconnect(pReason);
SetState(IClient::STATE_OFFLINE);
@ -1594,6 +1605,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy)
{
m_pConsole->RegisterTemp(pName, pParams, CFGFLAG_SERVER, pHelp);
}
m_GotRconCommands++;
}
else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_REM)
{
@ -1621,7 +1633,7 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy)
if(Old != 0 && m_UseTempRconCommands == 0)
{
m_pConsole->DeregisterTempAll();
m_ReceivingRconCommands = false;
m_ExpectedRconCommands = -1;
}
}
}
@ -1953,11 +1965,16 @@ void CClient::ProcessServerPacket(CNetChunk *pPacket, int Conn, bool Dummy)
}
else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_GROUP_START)
{
m_ReceivingRconCommands = true;
int ExpectedRconCommands = Unpacker.GetInt();
if(Unpacker.Error())
return;
m_ExpectedRconCommands = ExpectedRconCommands;
m_GotRconCommands = 0;
}
else if(Conn == CONN_MAIN && (pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_CMD_GROUP_END)
{
m_ReceivingRconCommands = false;
m_ExpectedRconCommands = -1;
}
}
else if((pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0)

View file

@ -117,7 +117,8 @@ class CClient : public IClient, public CDemoPlayer::IListener
char m_aRconUsername[32] = "";
char m_aRconPassword[sizeof(g_Config.m_SvRconPassword)] = "";
int m_UseTempRconCommands = 0;
bool m_ReceivingRconCommands = false;
int m_ExpectedRconCommands = -1;
int m_GotRconCommands = 0;
char m_aPassword[sizeof(g_Config.m_Password)] = "";
bool m_SendPassword = false;
@ -285,7 +286,8 @@ public:
bool UseTempRconCommands() const override { return m_UseTempRconCommands != 0; }
void RconAuth(const char *pName, const char *pPassword) override;
void Rcon(const char *pCmd) override;
bool ReceivingRconCommands() const override { return m_ReceivingRconCommands; }
bool ReceivingRconCommands() const override { return m_ExpectedRconCommands > 0; }
float GotRconCommandsPercentage() const override;
bool ConnectionProblems() const override;

View file

@ -1341,13 +1341,30 @@ void CServer::SendRconCmdRem(const IConsole::CCommandInfo *pCommandInfo, int Cli
SendMsg(&Msg, MSGFLAG_VITAL, ClientId);
}
int CServer::GetConsoleAccessLevel(int ClientId)
{
return m_aClients[ClientId].m_Authed == AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : m_aClients[ClientId].m_Authed == AUTHED_MOD ? IConsole::ACCESS_LEVEL_MOD : IConsole::ACCESS_LEVEL_HELPER;
}
int CServer::NumRconCommands(int ClientId)
{
int Num = 0;
int ConsoleAccessLevel = GetConsoleAccessLevel(ClientId);
for(const IConsole::CCommandInfo *pCmd = Console()->FirstCommandInfo(ConsoleAccessLevel, CFGFLAG_SERVER);
pCmd; pCmd = pCmd->NextCommandInfo(ConsoleAccessLevel, CFGFLAG_SERVER))
{
Num++;
}
return Num;
}
void CServer::UpdateClientRconCommands()
{
int ClientId = Tick() % MAX_CLIENTS;
if(m_aClients[ClientId].m_State != CClient::STATE_EMPTY && m_aClients[ClientId].m_Authed)
{
int ConsoleAccessLevel = m_aClients[ClientId].m_Authed == AUTHED_ADMIN ? IConsole::ACCESS_LEVEL_ADMIN : m_aClients[ClientId].m_Authed == AUTHED_MOD ? IConsole::ACCESS_LEVEL_MOD : IConsole::ACCESS_LEVEL_HELPER;
int ConsoleAccessLevel = GetConsoleAccessLevel(ClientId);
for(int i = 0; i < MAX_RCONCMD_SEND && m_aClients[ClientId].m_pRconCmdToSend; ++i)
{
SendRconCmdAdd(m_aClients[ClientId].m_pRconCmdToSend, ClientId);
@ -1759,6 +1776,7 @@ void CServer::ProcessClientPacket(CNetChunk *pPacket)
// AUTHED_ADMIN - AuthLevel gets the proper IConsole::ACCESS_LEVEL_<x>
m_aClients[ClientId].m_pRconCmdToSend = Console()->FirstCommandInfo(AUTHED_ADMIN - AuthLevel, CFGFLAG_SERVER);
CMsgPacker MsgStart(NETMSG_RCON_CMD_GROUP_START, true);
MsgStart.AddInt(NumRconCommands(ClientId));
SendMsg(&MsgStart, MSGFLAG_VITAL, ClientId);
if(m_aClients[ClientId].m_pRconCmdToSend == nullptr)
{

View file

@ -331,6 +331,8 @@ public:
void SendRconCmdAdd(const IConsole::CCommandInfo *pCommandInfo, int ClientId);
void SendRconCmdRem(const IConsole::CCommandInfo *pCommandInfo, int ClientId);
int GetConsoleAccessLevel(int ClientId);
int NumRconCommands(int ClientId);
void UpdateClientRconCommands();
bool CheckReservedSlotAuth(int ClientId, const char *pPassword);

View file

@ -1307,8 +1307,20 @@ void CGameConsole::OnRender()
if(m_ConsoleType == CONSOLETYPE_REMOTE && Client()->ReceivingRconCommands())
{
float Percentage = Client()->GotRconCommandsPercentage();
SProgressSpinnerProperties ProgressProps;
ProgressProps.m_Progress = Percentage;
Ui()->RenderProgressSpinner(vec2(Screen.w / 4.0f + FONT_SIZE / 2.f, FONT_SIZE), FONT_SIZE / 2.f);
TextRender()->Text(Screen.w / 4.0f + FONT_SIZE + 2.0f, FONT_SIZE / 2.f, FONT_SIZE, Localize("Loading commands…"));
char aLoading[128];
str_copy(aLoading, Localize("Loading commands…"));
if(Percentage > 0)
{
char aPercentage[8];
str_format(aPercentage, sizeof(aPercentage), " %d%%", (int)(Percentage * 100));
str_append(aLoading, aPercentage);
}
TextRender()->Text(Screen.w / 4.0f + FONT_SIZE + 2.0f, FONT_SIZE / 2.f, FONT_SIZE, aLoading);
}
// render version