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:
SylvaniaCore deploy
2026-08-19 00:13:33 +02:00
parent 9b4851678f
commit bf58c59f3d
2 changed files with 8 additions and 10 deletions
+8 -2
View File
@@ -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;
}