zynk/cmd_seen.h

58 lines
1.9 KiB
C
Raw Permalink Normal View History

#ifndef CMD_SEEN_H
#define CMD_SEEN_H
#include "zynk.h"
/*
* cmd_seen - Handle the "!seen <nick>" command.
*
* Looks up the given nick in the seen database and reports when they
* were last seen, in which channel, and what action they were performing.
* Special-cases: checking yourself returns "You are right here, duh!",
* checking the bot returns "I am right here!", and unknown nicks return
* "I have never seen <nick>". 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_seen(Session *s, const char *msg, const char *reply_target, const char *src_nick) {
if (strncmp(msg, "!seen", 5) != 0) return 0;
if (msg[5] != ' ') return 0;
2026-07-25 20:37:07 +02:00
if (rate_limit_check(src_nick, reply_target, current_userhost) < 0) return 1;
const char *rest = msg + 6;
while (*rest == ' ') rest++;
if (!*rest) {
irc_reply(s, reply_target, src_nick, "Usage: !seen <nick>");
return 1;
}
char target[32];
int i = 0;
while (*rest && *rest != ' ' && i < 31) target[i++] = *rest++;
target[i] = 0;
if (strcasecmp(target, src_nick) == 0) {
irc_reply(s, reply_target, src_nick, "You are right here, duh!");
return 1;
}
if (strcasecmp(target, s->nick) == 0) {
irc_reply(s, reply_target, src_nick, "I am right here!");
return 1;
}
char *result = seen_lookup(target);
if (result) {
irc_reply(s, reply_target, src_nick, result);
free(result);
} else {
char resp[128];
snprintf(resp, sizeof resp, "I have never seen %s", target);
irc_reply(s, reply_target, src_nick, resp);
}
log_stamp(); fprintf(stderr, CLR_CYAN "SEEN %s from %s in %s" CLR_RESET "\n", target, src_nick, reply_target);
return 1;
}
#endif