- 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.
121 lines
3 KiB
C
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
|