doc/Commands.md: add and improve sections about command syntax

This commit is contained in:
Pragmatic Software 2020-05-31 18:12:59 -07:00
parent eb09de1da4
commit bcee2e8460
2 changed files with 126 additions and 23 deletions

View File

@ -3,11 +3,13 @@
<!-- md-toc-begin --> <!-- md-toc-begin -->
* [Command interpreter](#command-interpreter) * [Command interpreter](#command-interpreter)
* [Command invocation](#command-invocation)
* [Addressing output to users](#addressing-output-to-users)
* [Inline invocation](#inline-invocation)
* [Chaining](#chaining)
* [Piping](#piping) * [Piping](#piping)
* [Substitution](#substitution) * [Substitution](#substitution)
* [Chaining](#chaining)
* [Variables](#variables) * [Variables](#variables)
* [Inline invocation](#inline-invocation)
* [Background processing](#background-processing) * [Background processing](#background-processing)
* [Types of commands](#types-of-commands) * [Types of commands](#types-of-commands)
* [Built-in commands](#built-in-commands) * [Built-in commands](#built-in-commands)
@ -114,9 +116,118 @@
## Command interpreter ## Command interpreter
PBot has a powerful command interpreter with useful functionality. PBot has a powerful command interpreter with useful functionality.
### Command invocation
There are a number of ways to invoke commands with PBot.
The syntax of PBot's commands largely follow Unix/POSIX conventions.
A single command's syntax is:
<keyword> [arguments]
`<keyword>` is one token containing no whitespace, and is required as denoted by the angle brackets.
`[arguments]` is a list of tokens which can be quoted to contain whitespace, and is optional as denoted by the square brackets.
We will refer to this as `<command>` throughout this documentation.
The most straight-forward way to invoke a command is:
<bot trigger> <command>
`<bot trigger>` is the bot's trigger sequence, defined in the `general.trigger` registry setting
(defined to be the exclamation mark by default).
Example:
<pragma-> !echo hi
<PBot> hi
You can also prefix or postfix address PBot by its nickname:
<bot nick> <command>
<command> <bot nick>
Examples:
<pragma-> PBot: hello
<PBot> Hi there, pragma-
<pragma-> bye, PBot
<PBot> Good-bye, pragma-
### Addressing output to users
There are a number of ways to address command output to users.
You can use the `tell` keyword:
tell <nickname> (about|the) <command>
Examples:
<pragma-> !tell dave about echo Testing
<PBot> dave: Testing
<pragma-> !tell mike the time
<PBot> It's Sun 31 May 2020 06:03:08 PM PDT in Los Angeles.
You can use the `give` keyword:
give <nickname> <command>
Examples:
<pragma-> !give dave echo Testing
<PBot> dave: Testing
<pragma-> !give mike time
<PBot> It's Sun 31 May 2020 06:03:08 PM PDT in Los Angeles.
You can use [#inline-invocation](inline invocation), as well -- see the next section.
### Inline invocation
You can invoke up to three commands inlined within a message. If the message
is addressed to a nick, the output will also be addressed to them.
The syntax for inline invocation is:
[nickname:] [text] <bot trigger>{ <command> } [text]
`[nickname:]` may optionally be prefixed to the message to address the command output to them.
`[text]` is optional message text that is ignored.
`<bot trigger>` is the bot's command trigger; which defaults to the exclamation mark (!).
`<command>` is the command to invoke.
Example:
<pragma-> newuser13: Check the !{version} and the !{help} documentation.
<PBot> newuser13: PBot version 2696 2020-01-04
<PBot> newuser13: To learn all about me, see https://github.com/pragma-/pbot/tree/master/doc
### Chaining
You can execute multiple commands sequentially as one command.
The syntax for chaining is:
<command> ;;; <command> [...]
Example:
<pragma-> !echo Test! ;;; me smiles. ;;; version
<PBot> Test! * PBot smiles. PBot version 2696 2020-01-04
### Piping ### Piping
You can pipe output from one command as input into another command, indefinitely. You can pipe output from one command as input into another command, indefinitely.
The syntax for piping is:
<command> | { <command> } [...]
Example:
<pragma-> !echo hello world | {sed s/world/everybody/} | {uc} <pragma-> !echo hello world | {sed s/world/everybody/} | {uc}
<PBot> HELLO EVERYBODY <PBot> HELLO EVERYBODY
@ -124,17 +235,21 @@ You can pipe output from one command as input into another command, indefinitely
You can insert the output from another command at any point within a command. This You can insert the output from another command at any point within a command. This
substitutes the command with its output at the point where the command was used. substitutes the command with its output at the point where the command was used.
The syntax for substitution is:
<command &{ <command> } >
Example:
<pragma-> !echo This is &{echo a demonstration} of command substitution <pragma-> !echo This is &{echo a demonstration} of command substitution
<PBot> This is a demonstration of command substitution <PBot> This is a demonstration of command substitution
For example, suppose you want to make a Google Image Search command. The naive Suppose you want to make a Google Image Search command. The naive way would be to simply do:
way would be to simply do:
<pragma-> !factadd img /call echo https://google.com/search?tbm=isch&q=$args <pragma-> !factadd img /call echo https://google.com/search?tbm=isch&q=$args
Unfortuately this would not support queries containing spaces or certain symbols. But Unfortuately this would not support queries containing spaces or certain symbols. To fix this,
never fear! We can use command substitution and the `uri_escape` function from the We can use command substitution and the `uri_escape` function from the `func` command.
`func` command.
Note that you must escape the command substitution to insert it literally into the Note that you must escape the command substitution to insert it literally into the
factoid otherwise it will be expanded first. factoid otherwise it will be expanded first.
@ -144,12 +259,6 @@ factoid otherwise it will be expanded first.
<pragma-> !img spaces & stuff <pragma-> !img spaces & stuff
<PBot> https://google.com/search?tbm=isch&q=spaces%20%26%20stuff <PBot> https://google.com/search?tbm=isch&q=spaces%20%26%20stuff
### Chaining
You can execute multiple commands sequentially as one command.
<pragma-> !echo Test! ;;; me smiles. ;;; version
<PBot> Test! * PBot smiles. PBot version 2696 2020-01-04
### Variables ### Variables
You can use factoids as variables and interpolate them within commands. You can use factoids as variables and interpolate them within commands.
@ -164,14 +273,6 @@ combine their effects.
<pragma-> !echo $greeting:uc <pragma-> !echo $greeting:uc
<PBot> HELLO, WORLD <PBot> HELLO, WORLD
### Inline invocation
You can invoke up to three commands inlined within a message. If the message
is addressed to a nick, the output will also be addressed to them.
<pragma-> newuser13: Check the !{version} and the !{help} documentation.
<PBot> newuser13: PBot version 2696 2020-01-04
<PBot> newuser13: To learn all about me, see https://github.com/pragma-/pbot/tree/master/doc
### Background processing ### Background processing
Any command can be flagged to be executed as a background process. For example, suppose you Any command can be flagged to be executed as a background process. For example, suppose you
make a Plugin that has a command that may potentially take a long time to complete, which could make a Plugin that has a command that may potentially take a long time to complete, which could

View File

@ -35,11 +35,13 @@
<!-- md-toc-begin --> <!-- md-toc-begin -->
* [Commands](Commands.md#commands) * [Commands](Commands.md#commands)
* [Command interpreter](Commands.md#command-interpreter) * [Command interpreter](Commands.md#command-interpreter)
* [Command invocation](Commands.md#command-invocation)
* [Addressing output to users](Commands.md#addressing-output-to-users)
* [Inline invocation](Commands.md#inline-invocation)
* [Chaining](Commands.md#chaining)
* [Piping](Commands.md#piping) * [Piping](Commands.md#piping)
* [Substitution](Commands.md#substitution) * [Substitution](Commands.md#substitution)
* [Chaining](Commands.md#chaining)
* [Variables](Commands.md#variables) * [Variables](Commands.md#variables)
* [Inline invocation](Commands.md#inline-invocation)
* [Background processing](Commands.md#background-processing) * [Background processing](Commands.md#background-processing)
* [Types of commands](Commands.md#types-of-commands) * [Types of commands](Commands.md#types-of-commands)
* [Built-in commands](Commands.md#built-in-commands) * [Built-in commands](Commands.md#built-in-commands)