/****************************************************************************** * 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