希望能夠恢復do 的指令功能!!
#include <ansi.h>
// 取得第一個逗號的位置
int parse (string arg)
{
int i, k;
int n;
i = 0; k = 0; n = strlen (arg);
arg += ","; // 這樣才可以讓 ,, 的判斷正常
for (i=0; i<n; i++) {
if (arg == '"')
if (arg[i+1] == '"') {
i++;
continue;
}
else k = !k;
else if (arg != ',') continue;
else if (k) continue;
else if (arg[i+1] == ',')
i++;
else break;
}
return i-1;
}
// 跳過空白部份, 使得 "l,hp", "l, hp" 跟 "l, hp" 都可以用
int skip_space(string arg)
{
int i, n;
i = 0;
n = strlen (arg);
while ( i<n && arg == ' ') i++;
return i;
}
// 放棄特殊字元, 如兩個雙括號, 以及兩個逗號其實只是一個逗號而已
string discard (string arg)
{
string msg;
int i, n;
if (!arg || arg == "") return arg;
n = strlen(arg);
arg += ","; // 這理由跟 parse() 裡的一樣
msg = "";
for (i=0; i<n; i++)
if ((arg == ',' && arg[i+1] == ',') ||
(arg == '"' && arg[i+1] == '"'))
{
i++;
msg += arg[i..i];
}
else if (arg == '"') continue;
else msg += arg[i..i];
return msg;
}
int main(object me, string cmds, int depth, int in_do)
{
string cmd, other;
int i, j, n;
if (!cmds || cmds == "") return 0;
// 最多十九層
//if (depth >= 19) return 0;
if (depth > 5 ) return 0;
// 取出第一個逗號位置
if (cmds == "") return 1;
i = parse(cmds);
if (i == -1) return 0;
j = skip_space(cmds);
if (i<j) return 0;
// 順便保留其他部份
cmd = cmds[j..i];
if ((i+2) < (n=strlen(cmds))) other = cmds[i+2..n-1];
cmd = discard(cmd);
// 此時 cmd 已經是 do 裡的內容, 我們不允許 do 裡還有 do
if (cmd[0..1] == "do") return 0;
// 硬性規定在 do 裡頭的一定是 brief mode
if (!in_do) {
n = me->query_temp("brief_mode");
me->set_temp("brief_mode",1);
}
// 每個命令本身可能是 alias, 所以先送去 alias.c 裡的 process_input 處理過
// 然後再送進 /feature/commamd.c 處理
me->do_command(me->process_input (cmd));
if ( other && other != "" )
// 最後的參數 1 代表在 do 命令裡, 這是為了 brief mode 用的
// call_other(this_object(),"main", me, other, depth+1, 1);
main (me, other, depth+1, 1);
// 把 brief mode 還原
me->set_temp("brief_mode",n);
return 1;
}
int help(object me)
{
write(@HELP
指令格式 : do
指令說明 :
這個指令可以讓你以更方便的方式下命令,
1. do: 你可以用 do 來一次下多個命命,如:
do e,e,e,s,e,n,e
2. 你可以下 10 e 代替連按十次 e
4 e 跟 do e,e,e,e 是一樣的意思
3. 以上兩種會在說話或者 channel 中有逗號時發生問題
do 'hello, wade, smile
解決之道是用雙引號,或者雙逗號
do '"hello, wade",smile
do 'hello,, wade, smile
4. 如果要用到雙括號,解法就是用兩個連續雙括號,
譬如你要說 "你" 則可以用:
do '""你"" 是大笨蛋,giggle
5. 執行上一命令: 請直接用 !
如果驚嘆號後面有東西, 會加進去, 例如你原來是:
smile <-- 後來發現應該加個對象 wade
! wade <-- 等於 smile wade
注意喔,是一個驚嘆號喔
6. 修改, 例如你原先想打 smile 卻不小心打成 smille
^ll^l <-- 把所有 ll 改成 l
其他參考 :
tune,alias,semote
HELP
);
return 1;
}
希望恢復do 指令
Re: 希望恢復do 指令
目前do的問題在下數量和一些指令時變成不作用
像是說明寫的 do e,e,e,e 改寫成do 4 e就變無作用
寫 do 2 e,n 2 e會被取消 只走n
像是說明寫的 do e,e,e,e 改寫成do 4 e就變無作用
寫 do 2 e,n 2 e會被取消 只走n
Re: 希望恢復do 指令
4 e 這種類型的指令應該是被取消掉了 (原因不明, 也沒有計劃再開放)
並不是 do 的問題
ps: 系出同源的 windcloud 可以單獨使用 4 e, 不須配合 do 指令
並不是 do 的問題
ps: 系出同源的 windcloud 可以單獨使用 4 e, 不須配合 do 指令