#pragma once #include "command.hpp" #include "services/players/player_service.hpp" namespace big { class player_command; class player_all_component : public command { player_command* m_parent; protected: virtual void execute(const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) override; virtual std::optional parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; public: player_all_component(player_command* parent, const std::string& name, const std::string& label, const std::string& description, std::optional num_args); }; inline std::unordered_map g_player_commands; class player_command : public command { friend player_all_component; std::unique_ptr m_all_component; protected: virtual void execute(const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) override; virtual void execute(player_ptr player, const command_arguments& args, const std::shared_ptr ctx = std::make_shared()) = 0; virtual std::optional parse_args(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) override; virtual std::optional parse_args_p(const std::vector& args, const std::shared_ptr ctx = std::make_shared()) { return {0}; }; virtual std::optional> get_argument_suggestions(int arg) override { if (arg == 1) // First argument of all player commands is the player name { std::vector suggestions; for (auto& player : g_player_service->players() | std::ranges::views::values) { suggestions.push_back(player->get_name()); } return suggestions; } return std::nullopt; }; public: static player_command* get(rage::joaat_t command) { return g_player_commands[command]; } void call(player_ptr player, const command_arguments& args, const std::shared_ptr ctx = std::make_shared()); player_command(const std::string& name, const std::string& label, const std::string& description, std::optional num_args, bool make_all_version = true); }; }