13 KiB
2026.07.22 - Fix whitespace collapsing in !ai, !gitlog, !changelog responses. (0.39.1)
- Fixed
collapse_spaces()to treat tabs, newlines, and carriage returns as whitespace (not just spaces), collapsing any run of mixed whitespace into a single space. collapse_spaces()now strips leading and trailing whitespace from output.- Added
collapse_spaces()call to!airesponses (afterstrip_ai_phrases()). - Added
collapse_spaces()call to!changelog fullentries before sending. - Fixed
!gitlog fulloutput still containing multiple spaces from git's tab-delimited commit fields. - Version bumped to 0.39.1.
2026.07.21 - Hot reload preserves IRC session (nick, channels, voice). (0.39.0)
reload_do()now accepts anexec_newparameter: when 0 (!reload/!restart), the child inherits the socket fd and SSL context directly and continues the event loop without reconnecting; when 1 (!rebuild/!code), the old fork+exec path is used.- Removed
irc_part_all()from the reload path — the bot no longer parts channels on reload, so voice mode (+v) and channel presence are preserved. - Reset
pending_ai_pid/pending_ai_idin the fork child to avoid stale state from orphaned AI processes. !reloadand!restartnow keep the bot's IRC session alive (no nick collision, no rejoin, no lost voice).!rebuild/!codestill do a clean QUIT+exec since the binary changed.- Version bumped to 0.39.0.
2026.07.21 - Strip opencode header from !ai responses. (0.38.3)
- Added
strip_opencode_header(): removes the opencode header line (e.g.> plan · big-pickle) and any trailing blank lines from AI responses before sending to IRC. - Pipeline order: format strip → header strip → phrase strip, so ANSI codes are cleaned up first and the
>prefix is reliably detected. - Version bumped to 0.38.3.
2026.07.21 - Full mode for !gitlog/!changelog, optional pull for !rebuild. (0.38.2)
- Added optional
fullkeyword to!gitlogand!changelog:!gitlog 5 fullshows full commit messages (author, date, body),!changelog 5 fullshows the complete entry text including bullet points. !gitlogfull mode collapses multiple spaces and strips leading whitespace from each commit block for cleaner IRC output.- Changed
!rebuildto skipgit pullby default; passpullto pull before rebuilding (e.g.!rebuild pull). - Changed the default count
GITLOG_COUNTfor!gitlogfrom 5 to 1 andCHANGELOG_COUNTfor!changelogfrom 5 to 1. - Reduced
GITLOG_MAXfrom 10 to 5. - Updated
!helptext to reflect new[full]and[pull]arguments. - Updated README.md with
fulloption for!gitlog/!changelogandpulloption for!rebuild. - Version bumped to 0.38.2.
2026.07.21 - Exempt ops from rate limiting. (0.38.1)
- Op users in channels are now exempt from rate limiting:
rate_limit_check()callschan_is_op()and allows ops through immediately. - Removed unused
AI_REPLY_MAXconstant. - Version bumped to 0.38.1.
2026.07.21 - Add !changelog command. (0.38.0)
- Added
!changelog [count]command: displays the latest changelog entries fromCHANGELOG.md. Defaults to 5 entries (CHANGELOG_COUNT), accepts 1-10 as count. Each entry title (date line) is sent as a separate IRC message with a 200ms delay to avoid IRC server flood protection. - Reduced
GITLOG_MAXandCHANGELOG_MAXfrom 20 to 10. - Updated
!helpto list!changelog. - Updated README.md with
!changelogdocumentation and corrected max values. - Version bumped to 0.38.0.
2026.07.20 - Add !rebuild command. (0.37.0)
- Added
!rebuildcommand (ops only, channels): runsgit pull,make clean, andmakein sequence, then triggers a hot reload if all steps succeed. If any step fails, the error output from the build is reported to the channel. - Updated
!helpto list!rebuild. - Updated README.md with
!rebuilddocumentation in the Admin (Ops Only) section. - Version bumped to 0.37.0.
2026.07.20 - Fix !seen showing UTC instead of local time. (0.36.1)
- Fixed
!seencommand storing UTC timestamps instead of local time:seen_update()useddatetime('now')which returns UTC, causing!seen <nick>to display a time offset by the server's timezone difference (e.g. 16:00 instead of 18:00 on a UTC+2 system). Changed todatetime('now','localtime')so seen timestamps match the system's local time. - Version bumped to 0.36.1.
2026.07.20 - Add !gitlog command. (0.36.0)
- Added
!gitlog [count]command: displays recent git commits of the zynk project usinggit log --oneline. Defaults to 5 commits (GITLOG_COUNT), accepts 1-20 as count. Each commit is sent as a separate IRC message. - Updated
!helpto list!gitlog. - Updated README.md with
!gitlogdocumentation andgitas a requirement. - Added detailed doc comment to
cmd_gitlog()matching the style of all other function documentation in zynk.c. - Version bumped to 0.36.0.
2026.07.20 - Remove timezone abbreviation from !time response. (0.35.6)
!timenow outputs date and time only (YYYY-MM-DD HH:MM:SS) without the timezone abbreviation, keeping IRC responses shorter and cleaner.- Removed 60 lines of dead timezone abbreviation-matching code from
tz_format()(previously mapped 45 IANA timezone names to abbreviations like CEST, EDT, JST, etc.). - Updated README.md output format to reflect the change.
- Added
tzdatato README.md requirements as optional (without it,!timefalls back to 45 built-in timezones). - Version bumped to 0.35.6.
2026.07.20 - Fix !time to work without tzdata. (0.35.5)
- Rewrote
!timeto try the systemlocaltime_r()first, then fall back to a built-in timezone table with 45 IANA zones and simplified DST rules when the system can't resolve timezones (e.g. notzdatainstalled). This means!time Australia/Sydneynow shows correct AEST/AEDT even on minimal systems. - Added doc comments to all undocumented functions in zynk.c:
seen_update,seen_lookup,tell_add,tell_deliver,valid_irc_word,normalize_city,collapse_spaces,cmd_reload,cmd_time,cmd_seen,cmd_tell,cmd_greeting_or_chat,tz_lookup,tz_format. - Added full list of built-in timezones to README.md (all 45 entries from
tz_table) with region, offset, and DST status. - Version bumped to 0.35.5.
2026.07.20 - Update README with !calc pi() docs and date requirement. (0.35.4)
- Added
pi()constants section to README.md with examples (!calc pi(),!calc pi()*2,!calc pi()^2). - Added
dateto the list of system requirements in README.md. - Version bumped to 0.35.4.
2026.07.20 - Add pi() to !calc. (0.35.3)
- Added
pi()function support to!calc: bc -l does not definepi()on all systems, socmd_calcnow prepends api()definition before evaluating expressions.!calc pi(),!calc pi()*2,!calc pi()^2etc. all work. - Version bumped to 0.35.3.
2026.07.20 - Fix !time timezone conversion bug. (0.35.2)
- Fixed
!timecommand:setenv("TZ",...) + localtime()was not reliably converting to the requested timezone. Replaced withTZ=... dateviapopen(), which handles all IANA timezone names correctly (e.g.!time Australia/Sydneynow shows 11:15 AEST instead of UTC). - Version bumped to 0.35.2.
2026.07.20 - Fix !calc not working (bc stdin not connected). (0.35.1)
- Fixed
!calccommand: the expression was never piped tobc's stdin, causing empty output and a "no result" error for every expression. Added a second pipe to feed the expression intobcbefore reading the result. - Version bumped to 0.35.1.
2026.07.20 - Calculator, time, seen, and tell commands. (0.35.0)
- Added
!calc <expression>command: evaluate math expressions viabc -l(supports arithmetic, powers, trigonometry, logarithms, variables, and multi-statement expressions). - Added
!time [timezone]command: display the current time in any IANA timezone (e.g.!time US/Pacific,!time Europe/Berlin). - Added
!seen <nick>command: track and query when users were last seen (auto-updated on PRIVMSG, PART, and QUIT). - Added
!tell <nick> <message>command: leave offline messages for users, delivered automatically when they next speak. - Added
seenandtelltables to the SQLite database for persistent user tracking and message storage. - Updated
!helpto list all new commands. - Updated README.md with detailed documentation for all commands, including
!calcexpression syntax and!timetimezone examples. - Version bumped to 0.35.0.
2026.07.20 - Disabled stripping feature from 0.34.4 because it needs more testing. (0.34.5)
- Disabled
strip_opencode_header()(introduced in 0.34.4) as it requires further testing. - Version bumped to 0.34.5.
2026.07.20 - Strip opencode header from AI responses. (0.34.4)
- Added
strip_opencode_header()to remove the opencode model/agent header line from AI responses before sending them to IRC. - Version bumped to 0.34.4.
2026.07.19 - Show full AI error output on failure. (0.34.3)
- AI error messages now include the actual opencode output instead of a generic "(opencode exited with error)" message.
- Captured stderr from opencode (previously sent to /dev/null) so error details are no longer lost.
- Version bumped to 0.34.3.
2026.07.19 - Collapsed double spaces in !forecast and !stock responses (0.34.2)
- Collapsed double spaces in
!forecastand!stockresponses (e.g., when weather condition is empty). - Version bumped to 0.34.2.
2026.07.19 - Fix !weather returning HTML. (0.34.1)
- Fixed
!weathercommand returning<!DOCTYPE html>instead of weather data: wttr.in now returns HTML when it detects a browser User-Agent, so replaced the fake Firefox UA string withzynk/VERSION. - Fixed
!forecastshowing all days as Sunday on musl libc (Alpine Linux):strptimeon musl does not computetm_wday, so addedmktime()to normalize the struct before formatting. - Version bumped to 0.34.1.
2026.07.19 - Uptime command, remove !hello. (0.34.0)
- Added
!uptimecommand: displays bot uptime in a human-readable format (days/hours/minutes/seconds). - Removed
!hellocommand. - Version bumped to 0.34.0.
2026.07.19 - Hot reload re-registration fix, !hello, docs. (0.33.1)
- Fixed hot reload: after TLS session restore, the bot now re-sends PASS/NICK/USER to re-register with the IRC server, fixing the issue where channels were never re-joined after
!reloador!restart. - Added
!hellocommand: responds with a greeting and the user's nick. - Added atomic build target in Makefile: compiles to a temp file and moves into place to avoid partial binaries on failure.
- Added comprehensive doc comments to all major functions in zynk.c.
- Version bumped to 0.33.1.
2026.07.19 - Hot reload, stock quotes, and auto-recompile. (0.33.0)
- Added hot reload:
!reloadand!restartcommands (ops) save TLS session state, fork a new process with the inherited socket, and resume without dropping from IRC. - Added
!stock <SYMBOL>[,SYMBOL...]command to fetch real-time stock quotes from Yahoo Finance (up to 3 symbols). - Added auto-compile and restart on
!codechanges: when the AI code change response is received, the bot runsmakeand reloads on success. - Added User-Agent header to curl requests to avoid being blocked by servers that reject the default curl agent.
- Increased curl read buffer from 2 KiB to 32 KiB to handle larger API responses.
- Improved
!forecastJSON parsing: returns a descriptive error message on parse failure instead of silently returning nothing. - Increased AI_TIMEOUT from 240s to 600s and AI_REPLY_MAX from 400 to 2048 chars for longer AI interactions.
- Version bumped to 0.33.0.
2026.07.16 - Security hardening.
- Fixed buffer overflow in ai_child_task: plen unsigned underflow when history entries exceed prefix buffer size, causing out-of-bounds writes via snprintf.
- Fixed IRC injection in handle_nick_change: validate new nick for CRLF and control characters before storing in op cache.
- Fixed control char leak in irc_msg: drop the message on strdup failure instead of sending unsanitized input on the wire.
- Fixed CRLF/control char injection in -pass argument: reject passwords containing control characters at startup.
2026.07.15 - Numerous optimizations and fixes.
- Fixed DB/TLS resource cleanup on partial startup failures and normal shutdown.
- Fixed net_send() stack over-read risk when vsnprintf() truncates.
- Fixed curl/opencode pipe readers so oversized output cannot deadlock the bot.
- Fixed !code AI agent propagation into the forked child.
- Added CR/LF rejection for startup IRC args to prevent local IRC command injection.
- Normalized weather/forecast city input before building wttr.in URLs.
- Fixed IRC op cache bugs around nick changes and long NAMES entries.
- Added !version command to report the bot's version via IRC.
- Fixed the malformed VERSION macro definition to ensure successful builds.
- Added !help command to list available bot commands.
- Added -opencode command-line option to set the path to the opencode binary, overriding OPENCODE_BIN.
- Hardened IRC sending: strip control characters from messages and sanitize targets to prevent IRC injection.
- Sanitized JOIN/NICK targets and PONG payload to avoid injection via CR/LF or control chars.
- Validated -opencode path at startup to reject control characters.