#include "CCommandsManager.h" bool CCommandsManager::IsCommandPresent(const std::string& name) const { return std::find_if(Items.begin(), Items.end(), [&name](auto& ptr) -> bool { return ptr->IsNamedLike(name); }) != Items.end(); } std::unique_ptr& CCommandsManager::GetCommand(const std::string& name) { auto it = std::find_if(Items.begin(), Items.end(), [&name](auto& ptr) -> bool { return ptr->IsNamedLike(name); }); if (it == Items.end()) { //return nullptr; throw std::runtime_error("No such command"); } return *it; } bool CCommandsManager::IsCommandPresent(const std::unique_ptr& cmd) const { return std::find_if(Items.begin(), Items.end(), [&cmd](auto& ptr) -> bool { return ptr == cmd; }) != Items.end(); } bool CCommandsManager::CanAdd(const std::unique_ptr& item) const { bool NameMatch = IsCommandPresent(item->Name); bool AliasMatch = false; for (const auto& s : item->Aliases) { bool mtch = IsCommandPresent(s); if (mtch) { AliasMatch = true; break; } } return !IsCommandPresent(item) && (!NameMatch && !AliasMatch); } void CCommandsManager::Add(std::unique_ptr&& cmd) { Items.push_back(std::move(cmd)); } std::unique_ptr& CCommandsManager::CreateCommand(const std::string& name, CCommand::CType type, CCommand::CmdRight rights, const std::function& hndlr) { std::unique_ptr cmd = std::make_unique(); cmd->Name = name; cmd->Type = type; cmd->ProcessRights = rights; cmd->Handlers += hndlr; Add(std::move(cmd)); return Items.back(); } std::unique_ptr& CCommandsManager::CreateLuaCommand(const std::string& name, CCommand::CType type, CCommand::CmdRight rights, const sol::function& func) { std::unique_ptr cmd = std::make_unique(); cmd->Name = name; cmd->Type = type; cmd->ProcessRights = rights; std::unique_ptr> _func = std::make_unique>(func); _func->MakeCustomOutCaller([](const sol::function& luafunc, COMMAND_ARGS) -> COMMAND_RETURN { sol::protected_function safe_luafunc(luafunc.lua_state(), luafunc); sol::object ret_obj = safe_luafunc(args.ToLua(), sender.GetID()); //TODO fix it CCommand::CmdStatus ret = CCommand::CmdStatus::OK; if(ret_obj.valid() && ret_obj.is()) { ret = (CCommand::CmdStatus)ret_obj.as(); } return ret; }); _func->MakeCustomInCaller([](CFunctionBase* rawfunc, sol::variadic_args va) -> sol::object { if(va.size() == 0) { return sol::make_object(va.lua_state(), (int)rawfunc->Call({}, CCommandSender::Self)); } if(va.size() == 1) { //return sol::make_object(va.lua_state(), (int)rawfunc->Call({}, CCommandSender::FromID())); TODO sender return sol::make_object(va.lua_state(), (int)rawfunc->Call({}, CCommandSender::Self)); //TEMPORARY } std::vector args; for(size_t i = 0; i < va.size() - 1; i++) { args.push_back(va.get(i)); } return sol::make_object(va.lua_state(), (int)rawfunc->Call(args, CCommandSender::Self)); //TODO sender }); cmd->Handlers.Add(std::move(_func)); Add(std::move(cmd)); return Items.back(); }