| 本帖最后由 alucar 于 2013-10-5 08:07 PM 编辑 
 
 Action 
 语法:#action {触发语句} {命令} {优先级} 
 #action命令可以对mud服务器发来的特定信息作出回应,并执行一条或多条命令。在触发语句和命令中可以使用%1~99这样的变量,用于替代指定的内容。“优先级”参数是可选的,它决定了这个触发语句生效的优先权,默认值为5。 
 颜色触发语句以“~”号开头,你可以用#config {convert meta} on命令打开颜色代码显示,以便于制作颜色触发。 
 TinTin++用“^”号匹配行首触发,“$”匹配行尾触发。 
 以下内容适用于正则表达式。 
 在触发语句中使用%1、%2……%99可以实现模糊匹配,模糊匹配的内容将被存入变量,并在触发命令中相应地通过%1、%2……%99进行调用。%0比较特殊,它包含所有的匹配内容。除非你在触发语句中直接使用了%0,在这种情况下,%0就与%1一样了。 
 Using { } will embed a Perl CompatibleRegular Expression, available at the next available numeric variable, startingout at %1. 运用{ }可以在匹配语句中使用一个与Perl语言兼容的正则表达式,并通过%1这样的变量来调用。 
 [ ] . + | ( ) ? * are treated as normaltext unlessed used within braces. Keep in mind that { } is replaced with ( ). 在触发语句中,[ ] . +| ( ) ? * 这些符号通常被当作普通文本处理,但在{ }内出现时除外。同时需要注意的是,此时将{ }被( )代替。 (译注:以上关于正则表达式的内容本人没有仔细研究过,也未曾实际使用,不能保证翻译的准确性,因此附上原文供参考) 
 下面是一些常用的通配符: 
   %w 匹配0到任意个字母。   %W 匹配0到任意个非字母。   %d 匹配0到任意个数字。   %D 匹配0到任意个非数字。   %s 匹配0到任意个空格。   %S 匹配0到任意个非空格。 
   %? 匹配0或1个字符。   %. 匹配1个字符。   %+ 匹配1到任意个字符。   %* 匹配0到任意个字符。 
   %i 匹配时不区分大小写。   %I 匹配时区分大小写(默认)。 
 例子:#action {%1(%2)告诉你:%3} {tell %2 我是机器人,啦啦啦~} 
 在使用%d、%*这种不带数字的变量进行触发配置时(译注:相对于%1、%2这样的),引用的时候需要按照其出现的顺序,在上一个数字形式的变量基础上+1。(译注:这段比较绕,对照下面的具体例子会更加清楚一些) 
 例子:#action {%*(%w)告诉你:%*} {tell %2 目前afk中;say %2 告诉我 %3} 例子:#action {%3(%4)告诉你:%*} {tell %4 目前afk中;say %4 告诉我 %5} 
 对于一些采用常规方式难以匹配的语句,可以利用“~”号来制作一个颜色触发。输入#configconvert on可以查看mud输出的颜色代码。 
 例子:#action {~^\e[1;37m%1} {#showme {这是以白色粗体显示的文字:%1}} 
 触发对#showme命令显示的内容有效。 
 注:#unaction命令可以删除触发。 
 如果要删除一个以%*为内容的触发,你需要使用#unaction {%%*}命令。然而,#action {%*} {command}这样的触发是比较危险的,更好的方法是将这个触发放到一个类里,当你不再需要它的时候,就删除这个类。通过这种方式,你可以避免在使用#unact {%*}时误删所有的触发。 
 Alias 
 语法:#alias {别名名称} {命令} 
 #alias命令主要用于缩写一些比较长的指令或者是常用的指令。变量%1~99%可以用来引用别名的参数,分别代表别名命令后的第1个至第99个参数。 
 %0可以用来引用所有的参数,如果别名的命令部分只有一个单词,变量会自动添加到命令之后。 
 例子:#alias {k} {kill %1;exert yihun} 输入 k pantu 就会对慕容叛徒叫杀并运用九阴神功的移魂大法busy对手。 
 你可以在别名的名称部分使用变量以制作一些更加复杂的别名,在这种情况下变量的使用方式也会有所变化。 
 例子:#alias {k%1 with %2} {unwield all;wield %2;kill %1;perform hammer.wushuai} 使用上面这个别名时你就需要输入 k robber with hammer 这样的命令。 
 如果你想要一个能匹配所有输入内容的别名,你可以将别名的名称定义为%*。 
 例子:#alias {%*} {#showme 你输入的内容是:%0} 注:你可以使用#unalias命令删除别名。 
 如果要删除一个以%*为名称的别名,你需要使用#unalias {%%*}命令。然而,更好的方法是将这个别名放到一个类里,当你不再需要它的时候,就删除这个类。通过这种方式,你可以避免在使用#unalias {%*}时误删所有的别名。 
 
 All 
 语法:#all {命令} 
 如果打开了多个session,你可以使用#all将一条命令同时发送到所有的session中。 
 例子:#all quit ——关机了,洗洗睡了。 
 Bell 
 语法:#bell 
 这个命令的作用就是让你的电脑响铃一声。但这个命令已经过时了,最好避免使用,作为替代,你可以用#show {\a}命令向系统发出一个响铃控制符。 
 例子:#action {【江湖传闻】江湖又暂时恢复了表面的宁静} {#showme {\a}} 当你不能保证每时每刻都面对屏幕,但又不想错过系统更新的时候,这个命令就很有用了。如果觉得系统铃声太过单调,你也可以用#system命令来播放一段合适的音乐。 
 在一些终端里你可以使用VT100操作系统的命令来改变终端程序的标题行名称,这也是一种可视化的提醒方法。 
 例子: #action {【江湖传闻】江湖又暂时恢复了表面的宁静} {        #showme {\e]1;更新啦~\e\\};        #delay 10 #showme {\e]1;TinTin++ MUD client\e\\}; }; (译注:以上例子未进行测试) 
 
 Break 
 语法:#break 
 #break命令用于跳出#foreach、#loop、#parse、#switch,以及#while这些命令的循环进程。当执行#bradk命令时,TinTin++会直接跳到上述这些循环命令的后一条指令并执行下去。 
 例子: #math cnt 0; #while {1} {        #math cnt $cnt+1;        #if {$cnt==2} {#break}; }; 
 Buffer 
 语法:#buffer {home|up|down|end|find|get|lock|write|info} 
 #buffer命令可以通过不同的参数对缓冲区的显示内容进行操作。 
 #buffer {home} 
 移动到缓冲区的开始处并显示页面内容,同时锁定滚动条,推荐在宏键中使用。 
 #buffer {up} 
 将缓冲区上翻一页并显示页面内容,同时锁定滚动条,推荐在宏键中使用。 
 #buffer {down} 
 将缓冲区下翻一页并显示页面内容,同时锁定滚动条,推荐在宏键中使用。 
 #buffer {end} 
 移动到缓冲区的结尾处并显示页面内容,同时解除滚动条锁定,推荐在宏键中使用。 
 #buffer {find} {[序号]} {<内容>} 
 在缓冲区里查找指定的内容,<内容>可以使用正则表达式,[序号]是可选项,表示查找第几个指定的对象。 
 #buffer {get} {<变量名>} {<下界>} {[上界]} 
 将缓冲区的一行或多行内容(包括颜色代码)保存到一个变量中,下界与上界必须在1到缓冲区的总行数之间。如果省略上界,那么指定行的内容将被保存到一个标准变量中。如果给定上界,那么上下界之间的内容将被逐行保存到一个list变量中。 
 #buffer {lock} 
 锁定滚动条或解除锁定。当滚动条被锁定时,新的mud信息不会被显示。输入任意命令将解除锁定状态,当然,有一些缓冲区操作指令会重新锁定滚动条。当解除锁定后,窗口会移动到缓冲区的底部并显示相应的页面。 
 #buffer {write} {<文件名>} 
 将缓冲区的内容写入指定的文件。 
 #buffer {info} 
 显示内存占用等缓冲区信息。 
 例子:#macro {(press ctrl-v)(press F1)} {#buffer end} 将F1键设置为滚动到缓冲区底部。 
 例子: #alias {colorsearch} {     #var found null;     #loop 2 20 loop     {        #buffer get name $loop;        #if {"$name" == "\e[1;33m%*"}        {            #var found &1;            #break;        }     } } 上面这个例子会创建一个叫colorsearch的别名,当你输入colorsearch时,TinTin++会在屏幕缓冲区的最近20行内容中查找以黄色粗体显示的文字,并保存到found变量中。 
 
 Case 
 语法:#case {条件} {指令} 
 #case命令只能用在#switch命令的内部,当#case命令中的条件与#switch的一致时,#case命令中的指令部分将被执行。 
 例子:#switch {1d4} {#case 1 hihi;#case 2 hehe;#default grin} 
 
 Chat (译注:本章和下一章的“MudMaster Chat协议”仅供参考,由于较少用到这两章的命令,对该部分的内容未作核实,部分译文可能不够准确与规范) 
 语法:#chat {命令} {参数} 
 #chat命令可以与其他mud客户端建立点对点的连接,通常用于聊天或传输文件。这是一个分散化的聊天系统,这意味着你必须与其他用户交换ip地址和端口号以建立连接。 
 #chat {initialize} {端口号} 
 #chat initialize命令将创建一个聊天服务器,端口号是可选的,默认为4050。在创建聊天服务之后,其他人就能通过你的ip地址和端口号连接到你的服务器,你也就与他们建立了连接。 
 #chat {name} {你的名字} 
 默认情况下你的名字是TinTin,但大部分服务器会限制同名连接,因此在建立连接前你要做的第一件事是更改你的名字。名字中可以包括颜色代码,但有一些名字是不被TinTin++的聊天服务器接受的,比如“all”或者长度超过20个字符的名字。 
 #chat {call} {ip地址} {端口号} 
 #chat call命令用于连接到一个TinTin++聊天服务器,如果你省略端口号,默认的4050端口将被采用。 
 #chat {color} {颜色} 
 默认的聊天颜色是红色粗体,你可以用#chat color命令来进行调整。比如:#chat color bold yellow——调整为黄色粗体。或者你也可以使用支持256色的颜色代码,比如:#chatcolor 。 
 #chat {message} {用户|all} {内容} 
 这是聊天中使用的主要命令,如果你使用了#chat message all,那么这条消息会被作为广播,发送到所有与你连接的对象。 
 #chat {emote} {用户|all} {内容} 
 这个命令的作用与#chatmessage基本一致,只是它会把你的名字加入到发送的消息中。 
 #chat {paste} {用户|all} {内容} 
 这个命令用于在消息后添加新的内容,但要注意,大部分mud客户端都不会正确接受超过40行的信息。 
 #chat {reply} {内容} 
 #chat reply用于回复上一个给你发消息的人。 
 #chat {send} {用户|all} 
 这个命令将向别人发送一个原始的数据串,你需要了解Mud Master Chat协议来使用它。 
 #chat dnd 
 DND表示“不要打扰我”(Do Not Disturb),这个命令用于切换DND状态,当处于DND状态时,将自动拒绝所有新的连接请求。 
 #chat {ip} {地址} 
 当你没有默认的ip时,这个命令用于设置你的ip地址,在你连接到另一个mud客户端时,这个地址会被发送给对方。TinTin++通常忽略报送的ip地址,直接采用实际地址,但其他mud客户端可能会需要这一报送信息。 
 #chat {who} 
 #chat who命令显示所有与你建立连接的人。第一栏为连接号,在给别人发送消息的时候,你可以用这个号码代替他的名字;第二栏为对方的名字;第三栏是标记,可以为P(私人private)、I(忽略ignore)、S(服务serve)、F(转发给forward to)、f(转发自forwardfrom);之后各栏分别为ip地址、端口号、mud客户端名称。 
 #chat {info} 
 这个命令显示你的名字、ip地址、端口号、下载目录、回复(replay)对象,以及DND状态。 
 #chat {ignore} {用户} 
 这个命令将忽略一个用户,使你不再收到他的消息,而且对方并不会察觉到这一点。 
 #chat {private} {用户|all} 
 这个命令将对指定的用户禁用peek和request命令。 
 #chat {public} {用户|all} 
 这个命令是private命令的逆操作,允许指定的用户进行peek和request操作,新建的连接默认是公开(public)的。 
 #chat {peek} {用户} 
 这个命令显示指定用户的公开连接。 
 #chat {request} {用户} 
 这个命令将获取指定用户的公开连接,并自动与他们建立连接。 
 #chat {ping} {用户} 
 这个命令显示你与指定用户之间的连接速度,ping的时间以毫秒为单位。 
 #chat {zap} {用户|all} 
 这个命令将关闭指定的连接。 
 #chat {forward} {用户} 
 这个命令将把所有消息转发给指定用户。为避免陷入循环,当该用户正在向你转发消息时,转发功能会被自动关闭。 
 #chat {forwardall} {用户} 
 这个命令将把屏幕缓冲区里的所有内容转发给指定用户。 
 #chat {serve} {用户} 
 这个命令将把所有的公开消息转发给指定用户,并将该用户发给你的所有公开消息转发给其他与你建立连接的用户。为避免陷入循环,以上消息都作为私人消息转发。 
 #chat {group} {用户} {组名} 
 这个命令将指定的用户归为一组,你可以在emote、message、send命令中使用组名。不带参数的#chat group命令将显示所有的用户和他们所属的组名,与#chat who类似。 
 #chat {sendfile} {用户} {文件名} 
 这个命令用于向指定用户发送一个文件,在对方接受后文件将被传送。 
 #chat {accept} {用户} 
 接受对方发来的文件。 
 #chat {decline} {用户} 
 拒绝对方发送的文件。 
 #chat {cancel} {用户} 
 取消正在传送的文件。 
 #chat {filestat} {用户} 
 显示正在传送的文件的相关信息。 
 #chat {downloaddir} {目录} 
 这个命令用于设置下载文件的存放目录。 
 
 Mud Master Chat Protocol(MudMaster Chat协议) 
 建立一个连接 
 呼叫方: 
 每次新建一个连接的时候,呼叫方发送一条形如“CHAT:\n”的连接字串,字串的格式为:“CHAT:%s\n%s%-5u”。端口号必须是5个字符,位数不足的在右侧添加空格。字串发送后将会等待对方的回复,如果回复为“NO”,呼叫将被取消,如果接收到形如“YES:\n”的回复,表示呼叫已被接受。 
 接收方: 
 检测到呼叫的时候,TinTin++会等待呼叫方发出一个以“CHAT:”开始的字串,回复“NO”字串将拒绝呼叫,回复“YES:\n”字串接受呼叫。 
 Chat数据包 
 Chat数据包是形如“”的字串。所有的数据都需要遵循这一格式,但有两个例外:一是在连接过程中不需要使用数据包;二是在传输文件时数据包是定长的,因此不需要标识。 
 数值对照表: 
 CHAT_NAME_CHANGE                      1 CHAT_REQUEST_CONNECTIONS              2 CHAT_CONNECTION_LIST                  3 CHAT_TEXT_EVERYBODY                   4 CHAT_TEXT_PERSONAL                    5 CHAT_TEXT_GROUP                       6 CHAT_MESSAGE                          7 CHAT_DO_NOT_DISTURB                   8 
 CHAT_VERSION                         19 CHAT_FILE_START                      20 CHAT_FILE_DENY                       21 CHAT_FILE_BLOCK_REQUEST              22 CHAT_FILE_BLOCK                      23 CHAT_FILE_END                        24 CHAT_FILE_CANCEL                     25 CHAT_PING_REQUEST                    26 CHAT_PING_RESPONSE                   27 CHAT_PEEK_CONNECTIONS                28 CHAT_PEEK_LIST                       29 CHAT_SNOOP_START                     30 CHAT_SNOOP_DATA                      31 
 CHAT_END_OF_COMMAND                 255 
 <新的名字> 
 当一个用户改变他的名字的时候,新的名字将被广播给所有连接的用户。 
 
 
 从一个用户处获取所有的公开连接,并与他们建立连接。 
 <地址>,<端口号>,<地址>,<端口号> 
 接收方需要将所有公开连接的ip地址与端口号用逗号分隔,作为一个连接列表发送回去。 
 <消息内容> 
 用于将消息内容发送给所有人,所有显示的内容都需要由发送方生成,包括换行和“ chats to everybody”字串。 
 接收方: 
 如果你没有忽略一个连接,这个字串将被直接显示出来。如果你有部分连接是标记为“服务”的,你将把这个字串广播给这些连接。同时,如果这个字串来自一个被标记为“服务”的连接,你将把这条字串广播给所有的其他连接。这使得那些无法与每个人直接建立连接的人,可以通过第三方服务实现这一目的。 
 <发送的消息> 
 这与CHAT_TEXT_EVERYBODY字串的功能基本一致。当然接收方会从这个字串了解到,这是一条私人消息,从而不会被广播给其他人。 
 接收方: 
 如果没有被忽略的话,仅仅是把这条消息显示出来。 
 <组名><发送的消息> 
 用于将消息发送给特定的组,基本功能与其他发送命令一致。组名是一个15字符的字串,如果长度不足的话,需要在右侧加足空格。 
 接收方: 
 如果没有被忽略的话,仅仅是把这条消息显示出来。 
 <消息> 
 用于将消息发送到一个连接。这个字串应当被用于系统消息,比如接受或拒绝一个连接请求,将一个连接标记为公开或私人的。为了让你的接收方知道一条消息是系统消息,采用下面这样的格式将是一个比较好的办法:“\n %s has refused your connection because your name istoo long.\n” 
 接收方: 
 仅仅显示这条消息。 
 <版本信息> 
 这用于发送你的mud客户端的名称与版本号。 
 <文件名,文件长度> 
 这条字串发送后将开始传送文件。文件名不能是一个目录,文件长度以字节为单位。 
 接收方: 
 首先会确认是否允许这个连接向你发送文件,并检查文件名与文件长度的合法性。如果信息不正确或你不想接受这个文件,你需要返回CHAT_FILE_DENY以停止传输。如果希望继续传输,你需要返回CHAT_FILE_BLOCK_REQUEST来请求相应的数据包。 
 <消息> 
 当你接收到CHAT_FILE_START消息后想中止传输时,你可以使用这条字串。<消息>为拒绝传输的原因,比如,当被传输文件已存在时,你可以回复:“File already exists.” 
 接收方: 
 显示拒绝消息,并关闭所有已打开并准备传输的文件。 
 
 
 在文件传输时用于请求下一个数据包。 
 接收方: 
 需要创建一个用于发送的数据包。数据包是定长的,因此你不需要指定字节数。如果已到达文件尾部,你需要发送CHAT_FILE_END字串,以关闭文件并通知对方传输完毕。 
 <数据包> 
 一个数据包的长度是500字节,这个长度是固定的,因此不需要添加CHAT_END_OF_COMMAND。 
 接收方: 
 接收方需要始终关注接收到的每一个字节,以正确写入数据包,并预计什么时候将达到文件的尾部,此时数据包的长度将小于500字节。文件传输是由接收方驱动的,因此每完成一个数据包的接收,你都需要返回一个CHAT_FILE_BLOCK_REQUEST字串,以请求下一个数据包。 
 
 
 关闭文件完成传输。TinTin++不需要用到这个字串,因为TinTin++将自动跟踪文件传输进程。 
 
 
 文件传输的双方都可以发出这个字串来中止传输。 
 <时序数据> 
 时序数据取决于ping的请求方,TinTin++发送的是64比特的时戳。 
 <时序数据> 
 当接收到一个CHAT_PING_REQUEST字串后,你应当返回一个时序数据。 
 
 
 发送方请求提供所有的公开连接的情况。 
 地址>~<端口号>~<名字>~ 
 接收方需要将所有公开连接的ip地址,端口号,名称以“~”号隔开,作为一个列表发送回去。 
 
 
 发送方请求启动或停止观察一个连接的信息,接收方可以决定是否允许对方进行观察。 
 <消息> 
 这条字串由一个处于观察或转发状态的mud客户端发出,<消息>将被接收方显示出来,但不会再次转发,以防止陷入循环。 
 
 Class 
 语法:#class {类名} {open|close|read 文件名|write 文件名|kill} 
 #class {<类名>} {open} 
 {open}选项将打开一个类并自动关闭上一个打开的类(如果有的话),在此之后新建的所有触发、别名、变量等都会被标记为这个类,直到这个类被关闭。 
 #class {<类名>} {close} 
 {close}选项会关闭当前打开的类。 
 #class {<类名>} {read} {<文件名>} 
 {read}选项会打开一个类,读入指定的文件,最后关闭这个类。(译注:即把命令文件中的触发、别名、变量等都放到一个类里) 
 #class {<类名>} {write} {<文件名>} 
 {write}选项将把指定类中的所有触发(译注:也包括别名、变量等内容)写入文件。这个命令可以用来保存数据,比如你可以先把一个变量放进一个类,然后利用这条命令保存变量的内容。 
 #class {<类名>} {kill} 
 {kill}选项将删除一个类,包括属于这个类的所有触发。(译注:也包括别名、变量等) 
 
 ANSI Colors(ANSI颜色代码) 
 语法:其中a、b、c为参数 
 参数a:VT100代码 
 0 – 默认 1 – 亮色 2 – 暗色 4 – 下划线 5 – 闪烁 7 – 反色(前景色与背景色互换) 8 – 跳过 (译注:TinTin++并不支持文字闪烁显示,这里的代码5只是将背景色亮化以突出显示;代码8原文为skip,具体作用不详) 
 参数b:前景色 参数c:背景色 
 0 – 黑色       5 – 粉色 1 – 红色       6 – 青色 2 – 绿色       7 – 白色 3 – 黄色       8 – 跳过 4 – 蓝色       9 – 默认 
 Xterm 256色代码 对于支持xterm 256色的终端,可以用到设置前景色,用到设置背景色。 
 对于支持灰度的终端,可以用到设置前景色,用到设置背景色。 
 例子:#showme <034>T<025>i<016>n<007>T<043>i<052>n<061>+<070>+<088> 试着在TinTin++中执行上面的命令并观察结果。 
 例子:#showme  橙色 青绿 靛紫 天蓝 玫红 试着在TinTin++中执行上面的命令并观察结果,你的终端必须支持xterm 256色。 |