Added timers module.

2026-02-08 17:51:39 -05:00
parent 25e541790a
commit 4be0412616
4 changed files with 141 additions and 0 deletions
+15
@@ -34,3 +34,18 @@ For more information, see [Custom Commands](Custom-Commands).
| `!listquotes` | | Send a link to the quotes list page. |
For more information, see [Quotes](Quotes).
## Timers
| Command | Aliases | Description |
|---------|---------|-------------|
| `!addtimer` | | Create a new empty timer with an optional name. |
| `!settimermessage` | | Set the message text for a timer. |
| `!settimerinterval` | | Set the interval (simple duration or cron expression). |
| `!settimerlines` | | Set minimum chat lines between firings. |
| `!enabletimer` | | Enable a timer. |
| `!disabletimer` | | Disable a timer. |
| `!deletetimer` | | Permanently delete a timer. |
| `!listtimers` | | Send a link to the timer list page. |
For more information, see [Timers](Timers).
+1
@@ -6,6 +6,7 @@ Owlbot is a modular, event-driven toolkit for extending [Owncast](https://owncas
- **[Custom commands](Custom-Commands)**: Moderators can create, edit, and delete chat commands at runtime without code changes or restarts. Responses support dynamic placeholders like `$(user)`, `$(count)`, `$(rand)`, `$(countdown)`, and positional arguments.
- **[Quotes](Quotes)**: Codify the streamer's hot takes, wild claims, and memorable one-liners said live on air. Moderators add quotes, and anyone can recall them at random or look up a specific quote by ID.
- **[Timers](Timers)**: Set up recurring chat messages that fire on a simple duration or cron schedule. An optional minimum chat line threshold keeps timers from firing into an empty chat.
Owlbot's core is a framework for building and running modules. If the included modules don't cover your use case, you can write your own:
+124
@@ -0,0 +1,124 @@
# Timers
The `timers` module lets moderators create recurring chat messages that fire on a configurable interval with an optional minimum chat activity threshold.
This module is included with Owlbot and enabled by default.
## Quick Start
Create a timer, set its message and interval, then enable it:
```
!addtimer hydrate
!settimermessage hydrate Remember to stay hydrated!
!settimerinterval hydrate 30m
!enabletimer hydrate
```
The bot will now send "Remember to stay hydrated!" every 30 minutes.
## Commands
| Command | Aliases | Usage | Permission | Description |
|---------|---------|-------|------------|-------------|
| `!addtimer` | | `!addtimer [name]` | Moderator | Create a new empty timer with an optional name. |
| `!settimermessage` | | `!settimermessage <id\|name> <message>` | Moderator | Set the message text for a timer. |
| `!settimerinterval` | | `!settimerinterval <id\|name> <interval>` | Moderator | Set the interval (simple duration or cron expression). |
| `!settimerlines` | | `!settimerlines <id\|name> <count>` | Moderator | Set minimum chat lines between firings. 0 to disable. |
| `!enabletimer` | | `!enabletimer <id\|name>` | Moderator | Enable a timer. |
| `!disabletimer` | | `!disabletimer <id\|name>` | Moderator | Disable a timer. |
| `!deletetimer` | | `!deletetimer <id\|name>` | Moderator | Permanently delete a timer. |
| `!listtimers` | | `!listtimers` | Moderator | Send a link to the timer list web page. |
## Timer Identification
Every timer has a numeric ID assigned when it is created. Timers can also have an optional name (must start with a letter or underscore, followed by letters, numbers, or underscores, max 32 characters). All commands accept either the numeric ID or the name to identify a timer.
## Intervals
Timers support two types of intervals:
### Simple Durations
A single token combining hours, minutes, and/or seconds. Minimum interval is 30 seconds.
| Example | Duration |
|---------|----------|
| `30s` | 30 seconds |
| `5m` | 5 minutes |
| `1h` | 1 hour |
| `1h30m` | 1 hour 30 minutes |
| `2h30m` | 2 hours 30 minutes |
```
!settimerinterval hydrate 15m
```
### Cron Expressions
Standard 5-field cron expressions for precise scheduling. Minimum gap between firings is 1 minute. Uses the [croniter](https://github.com/kiorky/croniter) library for parsing.
| Example | Schedule |
|---------|----------|
| `*/15 * * * *` | Every 15 minutes |
| `0 * * * *` | Every hour on the hour |
| `0 */2 * * *` | Every 2 hours |
| `30 20 * * *` | Daily at 8:30 PM UTC |
```
!settimerinterval hydrate */15 * * * *
```
The interval type is auto-detected: values with spaces are parsed as cron, values without spaces are parsed as simple durations.
## Minimum Chat Lines
Timers can require a minimum number of chat messages between firings. This prevents timers from firing into an empty chat when no one is talking.
```
!settimerlines hydrate 5
```
With this setting, the hydrate timer will only fire if at least 5 chat messages have been sent since it last fired, even if the interval has elapsed. Set to 0 to disable the threshold:
```
!settimerlines hydrate 0
```
Bot messages and hidden messages (removed by moderation) are not counted toward the threshold.
## Web UI
The module serves a timer list page at `/owlbot/timers/list` showing all timers in a table with their ID, name, message, interval, minimum lines, status, and last fired time. The `!listtimers` command sends a link to this page in chat.
## Examples
```
# Create a timer with a name
!addtimer hydrate
!settimermessage hydrate Remember to stay hydrated!
!settimerinterval hydrate 30m
!enabletimer hydrate
# Create a timer without a name (uses ID)
!addtimer
!settimermessage 2 Follow us on social media!
!settimerinterval 2 1h
!settimerlines 2 10
!enabletimer 2
# Use a cron expression for precise scheduling
!addtimer hourly_reminder
!settimermessage hourly_reminder Check out our merch store!
!settimerinterval hourly_reminder 0 * * * *
!enabletimer hourly_reminder
# Disable a timer
!disabletimer hydrate
# Delete a timer
!deletetimer hydrate
# View all timers on the web page
!listtimers
```
+1
@@ -8,6 +8,7 @@
**Included Modules**
* [Custom Commands](Custom-Commands)
* [Quotes](Quotes)
* [Timers](Timers)
---