Просмотр исходного кода

feat(GMCP): 添加 GMCP 支持

dzp 3 лет назад
Родитель
Сommit
2970ed92b4
3 измененных файлов с 63 добавлено и 0 удалено
  1. 9 0
      plugins/basic/login.tin
  2. 45 0
      plugins/lib/gmcp.tin
  3. 9 0
      plugins/lib/telnet.tin

+ 9 - 0
plugins/basic/login.tin

@@ -17,6 +17,12 @@
         #class auto-login kill;
         #class auto-login open;
 
+        #nop 如果角色设置了 GMCP 支持,则积极回应服务器的 GMCP 协商请求。;
+        #if { "$user[GMCP]" == "true" } {
+            load-lib gmcp;
+            gmcp.Enable;
+        };
+
         #if { "$session[UTF8]" == "true" } {
             #config {charset} {UTF-8};
         };
@@ -54,6 +60,9 @@
         };
 
         #line oneshot #action {^%s{欢迎来到北大侠客行!|重新连线完毕。}%s$} {
+            #if { "$login[user][GMCP]" == "true" } {
+                gmcp.Subscribe;
+            };
             #delay 0 {
                 #showme 登录成功。;
                 #local handler $login[autoexec];

+ 45 - 0
plugins/lib/gmcp.tin

@@ -0,0 +1,45 @@
+#nop GMCP 支持库;
+
+load-lib telnet;
+load-lib event;
+
+event.define {GMCP.Move}    {无参} {GMCP} {接收到 GMCP 移动信息,已更新 gGMCP[Move]};
+event.define {GMCP.Status}  {无参} {GMCP} {接收到 GMCP 角色状态,已更新 gGMCP[Status]};
+event.define {GMCP.Combat}  {无参} {GMCP} {接收到 GMCP 战斗信息,已更新 gGMCP[Combat]};
+event.define {GMCP.Buff}    {无参} {GMCP} {接收到 GMCP BUFF状态,已更新 gGMCP[Buff]};
+
+#alias {gmcp.Enable} {
+    #event {IAC WILL GMCP} {
+        #send {$TELNET[IAC]$TELNET[DO]$TELNET[GMCP]\};
+    };
+};
+
+#alias {gmcp.Handle} {
+    #local key      {%1};
+    #local handler  {%2};
+
+    #line sub var #event {IAC SB GMCP $key IAC SE} {$handler};
+};
+
+#alias {gmcp.Subscribe} {
+    gmcp.Handle GMCP.Move {
+        #var gGMCP[Move] {%%0};
+        #var gGMCP[Move] {$gGMCP[Move][1]};
+        event.emit GMCP.Move {};
+    };
+
+    gmcp.Handle GMCP.Status {
+        #var gGMCP[Status] {%%0};
+        event.emit GMCP.Status {};
+    };
+
+    gmcp.Handle GMCP.Combat {
+        #var gGMCP[Combat] {%%0};
+        event.emit GMCP.Combat {};
+    };
+
+    gmcp.Handle GMCP.Buff {
+        #var gGMCP[Buff] {%%0};
+        event.emit GMCP.Buff {};
+    };
+};

+ 9 - 0
plugins/lib/telnet.tin

@@ -0,0 +1,9 @@
+#var TELNET[IAC]  {\xFF};
+#var TELNET[DONT] {\xFE};
+#var TELNET[DO]   {\xFD};
+#var TELNET[WONT] {\xFC};
+#var TELNET[WILL] {\xFB};
+#var TELNET[SB]   {\xFA};
+#var TELNET[SE]   {\xF0};
+#var TELNET[GMCP] {\xC9};
+#var TELNET[MXP]  {\x5B};