Added support for named counters, getcount placeholder, and nested placeholders.
+8
-3
@@ -86,8 +86,13 @@ Modules may add their own config keys under their name. These appear in the conf
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
modules:
|
modules:
|
||||||
my_module:
|
custom_commands:
|
||||||
enabled: true
|
enabled: true
|
||||||
greeting: "Hello"
|
max_nesting_depth: 4
|
||||||
max_retries: 3
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Custom Commands
|
||||||
|
|
||||||
|
| Key | Default | Description |
|
||||||
|
|-----|---------|-------------|
|
||||||
|
| `max_nesting_depth` | `4` | Maximum nesting depth for placeholders. `$(` tokens encountered at or beyond this depth are treated as literal text. |
|
||||||
|
|||||||
+46
-2
@@ -54,16 +54,40 @@ Custom command responses support placeholders that are replaced at runtime.
|
|||||||
|-------------|-------------|---------|
|
|-------------|-------------|---------|
|
||||||
| `$(1)` through `$(9)` | Command arguments by position. Empty string if not provided. | `!greet $(1)` with `!greet Alice` produces `Alice` |
|
| `$(1)` through `$(9)` | Command arguments by position. Empty string if not provided. | `!greet $(1)` with `!greet Alice` produces `Alice` |
|
||||||
| `$(count)` | Number of times the command has been used (incremented before display). | `This command has been used $(count) times.` |
|
| `$(count)` | Number of times the command has been used (incremented before display). | `This command has been used $(count) times.` |
|
||||||
|
| `$(count name)` | Increment a named counter by 1 and display its value. Supports modifiers: `+n` (increment), `-n` (decrement), or `n` (set). | `$(count deaths)` increments and shows the `deaths` counter. `$(count deaths +5)` increments by 5. `$(count deaths 0)` resets to 0. |
|
||||||
|
| `$(getcount name)` | Display a named counter's value without changing it. Returns `0` if the counter doesn't exist. | `$(getcount deaths)` shows the current value of the `deaths` counter. |
|
||||||
| `$(user)` | Display name of the user who ran the command. | `Hello, $(user)!` |
|
| `$(user)` | Display name of the user who ran the command. | `Hello, $(user)!` |
|
||||||
| `$(rand start stop)` | Random integer between `start` and `stop` (inclusive). | `$(rand 1 100)` produces `42` |
|
| `$(rand start stop)` | Random integer between `start` and `stop` (inclusive). | `$(rand 1 100)` produces `42` |
|
||||||
| `$(countdown date)` | Human-readable time remaining until a date. | `$(countdown Dec 25 2025 12:00:00 AM EST)` produces `3 days 4 hours` |
|
| `$(countdown date)` | Human-readable time remaining until a date. | `$(countdown Dec 25 2025 12:00:00 AM EST)` produces `3 days 4 hours` |
|
||||||
| `$(countup date)` | Human-readable time elapsed since a date. | `$(countup Jan 1 2024 12:00:00 AM UTC)` produces `365 days 3 hours` |
|
| `$(countup date)` | Human-readable time elapsed since a date. | `$(countup Jan 1 2024 12:00:00 AM UTC)` produces `365 days 3 hours` |
|
||||||
| `\$(...)` | Escaped. Outputs the literal placeholder text without expanding it. | `\$(count)` produces `$(count)` |
|
| `\$(...)` | Escaped. Outputs the literal placeholder text without expanding it. | `\$(count)` produces `$(count)` |
|
||||||
|
|
||||||
Placeholders are validated when a command is created or edited. If a placeholder has invalid syntax (e.g., `$(rand abc)` or `$(countdown bad date)`), the command is rejected with an error message.
|
If a placeholder has invalid arguments at runtime (e.g., `$(rand abc)` or `$(getcount)` with no name), the entire response is replaced with an error message describing the problem.
|
||||||
|
|
||||||
Unknown placeholder names are left as-is in the output.
|
Unknown placeholder names are left as-is in the output.
|
||||||
|
|
||||||
|
### Nesting
|
||||||
|
|
||||||
|
Placeholders can be nested inside the arguments of other placeholders. Inner placeholders are resolved first, and their results are passed as arguments to the outer placeholder.
|
||||||
|
|
||||||
|
```
|
||||||
|
!addcommand !customrand $(rand $(1) $(2))
|
||||||
|
```
|
||||||
|
|
||||||
|
Now `!customrand 1 10` produces a random number between 1 and 10. The inner `$(1)` and `$(2)` resolve to the user's arguments, then `$(rand 1 10)` produces the final result.
|
||||||
|
|
||||||
|
Multi-level nesting also works:
|
||||||
|
|
||||||
|
```
|
||||||
|
!addcommand !deeprand $(rand 1 $(rand 5 10))
|
||||||
|
```
|
||||||
|
|
||||||
|
This picks a random number between 5 and 10, then picks a random number between 1 and that result.
|
||||||
|
|
||||||
|
Nesting is limited to a configurable maximum depth (default 4). Beyond the limit, `$(` is treated as literal text. The placeholder name itself must always be literal text. Constructions like `$($(1))` are not valid.
|
||||||
|
|
||||||
|
Escaping applies to the entire placeholder group including any nested content. `\$(rand $(1) $(2))` outputs the literal text `$(rand $(1) $(2))` without resolving anything inside.
|
||||||
|
|
||||||
### Date Format
|
### Date Format
|
||||||
|
|
||||||
`$(countdown)` and `$(countup)` use the following date format:
|
`$(countdown)` and `$(countup)` use the following date format:
|
||||||
@@ -82,7 +106,7 @@ If the target date is in the past for `$(countdown)`, it returns "0 seconds". Th
|
|||||||
|
|
||||||
Cooldowns are global per-command, not per-user. Setting `!commandcooldown !hello 30` means `!hello` can only fire once every 30 seconds regardless of who invokes it. A cooldown of 0 disables it.
|
Cooldowns are global per-command, not per-user. Setting `!commandcooldown !hello 30` means `!hello` can only fire once every 30 seconds regardless of who invokes it. A cooldown of 0 disables it.
|
||||||
|
|
||||||
New commands default to a 5-second cooldown.
|
New commands default to a 5-second cooldown. This default can be changed via the `default_cooldown` module configuration option.
|
||||||
|
|
||||||
When a command is on cooldown, the user receives a private system message with the remaining wait time.
|
When a command is on cooldown, the user receives a private system message with the remaining wait time.
|
||||||
|
|
||||||
@@ -138,6 +162,26 @@ The module serves a command list page at `/owlbot/custom_commands/list` showing
|
|||||||
!addalias !shoutout !so
|
!addalias !shoutout !so
|
||||||
!commandcooldown !shoutout 10
|
!commandcooldown !shoutout 10
|
||||||
|
|
||||||
|
# Named death counter (increments each use)
|
||||||
|
!addcommand !deaths We have died $(count deaths) times.
|
||||||
|
|
||||||
|
# Display death count without incrementing
|
||||||
|
!addcommand !deathcheck Total deaths so far: $(getcount deaths)
|
||||||
|
|
||||||
|
# Reset a named counter
|
||||||
|
!editcommand !deaths $(count deaths 0) deaths. Counter reset!
|
||||||
|
|
||||||
|
# Multiple named counters in one command
|
||||||
|
!addcommand !score Wins: $(getcount wins) | Losses: $(getcount losses)
|
||||||
|
!addcommand !win We won! Total wins: $(count wins)
|
||||||
|
!addcommand !loss We lost. Total losses: $(count losses)
|
||||||
|
|
||||||
|
# Nested placeholders: random range from arguments
|
||||||
|
!addcommand !customrand $(rand $(1) $(2))
|
||||||
|
|
||||||
|
# Multi-level nesting
|
||||||
|
!addcommand !deeprand $(rand 1 $(rand 5 10))
|
||||||
|
|
||||||
# Show literal placeholder text (escaped)
|
# Show literal placeholder text (escaped)
|
||||||
!addcommand !placeholderhelp Use \$(user) to insert your name.
|
!addcommand !placeholderhelp Use \$(user) to insert your name.
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user