smite warning

This commit is contained in:
MrBesen 2022-08-26 02:12:25 +02:00
parent 0d43798a1c
commit 58795ad66e
6 changed files with 178 additions and 7 deletions

View File

@ -97,6 +97,8 @@ public:
int32_t championID = 0;
int32_t championPickIntentID = 0;
int64_t summonerID = 0;
int64_t spell1Id = 0; // 4 = flash, 6 = ghost, 7 = heal, 11 = smite, 12 = teleport, 14 = ignite
int64_t spell2Id = 0;
ChampSelectCell();
explicit ChampSelectCell(const QJsonObject& json);
@ -148,6 +150,37 @@ public:
explicit RunePage(const QJsonObject& json);
};
struct Message {
std::string body;
std::string fromId;
std::string fromPid;
int64_t fromSummonerId;
std::string id;
bool isHistorical;
std::string timestamp;
std::string type; // known types: chat (1:1), customGame, championSelect, groupchat
Message();
explicit Message(const QJsonObject& json);
};
struct Conversation {
std::string gameName;
std::string gameTag;
std::string id;
bool isMuted;
std::shared_ptr<Message> lastMessage;
std::string name;
std::string password;
std::string pid;
std::string targetRegion;
std::string type;
int64_t unreadMessageCount;
Conversation();
explicit Conversation(const QJsonObject& json);
};
ClientAPI(const ClientAccess& access);
~ClientAPI();
@ -164,6 +197,10 @@ public:
TimerInfo getTimerInfo();
// chats
std::vector<Conversation> getAllConversations();
Message sendMessage(const std::string& chatid, const std::string& messagebody);
// rune stuff
RunePage getCurrentRunePage();
std::vector<RunePage> getAllRunePages();

View File

@ -49,6 +49,9 @@ protected:
bool nextApplyRunes = false;
std::string chatid; // the chatid of the chat from the champselect
std::chrono::time_point<std::chrono::system_clock> lastMessageSent;
public:
enum class State {
LOBBY = 0,
@ -96,5 +99,7 @@ private:
static int32_t getBestRunePage(const std::vector<ClientAPI::RunePage>& allpages);
static int32_t getMatchingRunePage(const RunePage& rp, const std::vector<ClientAPI::RunePage>& allpages);
void champSelect();
void smiteWarning(const std::vector<ClientAPI::ChampSelectCell>& cells);
const std::string& getChatid();
void applyRunes_internal(uint32_t champid, Position pos);
};
};

View File

@ -148,6 +148,53 @@ ClientAPI::TimerInfo ClientAPI::getTimerInfo() {
return (TimerInfo) obj;
}
std::vector<ClientAPI::Conversation> ClientAPI::getAllConversations() {
std::vector<Conversation> out;
QJsonDocument doc = request("lol-chat/v1/conversations");
if(doc.isArray()) {
QJsonArray arr = doc.array();
out.reserve(arr.size());
for(auto elem : arr) {
if(elem.isObject()) {
out.push_back((Conversation) elem.toObject());
}
}
}
return out;
}
ClientAPI::Message ClientAPI::sendMessage(const std::string& chatid, const std::string& messagebody) {
QJsonObject requestj;
requestj["body"] = QString::fromStdString(messagebody);
QJsonDocument requestdoc(requestj);
const std::string requeststr = requestdoc.toJson(QJsonDocument::JsonFormat::Compact).toStdString();
Log::debug << "requeststr: " << requeststr;
QJsonDocument doc = request("lol-chat/v1/conversations/" + chatid + "/messages", Method::POST, requeststr);
std::string error;
if(doc.isObject()) {
QJsonObject obj = doc.object();
auto errref = obj["errorCode"];
auto msgref = obj["message"];
if(errref.isString()) {
error = errref.toString().toStdString() + " ";
}
if(msgref.isString()) {
error += msgref.toString().toStdString();
}
if(error.empty()) {
return (Message) obj;
}
}
Log::note << "send message error: " << error;
return {};
}
ClientAPI::RunePage ClientAPI::getCurrentRunePage() {
QJsonDocument doc = request("lol-perks/v1/currentpage");

View File

@ -119,6 +119,8 @@ ClientAPI::ChampSelectCell::ChampSelectCell(const QJsonObject& json) {
championID = getValue<int32_t>(json, "championId");
championPickIntentID = getValue<int32_t>(json, "championPickIntent");
summonerID = getValue<int32_t>(json, "summonerId");
spell1Id = getValue<int64_t>(json, "spell1Id", 0);
spell2Id = getValue<int64_t>(json, "spell2Id", 0);
}
std::vector<ClientAPI::ChampSelectCell> ClientAPI::loadAllInfos(const QJsonArray& arr) {
@ -226,10 +228,42 @@ RuneAspekt::RuneAspekt(const QJsonObject& json) {
iconPath = getValue<std::string>(json, "iconPath");
}
ClientAPI::Message::Message() {}
ClientAPI::Message::Message(const QJsonObject& json) {
body = getValue<std::string>(json, "body");
fromId = getValue<std::string>(json, "fromId");
fromPid = getValue<std::string>(json, "fromPid");
fromSummonerId = getValue<int64_t>(json, "fromSummonerId");
id = getValue<std::string>(json, "id");
isHistorical = getValue<bool>(json, "isHistorical", true);
timestamp = getValue<std::string>(json, "timestamp");
type = getValue<std::string>(json, "type");
}
ClientAPI::Conversation::Conversation() {}
ClientAPI::Conversation::Conversation(const QJsonObject& json) : lastMessage(nullptr) {
gameName = getValue<std::string>(json, "gameName");
gameTag = getValue<std::string>(json, "gameTag");
id = getValue<std::string>(json, "id");
isMuted = getValue<bool>(json, "isMuted");
name = getValue<std::string>(json, "name");
password = getValue<std::string>(json, "password");
pid = getValue<std::string>(json, "pid");
targetRegion = getValue<std::string>(json, "targetRegion");
type = getValue<std::string>(json, "type");
unreadMessageCount = getValue<int64_t>(json, "unreadMessageCount");
auto msgref = json["lastMessage"];
if(msgref.isObject()) {
lastMessage = std::make_shared<Message>(msgref.toObject());
}
}
#define PRINTENUM(ENUMNAME) \
std::ostream& operator<<(std::ostream& str, const ClientAPI:: ENUMNAME & state) { \
assert(((int) state) < ENUMNAME ## NamesCount); \
return str << ENUMNAME ## Names[(int) state] << " (" << (int) state << ')'; \
assert(((uint32_t) state) < ENUMNAME ## NamesCount); \
return str << ENUMNAME ## Names[(uint32_t) state] << " (" << (uint32_t) state << ')'; \
}
@ -238,7 +272,8 @@ PRINTENUM(GameflowPhase)
PRINTENUM(ChampSelectPhase)
PRINTENUM(ChampSelectActionType)
std::ostream& operator<<(std::ostream& str, const Position & state) { \
assert(((int) state) < PositionNamesCount); \
return str << PositionNames[(int) state] << " (" << (int) state << ')'; \
// not using macro because its not in ClientAPI
std::ostream& operator<<(std::ostream& str, const Position & state) {
assert(((uint32_t) state) < PositionNamesCount);
return str << PositionNames[(uint32_t) state] << " (" << (uint32_t) state << ')';
}

View File

@ -115,6 +115,9 @@ void LolAutoAccept::stopJoinThread() {
void LolAutoAccept::innerRun() {
shouldrun = true;
auto convs = clientapi->getAllConversations();
Log::info << "got " << convs.size() << " conversations";
try {
while(shouldrun) {
uint32_t extrasleep = 800;
@ -199,6 +202,7 @@ void LolAutoAccept::resetAllOffsets() {
currentPosition = Position::INVALID;
currentPositionSet = false;
lastPickedChamp = 0;
chatid.clear();
}
void LolAutoAccept::resetRunes() {
@ -424,6 +428,9 @@ void LolAutoAccept::champSelect() {
pickPhase(ownactions);
} else if(session.timer.phase == ClientAPI::ChampSelectPhase::FINALIZATION) {
// trade?
// check for smite
smiteWarning(session.myTeam);
}
if(nextApplyRunes) {
@ -431,6 +438,46 @@ void LolAutoAccept::champSelect() {
}
}
void LolAutoAccept::smiteWarning(const std::vector<ClientAPI::ChampSelectCell>& cells) {
uint32_t smiteCount = 0;
for(const ClientAPI::ChampSelectCell& member : cells) {
Log::info << "position: " << member.position << " spells: " << member.spell1Id << " " << member.spell2Id;
smiteCount += (member.spell1Id == 11 || member.spell2Id == 11);
}
if(smiteCount != 1) {
// check timeout
std::chrono::time_point<std::chrono::system_clock> currenttime = std::chrono::system_clock::now();
if((currenttime - lastMessageSent) < std::chrono::seconds(2)) {
return;
}
Log::info << "smite warning: " << smiteCount;
const std::string& chatid = getChatid();
if(!chatid.empty()) {
clientapi->sendMessage(chatid, "smite");
lastMessageSent = currenttime;
}
}
}
const std::string& LolAutoAccept::getChatid() {
if(chatid.empty()) {
std::vector<ClientAPI::Conversation> convs = clientapi->getAllConversations();
Log::info << "got " << convs.size() << " conversations";
for(const ClientAPI::Conversation& conv : convs) {
Log::info << " id: " << conv.id << " type: " << conv.type << " name: " << conv.name << " gameName: " << conv.gameName;
if(conv.type == "championSelect" && conv.name.empty()) {
Log::info << "groupchat found";
chatid = conv.id;
return chatid;
}
}
}
return chatid; //might be empty string
}
void LolAutoAccept::applyRunes_internal(uint32_t champid, Position pos) {
nextApplyRunes = false;
Log::note << "apply runes";

2
thirdparty/Log vendored

@ -1 +1 @@
Subproject commit 96d10d6e72ddaffd8b688db5ef2705e38aff3a75
Subproject commit 5bf9e688b125ac042292d8f554711d7337fe88c0