Commands !set, !reset and !say support "replacements", or special forms of text replaced with other text.
The syntax is generally %<something>%, such as the following:
I %verb% all the time.
and the %verb% is replaced with a verb; for example:
I estimate all the time.
Identifiers
Here are some of the built in replacement identifiers:
nick - nickname of the person who triggered the replacement
chan - current IRC channel/room name
bot - bot's nickname
arg - optional argument (first) supplied when retrieving word
arg! - required argument (first)
args - optional arguments (all)
args! - required arguments (all)
argN - Nth argument (offset)
argornick - uses the argument (first) if supplied, or falls back to their nickname
lastmsg - last message to the channel (excluding bot's)
lastmsgnick - last speaker's nickname (excluding bot)
Ones giving random results (sometimes called reversed madlibs):
verb - verbs
noun - nouns
thing - subset of nouns which are things
adv - adverbs
adj - adjectives
feel - feelings/moods
color - color names
food - types of food
drink - types of drink
clothing - types of clothing
place - places/locations
animal - types of animals
job - job titles
shape - shapes
drug - types of drugs
letter - random letter
digit - random digit
num - random number between 0 and 100
smiley - random smiley
truefalse - randomly true or false
yesno - randomly yes or no
vehicle - types of vehicles
body - body parts
randN - random number with upper bound N
randM-N - random number with lower bound M and upper bound N
?@word - retrieve a set word; see below for details
User Identifiers
If you !set or !reset a word starting with @ (the at symbol), you can use it as a replacement. For example:
!set @fun this is fun
!say The answer is: %?@fun%!
The output would be:
The answer is: this is fun!
Randomized Lists
You can make your own randomized lists like the above built in identifiers. Simply separate items with | (the or symbol), like the following:
!say Pick one: %foo|bar|baz%
Would output something similar to:
Pick one: bar
The default action is not to evaluate items in randomized lists, but you can force evaluation by enclosing the item with curly braces, like so:
!say Is your name %cookie monster|{nick}%?
which literally uses cookie monster or evaluates nick to your current nickname. User variables are also evaluated and do not need curly braces; user variables explained below.
User Variables
User variables may be saved temporarily and expire over time. To set a variable, enclose a name in square brackets after the replacement identifier:
!say Look at the %thing[mything]%
This implicitly sets a variable named [mything] to the word thing returned.
To recall a variable, simply use %[variablename]%
Variables can be relative to the person requesting the replacement; this is accomplished by prepending the variable name with ~ (tilde), such as %thing[~mine]%
There's also channel-relative variables if the name is prefixed with #
User variables are saved between requests, but expire unpredictably. However, you can generally assume the variable will exist within a couple minutes.
Variables can be local to the current script by prefixing with a dot.
These variables are essentially unset automatically.
Flags
There are special flags that can be used to affect the output of a replacement. To specify a flag, put a colon and flag characters after the identifier (but before setting a variable). The flag characters, or flags, are listed below.
c - capitalize; makes the first letter uppercase
C - capwords; uppercases the first letter of every word
u - make the whole thing uppercase
l (L) - make the whole thing lowercase
s - remove all spaces
S - remove leading and trailing spaces
h - HTTP URL encode
H - HTTP URL decode
x - exclude this replacement from being output; useful for setting variables
1 (one) - try to make this replacement unique; useful for randomized identifiers
i - turn into a safe C identifier; use with s to use underscores
p - plain, do not evaluate identifiers
b - only output the first word (beginning)
e - only output the last word (ending)
B - only output the first character
E - only output the last character
= - conditional; compare first 2 items in a list, return 3rd if matching, or 4th (optional) otherwise
#N - where N is: 0 to get the string's length; or an integer to get the Nth character; BbEe? affect this
+ - add one to the number; multiple + adds more
- - subtract one from the number; multiple - subtracts more
For example:
!say %verb:u%!
may output:
RUN!
Example conditional:
!say %Joe|{nick}|Hi, Joe!|Sorry, I don't know who you are:=%
Compares the literal text Joe with the identifier nick (current nickname).
If the person's nickname is Joe, it greets him, or tells the person I don't know you.
Arbitrary Aliasing
You can arbitrarily redirect to other sets with !set and !reset. If the first word of the set is -A (dash and uppercase A; the uppercase is important), the user will automatically be redirected to another set identified by the word after the -A, which can be calculated using replacements. For example:
!set GotoMe -A %nick%
This will take the user to ?theirnick when they type ?GotoMe
This can also be used to pass arguments, which can also evaluated with replacements.
As well as -A, there is +A which will append words to the alias.
!set nextone +A one after
will add " after" to the "one" word.
Note that this adds a space.
Also, +AA, instead of appending words, appends literal text, without a space.
There is also -D defaultword testword where the defaultword is a default fallback word if testword doesn't exist. If testword does exist, it goes to it, otherwise it goes to the defaultword. When defaultword is chosen, %notset% is the testword that failed.