希望恢復do 指令

回覆文章
gghowda
文章: 3
註冊時間: 2018-06-17, 12:43

希望恢復do 指令

文章 gghowda » 2018-06-17, 13:02

希望能夠恢復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;
}

jrealm
系統管理員
文章: 1084
註冊時間: 2014-03-31, 23:10

Re: 希望恢復do 指令

文章 jrealm » 2018-06-17, 22:11

這個指令...好像一直都有耶

kiggy
文章: 11
註冊時間: 2018-06-15, 23:46

Re: 希望恢復do 指令

文章 kiggy » 2018-06-21, 02:28

目前do的問題在下數量和一些指令時變成不作用
像是說明寫的 do e,e,e,e 改寫成do 4 e就變無作用

寫 do 2 e,n 2 e會被取消 只走n

jrealm
系統管理員
文章: 1084
註冊時間: 2014-03-31, 23:10

Re: 希望恢復do 指令

文章 jrealm » 2018-06-21, 09:27

4 e 這種類型的指令應該是被取消掉了 (原因不明, 也沒有計劃再開放)
並不是 do 的問題

ps: 系出同源的 windcloud 可以單獨使用 4 e, 不須配合 do 指令

回覆文章