/******************************************************************************
* This file is part of TinTin++ *
* *
* Copyright 2004-2020 Igor van den Hoven *
* *
* TinTin++ is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with TinTin++. If not, see https://www.gnu.org/licenses. *
******************************************************************************/
/******************************************************************************
* T I N T I N + + *
* *
* coded by Igor van den Hoven 2004 *
******************************************************************************/
#include "tintin.h"
struct help_type
{
char * name;
char * text;
char * also;
};
struct help_type help_table[];
char *help_related(struct session *ses, int index, int html)
{
char *arg;
char tmp[BUFFER_SIZE], link[BUFFER_SIZE];
static char buf[INPUT_SIZE];
push_call("help_related(%p,%d,%d)",ses,index,html);
arg = help_table[index].also;
buf[0] = 0;
while (*arg)
{
arg = get_arg_in_braces(ses, arg, tmp, GET_ONE);
if (html)
{
sprintf(link, "\\c%s\\c", tmp, tmp);
sprintf(tmp, "%s", link);
}
if (*buf == 0)
{
sprintf(buf, "<178>Related<278>: %s", tmp);
}
else
{
if (*arg)
{
cat_sprintf(buf, ", %s", tmp);
}
else
{
cat_sprintf(buf, " and %s.", tmp);
}
}
}
pop_call();
return buf;
}
DO_COMMAND(do_help)
{
char arg1[BUFFER_SIZE], buf[BUFFER_SIZE];
int cnt, found;
arg = get_arg_in_braces(ses, arg, arg1, GET_ALL);
if (*arg1 == 0)
{
*buf = 0;
for (cnt = 0 ; *help_table[cnt].name != 0 ; cnt++)
{
if (strlen(buf) + 19 > ses->wrap)
{
print_lines(ses, SUB_COL, "<088>%s<088>\n", buf);
*buf = 0;
}
cat_sprintf(buf, "%19s ", help_table[cnt].name);
}
if (*buf)
{
print_lines(ses, SUB_COL, "<088>%s<088>\n", buf);
}
}
else if (!strcasecmp(arg1, "dump"))
{
FILE *logfile = fopen("../docs/help.html", "w");
do_configure(ses, "{log} {html}");
if (HAS_BIT(ses->logmode, LOG_FLAG_HTML))
{
write_html_header(ses, logfile);
}
*buf = 0;
for (cnt = 0 ; *help_table[cnt].name != 0 ; cnt++)
{
if (cnt && cnt % 4 == 0)
{
substitute(ses, buf, buf, SUB_ESC|SUB_COL);
logit(ses, buf, logfile, LOG_FLAG_LINEFEED);
*buf = 0;
}
cat_sprintf(buf, " \\c%15s\\c", help_table[cnt].name, help_table[cnt].name);
}
cat_sprintf(buf, "\n\n");
substitute(ses, buf, buf, SUB_ESC|SUB_COL);
logit(ses, buf, logfile, LOG_FLAG_LINEFEED);
for (cnt = 0 ; *help_table[cnt].name != 0 ; cnt++)
{
sprintf(buf, "\\c\\c\n", help_table[cnt].name);
substitute(ses, buf, buf, SUB_ESC|SUB_COL);
logit(ses, buf, logfile, LOG_FLAG_LINEFEED);
sprintf(buf, "<128> %s\n", help_table[cnt].name);
substitute(ses, buf, buf, SUB_ESC|SUB_COL);
logit(ses, buf, logfile, LOG_FLAG_LINEFEED);
substitute(ses, help_table[cnt].text, buf, SUB_COL);
logit(ses, buf, logfile, LOG_FLAG_LINEFEED);
if (*help_table[cnt].also)
{
substitute(ses, help_related(ses, cnt, 0), buf, SUB_COL);
logit(ses, buf, logfile, LOG_FLAG_LINEFEED);
}
}
fclose(logfile);
}
else if (!strcasecmp(arg1, "dump.php"))
{
FILE *logfile;
do_configure(ses, "{log} {html}");
*buf = 0;
for (cnt = 0 ; *help_table[cnt].name != 0 ; cnt++)
{
filename_string(help_table[cnt].name, arg1);
lowerstring(arg1);
sprintf(buf, "../../manual/%s.php", arg1);
logfile = fopen(buf, "w");
fprintf(logfile, " %s\n", help_table[cnt].name);
substitute(ses, buf, buf, SUB_ESC|SUB_COL);
logit(ses, buf, logfile, LOG_FLAG_LINEFEED);
}
substitute(ses, help_table[cnt].text, buf, SUB_COL);
logit(ses, buf, logfile, LOG_FLAG_LINEFEED);
if (*help_table[cnt].also)
{
substitute(ses, help_related(ses, cnt, 1), buf, SUB_ESC|SUB_COL);
logit(ses, buf, logfile, LOG_FLAG_LINEFEED);
}
fprintf(logfile, "\n\t\");\n\n");
fprintf(logfile, "\tshow_tail();\n?>\n");
fclose(logfile);
}
}
else
{
for (cnt = 0 ; *help_table[cnt].name != 0 ; cnt++)
{
if (is_abbrev(arg1, help_table[cnt].name))
{
print_lines(ses, SUB_COL, "%s<088>\n", help_table[cnt].text);
if (*help_table[cnt].also)
{
print_lines(ses, SUB_COL, "%s<088>\n\n", help_related(ses, cnt, 0));
}
return ses;
}
}
found = FALSE;
for (cnt = 0 ; *help_table[cnt].name != 0 ; cnt++)
{
if (match(ses, help_table[cnt].name, arg1, SUB_VAR|SUB_FUN))
{
print_lines(ses, SUB_COL, "%s<088>\n", help_table[cnt].text);
if (*help_table[cnt].also)
{
print_lines(ses, SUB_COL, "%s<088>\n\n", help_related(ses, cnt, 0));
}
found = TRUE;
}
}
if (found == FALSE)
{
tintin_printf2(ses, "No help found for '%s'", arg1);
}
}
return ses;
}
/*
This help table is a mess, but I got better things to do - Igor
*/
struct help_type help_table[] =
{
{
"ACTION",
"<178>Command<278>: #action <178>{<278>message<178>} {<278>commands<178>} {<278>priority<178>}<278>\n"
"\n"
" The #action command can be used to respond with one or several\n"
" commands to a specific message send by the server. The %1-%99\n"
" variables are substituted from the message and can be used in the\n"
" command part of the action.\n"
"\n"
" The priority part is optional and determines the priority of the\n"
" action, it defaults to 5.\n"
"\n"
" If the message starts with a ~ color codes must be matched. You can\n"
" enable #config {convert meta} on to display meta characters.\n"
"\n"
" For more information on pattern matching see the section on PCRE.\n"
"\n"
"<178>Example<278>: #action {%1 tells you '%2'} {tell %1 I'm afk.}\n"
"\n"
" Actions can be triggered by the showme command and certain system\n"
" messages.\n"
"\n"
" Actions can be triggered by the #showme command. If you don't want a\n"
" #showme to get triggered use: #line ignore #showme {text}\n"
"\n"
" Actions are ordered alphabetically and only one action can trigger at\n"
" a time. To change the order you can assign a priority, which defaults\n"
" to 5, with a lower number indicating a higher priority. The priority\n"
" can be a floating point number.\n"
"\n"
" To remove action with %* as the message, use #unaction {%%*} or\n"
" #unaction {\%*}. Alternatively you could wrap the action inside a\n"
" class, and kill that class when you no longer need the action.\n"
"\n"
"<178>Comment<278>: You can remove an action with the #unaction command.\n",
"pcre gag highlight prompt substitute"
},
{
"ALIAS",
"<178>Command<278>: #alias <178>{<278>name<178>} {<278>commands<178>} {<278>priority<178>}<278>\n"
"\n"
" The #alias command can be used to shorten up long or oftenly used\n"
" commands. The %1-99 variables are substituted from the arguments when\n"
" using an alias and represent the 1st till 99th word which can be used\n"
" in the commands part of the alias. If %0 is used it will contain all\n"
" arguments. The priority part is optional and determines the priority\n"
" of the alias, it defaults to 5.\n"
"\n"
"<178>Example<278>: #alias {k} {kill %1;kick}\n"
"\n"
" Typing 'k orc' would result in attacking the orc followed by a kick.\n"
"\n"
" You can create multi-word aliases by using variables in the name\n"
" section.\n"
"\n"
"<178>Example<278>: #alias {k %1 with %2} {draw %2;attack %1;slash %1 with %2;\n"
" kick at %2;strike %1 with %2}\n"
"\n"
" Using the above alias you could type k blue smurf with battle axe\n"
"\n"
" To have an alias that matches all user input, use %* as the name.\n"
"\n"
"<178>Example<278>: #alias {%*} {#showme You wrote: %0}\n"
"\n"
" Aliases are ordered alphabetically and only one alias can trigger at\n"
" a time. To change the order you can assign a priority, which defaults\n"
" to 5, with a lower number indicating a higher priority. The priority\n"
" can be a floating point number.\n"
"\n"
" To remove an alias with %* as the name, use #unalias {%%*} or #unalias\n"
" {\%*}. Alternatively you can wrap the alias inside a class, and kill\n"
" that class when you no longer need the alias.\n"
"\n"
" For more information on pattern matching see the section on PCRE.\n"
"\n"
"<178>Comment<278>: You can remove an alias with the #unalias command.\n",
"cursor history keypad macro speedwalk tab"
},
{
"ALL",
"<178>Command<278>: #all <178>{<278>string<178>}<278>\n"
"\n"
" If you have multiple sessions in one terminal you can use #all to\n"
" execute the command with all sessions, excluding the startup session.\n"
"\n"
"<178>Example<278>: #all quit\n"
"\n"
" Sends 'quit' to all sessions.\n",
"port run session sessionname snoop ssl zap"
},
{
"BELL",
"<178>Command<278>: #bell <178>{<278>flash<178>|<278>focus<178>|<278>margin<178>|<278>ring<178>|<278>volume<178>} {<278>argument<178>}<278>\n"
"\n"
" The #bell command without an argument will ring the terminal bell.\n"
"\n"
"<178>Example<278>: #action {Bubba tells you} {#bell}\n"
"\n"
" If you aren't watching the screen this could be useful if you don't\n"
" want to miss out on a conversation with Bubba. Alternatively you can\n"
" use #system to play a sound file.\n"
"\n"
" Some terminals will allow you to use VT100 Operating System Commands\n"
" to change the terminal's bell behavior which can be used to flash the\n"
" taskbar icon and or focus the window on receival of a bell.\n"
"\n"
"<178>Example<278>: #action {Bubba tells you} {#screen save title;#screen set title Tell!;\n"
" #bell ring;#delay 10 #screen load title}\n"
"\n"
" The above example will save your window title, change the title to\n"
" 'Tell!', ring the bell, next reset the window title after 10 seconds.\n"
"\n"
" It's possible to set the terminal to pop to the foreground upon\n"
" ringing of the alarm bell.\n"
"\n"
"<178>Example<278>: #bell focus on;#bell ring;#bell focus off\n"
"\n"
" It's possible to adjust the alarm bell volume on some terminals.\n"
"\n"
"<178>Example<278>: #loop {1} {8} {cnt} {#line substitute variables\n"
" #delay {$cnt} #showme {Volume $cnt: #bell volume $cnt;#bell}\n",
"screen"
},
{
"BREAK",
"<178>Command<278>: #break\n"
"\n"
" The break command can be used inside the #foreach, #loop, #parse,\n"
" #while and #switch statements. When #break is found, tintin will stop\n"
" executing the statement it is currently in and move on to the next.\n"
"\n"
"<178>Example<278>: #while {1} {#math cnt $cnt + 1;#if {$cnt == 20} {#break}}\n",
"statements"
},
{
"BUFFER",
"<178>Command<278>: #buffer <178>{<278>home<178>|<278>up<178>|<278>down<178>|<278>end<178>|<278>lock<178>|<278>find<178>|<278>get<178>|<278>clear<178>}<278>\n"
"\n"
" The buffer command has various options to manipulate your scrollback\n"
" buffer.\n"
"\n"
" <178>#buffer {home}\n"
"<278>\n"
" Moves you to the top of your scrollback buffer and displays the page.\n"
" Enables scroll lock mode. Most useful when used in a #macro.\n"
"\n"
" <178>#buffer {up} [lines]\n"
"<278>\n"
" Moves your scrollback buffer up one page and displays the page.\n"
" Enables scroll lock mode. Most useful when used in a #macro. You\n"
" can use #buffer {up} {1} to move the scrollback buffer up 1 line.\n"
"\n"
" <178>#buffer {down} [lines]\n"
"<278>\n"
" Moves your scrollback buffer down one page and displays the page.\n"
" Enables scroll lock mode unless at the end. Most useful when used in\n"
" a #macro.\n"
"\n"
" <178>#buffer {end}\n"
"<278>\n"
" Moves you to the end of your scrollback buffer and displays the page.\n"
" Disables scroll lock mode. Most useful when used in a #macro.\n"
"\n"
" <178>#buffer {find} {[number]} {}\n"
"<278>\n"
" Moves the buffer to the given string which can contain a regular\n"
" expression. Optionally you can provide the number of matches to skip,\n"
" allowing you to jump further back in the buffer.\n"
"\n"
" <178>#buffer {get} {} {} {[upper bound]}\n"
"<278>\n"
" Allows you to store one or several lines from your scrollback buffer\n"
" (including color codes) into a variable. The lower and upper bound\n"
" must be between 1 and the size of the buffer. If the upper bound is\n"
" omitted the given line is stored as a standard variable. If an upper\n"
" bound is given the lines between the two bounds are stored as a list.\n"
"\n"
" <178>#buffer {lock} {on|off}\n"
"<278>\n"
" Toggles the lock on the scrollback buffer. When locked, newly incoming\n"
" text won't be displayed, any command will disable the lock, though\n"
" several buffer commands will re-enable the lock. When unlocking it'll\n"
" move you to the end of your scrollback buffer and display the page.\n"
"\n"
" <178>#buffer {write} {}\n"
"<278>\n"
" Writes the scrollback buffer to the given file.\n"
"\n"
"<178>Example<278>: #macro {\\e[F} {#buffer end}\n",
"echo grep macro showme screen"
},
{
"BUTTON",
"<178>Command<278>: #button <178>{<278>square<178>} {<278>commands<178>} {<278>priority<178>}<278>\n"
"\n"
" The #button command can be used to respond with one or several\n"
" commands to a mouse click received within the specified square.\n"
" The click coordinates are stored in %0-%3 and can be used in the\n"
" command part of the button.\n"
"\n"
" The square part should exists of two coordinates defining the\n"
" upper left and bottom right corner using row, col, row, col syntax.\n"
" The square arguments should be separated by spaces, semi-colons or\n"
" braces.\n"
"\n"
" By default the button is set to respond to a mouse button press, to\n"
" respond to other button presses you must add a 5th argument to the\n"
" square that defines the button press type. You can enable #info\n"
" button on to see button events and their type as they happen.\n"
"\n"
" The priority part is optional and determines the priority of the\n"
" button, it defaults to 5.\n"
"\n"
" You must enable #config {mouse tracking} on for buttons to work.\n"
"\n"
" This command draws no visible button, you'll have to do so separately\n"
" if needed.\n"
"\n"
"<178>Example<278>: #button {1;1;2;2} {#showme You clicked the upper left corner.}\n"
"\n"
" Buttons are ordered alphabetically and only one button can trigger at\n"
" a time. To change the order you can assign a priority, which defaults\n"
" to 5, with a lower number indicating a higher priority. The priority\n"
" can be a floating point number.\n"
"\n"
"<178>Comment<278>: To see button clicks trigger use #info button on.\n"
"\n"
"<178>Comment<278>: You can remove a button with the #unbutton command.\n",
"delay event ticker"
},
{
"CASE",
"<178>Command<278>: #case <178>{<278>conditional<178>} {<278>arguments<178>}<278>\n"
"\n"
" The case command must be used within the #switch command. When the\n"
" conditional argument of the case command matches the conditional\n"
" argument of the switch command the body of the case is executed.\n"
"\n"
" When comparing strings both the switch and case arguments must be\n"
" surrounded in quotes.\n"
"\n"
"<178>Example<278>:\n"
"\n"
" #function {reverse_direction}\n"
" {\n"
" #switch {\"%1\"}\n"
" {\n"
" #case {\"north\"} {#return south};\n"
" #case {\"east\"} {#return west};\n"
" #case {\"south\"} {#return north};\n"
" #case {\"west\"} {#return east};\n"
" #case {\"up\"} {#return down};\n"
" #case {\"down\"} {#return up}\n"
" }\n"
" }\n"
"\n"
" This function returns the reverse direction. @reverse_direction{north}\n"
" would return south.\n",
"default statements switch"
},
{
"CAT",
"<178>Command<278>: #cat <178>{<278>variable<178>} {<278>argument<178>}<278>\n"
"\n"
" The cat command will concatinate the argument to the given variable.\n",
"format function local math replace script variable"
},
{
"CHARACTERS",
"<278>\n"
" The following special characters are defined:\n"
"\n"
"# The hashtag is the default character for starting a command and is\n"
" subsequently known as the command character or tintin character.\n"
" When loading a command file the command character is set to the\n"
" first character in the file. The character can also be redefined\n"
" using #config.\n"
"\n"
"; The semi-colon is used as the command separator and can be used to\n"
" separate two commands. Multiple commands can be strung together as\n"
" well. Trailing semi-colons are ignored when reading a script file\n"
" as this is a common error.\n"
"\n"
"{ } Curly brackets aka braces are used for separating multi word command\n"
" arguments, nesting commands, and nesting variables. Braces cannot\n"
" easily be escaped and must always be used in pairs.\n"
"\n"
"\" \" Quote characters are used for strings in the #math, #if, #switch,\n"
" and #case commands. It is however suggested to use an extra\n"
" set of braces { } to define strings.\n"
"\n"
"! The exclamation sign is used to repeat commands, see #help history.\n"
" The character can be redefined using #config.\n"
"\n"
"\\ An input line starting with a backslash is send verbatim if you are\n"
" connected to a server. This character can be configured with\n"
" #config.\n",
"colors escape mathematics pcre"
},
{
"CHAT",
"<178>Command<278>: #chat <178>{<278>option<178>} {<278>argument<178>}\n"
"<278>\n"
" The #chat command is used to create peer to peer connections to other\n"
" clients, typically for the purpose of chatting and sending files.\n"
" This is a decentralized chat system, meaning you have to exchange ip\n"
" addresses and port numbers with other users in order to connect to\n"
" them.\n"
"\n"
" <178>#chat {init} {port}\n"
" <278> #chat initialize launches your chat server. The port number is\n"
" optional, and by default 4050 is used as your port. After using\n"
" this command other people can connect to your chat server using\n"
" your ip address and port number, and in turn you can connect to\n"
" other people.\n"
" <178>#chat {name} {name}\n"
" <278> By default your name is set to TinTin, but most servers will\n"
" reject you if there is already someone with the name TinTin\n"
" connected, so one of the first things you'd want to do is\n"
" change your chat name. Your name can include color codes. Some\n"
" names aren't accepted by tt++ chat servers, like the name 'all'\n"
" and names longer than 20 characters.\n"
" <178>#chat {message} {buddy|all} {text}\n"
" <278> This is the main command used for communication. If you use\n"
" #chat message all, the message is marked as public and send to\n"
" everyone you are connected to.\n"
" <178>#chat {accept} {buddy} {boost}\n"
" <278> Accept a file transfer from a buddy. The boost is optional and\n"
" must be a value between 1 and 1000.\n"
" <178>#chat {call} {address} {port}\n"
" <278> #chat call is used to connect to another chat server. If you\n"
" omit the port argument the default port (4050) is used.\n"
" <178>#chat {cancel} {buddy} Cancel a file transfer\n"
" #chat {color} {color names} Set the default color\n"
" #chat {decline} {buddy} Decline a file transfer\n"
" #chat {dnd} Decline new connections\n"
" #chat {download} {directory} Set your download directory\n"
" #chat {emote} {buddy|all} {text} Send an emote message\n"
" #chat {forward} {buddy} Forward all chat messages\n"
" #chat {forwardall} {buddy} Forward all session output\n"
" #chat {filestat} {buddy} Show file transfer data\n"
" #chat {group} {buddy} {name} Assign a chat group\n"
" #chat {ignore} {buddy} Ignores someone\n"
" #chat {info} Displays your info\n"
" #chat {ip} {address} Changes your IP address\n"
" #chat {paste} {buddy|all} {text} Pastes a block of text\n"
" #chat {peek} {buddy} Show one's public connections\n"
" #chat {ping} {buddy} Display response time\n"
" #chat {private} {buddy|all} Make a connection private\n"
" #chat {public} {buddy|all} Make a connection public\n"
" #chat {reply} {text} Reply to last private message\n"
" #chat {request} {buddy} Request one's public connections\n"
" #chat {send} {buddy|all} {text} Sends a raw data string\n"
" #chat {sendfile} {buddy} {filename} Start a file transfer\n"
" #chat {serve} {buddy} Forward all public chat messages\n"
" #chat {uninitialize} Uninitialize the chat port.\n"
" <178>#chat {who} Show all connections\n"
" <278> #chat who shows all people you are connected to. The first\n"
" column shows a reference number for the connection, which can be\n"
" used instead of the connection's name when sending someone a message\n"
" The second column shows the connection's name. The third column\n"
" shows flags set for the connection, (P)rivate, (I)gnore, (S)erve,\n"
" (F)orward to user, and (f)orward from user. The next columns show\n"
" ip, port, and client name.\n"
" <178>#chat {zap} {buddy} Close a connection\n",
"port"
},
{
"CLASS",
"<178>Command<278>: #class <178>{<278>name<178>} {<278>optionkill<178>} {<278>arg<178>}<278>\n"
"\n"
" <178>#class {} {open}\n"
" <278> Open a class, closing a previously opened class. All triggers\n"
" <278> added afterwards are assigned to this class.\n"
" <178>#class {} {clear}\n"
" <278> Will delete all triggers associated with the given class.\n"
" <178>#class {} {close}\n"
" <278> Close the given class, opening the last open class, if any.\n"
" <178>#class {} {kill}\n"
" <278> Will clear, close, and remove the class.\n"
" <178>#class {} {list}\n"
" <278> List all triggers associated with the given class.\n"
" <178>#class {} {load}\n"
" <278> Will load the saved copy of the class from memory.\n"
" <178>#class {} {read} {\n"
" <278> Will open the class, read the file, and close afterwards.\n"
" <178>#class {} {save}\n"
" <278> Will save all triggers of the given class to memory.\n"
" <178>#class {} {size} {}\n"
" <278> Will store the size of the class in a variable.\n"
" <178>#class {} {write} {}\n"
" <278> Will write all triggers of the given class to file.\n"
" The {kill} option will delete all triggers of the given class.\n"
"\n"
" Keep in mind that the kill and read option are very fast allowing\n"
" them to be used to enable and disable classes.\n"
"\n"
"<178>Example<278>: #class extra kill;#class extra read extra.tin\n"
" Deletes all triggers of 'extra' class if any. Read 'extra.tin' file,\n"
" all triggers loaded will be assigned to the fresh new 'extra' class.\n",
"config debug ignore info kill line message"
},
{
"COLORS",
"<178>Syntax<278>: <<888>xyz> with x, y, z being parameters\n"
"\n"
" Parameter 'x': VT100 code\n"
"\n"
" 0 - Reset all colors and codes to default\n"
" 1 - Bold\n"
" 2 - Dim\n"
" 4 - Underscore\n"
" 5 - Blink\n"
" 7 - Reverse\n"
" 8 - Skip (use previous code)\n"
"\n"
" Parameter 'y': Foreground color\n"
" Parameter 'z': Background color\n"
"\n"
" 0 - Black 5 - Magenta\n"
" 1 - Red 6 - Cyan\n"
" 2 - Green 7 - White\n"
" 3 - Yellow 8 - Skip\n"
" 4 - Blue 9 - Default\n"
"\n"
" For xterm 256 colors support use <<888>aaa> to <<888>fff> for RGB foreground\n"
" colors and <<888>AAA> to <<888>FFF> for RGB background colors. For the grayscale\n"
" foreground colors use <<888>g00> to <<888>g23>, for grayscale background colors\n"
" use <<888>G00> to <<888>G23>.\n"
"\n"
" The tertiary colors are as follows:\n"
"\n"
" <<888>acf> - Azure <<888>afc> - Jade\n"
" <<888>caf> - Violet <<888>cfa> - Lime\n"
" <<888>fac> - Pink <<888>fca> - Orange\n"
"\n"
"<178>Example<278>: #showme <<888>acf>Azure <<888>afc>Jade <<888>caf>Violet\n"
"<178>Example<278>: #showme <<888>cfa>Lime <<888>fac>Pink <<888>fca>Orange\n"
"\n"
" For 12 bit truecolor use <<888>F000> to <<888>FFFF> for foreground colors and\n"
" <<888>B000> to <<888>BFFF> for background colors.\n"
"\n"
" For 24 bit truecolor use <<888>F000000> to <<888>FFFFFFF> for foreground\n"
" colors and <<888>B000000> to <<888>BFFFFFF> for background colors.\n"
"\n"
" If the color code exceeds your configured color mode it will be\n"
" downgraded to the closest match.\n",
"characters coordinates escape mathematics pcre"
},
{
"COMMANDS",
"<178>Command<278>: #commands <178>{<278>regex<178>}\n"
"<278>\n"
" Shows all commands or all commands matching the given search\n"
" string.\n",
"help info statements"
},
{
"COORDINATES",
"<278>\n"
" When the 0,0 coordinate is in the upper left corner TinTin++ uses\n"
" a y,x / rows,cols notation. When the 0,0 coordinate is in the\n"
" bottom left corner tintin uses a x,y / cols/rows notation.\n"
"\n"
" When a square is defined this is done by specifying the upper left\n"
" and bottom right corner of the square using four coordinates.\n"
"\n"
" The vast majority of tintin commands use row,col notation.\n",
"characters colors escape mathematics pcre"
},
{
"CONFIG",
"<178>Command<278>: #config <178>{<278>option<178>} {<278>argument<178>}<278>\n"
"\n"
" This allows you to configure various settings, the settings can be\n"
" written to file with the #write command.\n"
"\n"
" If you configure the global session (the one you see as you start up\n"
" tintin) all sessions started will inherite these settings.\n"
"\n"
" It's advised to make a configuration file to read on startup if you\n"
" do not like the default settings.\n"
"\n"
" Config options which aren't listed by default:\n"
"\n"
" #CONFIG {BUFFER SIZE} {SIZE} Set the scrollback buffer size.\n"
" #CONFIG {CHILD LOCK} {ON|OFF} Enable or disable command input.\n"
" #CONFIG {CONVERT META} {ON|OFF} Shows color codes and key bindings.\n"
" #CONFIG {DEBUG TELNET} {ON|OFF} Shows telnet negotiations y/n.\n"
" #CONFIG {LOG LEVEL} {LOW|HIGH} LOW logs server output before triggers.\n"
" #CONFIG {INHERITANCE} {ON|OFF} Session trigger inheritance y/n.\n"
" #CONFIG {MCCP} {ON|OFF} Enable or disable MCCP support.\n"
" #CONFIG {PID} {NUMBER} Set the PID of the master process.\n",
"class line"
},
{
"CONTINUE",
"<178>Command<278>: #continue\n"
"\n"
" The continue command can be used inside the #FOREACH, #LOOP, #PARSE,\n"
" #WHILE and #SWITCH commands. When #CONTINUE is found, tintin will go\n"
" to the end of the command and proceed as normal, which may be to\n"
" reiterate the command.\n"
"\n"
"<178>Example<278>: #loop 1 10 cnt {#if {$cnt % 2 == 0} {#continue} {say $cnt}}\n",
"break foreach list loop parse repeat return while"
},
{
"CR",
"<178>Command<278>: #cr\n"
"\n"
" Sends a carriage return to the session. Useful for aliases that need\n"
" extra carriage returns.\n"
"\n"
" This command is obsolete as you can accomplish the same using #send\n"
" without an argument or #send {}.\n",
"forall"
},
{
"CURSOR",
"<178>Command<278>: #cursor <178>{<278>option<178>} {<278>argument<178>}<278>\n"
"\n"
" Typing #cursor without an option will show all available cursor\n"
" options, their default binding, and an explanation of their function.\n"
"\n"
" The cursor command's primarly goal is adding customizable input editing\n"
" with macros. Subsequently many cursor commands only work properly when\n"
" used within a macro or event.\n"
"\n"
" <178>#cursor tab \n"
" <278> Tab through the given option(s) going forward or backward.\n"
,
"alias history keypad macro speedwalk tab"
},
{
"DAEMON",
"<178>Command<278>: #daemon <178>{<278>attach<178>|<278>detach<178>|<278>kill<178>|<278>list<178>} <178>[<278>name<178>]\n"
"\n"
" <278>#daemon provides functionality similar to that of the screen and tmux\n"
" utilities.\n"
"\n"
" <178>#daemon attach [name]\n"
" <278> The attach option will try to find a daemonized tintin instance and\n"
" take over control. The name argument is optional.\n"
"\n"
" <178>#daemon detach [name]\n"
" <278> The detach option will daemonize tintin, turning it into a background\n"
" process. The name argument is optional and is useful if you have\n"
" several daemonized tt++ instances running so you can keep them apart.\n"
"\n"
" <178>#daemon kill [name]\n"
" <278> Kills all daemons or daemons with matching name.\n"
"\n"
" <178>#daemon list [name]\n"
" <278> List all daemons or daemons with matching name.\n",
"script system run"
},
{
"DEBUG",
"<178>Command<278>: #debug <178>{<278>listname<178>} {<278>on<178>|<278>off<178>|<278>log<178>}<278>\n"
"\n"
" Toggles a list on or off. With no argument it shows your current\n"
" settings, as well as the list names that you can debug.\n"
"\n"
" If you for example set ACTIONS to ON you will get debug information\n"
" whenever an action is triggered.\n"
"\n"
" #debug {listname} {log} will silently write debugging information to\n"
" the log file, you must be logging in order for this to work.\n"
"\n"
" Not every list has debug support yet.\n",
"class ignore info kill message"
},
{
"DEFAULT",
"<178>Command<278>: #default <178>{<278>commands<178>}<278>\n"
"\n"
" The default command can only be used within the switch command. When\n"
" the conditional argument of non of the case commands matches the switch\n"
" command's conditional statement the default command is executed.\n",
"case default else elseif if switch regex"
},
{
"DELAY",
"<178>Command<278>: #delay <178>{<278>seconds<178>} {<278>command<178>}<278>\n"
"<178>Command<278>: #delay <178>{<278>name<178>} {<278>command<178>} {<278>seconds<178>}<278>\n"
"\n"
" Delay allows you to have tintin wait the given amount of seconds\n"
" before executing the given command. tintin won't wait before\n"
" executing following input commands if any.\n"
"\n"
" Floating point precision for milliseconds is possible.\n"
"\n"
"<178>Example<278>: #showme first;#delay {1} {#showme last}\n"
" This will print 'first', and 'last' around one second later.\n"
"\n"
"<178>Comment<278>: If you want to remove a delay with the #undelay command you can add\n"
" a name as the first argument, be aware this changes the syntax. If\n"
" the name is a number keep in mind that delays with the same numeric\n"
" name will not be overwritten\n",
"event ticker"
},
{
"DRAW",
"<178>Command<278>: #draw <178>[<278>color<178>] <178>[<278>options<178>] <178><<278>type<178>> <<278>square<178>> {<278>text<178>}\n"
"<278>\n"
" The draw commands allows you to draw various types of lines and shapes\n"
" on the screen. Common options and types with a brief description are\n"
" provided when you type #draw without an argument.\n"
"\n"
" The square arguments should exists of two coordinates defining the\n"
" upper left and bottom right corner using row, col, row, col syntax.\n"
"\n"
"\n You can prefix the option with a color code or color name to color the\n"
" lines and shapes.\n"
"\n"
" You can further prefix the option as following:\n"
"\n"
" ASCII will draw in ASCII mode.\n"
" BLANKED will blank the lines and corners.\n"
" BOTTOM will draw on the bottom side if possible.\n"
" BUMPED will precede the draw with an enter.\n"
" CIRCLED will circle the corners.\n"
" CONVERT will draw text with meta conversion.\n"
" CROSSED will cross the corners.\n"
" FILLED will fill circles and jewels.\n"
" GRID will draw TABLE as a grid.\n"
" HORIZONTAL will draw horizontal if possible.\n"
" HUGE will draw text in huge letters.\n"
" JEWELED will diamond the corners.\n"
" JOINTED will draw corners.\n"
" LEFT will draw on the left side if possible.\n"
" NUMBERED will draw numbered, mostly for debugging.\n"
" PRUNED will prune the corners.\n"
" RIGHT will draw on the right side if possible.\n"
" ROUNDED will round the corners.\n"
" SHADOWED will shadow HUGE text.\n"
" TEED will tee the corners.\n"
" TRACED will trace HUGE text.\n"
" TOP will draw on the top side if possible.\n"
" TUBED will draw tubes instead of lines.\n"
" UNICODE will draw in unicode mode.\n"
" VERTICAL will draw vertical if possible.\n"
"\n"
" The following types are available.\n"
"\n"
" <178>[ASCII|UNICODE|HUGE] BOX {[TEXT1]} {[TEXT2]}\n"
" <278> will draw a box.\n"
" <178>[BLANKED|CIRCLED|CROSSED|JEWELED|ROUNDED|TEED|PRUNED] CORNER\n"
" <278> will draw a corner.\n"
" <178>[BLANKED|HORIZONTAL|NUMBERED|TUBED|VERTICAL] LINE {[TEXT]}\n"
" <278> will draw a line.\n"
" <178>RAIN {} {[SPAWN]} {[FADE]} {[LEGEND]}\n"
" <278> will draw digital rain.\n"
" <178>[JOINTED|TOP|LEFT|BOTTOM|RIGHT] SIDE\n"
" <278> will draw one or more sides of a box.\n"
" <178>[GRID] TABLE {[LIST1]} {[LIST2]}\n"
" <278> will draw a table.\n"
" <178>[HUGE] TILE {[TEXT1]} {[TEXT2]}\n"
" <278> will draw a tile\n"
"\n"
" All draw types take an optional text argument as long as a valid\n"
" square with enough space has been defined. Text is automatically\n"
" word wrapped.\n"
"\n"
"<178>Example<278>: #draw Blue box 1 1 3 20 {Hello world!}\n",
"buffer echo grep showme"
},
{
"ECHO",
"<178>Command<278>: #echo <178>{<278>format<178>} {<278>argument1<178>} {<278>argument2<178>} {<278>etc<178>}<278>\n"
"\n"
" Echo command displays text on the screen with formatting options. See\n"
" the help file for the format command for more information.\n"
"\n"
" The echo command does not trigger actions.\n"
"\n"
" As with the #showme command you can split the {format} argument up into\n"
" two braced arguments, in which case the 2nd argument is the row number.\n"
"\n"
"<178>Example<278>: #echo {The current date is %t.} {%Y-%m-%d %H:%M:%S}\n"
" #echo {[%38s][%-38s]} {Hello World} {Hello World}\n"
" #echo {{this is %s on the top row} {-1}} {printed}\n",
"buffer format grep showme"
},
{
"ELSE",
"<178>Command<278>: #else <178>{<278>commands<178>}<278>\n"
"\n"
" The else statement should follow an #IF or #ELSEIF statement and is\n"
" only called if the proceeding #IF or #ELSEIF is false.\n"
"\n"
"<178>Example<278>: #if {1d2 == 1} {smile};#else {grin}\n",
"case default elseif if switch regex"
},
{
"ELSEIF",
"<178>Command<278>: #elseif <178>{<278>conditional<178>} {<278>commands<178>}<278>\n"
"\n"
" The elseif statement should follow an #IF or #ELSEIF statement and is\n"
" only called when the statement is true and the proceeding #IF and\n"
" #ELSEIF statements are false.\n"
"\n"
"<178>Example<278>: #if {1d3 == 1} {smirk};#elseif {1d2 == 1} {snicker}\n",
"case default else if switch regex"
},
{
"END",
"<178>Command<278>: #end {}\n"
"\n"
" Terminates tintin and return to unix. On most systems, ctrl-c has\n"
" the same result.\n"
"\n"
" The message is optional and is printed before tintin exits. When\n"
" using #end {\\} tintin will terminate silently.\n",
"zap"
},
{
"ESCAPE CODES",
"<278> You may use the escape character \\ for various special characters.\n"
"\n"
" \\a beep the terminal.\n"
" \\c send a control character, \\ca for ctrl-a.\n"
" \\e start an escape sequence.\n"
" \\n send a line feed.\n"
" \\r send a carriage return.\n"
" \\t send a horizontal tab.\n"
" \\x print an 8 bit character using hexadecimal, \\xFF for example.\n"
" \\x7B send the '{' character.\n"
" \\x7D send the '}' character.\n"
" \\u print a 16 bit unicode character, \\uFFFD for example.\n"
" \\U print a 21 bit unicode character, \\U02AF21 for example.\n"
" \\v send a vertical tab\n"
"\n"
" Ending a line with \\ will stop tintin from appending a line feed.\n"
" To escape arguments in an alias or action use %%0 %%1 %%2 etc.\n",
"characters colors coordinates mathematics pcre"
},
{
"EVENT",
"<178>Command<278>: #event <178>{<278>event type<178>}<278>\n"
"\n"
" Events allow you to create triggers for predetermined client events.\n"
"\n"
" Use #event without an argument to see a list of possible events with\n"
" a brief description. Use #event %* to see the current list of defined\n"
" events. Use #info {events} {on} to see events get thrown.\n"
"\n"
" Some events can be prefixed with CATCH to interrupt default behavior.\n"
"\n"
" CATCH \n"
" CHAT MESSAGE %0 default %1 plain\n"
" CLASS ACTIVATED %0 class name\n"
" CLASS DEACTIVATED %0 class name\n"
" DATE %1 month - %3 day %4 hour : %5 minute\n"
" DAY %3 day of the month\n"
" DOUBLE-CLICKED %0 row %1 col %2 -row %3 -col %4 word %5 line\n"
" END OF PATH\n"
" HOUR %4 hour\n"
" IAC \n"
" IAC SB GMCP %0 data %1 raw data\n"
" IAC SB MSSP %0 variable %1 value\n"
" IAC SB MSDP %0 variable %1 value %2 plain value\n"
" IAC SB MSDP %0 variable %1 value %2 plain value\n"
" IAC SB NEW-ENVIRON %0 variable %1 value\n"
" IAC SB ZMP %0 value\n"
" IAC SB %0 raw text %1 raw data\n"
" LONG-CLICKED %0 row %1 col %2 -row %3 -col %4 word %5 line\n"
" MAP ENTER MAP %0 new vnum\n"
" MAP ENTER ROOM %0 new vnum %1 old vnum\n"
" MAP ENTER ROOM %0 new vnum %1 old vnum\n"
" MAP EXIT MAP %0 old vnum\n"
" MAP EXIT ROOM %0 old vnum %1 new vnum\n"
" MAP EXIT ROOM %0 old vnum %1 new vnum\n"
" MAP FOLLOW MAP %0 old vnum %1 new vnum %2 exit name\n"
" MAP MOUSE LOCATION %0 vnum %1 location\n"
" MAP UPDATED VTMAP\n"
" MINUTE %5 minute\n"
" MONTH %1 month\n"
" MOVED %0 row %1 col %2 -row %3 -col %4 word %5 line\n"
" PORT CONNECTION %0 name %1 ip %2 port\n"
" PORT DISCONNECTION %0 name %1 ip %2 port\n"
" PORT MESSAGE %0 data %1 plain data\n"
" PORT LOG MESSAGE %0 name %1 ip %2 port %3 data %4 plain data\n"
" PORT RECEIVED MESSAGE %0 name %1 ip %2 port %3 data %4 plain data\n"
" PRESSED %0 row %1 col %2 -row %3 -col %4 word %5 line\n"
" PROGRAM START %0 startup arguments\n"
" PROGRAM TERMINATION %0 goodbye message\n"
" READ ERROR %0 filename %1 error message\n"
" RECEIVED INPUT %0 raw text\n"
" RECEIVED KEYPRESS %0 raw text %1 unicode index\n"
" RECEIVED LINE %0 raw text %1 plain text\n"
" RECEIVED OUTPUT %0 raw text\n"
" RECEIVED PROMPT %0 raw text %1 plain text\n"
" RELEASED %0 row %1 col %2 -row %3 -col %4 word %5 line\n"
" SCAN CSV HEADER %0 all args %1 arg1 %2 arg2 .. %99 arg99\n"
" SCAN CSV LINE %0 all args %1 arg1 %2 arg3 .. %99 arg99\n"
" SCAN TSV HEADER %0 all args %1 arg1 %2 arg3 .. %99 arg99\n"
" SCAN TSV LINE %0 all args %1 arg1 %2 arg3 .. %99 arg99\n"
" SCREEN FOCUS %0 focus (0 or 1)\n"
" SCREEN LOCATION %0 rows %1 cols %2 height %3 width\n"
" SCREEN MOUSE LOCATION %0-3 screen row/col %4-7 cell row/col %8 loc\n"
" SCREEN RESIZE %0 rows %1 cols %2 height %3 width\n"
" SCREEN SPLIT %0 top row %1 top col %2 bot row %3 bot col\n"
" SCREEN UNSPLIT %0 top row %1 top col %2 bot row %3 bot col\n"
" SCROLLED %0 row %1 col %2 -row %3 -col %4 word %5 line\n"
" SECOND %6 second\n"
" SEND OUTPUT %0 raw text %1 size\n"
" SENT OUTPUT %0 raw text %1 size\n"
" SESSION ACTIVATED %0 name\n"
" SESSION CONNECTED %0 name %1 host %2 ip %3 port\n"
" SESSION CREATED %0 name %1 host %2 ip %3 port\n"
" SESSION DEACTIVATED %0 name\n"
" SESSION DISCONNECTED %0 name %1 host %2 ip %3 port\n"
" SESSION TIMED OUT %0 name %1 host %2 ip %3 port\n"
" SHORT-CLICKED %0 row %1 col %2 -row %3 -col %4 word %5 line\n"
" SWIPED \n"
" %0 dir %1 button %2 row %3 col %4 -row %5 -col %6 row %7 col %8 -row\n"
" %9 -col %10 rows %11 cols\n"
" SYSTEM ERROR %0 name %1 system msg %2 error %3 error msg\n"
" TIME %4 hour : %5 minute : %6 second\n"
" TRIPLE-CLICKED %0 row %1 col %2 -row %3 -col %4 word %5 line\n"
" UNKNOWN COMMAND %0 raw text\n"
" VARIABLE UPDATE %0 name %1 new value\n"
" VARIABLE UPDATED %0 name %1 new value\n"
" VT100 SCROLL REGION %0 top row %1 bot row %2 rows %3 cols %4 wrap\n"
" WEEK %2 day of the week\n"
" WRITE ERROR %0 filename %1 error message\n"
" YEAR %0 year\n"
"\n"
" To see all events trigger use #event info on. Since this can quite\n"
" spammy it's possible to gag event info messages.\n"
"\n"
"<178>Example<278>: #event {SESSION CONNECTED} {#read mychar.tin}\n"
"\n"
"<178>Comment<278>: You can remove an event with the #unevent command.\n",
"button delay ticker"
},
{
"FORALL",
"<178>This command is obsolete, please use foreach instead.\n",
"foreach"
},
{
"FOREACH",
"<178>Command<278>: #foreach <178>{<278>list<178>} {<278>variable<178>} {<278>commands<178>}<278>\n"
"\n"
" For each item in the provided list the foreach statement will update\n"
" the given variable and execute the command part of the statement. List\n"
" elements must be separated by braces or semicolons.\n"
"\n"
"<178>Example<278>: #foreach {bob;tim;kim} {name} {tell $name Hello}\n"
"<178>Example<278>: #foreach {{bob}{tim}{kim}} {name} {tell $name Hello}\n",
"break continue list loop parse repeat return while"
},
{
"FORMAT",
"<178>Command<278>: #format <178>{<278>variable<178>} {<278>format<178>} {<278>argument1<178>} {<278>argument2<178>} {<278>etc<178>}<278>\n"
"\n"
" Allows you to store a string into a variable in the exact same way\n"
" C's sprintf works with a few enhancements and limitations such as\n"
" no integer operations and a maximum of 30 arguments.\n"
"\n"
" If you use #format inside an alias or action you must escape %1s as\n"
" %+1s or %%1s or %\\1s so the %1 isn't substituted by the trigger.\n"
"\n"
" #format {test} {%+9s} {string} pad string with up to 9 spaces\n"
" #format {test} {%-9s} {string} post pad string with up to 9 spaces\n"
" #format {test} {%.8s} {string} copy at most 8 characters\n"
" #format {test} {%a} {number} print corresponding charset character\n"
" #format {test} {%c} {string} use a highlight color name\n"
" #format {test} {%d} {number} print a number with integer formatting\n"
" #format {test} {%f} {string} perform floating point math\n"
" #format {test} {%g} {number} perform thousand grouping on {number}\n"
" #format {test} {%h} {string} turn text into a header line\n"
" #format {test} {%l} {string} lowercase text\n"
" #format {test} {%m} {string} perform mathematical calculation\n"
" #format {test} {%n} {name} capitalize the first letter\n"
" #format {test} {%p} {string} strip leading and trailing spaces\n"
" #format {test} {%r} {string} reverse text, hiya = ayih\n"
" #format {test} {%s} {string} print given string\n"
" #format {test} {%t} {format} display time with strftime format\n"
" optional {{format}{time}} syntax\n"
" #format {test} {%u} {string} uppercase text\n"
" #format {list} {%w} {string} store word wrapped text in {list}\n"
" optional {{string}{width}} syntax\n"
" #format {test} {%x} {hex} print corresponding charset character\n"
" #format {test} {%A} {char} store corresponding character value\n"
" #format {test} {%C} {number} store number in chronological notation\n"
" #format {test} {%D} {hex} convert hex to decimal in {test}\n"
" #format {hash} {%H} {string} store a 64 bit string hash in {hash}\n"
" #format {test} {%L} {string} store the string length in {test}\n"
" #format {test} {%M} {number} convert number to metric in {test}\n"
" #format {test} {%S} {string} store the number of spelling errors\n"
" #format {time} {%T} {} store the epoch time in {time}\n"
" #format {time} {%U} {} store the micro epoch time in {time}\n"
" #format {test} {%X} {dec} convert dec to hexadecimal in {test}\n\n"
" #format {test} {%%} a literal % character\n"
"\n"
"<178>Comment<278>: See #help TIME for help on the %t argument.\n",
"cat echo function local math replace script time variable"
},
{
"FUNCTION",
"<178>Command<278>: #function <178>{<278>name<178>} {<278>operation<178>}<278>\n"
"\n"
" Functions allow you to execute a script within a line of text, and\n"
" replace the function call with the line of text generated by the\n"
" function.\n"
"\n"
" Be aware that each function should set the $result variable at the\n"
" end of the function, or call #return with the given result.\n"
"\n"
" To use a function use the @ character before the function name.\n"
" The function arguments should be placed between braces behind the\n"
" function name with argument separated by semicolons.\n"
"\n"
" The function itself can use the provided arguments which are stored\n"
" in %1 to %9, with %0 holding all arguments.\n"
"\n"
"<178>Example<278>: #function {rnd} {#math {result} {1 d (%2 - %1 + 1) + %1 - 1}}\n"
" #showme A random number between 100 and 200: @rnd{100;200}\n"
"\n"
"<178>Example<278>: #function gettime {#format result %t %H:%M}\n"
" #showme The current time is @gettime{}\n"
"\n"
"<178>Comment<278>: You can remove a function with the #unfunction command.\n",
"format local math replace script variable"
},
{
"GAG",
"<178>Command<278>: #gag <178>{<278>string<178>}<278>\n"
"\n"
" Removes any line that contains the string.\n"
"\n"
"<178>Comment<278>: See '#help action', for more information about triggers.\n"
"\n"
"<178>Comment<278>: You can remove a gag with the #ungag command.\n",
"action highlight prompt substitute"
},
{
"GREETING",
"<268> #<268>##################################################################<268>#\n"
"<268> #<278> <268>#\n"
"<268> #<278> T I N T I N + + "CLIENT_VERSION" <268>#\n"
"<268> #<278> <268>#\n"
// "<268> #<278> <268>T<278>he K<268>i<278>cki<268>n<278> <268>T<278>ickin D<268>i<278>kuMUD Clie<268>n<278>t <268> #\n"
// "<268> #<278> <268>#\n"
"<268> #<278> Code by Peter Unold, Bill Reis, and Igor van den Hoven <268>#\n"
"<268> #<278> <268>#\n"
"<268> #<268>##################################################################<268>#<288>\n",
""
},
{
"GREP",
"<178>Command<278>: #grep <178>[<278>page<178>] {<278>search string<178>}<278>\n"
"\n"
" This command allows you to search for matching lines in your scroll\n"
" back buffer. The amount of matches shown equals your screen size. If\n"
" you want to search back further use the optional page number. You can\n"
" use wildcards for better search results. Be aware the search string\n"
" is case sensitive, which can be disabled by using %i.\n"
"\n"
" By default grep searches from the end of the scrollback buffer to the\n"
" beginning, this can be reversed by using a negative page number.\n"
"\n"
"<178>Example<278>: #grep Bubba tells you\n"
" This will show all occasions where bubba tells you something.\n",
"buffer echo showme"
},
{
"HELP",
"<178>Command<278>: #help <178>{<278>subject<178>}<278>\n"
"\n"
" Without an argument #help will list all available help subjects.\n"
"\n"
" Using #help %* will display all help entries.\n",
"commands debug ignore info message statements"
},
{
"HIGHLIGHT",
"<178>Command<278>: #highlight <178>{<278>string<178>} {<278>color names<178>} {<278>priority<178>}<278>\n"
"\n"
" The highlight command is used to allow you to highlight strings of text.\n"
"\n"
" Available color options are:\n"
"\n"
" reset - resets the color state to default\n"
" light - turns the color light in 16 color mode.\n"
" dark - turns the color dark in 16 color mode.\n"
" underscore - underscores the text.\n"
" blink - makes the text blink.\n"
" reverse - reverse foreground and background color.\n"
" b - makes next color the background color.\n"
"\n"
" Available color names are:\n"
"\n"
" <<888>F06B> - azure <<888>F08F> - Azure\n"
" <<888>F00B> - blue <<888>F00F> - Blue\n"
" <<888>F0BB> - cyan <<888>F0FF> - Cyan\n"
" <<888>F000> - ebony <<888>F666> - Ebony\n"
" <<888>F0B0> - green <<888>F0F0> - Green\n"
" <<888>F0B6> - jade <<888>F0F8> - Jade\n"
" <<888>F6B0> - lime <<888>F8F0> - Lime\n"
" <<888>FB0B> - magenta <<888>FF0F> - Magenta\n"
" <<888>FB60> - orange <<888>FF80> - Orange\n"
" <<888>FB06> - pink <<888>FF08> - Pink\n"
" <<888>FB00> - red <<888>FF00> - Red\n"
" <<888>F888> - silver <<888>FDDD> - Silver\n"
" <<888>F860> - tan <<888>FDB0> - Tan\n"
" <<888>F60B> - violet <<888>F80F> - Violet\n"
" <<888>FBBB> - white <<888>FFFF> - White\n"
" <<888>FBB0> - yellow <<888>FFF0> - Yellow\n"
"\n"
" The %1-99 variables can be used as 'wildcards' that will match with any\n"
" text. They are useful for highlighting a complete line. The %0 variable\n"
" should never be used in highlights.\n"
"\n"
" You may start the string to highlight with a ^ to only highlight text\n"
" if it begins the line.\n"
"\n"
" Besides color names also <<888>abc> color codes can be used.\n"
"\n"
"<178>Example<278>: #high {Valgar} {reverse blink}\n"
" Prints every occurrence of 'Valgar' in blinking reverse video.\n"
"\n"
"<178>Example<278>: #high {^You %1} {bold cyan}\n"
" Boldfaces any line that starts with 'You' in cyan.\n"
"\n"
"<178>Example<278>: #high {Bubba} {red underscore b green}\n"
" Highlights the name Bubba as red underscored text on green background.\n"
"\n"
"<178>Comment<278>: See '#help action', for more information about triggers.\n"
"\n"
"<178>Comment<278>: See '#help substitute', for more advanced color substitution.\n"
"\n"
"<178>Comment<278>: This command only works with ANSI/VT100 terminals or emulators.\n"
"\n"
"<178>Comment<278>: You can remove a highlight with the #unhighlight command.\n",
"action gag prompt substitute"
},
{
"HISTORY",
"<178>Command<278>: #history <178>{<278>delete<178>}<278> Delete the last command.\n"
" #history <178>{<278>insert<178>} {<278>command<178>}<278> Insert a command.\n"
" #history <178>{<278>list<178>}<278> Display the entire command history.\n"
" #history <178>{<278>read<178>} {<278>filename<178>}<278> Read a command history from file.\n"
" #history <178>{<278>write<178>} {<278>filename<178>}<278> Write a command history to file.\n"
"\n"
" Without an argument all available options are shown.\n"
"\n"
" By default all commands are saved to the history list and the history\n"
" list is saved between sessions in the ~/.tintin/history.txt file.\n"
"\n"
" You can set the character to repeat a command in the history with the\n"
" #config {REPEAT CHAR} {} configuration option, by default\n"
" this is set to the exclamation mark.\n"
"\n"
" You can use ! by itself to repeat the last command, or ! to\n"
" repeat the last command starting with the given text.\n"
"\n"
" You can use #config {REPEAT ENTER} {ON} to repeat the last command\n"
" when you press enter on an empty line.\n"
"\n"
" You can press ctrl-r to enter an interactive regex enabled history\n"
" search mode, or by issuing #cursor {history search}.\n"
"\n"
" TinTin++ tries to bind the arrow up and down keys to scroll through\n"
" the history list by default. You can bind these with a macro yourself\n"
" using #cursor {history next} and #cursor {history prev}. Many #cursor\n"
" commands only work properly when bound with a macro.\n",
"alias cursor keypad macro speedwalk tab"
},
{
"IF",
"<178>Command<278>: #if <178>{<278>conditional<178>} {<278>commands if true<178>} {<278>commands if false<178>}<278>\n"
"\n"
" The 'if' command is one of the most powerful commands added since\n"
" TINTIN III. It works similar to an 'if' statement in other languages,\n"
" and is strictly based on the way C handles its conditional statements.\n"
" When an 'if' command is encountered, the conditional statement is\n"
" evaluated, and if TRUE (any non-zero result) the commands are executed.\n"
"\n"
" The 'if' statement is only evaluated if it is read, so you must nest\n"
" the 'if' statement inside another statement (most likely an 'action'\n"
" command). The conditional is evaluated exactly the same as in the\n"
" 'math' command only instead of storing the result, the result is used\n"
" to determine whether to execute the commands.\n"
"\n"
"<178>Example<278>: #action {%0 gives you %1 gold coins.} {#if {%1>5000} {thank %0}}\n"
" If someone gives you more than 5000 coins, thank them.\n"
"\n"
"<178>Comment<278>: See '#help math', for more information.\n",
"case default else elseif switch regex"
},
{
"IGNORE",
"<178>Command<278>: #ignore <178>{<278>listname<178>} {<278>on<178>|<278>off<178>}<278>\n"
"\n"
" Toggles a list on or off. With no arguments it shows your current\n"
" settings, as well as the list names that you can ignore.\n"
"\n"
" If you for example set ACTIONS to OFF actions will no longer trigger.\n"
" Not every list can be ignored.\n",
"class debug info kill message"
},
{
"INDEX",
"<278>"
" On this page you'll find an introduction to using TinTin++. Additional\n"
" information can be found in the individual help sections.\n"
"<128>\n"
" Starting and Ending\n"
"<278>\n"
" The syntax for starting TinTin++ is: ./tt++ [command file]\n"
"\n"
" Read more about the command file in the files section below. Remember\n"
" one thing though. All actions, aliases, substitutions, etc, defined\n"
" when starting up TinTin++ are inherited by all sessions.\n"
"\n"
" If you want to exit TinTin++ type '#end' or press ctrl-d on an empty\n"
" line.\n"
"\n"
" For the WinTin++ users, if you want to paste text use shift-insert,\n"
" text is automatically copied upon selection. This is typical Linux\n"
" behavior, but it can take some getting used to.\n"
"\n"
"<128>\n"
" Basic features\n"
"<278>\n"
" I'll start by explaining some of the very basic and important features:\n"
"\n"
" All TinTin++ commands starts with a '#'.\n"
"\n"
"<178>Example<278>: #help -- #help is a client command, and isn't send to the\n"
" server.\n"
"\n"
" All TinTin++ commands can be abbreviated when typed.\n"
"\n"
" #he -- Typing #he is the same as typing #help though it's suggested to\n"
" use at least 3 letter abbreviations just in case another command is\n"
" added that starts with 'he'.\n"
"\n"
" All commands can be separated with a ';'.\n"
"\n"
" n;l green;s;say Dan Dare is back! -- do these 4 commands\n"
" There are 3 ways ';'s can be overruled.\n"
"\n"
" \\say Hello ;) -- Lines starting with a '\\' aren't parsed by TinTin++.\n"
" say Hello \\;) -- The escape character can escape 1 letter.\n"
" #config verbatim on -- Everything is send as is except '#' commands.\n"
"<128>\n"
" Connecting to a server\n"
"<178>\n"
"Command<278>: #session <178>{<278>session name<178>} {<278>server address<178>} {<278>port<178>}<278>\n"
"\n"
" Example: #session someone tintin.sourceforge.net 4321\n"
"\n"
" You can have more than one session, in which case you can switch\n"
" between sessions typing #.\n"
"\n"
" You can get a list of all sessions by typing: #session. The current\n"
" active session is marked with (active). Snooped sessions with\n"
" (snooped). MCCP sessions (compression) with (mccp 2) and (mccp 3).\n"
"\n"
"<128>\n"
" Split\n"
"<178>\n"
"Command<278>: #split\n"
"\n"
" The split command will create a separated input and output area.\n"
"\n"
" Using the #prompt command you can capture the prompt and place it on\n"
" the split line. To get rid of the split interface you can use #unsplit\n"
" which will restore the terminal settings to default.\n"
"\n"
"<128>\n"
" Alias\n"
"<178>\n"
"Command<278>: #alias <178>{<278>name<178>} {<278>commands<178>}<278>\n"
"\n"
" The syntax of the #alias command is almost like alias in csh.\n"
" Use this command to define aliases. The variables %0, %1.. %9 contain\n"
" the arguments to the aliased command as follows:\n"
" the %0 variable contains ALL the arguments.\n"
" the %1 variable contains the 1st argument\n"
" ....\n"
" the %9 variable contains the 9th argument\n"
"\n"
"<178>Example<278>: #alias greet say Greetings, most honorable %1\n"
"\n"
" If there are no variables on the right-side of the alias definition,\n"
" any arguments following the aliases-command will be appended to the\n"
" command string.\n"
"\n"
"<178>Example<278>: #alias ff cast 'fireball' -- 'ff bob' equals: cast 'fireball' bob\n"
"\n"
" If you want an alias to execute more commands, you must use braces.\n"
"\n"
"<178>Example<278>: #alias ws <178>{<278>wake;stand<178>}<278>\n"
"\n"
" To delete an alias use the #unalias command.\n"
"\n"
" WARNING! TinTin++ doesn't baby sit, and hence does not check for\n"
" recursive aliases! You can avoid recursion by escaping the entire\n"
" line.\n"
"\n"
"<178>Example<278>: #alias put \\put %1 in %2\n"
"\n"
" Or by using the send command.\n"
"\n"
"<178>Example<278>: #send put %1 in %2\n"
"\n"
"\n"
"<128> Action\n"
"\n"
"<178>Command<278>: #action <178>{<278>action-text<178>} {<278>commands<178>}<278>\n"
"\n"
" Use this command to define an action to take place when a particular\n"
" text appears on your screen. There are 99 variables you can use as\n"
" wildcards in the action-text.\n"
"\n"
" These variables are %1, %2, %3 .... %9, %10, %11 ... %97, %98, %99.\n"
"\n"
"<178>Example<278>: #action <178>{<278>You are hungry<178>} {<278>get bread bag;eat bread<178>}<278>\n"
"\n"
"<178>Example<278>: #action <178>{<278>%1 has arrived.<178>}<278> shake %1 -- shake hands with people arriving.\n"
"\n"
"<178>Example<278>: #action <178>{<278>%1 tells you '%2'<178>}\n"
" {<278>tell bob %1 told me '%2'<178>}<278> -- forward tells.\n"
"\n"
"<178>Example<278>: #action <178>{<278>tells you<178>}<278> #bell -- beep on tell.\n"
"\n"
" You can have TinTin++ ignore actions if you type '#ignore actions on'.\n"
"\n"
" You can see what commands TinTin++ executes when an action triggers\n"
" by typing '#debug actions on'.\n"
"\n"
" You can remove actions with the #unaction command.\n"
"\n"
"<128>\n"
" Highlight\n"
"\n"
"<178>Command<278>: #highlight <178>{<278>text<178>} {<278>color<178>}<278>\n"
"\n"
" This command works a bit like #action. The purpose of this command is\n"
" to substitute text from the server with color you provide. This command\n"
" is a simplified version of the #substitute command.\n"
"\n"
"<178>Example<278>: #high <178>{<278>Snowy<178>} {<278>light yellow<178>}<278>\n"
"\n"
"<178>Example<278>: #high <178>{<278>%*Snowy%*<178>} {<278>light yellow<178>}<278>\n"
"\n"
" Use #unhigh to delete highlights.\n"
"\n"
"\n"
" Speedwalk\n"
"\n"
" If you type a command consisting ONLY of letters and numbers n, e, s,\n"
" w, u, d - then this command can be interpreted as a serie of movement\n"
" commands.\n"
"\n"
"<178>Example<278>: ssw2n -- go south, south, west, north, north\n"
"\n"
" If you have problems with typing some commands that actually ONLY\n"
" consists of these letters, then type them in CAPS. For example when\n"
" checking the NEWS or when asked to enter NEW as your name.\n"
"\n"
" You must enable speedwalking with: #config speedwalk on/off.\n"
"\n"
"<128>\n"
" Ticker\n"
"\n"
"<178>Command<278>: #ticker <178>{<278>name<178>} {<278>commands<178>} {<278>seconds<178>}<278>\n"
"\n"
" The name can be whatever you want it to be, and is only required for\n"
" the unticker command. The commands will be executed every x amount of\n"
" seconds, which is specified in the interval part.\n"
"\n"
"<178>Example<278>: #tick <178>{<278>tick<178>} {<278>#delay 50 #show 10 SECONDS TO TICK!;#show TICK!!!<178>} {<278>60<178>}<278>\n"
"\n"
" This creates a ticker with the name <178>{<278>tick<178>}<278> which will print TICK!!!,\n"
" as well as print a warning when the next tick will occure.\n"
"\n"
" You can remove tickers with #untick\n"
"\n"
"<128>\n"
" Command files\n"
"<278>\n"
" When you order TinTin++ to read a command file, it parses all the text\n"
" in the file. You can use command files to keep aliases/actions in,\n"
" login to a server (name, password etc..) and basically all kinds of\n"
" commands.\n"
"\n"
" You can make the command files with either a text editor (suggested),\n"
" or use the #write command to write out a file.\n"
"\n"
" Commands for files:\n"
"\n"
" #read filename -- read and execute the file.\n"
"\n"
" #write filename -- write all actions/aliases/substitutes/etc known for\n"
" the current session to a file.\n"
"\n"
"<128>\n"
" Repeating Commands\n"
"<278>\n"
" You can repeat a command, the syntax is: #number command\n"
"\n"
"<178>Example<278>: #5 cackle -- if you just killed bob the wizard.\n"
"<178>Example<278>: #10 <178>{<278>buy bread;put bread bag<178>}<278> -- repeat these 2 commands 10 times.\n"
"<178>Example<278>: #100 ooc w00t w00t!!!!! -- nochannel yourself.\n"
"\n"
"<128>\n"
" History\n"
"<278>\n"
" TinTin++ has a limited subset of the csh history features.\n"
"\n"
" ! -- repeat the last command\n"
" !cast -- repeat the last command starting with cast\n"
" ctrl-r -- enter the reverse history search mode.\n"
"\n"
"<128>\n"
" Map commands\n"
"<278>\n"
" TinTin++ has a powerful highly configurable automapper. Whenever\n"
" you type n/ne/e/se/s/sw/w/nw/n/u/d tt++ tries to keep track of your\n"
" movement.\n"
"\n"
" Commands for map:\n"
"\n"
" #map create -- create a map.\n"
" #map goto 1 -- go to the first room in the map, created by default.\n"
" #map map -- display the map.\n"
" #map undo -- undo your last map alteration.\n"
" #map write -- save the map to file.\n"
" #map read -- load a map from file.\n"
"\n"
" There are many other map options and it's beyond the scope of this\n"
" help section to explain everything there is to know, but I'll give\n"
" a set of commands that will get most people started.\n"
"\n"
" #map create\n"
" #split 12 1\n"
" #map flag unicode on\n"
" #map flag vt on\n"
" #map goto 1\n"
"\n"
" These commands will create a 12 row vt100 split section at the top of\n"
" your screen where a map drawn using unicode characters is displayed.\n"
"\n"
"<178>Example<278>: #action <178>{<278>There is no exit in that direction.<178>} {<278>#map undo<178>}<278>\n"
"\n"
" The map will be automatically created as you move around.\n"
"\n"
"<128>\n"
" Help\n"
"\n"
"<178>Command<278>: #help <178>{<278>subject<178>}<278>\n"
"\n"
" The help command is your friend and contains the same helpfiles\n"
" inside TinTin++ as are available on the website. If you type #help\n"
" without an argument you will see the various available help subjects\n"
" which try to explain the TinTin++ commands and features in greater\n"
" detail.\n"
"\n"
"<128>\n"
" Enjoy<278>\n",
""
},
{
"INFO",
"<178>Command<278>: #info <178>{<278>listname<178>} {<278>LIST<178>|<278>ON<178>|<278>OFF<178>|<278>SAVE<178>}<278>\n"
"\n"
" Without an argument info displays the settings of every tintin list.\n"
"\n"
" By providing the name of a list and the LIST option it shows all\n"
" triggers/variables associated with that list. With the SAVE option\n"
" This data is written to the info variable.\n"
"\n"
" #info cpu will show information about tintin's cpu usage.\n"
" #info mccp will show information about data compression.\n"
" #info stack will show the low level debugging stack.\n"
" #info session will show some session information.\n"
" #info system will show some system information.\n"
" #info unicode will show information on the provided character.\n",
"class debug ignore kill message"
},
{
"KEYPAD",
"<278>When TinTin++ starts up it sends \\e= to the terminal to enable the terminal's\n"
"application keypad mode, which can be disabled using #showme {\\e>}\n"
"\n"
"<178> Configuration A Configuration B Configuration C<268>\n"
" â•─────┬─────┬─────┬─────╮ â•─────┬─────┬─────┬─────╮ â•─────┬─────┬─────┬─────╮\n"
" │<178>num<268> │<178>/<268> │<178>*<268> │<178>-<268> │ │<178>num<268> │<178>/<268> │<178>*<268> │<178>-<268> │ │<178>Num<268> │<178>nkp/<268> │<178>nkp*<268> │<178>nkp-<268> │\n"
" ├─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┤\n"
" │<178>7<268> │<178>8<268> │<178>9<268> │<178>+<268> │ │<178>Home<268> │<178>Up<268> │<178>PgUp<268> │<178>+<268> │ │<178>nkp7<268> │<178>nkp8<268> │<178>nkp9<268> │<178>nkp+<268> │\n"
" ├─────┼─────┼─────┤ │ ├─────┼─────┼─────┤ │ ├─────┼─────┼─────┤ │\n"
" │<178>4<268> │<178>5<268> │<178>6<268> │ │ │<178>Left<268> │<178>Cntr<268> │<178>Right<268>│ │ │<178>nkp4<268> │<178>nkp5<268> │<178>nkp6<268> │ │\n"
" ├─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┤ ├─────┼─────┼─────┼─────┤\n"
" │<178>1<268> │<178>2<268> │<178>3<268> │<178>Enter<268>│ │<178>End<268> │<178>Down<268> │<178>PgDn<268> │<178>Enter<268>│ │<178>nkp1<268> │<178>nkp2<268> │<178>nkp3<268> │<178>nkpEn<268>│\n"
" ├─────┴─────┼─────┤ │ ├─────┴─────┼─────┤ │ ├─────┴─────┼─────┤ │\n"
" │<178>0<268> │<178>.<268> │ │ │<178>Ins<268> │<178>Del<268><268> │ │ │<178>nkp0<268> │<178>nkp.<268> │ │\n"
" ╰───────────┴─────┴─────╯ ╰───────────┴─────┴─────╯ ╰───────────┴─────┴─────╯\n"
"<278>\n"
"With keypad mode disabled numlock on will give you configuration A, and numlock\n"
"off will give you configuration B. With keypad mode enabled you'll get\n"
"configuration C.\n"
"\n"
"<178>Terminals that support keypad mode"
"\n"
"<278>Linux Console, PuTTY, Eterm, aterm.\n"
"\n"
"<178>Terminals that do not support keypad mode\n"
"\n"
"<278>RXVT on Cygwin, Windows Console, Gnome Terminal, Konsole.\n"
"\n"
"<178>Peculiar Terminals\n"
"\n"
"<278>RXVT requires turning off numlock to enable configuration C.\n"
"\n"
"Xterm may require disabling Alt/NumLock Modifiers (num-lock) in the ctrl-left\n"
"click menu. Or edit ~/.Xresources and add XTerm*VT100.numLock:false\n"
"\n"
"Mac OS X Terminal requires enabling 'strict vt100 keypad behavior' in\n"
"Terminal -> Window Settings -> Emulation.\n",
"colors coordinates escape mathematics pcre"
},
{
"KILL",
"<178>Command<278>: #kill <178>{<278>list<178><178>} {<278>pattern<178>}<278>\n"
"\n"
" Without an argument, the kill command clears all lists. Useful if\n"
" you don't want to exit tintin to reload your command files.\n"
"\n"
" With one argument a specific list can be cleared.\n"
"\n"
" With two arguments the triggers in the chosen list that match the\n"
" given pattern will be removed.\n"
"\n"
"<178>Example<278>: #kill alias %*test*\n",
"class debug ignore info message"
},
{
"LINE",
"<178>Command<278>: #line <178>{<278>option<178>} {<278>argument<178>}<278>\n"
"\n"
" <178>#line background \n"
" <278> Prevent new session activation.\n"
"\n"
" <178>#line capture Argument is executed and output stored in .\n"
"\n"
" <178>#line debug \n"
" <278> Argument is executed in debug mode.\n"
"\n"
" <178>#line gag\n"
" <278> Gag the next line.\n"
"\n"
" <178>#line ignore {argument}\n"
" <278> Argument is executed without any triggers being checked.\n"
"\n"
" <178>#line log [text]\n"
" <278> Log the next line to file unless the [text] argument is\n"
" <278> provided.\n"
"\n"
" <178>#line logmode