本帖最后由 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色。 |