[Bug Fix] Fix issue with subcommand settings not working (#3643)

* [Bug Fix] Fix issue with subcommand settings not working

# Notes
- We were checking for `arguments >= 2` when we should just be checking for if there are any arguments and comparing `sep.arg[0]` (the command) and `sep.arg[1]` (the subcommand) to our `command_subsettings` to see if it exists and if we pass the requirements.
- This fix will let operators properly set a subcommand to a lower or higher status level than the parent command.

* Remove debug message.
This commit is contained in:
Alex King 2023-10-20 21:33:05 -04:00 committed by GitHub
parent 6927baef7f
commit 0585be0360
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -437,13 +437,13 @@ int command_realdispatch(Client *c, std::string message, bool ignore_status)
{ {
Seperator sep(message.c_str(), ' ', 10, 100, true); // "three word argument" should be considered 1 arg Seperator sep(message.c_str(), ' ', 10, 100, true); // "three word argument" should be considered 1 arg
std::string cstr(sep.arg[0] + 1); std::string command(sep.arg[0] + 1);
if (commandlist.count(cstr) != 1) { if (commandlist.count(command) != 1) {
return -2; return -2;
} }
auto cur = commandlist[cstr]; const CommandRecord* current_command = commandlist[command];
bool is_subcommand = false; bool is_subcommand = false;
bool can_use_subcommand = false; bool can_use_subcommand = false;
@ -451,11 +451,11 @@ int command_realdispatch(Client *c, std::string message, bool ignore_status)
const auto arguments = sep.argnum; const auto arguments = sep.argnum;
if (arguments >= 2) { if (arguments) {
const std::string& sub_command = sep.arg[1]; const std::string& sub_command = sep.arg[1];
for (const auto &e : command_subsettings) { for (const auto &e : command_subsettings) {
if (e.sub_command == sub_command) { if (e.parent_command == command && e.sub_command == sub_command) {
can_use_subcommand = c->Admin() >= static_cast<int16>(e.access_level); can_use_subcommand = c->Admin() >= static_cast<int16>(e.access_level);
is_subcommand = true; is_subcommand = true;
found_subcommand_setting = true; found_subcommand_setting = true;
@ -465,7 +465,7 @@ int command_realdispatch(Client *c, std::string message, bool ignore_status)
if (!found_subcommand_setting) { if (!found_subcommand_setting) {
for (const auto &e: command_subsettings) { for (const auto &e: command_subsettings) {
if (e.sub_command == sub_command) { if (e.parent_command == command && e.sub_command == sub_command) {
can_use_subcommand = c->Admin() >= static_cast<int16>(e.access_level); can_use_subcommand = c->Admin() >= static_cast<int16>(e.access_level);
is_subcommand = true; is_subcommand = true;
break; break;
@ -475,7 +475,7 @@ int command_realdispatch(Client *c, std::string message, bool ignore_status)
} }
if (!ignore_status) { if (!ignore_status) {
if (!is_subcommand && c->Admin() < cur->admin) { if (!is_subcommand && c->Admin() < current_command->admin) {
c->Message(Chat::White, "Your status is not high enough to use this command."); c->Message(Chat::White, "Your status is not high enough to use this command.");
return -1; return -1;
} }
@ -497,7 +497,7 @@ int command_realdispatch(Client *c, std::string message, bool ignore_status)
QServ->PlayerLogEvent(Player_Log_Issued_Commands, c->CharacterID(), event_desc); QServ->PlayerLogEvent(Player_Log_Issued_Commands, c->CharacterID(), event_desc);
} }
if (cur->admin >= COMMANDS_LOGGING_MIN_STATUS) { if (current_command->admin >= COMMANDS_LOGGING_MIN_STATUS) {
LogCommands( LogCommands(
"[{}] ([{}]) used command: [{}] (target=[{}])", "[{}] ([{}]) used command: [{}] (target=[{}])",
c->GetName(), c->GetName(),
@ -507,8 +507,8 @@ int command_realdispatch(Client *c, std::string message, bool ignore_status)
); );
} }
if (!cur->function) { if (!current_command->function) {
LogError("Command [{}] has a null function", cstr); LogError("Command [{}] has a null function", command);
return -1; return -1;
} }
@ -525,7 +525,7 @@ int command_realdispatch(Client *c, std::string message, bool ignore_status)
RecordPlayerEventLogWithClient(c, PlayerEvent::GM_COMMAND, e); RecordPlayerEventLogWithClient(c, PlayerEvent::GM_COMMAND, e);
} }
cur->function(c, &sep); // Dispatch C++ Command current_command->function(c, &sep); // Dispatch C++ Command
return 0; return 0;
} }