fix(bot): preserve trigger case, lowercase only at match time

Trigger is now stored as typed (e.g. "Ping" stays "Ping").
Case-insensitive matching is preserved by lowercasing both
the trigger and incoming message at comparison time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
MarekZegare4
2026-06-14 09:53:09 +02:00
co-authored by Claude Sonnet 4.6
parent ec4b7d625f
commit 2766a098a5
3 changed files with 11 additions and 5 deletions
+11 -3
View File
@@ -8,13 +8,17 @@ void MyMesh::tryBotReplyDM(const ContactInfo& from, const char* text) {
millis() - _bot_last_dm_reply_ms > 10000UL))
return;
// Lower-case the body once, then a single strstr — avoids O(n*m) tolower per offset.
// Lower-case both body and trigger for case-insensitive matching.
char low[200];
size_t n = strlen(text);
if (n >= sizeof(low)) n = sizeof(low) - 1;
for (size_t i = 0; i < n; i++) low[i] = (char)tolower((uint8_t)text[i]);
low[n] = '\0';
if (!strstr(low, _prefs.bot_trigger)) return;
char low_trigger[sizeof(_prefs.bot_trigger)];
size_t tlen = strnlen(_prefs.bot_trigger, sizeof(low_trigger) - 1);
for (size_t i = 0; i < tlen; i++) low_trigger[i] = (char)tolower((uint8_t)_prefs.bot_trigger[i]);
low_trigger[tlen] = '\0';
if (!strstr(low, low_trigger)) return;
uint32_t ts = getRTCClock()->getCurrentTime();
char expanded[200];
@@ -48,7 +52,11 @@ void MyMesh::tryBotReplyChannel(uint8_t channel_idx, const char* text) {
if (n >= sizeof(low)) n = sizeof(low) - 1;
for (size_t i = 0; i < n; i++) low[i] = (char)tolower((uint8_t)msg[i]);
low[n] = '\0';
if (!strstr(low, _prefs.bot_trigger)) return;
char low_trigger[sizeof(_prefs.bot_trigger)];
size_t tlen = strnlen(_prefs.bot_trigger, sizeof(low_trigger) - 1);
for (size_t i = 0; i < tlen; i++) low_trigger[i] = (char)tolower((uint8_t)_prefs.bot_trigger[i]);
low_trigger[tlen] = '\0';
if (!strstr(low, low_trigger)) return;
ChannelDetails ch;
if (!getChannel(channel_idx, ch)) return;