Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ban/kick concommand completion #604

Merged
merged 14 commits into from
Jan 4, 2024
Merged
1 change: 1 addition & 0 deletions NorthstarDLL/core/convar/concommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ void RegisterConCommand(
ConCommand* newCommand = new ConCommand;
ConCommandConstructor(newCommand, name, callback, helpString, flags, nullptr);
newCommand->m_pCompletionCallback = completionCallback;
newCommand->m_nCallbackFlags |= 0x3; // seems to be correct?; derived from client.dll + 0x737267
}

ON_DLL_LOAD("engine.dll", ConCommand, (CModule module))
Expand Down
54 changes: 52 additions & 2 deletions NorthstarDLL/server/auth/bansystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@
#include "engine/r2engine.h"
#include "client/r2client.h"
#include "config/profile.h"
#include "shared/maxplayers.h"

#include <filesystem>
#include <stdio.h>
#include <string.h>

const char* BANLIST_PATH_SUFFIX = "/banlist.txt";
const char BANLIST_COMMENT_CHAR = '#';
Expand Down Expand Up @@ -213,12 +216,59 @@ void ConCommand_clearbanlist(const CCommand& args)
g_pBanSystem->ClearBanlist();
}

int ConCommand_banCompletion(const char* const partial, char commands[COMMAND_COMPLETION_MAXITEMS][COMMAND_COMPLETION_ITEM_LENGTH])
{
const char* space = strchr(partial, ' ');
const char* cmdName = partial;
const char* query = partial + (space == nullptr ? 0 : space - partial) + 1;

const int queryLength = strlen(query);
const int cmdLength = strlen(cmdName) - queryLength;

int numCompletions = 0;
for (int i = 0; i < R2::GetMaxPlayers() && numCompletions < COMMAND_COMPLETION_MAXITEMS - 2; i++)
{
R2::CBaseClient* client = &R2::g_pClientArray[i];
if (client->m_Signon < R2::eSignonState::CONNECTED)
continue;

if (!strncmp(query, client->m_Name, queryLength))
{
strncpy(commands[numCompletions], cmdName, cmdLength);
strncpy_s(
commands[numCompletions++] + cmdLength,
COMMAND_COMPLETION_ITEM_LENGTH,
client->m_Name,
COMMAND_COMPLETION_ITEM_LENGTH - cmdLength);
}

if (!strncmp(query, client->m_UID, queryLength))
{
strncpy(commands[numCompletions], cmdName, cmdLength);
strncpy_s(
commands[numCompletions++] + cmdLength,
COMMAND_COMPLETION_ITEM_LENGTH,
client->m_UID,
COMMAND_COMPLETION_ITEM_LENGTH - cmdLength);
}
}

return numCompletions;
}

ON_DLL_LOAD_RELIESON("engine.dll", BanSystem, ConCommand, (CModule module))
{
g_pBanSystem = new ServerBanSystem;
g_pBanSystem->OpenBanlist();

RegisterConCommand("ban", ConCommand_ban, "bans a given player by uid or name", FCVAR_GAMEDLL);
RegisterConCommand("unban", ConCommand_unban, "unbans a given player by uid", FCVAR_GAMEDLL);
RegisterConCommand("ban", ConCommand_ban, "bans a given player by uid or name", FCVAR_GAMEDLL, ConCommand_banCompletion);
RegisterConCommand("unban", ConCommand_unban, "unbans a given player by uid", FCVAR_GAMEDLL, ConCommand_banCompletion);
RegisterConCommand("clearbanlist", ConCommand_clearbanlist, "clears all uids on the banlist", FCVAR_GAMEDLL);
}

ON_DLL_LOAD_RELIESON("server.dll", KickCompletion, ConCommand, (CModule module))
{
ConCommand* kick = R2::g_pCVar->FindCommand("kick");
catornot marked this conversation as resolved.
Show resolved Hide resolved
kick->m_pCompletionCallback = ConCommand_banCompletion;
kick->m_nCallbackFlags |= 0x3;
}
Loading