an IRC bot
- C 99%
- Makefile 1%
| .gitignore | .gitgnore update. | |
| AGENTS.md | init | |
| calc.c | Fixed multiple critical bugs including race conditions, buffer overflows, and memory visibility issues. Redesigned AI task pipeline for concurrency and improved IRC parsing security. Verified fixes by compiling and manual analysis. | |
| LICENSE | update LICENSE / README | |
| Makefile | bugfix in ssl handling | |
| README.md | — -> - | |
calc - Companion AI Logic Chatbot
A single-file IRC bot in C. Features a key-value store backed by SQLite3, weather lookups via wttr.in, and AI-powered replies.
Features
- Key-Value Store: Persist facts, notes, or any data with
calc key = value - Weather: Current conditions and 3-day forecasts via
wttr.in - AI Queries: Ask questions via
!aior by addressing the bot; powered byopencode - Chat Greetings: Responds to
hi,hello,hey,bye, and more - TLS: Secure connections via OpenSSL
- Rate Limiting: Per-nick protection against spam
- Single File: Easy to deploy and modify
Requirements
gcc(or any C99 compiler)libssl-dev(OpenSSL)libdl(dynamic linker)libsqlite3(loaded at runtime viadlopen)curl(for weather lookups)opencode(for AI queries - seecalc.c:229to configure path)
Build
make
Set custom compiler or flags:
make CC=clang CFLAGS="-O2 -Wall -Wextra"
Usage
./calc [options]
Options
| Option | Description |
|---|---|
-ssl |
Enable TLS (auto-enabled on ports 6697/7000) |
-noverify |
Skip TLS certificate verification |
-server <host> |
IRC server (default: irc.libera.chat) |
-port <p> |
Port (default: 6697) |
-pass <p> |
Server password |
-nick <n> |
Nickname (default: calc) |
-join <c> |
Auto-join channels, comma-separated (default: #calctest) |
-h |
Show help |
Example
./calc -ssl -nick mybot -join "#mychan,#myotherchan"
IRC Commands
| Command | Description |
|---|---|
calc <key> |
Look up a stored value |
calc <key> = <value> |
Store a value (key is lowercased) |
!ping |
Responds with pong |
!weather [city] |
Current weather (default: Berlin) |
!forecast [city] |
3-day forecast (default: Berlin) |
!ai <question> |
Ask the AI a question |
!quit / !die |
Shut down the bot |
<nick>: hi |
Greeting response |
<nick>: <question> |
Ask the bot anything (AI) |
Installation
make install
Installs to $(PREFIX)/bin (default: /usr/local/bin).
Override the prefix:
make install PREFIX=$HOME/.local
Database
Data is stored in calc.db (SQLite3) in the working directory. The bot creates two tables:
calc- key-value pairs with nick and timestamp metadataai_pending- single-row table for managing in-flight AI queries
Architecture
calc uses a single poll() loop with a 100ms timeout. AI queries fork a child process that runs the opencode CLI; the parent picks up the result on the next poll iteration. SQLite3 is loaded at runtime via dlopen to avoid a compile-time dependency.
License
MIT - see LICENSE file.