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 bool UseTempRconCommands() const = 0;
virtual void Rcon(const char *pLine) = 0; virtual void Rcon(const char *pLine) = 0;
virtual bool ReceivingRconCommands() const = 0; virtual bool ReceivingRconCommands() const = 0;
virtual float GotRconCommandsPercentage() const = 0;
// server info // server info
virtual void GetServerInfo(class CServerInfo *pServerInfo) const = 0; virtual void GetServerInfo(class CServerInfo *pServerInfo) const = 0;

View file

@ -217,6 +217,16 @@ void CClient::Rcon(const char *pCmd)
SendMsgActive(&Msg, MSGFLAG_VITAL); 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 bool CClient::ConnectionProblems() const
{ {
return m_aNetClient[g_Config.m_ClDummy].GotProblems(MaxLatencyTicks() * time_freq() / GameTickSpeed()) != 0; 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)); mem_zero(m_aRconPassword, sizeof(m_aRconPassword));
m_ServerSentCapabilities = false; m_ServerSentCapabilities = false;
m_UseTempRconCommands = 0; m_UseTempRconCommands = 0;
m_ReceivingRconCommands = false; m_ExpectedRconCommands = -1;
m_GotRconCommands = 0;
m_pConsole->DeregisterTempAll(); m_pConsole->DeregisterTempAll();
m_aNetClient[CONN_MAIN].Disconnect(pReason); m_aNetClient[CONN_MAIN].Disconnect(pReason);
SetState(IClient::STATE_OFFLINE); 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_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) 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) if(Old != 0 && m_UseTempRconCommands == 0)
{ {
m_pConsole->DeregisterTempAll(); 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) 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) 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) 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_aRconUsername[32] = "";
char m_aRconPassword[sizeof(g_Config.m_SvRconPassword)] = ""; char m_aRconPassword[sizeof(g_Config.m_SvRconPassword)] = "";
int m_UseTempRconCommands = 0; int m_UseTempRconCommands = 0;
bool m_ReceivingRconCommands = false; int m_ExpectedRconCommands = -1;
int m_GotRconCommands = 0;
char m_aPassword[sizeof(g_Config.m_Password)] = ""; char m_aPassword[sizeof(g_Config.m_Password)] = "";
bool m_SendPassword = false; bool m_SendPassword = false;
@ -285,7 +286,8 @@ public:
bool UseTempRconCommands() const override { return m_UseTempRconCommands != 0; } bool UseTempRconCommands() const override { return m_UseTempRconCommands != 0; }
void RconAuth(const char *pName, const char *pPassword) override; void RconAuth(const char *pName, const char *pPassword) override;
void Rcon(const char *pCmd) 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; bool ConnectionProblems() const override;

View file

@ -1341,13 +1341,30 @@ void CServer::SendRconCmdRem(const IConsole::CCommandInfo *pCommandInfo, int Cli
SendMsg(&Msg, MSGFLAG_VITAL, ClientId); 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() void CServer::UpdateClientRconCommands()
{ {
int ClientId = Tick() % MAX_CLIENTS; int ClientId = Tick() % MAX_CLIENTS;
if(m_aClients[ClientId].m_State != CClient::STATE_EMPTY && m_aClients[ClientId].m_Authed) 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) for(int i = 0; i < MAX_RCONCMD_SEND && m_aClients[ClientId].m_pRconCmdToSend; ++i)
{ {
SendRconCmdAdd(m_aClients[ClientId].m_pRconCmdToSend, ClientId); 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> // AUTHED_ADMIN - AuthLevel gets the proper IConsole::ACCESS_LEVEL_<x>
m_aClients[ClientId].m_pRconCmdToSend = Console()->FirstCommandInfo(AUTHED_ADMIN - AuthLevel, CFGFLAG_SERVER); m_aClients[ClientId].m_pRconCmdToSend = Console()->FirstCommandInfo(AUTHED_ADMIN - AuthLevel, CFGFLAG_SERVER);
CMsgPacker MsgStart(NETMSG_RCON_CMD_GROUP_START, true); CMsgPacker MsgStart(NETMSG_RCON_CMD_GROUP_START, true);
MsgStart.AddInt(NumRconCommands(ClientId));
SendMsg(&MsgStart, MSGFLAG_VITAL, ClientId); SendMsg(&MsgStart, MSGFLAG_VITAL, ClientId);
if(m_aClients[ClientId].m_pRconCmdToSend == nullptr) if(m_aClients[ClientId].m_pRconCmdToSend == nullptr)
{ {

View file

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

View file

@ -1307,8 +1307,20 @@ void CGameConsole::OnRender()
if(m_ConsoleType == CONSOLETYPE_REMOTE && Client()->ReceivingRconCommands()) 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); 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 // render version