/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. */ #include "CustomStrategyEditAction.h" #include "CustomStrategy.h" #include "Event.h" #include "Playerbots.h" bool CustomStrategyEditAction::Execute(Event event) { std::string text = event.getParam(); uint32 pos = text.find(" "); if (pos == std::string::npos) return PrintHelp(); std::string const name = text.substr(0, pos); text = text.substr(pos + 1); pos = text.find(" "); if (pos == std::string::npos) pos = text.size(); std::string const idx = text.substr(0, pos); text = pos >= text.size() ? "" : text.substr(pos + 1); return idx == "?" ? Print(name) : Edit(name, atoi(idx.c_str()), text); } bool CustomStrategyEditAction::PrintHelp() { botAI->TellMaster("=== Custom strategies ==="); uint32 owner = botAI->GetBot()->GetGUID().GetCounter(); PlayerbotsDatabasePreparedStatement* stmt = PlayerbotsDatabase.GetPreparedStatement(PLAYERBOTS_SEL_CUSTOM_STRATEGY_BY_OWNER); stmt->SetData(0, owner); if (PreparedQueryResult result = PlayerbotsDatabase.Query(stmt)) { do { Field* fields = result->Fetch(); std::string const name = fields[0].Get(); botAI->TellMaster(name); } while (result->NextRow()); } botAI->TellMaster("Usage: cs "); return false; } bool CustomStrategyEditAction::Print(std::string const name) { std::ostringstream out; out << "=== " << name << " ==="; botAI->TellMaster(out.str()); uint32 owner = botAI->GetBot()->GetGUID().GetCounter(); PlayerbotsDatabasePreparedStatement* stmt = PlayerbotsDatabase.GetPreparedStatement(PLAYERBOTS_SEL_CUSTOM_STRATEGY_BY_OWNER_AND_NAME); stmt->SetData(0, owner); stmt->SetData(1, name); if (PreparedQueryResult result = PlayerbotsDatabase.Query(stmt)) { do { Field* fields = result->Fetch(); uint32 idx = fields[0].Get(); std::string const action = fields[1].Get(); PrintActionLine(idx, action); } while (result->NextRow()); } return true; } bool CustomStrategyEditAction::Edit(std::string const name, uint32 idx, std::string const command) { uint32 owner = botAI->GetBot()->GetGUID().GetCounter(); PlayerbotsDatabasePreparedStatement* stmt = PlayerbotsDatabase.GetPreparedStatement(PLAYERBOTS_SEL_CUSTOM_STRATEGY_BY_OWNER_AND_NAME_AND_IDX); stmt->SetData(0, owner); stmt->SetData(1, name); stmt->SetData(2, idx); if (PreparedQueryResult result = PlayerbotsDatabase.Query(stmt)) { if (command.empty()) { stmt = PlayerbotsDatabase.GetPreparedStatement(PLAYERBOTS_DEL_CUSTOM_STRATEGY); stmt->SetData(0, name); stmt->SetData(1, owner); stmt->SetData(2, idx); PlayerbotsDatabase.Execute(stmt); } else { stmt = PlayerbotsDatabase.GetPreparedStatement(PLAYERBOTS_UPD_CUSTOM_STRATEGY); stmt->SetData(0, command); stmt->SetData(1, name); stmt->SetData(2, owner); stmt->SetData(3, idx); PlayerbotsDatabase.Execute(stmt); } } else { stmt = PlayerbotsDatabase.GetPreparedStatement(PLAYERBOTS_INS_CUSTOM_STRATEGY); stmt->SetData(0, name); stmt->SetData(1, owner); stmt->SetData(2, idx); stmt->SetData(3, command); PlayerbotsDatabase.Execute(stmt); } PrintActionLine(idx, command); std::ostringstream ss; ss << "custom::" << name; if (Strategy* strategy = botAI->GetAiObjectContext()->GetStrategy(ss.str())) { if (CustomStrategy* cs = dynamic_cast(strategy)) { cs->Reset(); botAI->ReInitCurrentEngine(); } } return true; } bool CustomStrategyEditAction::PrintActionLine(uint32 idx, std::string const command) { std::ostringstream out; out << "#" << idx << " " << command; botAI->TellMaster(out.str()); return true; }