瀏覽代碼

feat(bot/pp-server): PP 服务机器人

dzp 3 年之前
父節點
當前提交
089eced13b
共有 1 個文件被更改,包括 409 次插入0 次删除
  1. 409 0
      mud/pkuxkx/plugins/bot/pp-server.tin

+ 409 - 0
mud/pkuxkx/plugins/bot/pp-server.tin

@@ -0,0 +1,409 @@
+#nop vim: set filetype=tt:;
+
+/*
+本文件属于 PaoTin++ 的一部分。
+PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
+你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
+*/
+
+#var pp-server[META] {
+    {NAME}      {PP服务器}
+    {DESC}      {PP 大米专用,为其他人提供 PP 服务}
+    {AUTHOR}    {担子炮}
+};
+
+#nop 普通订单;
+#var pp-svip-order      {};
+#nop VIP 订单;
+#var pp-vip-order       {};
+#nop SVIP 订单;
+#var pp-public-order    {};
+
+#nop VIP 清单;
+#var pp-vip-list        {};
+#nop SVIP 清单;
+#var pp-svip-list       {};
+#nop 黑名单;
+#var pp-black-list      {};
+
+load-lib storage;
+
+#function {pp-server.Init} {
+    storage.Load {pp-server} {pp-vip-list;pp-svip-list;pp-black-list};
+
+    #return {true};
+};
+
+#action {^%u(%w)告诉你:find %*$} {
+    pp.find {%1} {%2} {%3};
+};
+
+#action {^【求助】%1(%2): find %*$} {
+    pp.find {%1} {%2} {%3};
+} {4};
+
+#alias {pp.find} {
+    #local name     {%1};
+    #local uid      {%2};
+    #local qid      {%3};
+
+    #format uid {%l} {$uid};
+    #format uid {%p} {$uid};
+    #format qid {%l} {$qid};
+    #format qid {%p} {$qid};
+
+    #replace qid {%S%s...%s%+1S} {&1 &4};
+
+    #if { "$qid" == "{.*[^a-z ].*|}" } {
+        #return;
+    };
+
+    #local now {};
+    #format now {%T};
+
+    #local order {
+        {name}  {$name}
+        {uid}   {$uid}
+        {qid}   {$qid}
+        {retry} {0}
+        {time}  {$now}
+    };
+
+    #if { &pp-svip-list[$uid][] > 0 } {
+        pp.add-order {pp-svip-order} {$order{source}{SVIP}};
+    };
+    #elseif { &pp-vip-list[$uid][] > 0 } {
+        pp.add-order {pp-vip-order} {$order{source}{VIP}};
+    };
+    #elseif { &pp-black-list[$uid][] > 0 } {
+        infoLog 黑名单用户,跳过;
+    };
+    #elseif { "$pp-invalid-id[$qid]" == "" } {
+        pp.add-order {pp-public-order} {$order{source}{PUBLIC}};
+    };
+
+    pp.check;
+};
+
+#nop 剔重,下单。普通用户只能排队一个订单,VIP/SVIP 可以排队多个订单;
+#alias {pp.add-order} {
+    #local order-list-name  {%1};
+    #local new-order        {%2};
+
+    #if { "$new-order[uid]$new-order[qid]" === "$pp-current-order[uid]$pp-current-order[qid]" } {
+        #return;
+    };
+
+    #local index {};
+    #foreach {*{${order-list-name}[]}} {index} {
+        #local order {${${order-list-name}[$index]}};
+        #if { "$new-order[source]/$order[uid]" === "PUBLIC/$new-order[uid]" } {
+            #var {${order-list-name}[$index]} {$new-order};
+            #return;
+        };
+        #if { "$order[uid]/$order[qid]" === "$new-order[uid]/$new-order[qid]" } {
+            #return;
+        };
+    };
+
+    #list {$order-list-name} add {{$new-order}};
+};
+
+#var pp-working         {false};
+#var pp-current-order   {};
+
+#tick pp.check {pp.check} 1;
+
+#alias {pp.check} {
+    #if { "$pp-working" == "true" } {
+        #return;
+    };
+
+    #local order {};
+
+    #if { &pp-svip-order[] > 0 } {
+        #local order {$pp-svip-order[1]};
+        #list pp-svip-order delete 1;
+    };
+    #elseif { &pp-vip-order[] > 0 } {
+        #local order {$pp-vip-order[1]};
+        #list pp-vip-order delete 1;
+    };
+    #elseif { &pp-public-order[] > 0 } {
+        #local order {$pp-public-order[1]};
+        #list pp-public-order delete 1;
+    };
+
+    #if { "$order" == "" } {
+        pp.idle;
+        #return;
+    };
+
+    #var pp-working {true};
+
+    #var pp-current-order {$order};
+    halt; yun regenerate; pp.do;
+};
+
+#alias {pp.do} {
+    #class pp.do open;
+
+    #local ID {|ID=pp-server};
+
+    #action {^不要频繁的查询,谢谢!{$ID}$} {
+        #class pp.do kill;
+        #delay pp.retry {pp.retry} 1;
+    };
+
+    #nop watch dog,防止未知的服务器反馈导致 pp.do 永远无法结束。;
+    #delay pp.do {
+        #class pp.do kill;
+        #delay pp.retry {pp.retry} 1;
+    } 10;
+
+    #action {^你默运玄功,将功力聚集于耳目,顿时觉得灵台一片空明。{$ID}$} {
+        #class pp.do kill;
+        pp.parse.result;
+        #nop;
+    };
+
+    #nop PP 对象不存在;
+    #action {^现在没这个人。{$ID}$} {
+        #class pp.do kill;
+        pp.add-invalid-id;
+        pp.result 失败;
+    };
+
+    #action {^你的精力不够,无法感应别人的位置。{$ID}$} {
+        #class pp.do kill;
+        pp.result 失败;
+    };
+
+    #class pp.do close;
+
+    infoLog perceive $pp-current-order[qid];
+    perceive $pp-current-order[qid];
+};
+
+#nop CD 期间如果接收到 VIP/SVIP 订单,则放弃普通订单。;
+#alias {pp.retry} {
+    #if { "$pp-current-order[source]" == "PUBLIC" } {
+        #if { &pp-svip-order[] + &pp-vip-order[] > 0 } {
+            #var pp-working {false};
+            pp.check;
+            #return;
+        };
+    };
+
+    pp.do;
+};
+
+#alias {pp.parse.result} {
+    #class pp.parse.result open;
+
+    #action {^你掐指一算,感觉%*(%*)现在好象在%*一带活动。$} {
+        #class pp.parse.result kill;
+        #local qid {%%2};
+        #format qid {%l} {$qid};
+        pp.result 成功 {%%1} {$qid} {%%3};
+    };
+
+    #action {^你费了半天的力气,就是感应不出%*的位置。$} {
+        #class pp.parse.result kill;
+        pp.result 失败 {%%1};
+    };
+
+    #action {^你费了半天的力气,完全无法感应出%*的位置。$} {
+        #class pp.parse.result kill;
+        pp.result 失败 {%%1};
+    };
+
+    #action {^你费了半天的力气,完全感应不出任何状况。$} {
+        #class pp.parse.result kill;
+        pp.result 失败 {};
+    };
+
+    #action {^此人已经隐姓埋名,你费了半天的力气,就是感应不出其位置。$} {
+        #class pp.parse.result kill;
+        pp.add-invalid-id;
+        pp.result 失败 {};
+    };
+
+    #class pp.parse.result close;
+};
+
+#alias {pp.result} {
+    #local answer   {%1};
+    #local qname    {%2};
+    #local qid      {@default{{%3};{$pp-current-order[qid]}}};
+    #local place    {%4};
+
+    #local uname    {$pp-current-order[name]};
+    #local uid      {@default{{$pp-current-order[uid]};{$user[id]}}};
+    #local source   {$pp-current-order[source]};
+
+    #local elapse {};
+    #format elapse {%T};
+    #math elapse {$elapse - $pp-current-order[time]};
+
+    #local prefix {<160>普通订单<070>};
+    #if { "$source" == "VIP" } {
+        #local prefix {<130>VIP 订单<070>};
+    };
+    #elseif { "$source" == "SVIP" } {
+        #local prefix {<150>SVIP订单<070>};
+    };
+
+    #if { "$answer" == "成功" } {
+        #local prefix {【$prefix】【<120>成功<070>】【<120>$uid<070>】【<160>$uname<070>】【<170>$qid<070>】};
+    };
+    #else {
+        #local prefix {【$prefix】【<110>失败<070>】【<120>$uid<070>】【<160>$uname<070>】【<170>$qid<070>】};
+    };
+
+    pp.add-history-id;
+
+    #if { "$answer" == "成功" } {
+        #if { "$qid" == "$pp-current-order[qid]" } {
+            ppLog $prefix【<140>$qname<070>】【<120>$place<070>】【<160>$elapse 秒<070>】;
+            tell $uid 【$qname($qid)】目前在【$place】,快去摁死它吧!;
+        };
+    };
+    #else {
+        #switch {"$source/$qname"} {
+            #case {"PUBLIC/"} {
+                ppLog $prefix【<110>未知<070>】【<110>查无此人<070>】【<160>$elapse 秒<070>】;
+            };
+            #case {"PUBLIC/%+"} {
+                ppLog $prefix【<140>$qname<070>】【<130>感应不到<070>】【<160>$elapse 秒<070>】;
+            };
+            #case {"{VIP|SVIP}/" } {
+                ppLog $prefix【<110>未知<070>】【<110>查无此人<070>】【<160>$elapse 秒<070>】;
+                tell $uid 据我所查,【$qid】已不在人世了;
+            };
+            #case {"{VIP|SVIP}/%+" } {
+                ppLog $prefix【<140>$qname<070>】【<130>感应不到<070>】【<160>$elapse 秒<070>】;
+                tell $uid 恕贫僧道行尚浅,无法查到【$qid】的具体下落,只知其人名曰【$qname】;
+            };
+        };
+    };
+
+    #var pp-working         {false};
+    #var pp-current-order   {};
+};
+
+#nop 最近一段时间查过的 ID;
+#var pp-history-id {};
+
+#alias {pp.add-history-id} {
+    #local {qid} {$pp-current-order[qid]};
+    #local now {};
+    #format now {%T};
+    #var {pp-history-id[$qid]} {$now};
+};
+
+#nop 如果一个 ID 曾经被查到过,后来又查无此人,则认为该 ID 已死亡,标注为无效 ID;
+#var pp-invalid-id {};
+
+#alias {pp.add-invalid-id} {
+    #local {qid} {$pp-current-order[qid]};
+
+    #if { "$pp-history-id[$qid]" == "" } {
+        pp.add-history-id;
+        #return;
+    };
+
+    #local now {};
+    #format now {%T};
+    #unvar {pp-history-id[$qid]};
+    #var {pp-invalid-id[$qid]} {$now};
+};
+
+#tick pp.clean-history {pp.clean-history} 600;
+
+#alias {pp.clean-history} {
+    #local now {};
+    #format now {%T};
+
+    #local id {};
+    #foreach {*pp-invalid-id[]} {id} {
+        #local time {$pp-invalid-id[$id]};
+        #if { $now - $time > 600 } {
+            #unvar {pp-invalid-id[$id]};
+        };
+    };
+
+    #local id {};
+    #foreach {*pp-history-id[]} {id} {
+        #local time {$pp-history-id[$id]};
+        #if { $now - $time > 300 } {
+            #unvar {pp-history-id[$id]};
+        };
+    };
+};
+
+#alias {pp.AddVIP}  {pp.add-list VIP    pp-vip-list   %1};
+#alias {pp.AddSVIP} {pp.add-list SVIP   pp-svip-list  %1};
+#alias {pp.BlockID} {pp.add-list 黑名单 pp-black-list %1};
+
+#alias {pp.add-list} {
+    #local list-name {%1};
+    #local list-var  {%2};
+    #local uid       {@trim{@toLower{%3}}};
+
+    #if { "$uid" != "{[a-z]{3,}}" } {
+        ppLog 添加 $list-name 失败,ID【$uid】格式有误。;
+        #return;
+    };
+
+    #var {${list-var}[$uid]} {
+        {uid}   {$uid}
+    };
+
+    ppLog 【<170>@alignLeft{$list-name;4}维护<070>】【<120>$uid<070>】【共 &{${list-var}[]} 位 VIP】【*{${list-var}[]}】;
+
+    pp.store-vip;
+};
+
+#alias {pp.idle} {
+    #if { $char[HP][最大内力] < $char[Skills][基本内功][jifa-level] * 10 } {
+        pp.dazuo;
+    };
+    #elseif { $char[HP][最大精力] < $char[Skills][基本内功][jifa-level] * 10 } {
+        pp.tuna;
+    };
+};
+
+#alias {pp.tuna} {
+    #if { "$char[HP][忙]" == "true" } {
+        #return;
+    };
+    #if { $char[HP][当前精力] + 10 > $char[HP][最大精力] * 2 } {
+        tuna 10;
+    };
+    #else {
+        #if { $char[HP][精神百分比] < 10 || $char[HP][内力百分比] < 90 } {
+            yun regenerate;
+        };
+        tuna max;
+    };
+};
+
+#alias {pp.dazuo} {
+    #if { "$char[HP][忙]" == "true" } {
+        #return;
+    };
+    #if { $char[HP][当前内力] + 10 > $char[HP][最大内力] * 2 } {
+        dazuo 10;
+    };
+    #else {
+        #if { $char[HP][气血百分比] < 10 || $char[HP][内力百分比] < 90 } {
+            yun recover;
+        };
+        dazuo max;
+    };
+};
+
+#alias {pp.store-vip} {
+    storage.Save {pp-server} {pp-vip-list;pp-svip-list;pp-black-list};
+};