zynk/cmd_help.h
hanez 19b07fa76f Wikipedia search command (!wp), version 0.43.0
- Add !wp <search terms> command: searches Wikipedia via MediaWiki API
  (action=query&list=search), displays article titles, snippets, and links.
  Single-result mode fetches the first chapter via Extracts API (exchars=800);
  multi-result mode shows a numbered list with short snippets and per-result
  Read full article links.
- Add self-contained JSON parser helpers: wp_json_get_string(),
  wp_json_next_array_item(), wp_decode_json_string() with \uXXXX Unicode
  support.
- Add wp_url_encode() (RFC 3986), wp_codepoint_to_utf8(), wp_strip_html(),
  wp_collapse_spaces(), wp_hex_digit().
- Add WITH_WP CMake feature toggle (ON by default, HAS_CMD_WP compile def).
- Add !wp to the !help command listing.
- Add doc comments to all 9 functions in cmd_wp.h.
- Update CHANGELOG.md with 0.43.0 entry.
- Update README.md: add Wikipedia to features list, feature toggles table,
  IRC commands utilities table, and minimal build command.
2026-07-26 00:23:38 +02:00

121 lines
3 KiB
C

#ifndef CMD_HELP_H
#define CMD_HELP_H
#include "zynk.h"
/*
* cmd_help - Handle the "!help" command.
*
* Responds with a compact listing of all available bot commands and
* their usage. Only lists commands that are compiled in (controlled
* by HAS_CMD_* defines). Rate-limited.
*
* Parameters:
* s - The IRC session.
* msg - The raw message text.
* reply_target - Channel or nick to reply to.
* src_nick - The nick of the user who sent the command.
*
* Returns: 1 if matched, 0 otherwise.
*/
int cmd_help(Session *s, const char *msg, const char *reply_target, const char *src_nick) {
if (strncmp(msg, "!help", 5) != 0) return 0;
if (msg[5] != ' ' && msg[5] != '\0') return 0;
if (rate_limit_check(src_nick, reply_target, current_userhost) < 0) return 1;
char buf[512];
char *p = buf;
size_t rem = sizeof buf;
int n;
n = snprintf(p, rem, "Commands:");
p += n; rem -= n;
#ifdef HAS_CMD_ZYNK
n = snprintf(p, rem, " !zynk <k>[=<v>],");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_PING
n = snprintf(p, rem, " !ping,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_VERSION
n = snprintf(p, rem, " !version,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_UPTIME
n = snprintf(p, rem, " !uptime,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_WEATHER
n = snprintf(p, rem, " !weather [city],");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_FORECAST
n = snprintf(p, rem, " !forecast [city],");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_STOCK
n = snprintf(p, rem, " !stock <SYMBOL>,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_CALC
n = snprintf(p, rem, " !calc <expr>,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_TIME
n = snprintf(p, rem, " !time [tz],");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_SEEN
n = snprintf(p, rem, " !seen <nick>,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_TELL
n = snprintf(p, rem, " !tell <nick> <msg>,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_GITLOG
n = snprintf(p, rem, " !gitlog [n],");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_CHANGELOG
n = snprintf(p, rem, " !changelog [n],");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_AI
n = snprintf(p, rem, " !ai <question>,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_CODE
n = snprintf(p, rem, " !code <change> (ops),");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_REBUILD
n = snprintf(p, rem, " !rebuild [pull] (ops),");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_RELOAD
n = snprintf(p, rem, " !reload (ops),");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_RESTART
n = snprintf(p, rem, " !restart (ops),");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_YT
n = snprintf(p, rem, " !yt <url>,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_WP
n = snprintf(p, rem, " !wp <query>,");
p += n; rem -= n;
#endif
#ifdef HAS_CMD_QUIT
n = snprintf(p, rem, " !quit/!die (ops)");
p += n; rem -= n;
#endif
if (p > buf && p[-1] == ',') p[-1] = '\0';
irc_reply(s, reply_target, src_nick, buf);
log_stamp(); fprintf(stderr, CLR_CYAN "HELP from %s in %s" CLR_RESET "\n", src_nick, reply_target);
return 1;
}
#endif