- Added optional full keyword to !gitlog and !changelog for showing
full commit messages and changelog entries instead of just headers.
- !gitlog full uses git log (without --oneline) and strips leading
indentation from commit blocks, collapses multiple spaces.
- !changelog full collects full entry text with bullet points and
shows the newest entries (first N in file, not last N).
- Added optional pull argument to !rebuild: !rebuild pull runs git
pull before make clean/make, plain !rebuild only rebuilds.
- Added collapse_spaces() call in !gitlog oneline path to remove
double spaces in compact output.
- Changed default GITLOG_COUNT and CHANGELOG_COUNT from 5 to 1.
- Reduced GITLOG_MAX from 10 to 5.
- Updated !help text to document [full] and [pull] options.
- Updated README.md with full option for !gitlog/!changelog and
pull option for !rebuild.
- Added CHANGELOG.md entry for v0.38.2.
- Op users in channels are now exempt from rate limiting: rate_limit_check()
calls chan_is_op() and allows ops through immediately, so ops can use
commands without being throttled.
- Updated rate_limit_check() signature to accept a channel parameter;
all 20 call sites now pass reply_target so the exemption works for
both channel and DM contexts.
- Removed unused AI_REPLY_MAX constant from the enum.
- Removed stale commented-out #include <sys/utsname.h>.
- Version bumped to 0.38.1.
- Added !changelog [count] command: displays the latest changelog entries
from CHANGELOG.md. Defaults to 5 entries (CHANGELOG_COUNT), accepts 1-10
as count. Each entry title is sent as a separate IRC message with a
200ms delay to avoid IRC server flood protection.
- Reduced GITLOG_MAX and CHANGELOG_MAX from 20 to 10.
- Rewrote cmd_changelog to use getline() for robust line reading and
isdigit() checks for reliable date pattern detection.
- Updated !help to list !changelog.
- Updated README.md with !changelog documentation and corrected max values.
- Added CHANGELOG.md entry for v0.38.0.
- Version bumped to 0.38.0.
Added !rebuild op-only command that runs git pull, make clean, and make
in sequence, then triggers hot reload on success. Reports build errors
from stderr if any step fails. Updated !help and README.md docs.
seen_update() used SQLite's datetime('now') which returns UTC, causing
!seen to show wrong times (e.g. 16:00 instead of 18:00 on UTC+2).
Changed to datetime('now','localtime') so seen timestamps match the
system's local time.
Version bumped to 0.36.1.
Add detailed function documentation for cmd_gitlog() matching the
existing style used throughout zynk.c. Describes the fork/exec
pattern for running git log, output handling, rate limiting, and
clamping behavior for the count argument.
Updated CHANGELOG.md 0.36.0 entry to reflect this addition.
Add !gitlog [count] IRC command that runs 'git log --oneline' and
sends each commit as a separate PRIVMSG. Defaults to GITLOG_COUNT (5)
commits when no argument is provided; accepts 1-20 as count.
- Fork/exec pattern consistent with existing !calc command
- Rate-limited per-nick like all other commands
- Listed in !help output
- Added git to README.md requirements
- Documented in README.md utilities section
- Added changelog entry for v0.36.0
The !time command now outputs only date and time (YYYY-MM-DD HH:MM:SS)
without the timezone abbreviation. This keeps responses shorter and
cleaner in IRC. Removed the dead abbreviation-matching code from
tz_format() which previously mapped 45 IANA timezone names to their
respective abbreviations (CEST, EDT, JST, etc.). Updated README to
reflect the new output format.
The CHANGELOG lists versions from newest to oldest. v0.35.4 (README
update for pi() docs and date requirement) was accidentally placed after
v0.35.3 (pi() support in !calc). Fixed so entries read:
0.35.5 -> 0.35.4 -> 0.35.3 -> 0.35.2 -> ...
- Added doc comments (/* ... */) to all 14 undocumented static functions in
zynk.c matching the existing documentation style (function name, description,
Parameters, Returns sections):
* DB ops: seen_update, seen_lookup, tell_add, tell_deliver
* String utils: valid_irc_word, normalize_city, collapse_spaces
* Command handlers: cmd_reload, cmd_time, cmd_seen, cmd_tell, cmd_greeting_or_chat
* Timezone helpers: tz_lookup, tz_format
- Added complete reference table of all 45 built-in timezones to README.md
with region, UTC offset, and DST support status, so users know which
timezones work without tzdata installed.
- Updated CHANGELOG.md v0.35.5 entry to reflect these additions.
- Clean build, zero warnings.
The !calc command was broken because the expression was never piped to
bc's stdin - only stdout was set up via a pipe. Added a second pipe
to feed the expression into bc before reading the result.
- Bumped version to 0.35.1
bc reads from stdin but the child process never wrote the expression
to it, causing empty output. Added a second pipe to feed the expression
into bc's stdin before reading the result from stdout.
New IRC commands:
- !calc <expr>: evaluate math via bc -l (arithmetic, powers, trig, log, vars)
- !time [tz]: show current time in any IANA timezone
- !seen <nick>: track/query last-seen activity (auto-updated on speak/part/quit)
- !tell <nick> <msg>: leave offline messages, delivered when target speaks
Database:
- Added 'seen' table for user activity tracking (nick, timestamp, channel, action)
- Added 'tell' table for pending offline messages
Other changes:
- Updated !help to list all new commands
- Updated README.md with detailed docs for all commands including !calc
expression syntax and !time timezone examples
- Bumped version to 0.35.0
When an AI query fails (opencode exits non-zero), the bot previously
sent a generic 'AI query failed (opencode exited with error)' message
to IRC, discarding all useful output. Users had no way to diagnose why
the query failed.
Changes:
- Redirect opencode's stderr into the capture pipe instead of /dev/null,
so error messages that go to stderr are no longer lost.
- On non-zero exit, include the actual captured output in the error
message sent to IRC: 'AI error (exit N): <output>' (truncated to
4000 chars). If no output was captured, show 'AI error (exit N, no
output)' instead.
- Applied strip_formatting() to the error output before sending so
ANSI codes and markdown don't leak into IRC.
- Bumped VERSION to 0.34.3.
Add collapse_spaces() utility that reduces runs of whitespace to a
single space. Applied to fetch_forecast() output and the !stock
response buffer before sending to IRC, fixing double spaces that
appeared when wttr.in returned an empty weather condition string
(e.g. "15°C / Sun 20 Jul" instead of "15°C / Sun 20 Jul").
Bump version to 0.34.2.
strptime on musl (Alpine Linux) does not compute tm_wday from the
parsed date, unlike glibc. Call mktime() after strptime to normalize
the struct tm and reliably compute the day of week on all platforms.
wttr.in now serves a full HTML page when it detects a browser-like
User-Agent string. Replaced the fake Firefox UA in run_curl with
"zynk/VERSION" so weather, forecast, and stock requests all return
the expected format again.
- Fixed hot reload: after TLS session restore, the bot now does a fresh
IRC connection and re-sends PASS/NICK/USER to re-register with the
server, fixing the issue where channels were never re-joined after
!reload or !restart.
- Removed ZYNK_RESTORE_FD env var approach; reload_try_restore now
restores settings and returns 1 to trigger a fresh connect.
- Added !hello command for casual greeting.
- Added atomic build rule in Makefile (compile to .tmp, then mv).
- Added comprehensive function-level documentation across the entire
codebase (~80 new doc comments).