Chat : la meme faille SQL existait dans le chat de groupe des bots
Le correctif precedent ne visait que le chuchotement, celui que la pile d appel designait. La requete du canal de groupe (ai_talk_group) portait le meme defaut, dans une boucle sur les membres qui plus est : une requete par bot present. Le royaume est retombe cinq minutes apres le premier correctif, sur le meme mot - « c est » - avec la meme erreur 1064. Lecon : chercher toutes les occurrences du motif, pas seulement celle que le crash montre. Retrait au passage de la trace de diagnostic temporaire : le message du fournisseur, remonte au joueur en jeu, suffit desormais. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -426,12 +426,18 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg,
|
||||
LocaleConstant locale = GetPlayer()->GetSession()->GetSessionDbcLocale();
|
||||
QueryResult result;
|
||||
|
||||
// SylvaniaCore : meme faille que pour le chuchotement, et meme
|
||||
// consequence - une erreur SQL abat le worldserver. Le message est
|
||||
// echappe et borne avant de toucher la requete.
|
||||
std::string safeGroupMsg = msg.size() > 255 ? msg.substr(0, 255) : msg;
|
||||
WorldDatabase.EscapeString(safeGroupMsg);
|
||||
|
||||
// First try locale specific
|
||||
result = WorldDatabase.PQuery(
|
||||
"SELECT `reply` FROM `ai_talk_group_locale` "
|
||||
"WHERE locale = %u AND '%s' REGEXP cname "
|
||||
"ORDER BY RAND() LIMIT 1",
|
||||
locale, msg.c_str()
|
||||
locale, safeGroupMsg.c_str()
|
||||
);
|
||||
|
||||
// Fallback in English
|
||||
@@ -441,7 +447,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg,
|
||||
"SELECT `reply` FROM `ai_talk_group` "
|
||||
"WHERE '%s' REGEXP cname "
|
||||
"ORDER BY RAND() LIMIT 1",
|
||||
msg.c_str()
|
||||
safeGroupMsg.c_str()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -745,14 +745,6 @@ bool MercenaryChatMgr::Perform(MercenaryChatRequest const& request, std::string&
|
||||
text << ".";
|
||||
|
||||
error = text.str();
|
||||
|
||||
// Trace de diagnostic : le corps envoye, jamais l adresse - chez Gemini
|
||||
// la cle voyage dans l URL. Le refus d un fournisseur porte presque
|
||||
// toujours sur ce qu on lui a transmis.
|
||||
TC_LOG_ERROR("server.worldserver", "Mercenaires (dialogue): refus %ld du fournisseur %s. Corps envoye : %s",
|
||||
httpCode, GetProviderName(request.provider), payload.c_str());
|
||||
TC_LOG_ERROR("server.worldserver", "Mercenaires (dialogue): reponse recue : %s", body.c_str());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user