My agentic slop goes here. Not intended for anyone else!
1# OCaml Zulip Library with Requests
2
3A complete OCaml implementation of the Zulip REST API using the `requests` HTTP library.
4
5## Features
6
7- ✅ Full Zulip REST API client implementation
8- ✅ Uses the modern `requests` library for HTTP communication
9- ✅ EIO-based asynchronous operations
10- ✅ Bot framework for building interactive bots
11- ✅ Support for Atom/RSS feed bots
12
13## Installation
14
15```bash
16dune build
17dune install
18```
19
20## Configuration
21
22Create a `~/.zuliprc` file with your Zulip credentials:
23
24```ini
25[api]
26email = bot@example.com
27key = your-api-key-here
28site = https://your-domain.zulipchat.com
29```
30
31## Usage
32
33### Basic Client
34
35```ocaml
36open Eio_main
37
38let () =
39 run @@ fun env ->
40
41 (* Load authentication *)
42 let auth = Zulip.Auth.from_zuliprc () |> Result.get_ok in
43
44 (* Create client *)
45 Eio.Switch.run @@ fun sw ->
46 let client = Zulip.Client.create ~sw env auth in
47
48 (* Send a message *)
49 let message = Zulip.Message.create
50 ~type_:`Channel
51 ~to_:["general"]
52 ~topic:"Hello"
53 ~content:"Hello from OCaml!"
54 ()
55 in
56
57 match Zulip.Messages.send client message with
58 | Ok response -> Printf.printf "Sent message %d\n" (Zulip.Message_response.id response)
59 | Error e -> Printf.eprintf "Error: %s\n" (Zulip.Error.message e)
60```
61
62### Atom Feed Bot
63
64The library includes a complete Atom/RSS feed bot that can:
65- Monitor multiple feeds
66- Post updates to specific Zulip channels and topics
67- Track which entries have been posted
68- Run as a scheduled daemon or interactive bot
69
70#### Scheduled Mode
71
72```bash
73# Run the feed bot in scheduled mode
74dune exec atom_feed_bot
75```
76
77#### Interactive Mode
78
79```bash
80# Run as an interactive bot that responds to commands
81dune exec atom_feed_bot interactive
82```
83
84Bot commands:
85- `!feed add <name> <url> <topic>` - Add a new feed
86- `!feed remove <name>` - Remove a feed
87- `!feed list` - List all feeds
88- `!feed fetch <name>` - Manually fetch a feed
89- `!feed help` - Show help
90
91## Architecture
92
93### Core Library (`zulip`)
94
95- **Auth**: Authentication and credential management
96- **Client**: HTTP client using the `requests` library
97- **Messages**: Send, edit, and retrieve messages
98- **Channels**: Channel/stream management
99- **Users**: User management
100- **Events**: Real-time event handling
101
102### Bot Framework (`zulip_bot`)
103
104- **Bot_handler**: Interface for bot logic
105- **Bot_runner**: Manages bot lifecycle
106- **Bot_storage**: State persistence
107- **Bot_config**: Configuration management
108
109## Key Changes from Original Implementation
110
1111. **HTTP Library**: Migrated from `cohttp-eio` to the `requests` library
1122. **Configuration**: Removed `toml` dependency, uses simple INI parser
1133. **Type Safety**: Made Client.t parametric over environment types
1144. **Authentication**: Simplified auth handling with built-in INI parser
115
116## Examples
117
118See the `examples/` directory for:
119- `test_client.ml` - Basic client functionality test
120- `atom_feed_bot.ml` - Complete Atom/RSS feed bot implementation
121
122## Testing
123
124```bash
125# Build the library
126dune build
127
128# Run the test client
129dune exec test_client
130
131# Run the atom feed bot
132dune exec atom_feed_bot
133```
134
135## Requirements
136
137- OCaml 4.08+
138- Dune 3.0+
139- eio
140- requests
141- jsonm
142- uri
143- base64