2026-07-23 01:46:37 +02:00
|
|
|
#ifndef CMD_TELL_H
|
|
|
|
|
#define CMD_TELL_H
|
|
|
|
|
|
|
|
|
|
#include "zynk.h"
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* cmd_tell - Handle the "!tell <nick> <message>" command.
|
|
|
|
|
*
|
|
|
|
|
* Stores a pending message in the tell table to be delivered to the
|
|
|
|
|
* target nick when they next speak. Validates that the sender is not
|
|
|
|
|
* trying to tell themselves something. Confirms with "Ok, I'll tell
|
|
|
|
|
* <nick> when they're around." Rate-limited.
|
|
|
|
|
*
|
|
|
|
|
* Parameters:
|
|
|
|
|
* s - The IRC session.
|
|
|
|
|
* msg - The raw IRC message text.
|
|
|
|
|
* reply_target - Channel or nick to send the response to.
|
|
|
|
|
* src_nick - The nick of the user who issued the command.
|
|
|
|
|
*
|
|
|
|
|
* Returns: 1 if the command was matched, 0 otherwise.
|
|
|
|
|
*/
|
|
|
|
|
int cmd_tell(Session *s, const char *msg, const char *reply_target, const char *src_nick) {
|
|
|
|
|
if (strncmp(msg, "!tell", 5) != 0) return 0;
|
|
|
|
|
if (msg[5] != ' ') return 0;
|
0.41.2 Implement comprehensive flood protection for IRC bot.
Phase 1: Incoming Protocol-Level Protection
- Added MAX_LINES_PER_POLL = 50 constant to limit lines processed per
poll iteration in irc_feed(), preventing burst flooding.
- Added poll_lines_left counter to Session struct, reset each poll cycle.
- Changed RateLimitEntry to track by user@host instead of nick, preventing
trivial bypass via nick cycling.
- Parse userhost from IRC prefix (nick!user@host) in irc_handle().
- Added violation tracking to RateLimitEntry for escalating penalties.
Phase 2: Outgoing Message Throttling
- Added OUTGOING_DELAY_MS = 100 constant for minimum delay between sends.
- Modified net_send() with timestamp-based throttling using clock_gettime().
- Added 200ms delay between lines in !gitlog output (cmd_gitlog.h).
- Added 150ms delay between AI response chunks (ai.h).
Phase 3: Rate Limit Improvements
- Increased RATE_LIMIT_MAX from 8 to 32 for larger tracking buffer.
- Added TELL_DELIVER_MAX = 5 to limit messages per nick delivery.
- Added AI_COOLDOWN_SECS = 5 to prevent rapid AI query re-submission.
Phase 4: Command-Specific Fixes
- Added rate_limit_check() to cmd_greeting_or_chat.h for casual chat.
- Limited tell_deliver() to 5 messages per nick, excess stays queued.
- Added 5-second cooldown after AI query completion before next query.
Files modified: zynk.h, zynk.c, irc.h, net.h, ai.h, db.h, and all
19 command header files to pass current_userhost to rate_limit_check().
2026-07-25 20:37:07 +02:00
|
|
|
if (rate_limit_check(src_nick, reply_target, current_userhost) < 0) return 1;
|
2026-07-23 01:46:37 +02:00
|
|
|
const char *rest = msg + 6;
|
|
|
|
|
while (*rest == ' ') rest++;
|
|
|
|
|
if (!*rest) {
|
Nick-prefixed channel replies for all non-admin commands. (0.40.8)
- Added irc_reply(): new IRC response helper that automatically prepends
the sender's nick to channel messages (e.g. 'nick: pong!'), while
leaving private-message responses unmodified. This makes it clear
which user the bot is addressing in busy channels.
- Converted all non-admin command handlers to use irc_reply() instead of
raw irc_msg(): !ping, !zynk, !weather, !forecast, !stock, !calc,
!time, !seen, !tell, !gitlog, !changelog, !ai, !uptime, !version,
!help, greeting/chat responses, and the 'Not implemented...' fallback.
- Converted AI async responses (ai_check_completion()) to use irc_reply(),
so AI answers delivered after the original query also show the nick.
- Converted AI error messages in ai_ask() (rate-limit busy, fork failure,
start failure) to use irc_reply().
- Removed redundant manual nick prefixes from commands that already
embedded the sender's nick in their response text: !ping, !calc,
!time, !uptime, and greeting/chat responses.
- Admin commands (!quit, !reload, !restart, !rebuild, !code) are
intentionally excluded - these are privileged operations where the
nick prefix adds no value.
- The tell_deliver() function retains its own existing format.
2026-07-24 04:03:04 +02:00
|
|
|
irc_reply(s, reply_target, src_nick, "Usage: !tell <nick> <message>");
|
2026-07-23 01:46:37 +02:00
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
char target[32];
|
|
|
|
|
int i = 0;
|
|
|
|
|
while (*rest && *rest != ' ' && i < 31) target[i++] = *rest++;
|
|
|
|
|
target[i] = 0;
|
|
|
|
|
while (*rest == ' ') rest++;
|
|
|
|
|
if (!*rest) {
|
Nick-prefixed channel replies for all non-admin commands. (0.40.8)
- Added irc_reply(): new IRC response helper that automatically prepends
the sender's nick to channel messages (e.g. 'nick: pong!'), while
leaving private-message responses unmodified. This makes it clear
which user the bot is addressing in busy channels.
- Converted all non-admin command handlers to use irc_reply() instead of
raw irc_msg(): !ping, !zynk, !weather, !forecast, !stock, !calc,
!time, !seen, !tell, !gitlog, !changelog, !ai, !uptime, !version,
!help, greeting/chat responses, and the 'Not implemented...' fallback.
- Converted AI async responses (ai_check_completion()) to use irc_reply(),
so AI answers delivered after the original query also show the nick.
- Converted AI error messages in ai_ask() (rate-limit busy, fork failure,
start failure) to use irc_reply().
- Removed redundant manual nick prefixes from commands that already
embedded the sender's nick in their response text: !ping, !calc,
!time, !uptime, and greeting/chat responses.
- Admin commands (!quit, !reload, !restart, !rebuild, !code) are
intentionally excluded - these are privileged operations where the
nick prefix adds no value.
- The tell_deliver() function retains its own existing format.
2026-07-24 04:03:04 +02:00
|
|
|
irc_reply(s, reply_target, src_nick, "Usage: !tell <nick> <message>");
|
2026-07-23 01:46:37 +02:00
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
if (strcasecmp(target, src_nick) == 0) {
|
Nick-prefixed channel replies for all non-admin commands. (0.40.8)
- Added irc_reply(): new IRC response helper that automatically prepends
the sender's nick to channel messages (e.g. 'nick: pong!'), while
leaving private-message responses unmodified. This makes it clear
which user the bot is addressing in busy channels.
- Converted all non-admin command handlers to use irc_reply() instead of
raw irc_msg(): !ping, !zynk, !weather, !forecast, !stock, !calc,
!time, !seen, !tell, !gitlog, !changelog, !ai, !uptime, !version,
!help, greeting/chat responses, and the 'Not implemented...' fallback.
- Converted AI async responses (ai_check_completion()) to use irc_reply(),
so AI answers delivered after the original query also show the nick.
- Converted AI error messages in ai_ask() (rate-limit busy, fork failure,
start failure) to use irc_reply().
- Removed redundant manual nick prefixes from commands that already
embedded the sender's nick in their response text: !ping, !calc,
!time, !uptime, and greeting/chat responses.
- Admin commands (!quit, !reload, !restart, !rebuild, !code) are
intentionally excluded - these are privileged operations where the
nick prefix adds no value.
- The tell_deliver() function retains its own existing format.
2026-07-24 04:03:04 +02:00
|
|
|
irc_reply(s, reply_target, src_nick, "You can't tell yourself something!");
|
2026-07-23 01:46:37 +02:00
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
tell_add(src_nick, target, rest);
|
|
|
|
|
char resp[256];
|
|
|
|
|
snprintf(resp, sizeof resp, "Ok, I'll tell %s when they're around.", target);
|
Nick-prefixed channel replies for all non-admin commands. (0.40.8)
- Added irc_reply(): new IRC response helper that automatically prepends
the sender's nick to channel messages (e.g. 'nick: pong!'), while
leaving private-message responses unmodified. This makes it clear
which user the bot is addressing in busy channels.
- Converted all non-admin command handlers to use irc_reply() instead of
raw irc_msg(): !ping, !zynk, !weather, !forecast, !stock, !calc,
!time, !seen, !tell, !gitlog, !changelog, !ai, !uptime, !version,
!help, greeting/chat responses, and the 'Not implemented...' fallback.
- Converted AI async responses (ai_check_completion()) to use irc_reply(),
so AI answers delivered after the original query also show the nick.
- Converted AI error messages in ai_ask() (rate-limit busy, fork failure,
start failure) to use irc_reply().
- Removed redundant manual nick prefixes from commands that already
embedded the sender's nick in their response text: !ping, !calc,
!time, !uptime, and greeting/chat responses.
- Admin commands (!quit, !reload, !restart, !rebuild, !code) are
intentionally excluded - these are privileged operations where the
nick prefix adds no value.
- The tell_deliver() function retains its own existing format.
2026-07-24 04:03:04 +02:00
|
|
|
irc_reply(s, reply_target, src_nick, resp);
|
2026-07-23 01:46:37 +02:00
|
|
|
log_stamp(); fprintf(stderr, CLR_CYAN "TELL %s from %s in %s:" CLR_RESET " -> %s: %s\n", reply_target, src_nick, reply_target, target, rest);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|