pp-server.tin 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. #var bot_pp-server[META] {
  8. {NAME} {PP服务器}
  9. {DESC} {PP 大米专用,为其他人提供 PP 服务}
  10. {AUTHOR} {担子炮}
  11. };
  12. #nop 普通订单;
  13. #var pp-svip-order {};
  14. #nop VIP 订单;
  15. #var pp-vip-order {};
  16. #nop SVIP 订单;
  17. #var pp-public-order {};
  18. #nop VIP 清单;
  19. #var pp-vip-list {};
  20. #nop SVIP 清单;
  21. #var pp-svip-list {};
  22. #nop 黑名单;
  23. #var pp-black-list {};
  24. load-lib storage;
  25. #func {bot_pp-server.Init} {
  26. storage.Load {pp-server} {pp-vip-list;pp-svip-list;pp-black-list};
  27. #return {true};
  28. };
  29. #action {^%u(%w)告诉你:find %*$} {
  30. pp.find {%1} {%2} {%3};
  31. };
  32. #action {^【求助】%1(%2): find %*$} {
  33. pp.find {%1} {%2} {%3};
  34. } {4};
  35. #alias {pp.find} {
  36. #local name {%1};
  37. #local uid {%2};
  38. #local qid {%3};
  39. #format uid {%l} {$uid};
  40. #format uid {%p} {$uid};
  41. #format qid {%l} {$qid};
  42. #format qid {%p} {$qid};
  43. #replace qid {%S%s...%s%+1S} {&1 &4};
  44. #if { "$qid" == "{.*[^a-z ].*|}" } {
  45. #return;
  46. };
  47. #local now {};
  48. #format now {%T};
  49. #local order {
  50. {name} {$name}
  51. {uid} {$uid}
  52. {qid} {$qid}
  53. {retry} {0}
  54. {time} {$now}
  55. };
  56. #if { &pp-svip-list[$uid][] > 0 } {
  57. pp.add-order {pp-svip-order} {$order{source}{SVIP}};
  58. };
  59. #elseif { &pp-vip-list[$uid][] > 0 } {
  60. pp.add-order {pp-vip-order} {$order{source}{VIP}};
  61. };
  62. #elseif { &pp-black-list[$uid][] > 0 } {
  63. infoLog 黑名单用户,跳过;
  64. };
  65. #elseif { "$pp-invalid-id[$qid]" == "" } {
  66. pp.add-order {pp-public-order} {$order{source}{PUBLIC}};
  67. };
  68. pp.check;
  69. };
  70. #nop 剔重,下单。普通用户只能排队一个订单,VIP/SVIP 可以排队多个订单;
  71. #alias {pp.add-order} {
  72. #local order-list-name {%1};
  73. #local new-order {%2};
  74. #if { "$new-order[uid]$new-order[qid]" === "$pp-current-order[uid]$pp-current-order[qid]" } {
  75. #return;
  76. };
  77. #local index {};
  78. #foreach {*{${order-list-name}[]}} {index} {
  79. #local order {${${order-list-name}[$index]}};
  80. #if { "$new-order[source]/$order[uid]" === "PUBLIC/$new-order[uid]" } {
  81. #var {${order-list-name}[$index]} {$new-order};
  82. #return;
  83. };
  84. #if { "$order[uid]/$order[qid]" === "$new-order[uid]/$new-order[qid]" } {
  85. #return;
  86. };
  87. };
  88. #list {$order-list-name} add {{$new-order}};
  89. };
  90. #var pp-working {false};
  91. #var pp-current-order {};
  92. #tick pp.check {pp.check} 1;
  93. #alias {pp.check} {
  94. #if { "$pp-working" == "true" } {
  95. #return;
  96. };
  97. #local order {};
  98. #if { &pp-svip-order[] > 0 } {
  99. #local order {$pp-svip-order[1]};
  100. #list pp-svip-order delete 1;
  101. };
  102. #elseif { &pp-vip-order[] > 0 } {
  103. #local order {$pp-vip-order[1]};
  104. #list pp-vip-order delete 1;
  105. };
  106. #elseif { &pp-public-order[] > 0 } {
  107. #local order {$pp-public-order[1]};
  108. #list pp-public-order delete 1;
  109. };
  110. #if { "$order" == "" } {
  111. pp.idle;
  112. #return;
  113. };
  114. #var pp-working {true};
  115. #var pp-current-order {$order};
  116. halt; yun regenerate; pp.do;
  117. };
  118. #alias {pp.do} {
  119. #class pp.do open;
  120. #local ID {|ID=pp-server};
  121. #action {^不要频繁的查询,谢谢!{$ID}$} {
  122. #class pp.do kill;
  123. #delay pp.retry {pp.retry} 1;
  124. };
  125. #nop watch dog,防止未知的服务器反馈导致 pp.do 永远无法结束。;
  126. #delay pp.do {
  127. #class pp.do kill;
  128. #delay pp.retry {pp.retry} 1;
  129. } 10;
  130. #action {^你默运玄功,将功力聚集于耳目,顿时觉得灵台一片空明。{$ID}$} {
  131. #class pp.do kill;
  132. pp.parse.result;
  133. #nop;
  134. };
  135. #nop PP 对象不存在;
  136. #action {^现在没这个人。{$ID}$} {
  137. #class pp.do kill;
  138. pp.add-invalid-id;
  139. pp.result 失败;
  140. };
  141. #action {^你的精力不够,无法感应别人的位置。{$ID}$} {
  142. #class pp.do kill;
  143. pp.result 失败;
  144. };
  145. #class pp.do close;
  146. infoLog perceive $pp-current-order[qid];
  147. perceive $pp-current-order[qid];
  148. };
  149. #nop CD 期间如果接收到 VIP/SVIP 订单,则放弃普通订单。;
  150. #alias {pp.retry} {
  151. #if { "$pp-current-order[source]" == "PUBLIC" } {
  152. #if { &pp-svip-order[] + &pp-vip-order[] > 0 } {
  153. #var pp-working {false};
  154. pp.check;
  155. #return;
  156. };
  157. };
  158. pp.do;
  159. };
  160. #alias {pp.parse.result} {
  161. #class pp.parse.result open;
  162. #action {^你掐指一算,感觉%*(%*)现在好象在%*一带活动。$} {
  163. #class pp.parse.result kill;
  164. #local qid {%%2};
  165. #format qid {%l} {$qid};
  166. pp.result 成功 {%%1} {$qid} {%%3};
  167. };
  168. #action {^你费了半天的力气,就是感应不出%*的位置。$} {
  169. #class pp.parse.result kill;
  170. pp.result 失败 {%%1};
  171. };
  172. #action {^你费了半天的力气,完全无法感应出%*的位置。$} {
  173. #class pp.parse.result kill;
  174. pp.result 失败 {%%1};
  175. };
  176. #action {^你费了半天的力气,完全感应不出任何状况。$} {
  177. #class pp.parse.result kill;
  178. pp.result 失败 {};
  179. };
  180. #action {^此人已经隐姓埋名,你费了半天的力气,就是感应不出其位置。$} {
  181. #class pp.parse.result kill;
  182. pp.add-invalid-id;
  183. pp.result 失败 {};
  184. };
  185. #class pp.parse.result close;
  186. };
  187. #alias {pp.result} {
  188. #local answer {%1};
  189. #local qname {%2};
  190. #local qid {@default{{%3};{$pp-current-order[qid]}}};
  191. #local place {%4};
  192. #local uname {$pp-current-order[name]};
  193. #local uid {@default{{$pp-current-order[uid]};{$user[id]}}};
  194. #local source {$pp-current-order[source]};
  195. #local elapse {};
  196. #format elapse {%T};
  197. #math elapse {$elapse - $pp-current-order[time]};
  198. #local prefix {<169>普通订单<299>};
  199. #if { "$source" == "VIP" } {
  200. #local prefix {<139>VIP 订单<299>};
  201. };
  202. #elseif { "$source" == "SVIP" } {
  203. #local prefix {<159>SVIP订单<299>};
  204. };
  205. #if { "$answer" == "成功" } {
  206. #local prefix {【$prefix】【<129>成功<299>】【<129>$uid<299>】【<169>$uname<299>】【<179>$qid<299>】};
  207. };
  208. #else {
  209. #local prefix {【$prefix】【<119>失败<299>】【<129>$uid<299>】【<169>$uname<299>】【<179>$qid<299>】};
  210. };
  211. pp.add-history-id;
  212. #if { "$answer" == "成功" } {
  213. #if { "$qid" == "$pp-current-order[qid]" } {
  214. ppLog $prefix【<149>$qname<299>】【<129>$place<299>】【<169>$elapse 秒<299>】;
  215. tell $uid 【$qname($qid)】目前在【$place】,快去摁死它吧!;
  216. };
  217. };
  218. #else {
  219. #switch {"$source/$qname"} {
  220. #case {"PUBLIC/"} {
  221. ppLog $prefix【<119>未知<299>】【<119>查无此人<299>】【<169>$elapse 秒<299>】;
  222. };
  223. #case {"PUBLIC/%+"} {
  224. ppLog $prefix【<149>$qname<299>】【<139>感应不到<299>】【<169>$elapse 秒<299>】;
  225. };
  226. #case {"{VIP|SVIP}/" } {
  227. ppLog $prefix【<119>未知<299>】【<119>查无此人<299>】【<169>$elapse 秒<299>】;
  228. tell $uid 据我所查,【$qid】已不在人世了;
  229. };
  230. #case {"{VIP|SVIP}/%+" } {
  231. ppLog $prefix【<149>$qname<299>】【<139>感应不到<299>】【<169>$elapse 秒<299>】;
  232. tell $uid 恕贫僧道行尚浅,无法查到【$qid】的具体下落,只知其人名曰【$qname】;
  233. };
  234. };
  235. };
  236. #var pp-working {false};
  237. #var pp-current-order {};
  238. };
  239. #nop 最近一段时间查过的 ID;
  240. #var pp-history-id {};
  241. #alias {pp.add-history-id} {
  242. #local {qid} {$pp-current-order[qid]};
  243. #local now {};
  244. #format now {%T};
  245. #var {pp-history-id[$qid]} {$now};
  246. };
  247. #nop 如果一个 ID 曾经被查到过,后来又查无此人,则认为该 ID 已死亡,标注为无效 ID;
  248. #var pp-invalid-id {};
  249. #alias {pp.add-invalid-id} {
  250. #local {qid} {$pp-current-order[qid]};
  251. #if { "$pp-history-id[$qid]" == "" } {
  252. pp.add-history-id;
  253. #return;
  254. };
  255. #local now {};
  256. #format now {%T};
  257. #unvar {pp-history-id[$qid]};
  258. #var {pp-invalid-id[$qid]} {$now};
  259. };
  260. #tick pp.clean-history {pp.clean-history} 600;
  261. #alias {pp.clean-history} {
  262. #local now {};
  263. #format now {%T};
  264. #local id {};
  265. #foreach {*pp-invalid-id[]} {id} {
  266. #local time {$pp-invalid-id[$id]};
  267. #if { $now - $time > 600 } {
  268. #unvar {pp-invalid-id[$id]};
  269. };
  270. };
  271. #local id {};
  272. #foreach {*pp-history-id[]} {id} {
  273. #local time {$pp-history-id[$id]};
  274. #if { $now - $time > 300 } {
  275. #unvar {pp-history-id[$id]};
  276. };
  277. };
  278. };
  279. #alias {pp.AddVIP} {pp.add-list VIP pp-vip-list %1};
  280. #alias {pp.AddSVIP} {pp.add-list SVIP pp-svip-list %1};
  281. #alias {pp.BlockID} {pp.add-list 黑名单 pp-black-list %1};
  282. #alias {pp.add-list} {
  283. #local list-name {%1};
  284. #local list-var {%2};
  285. #local uid {@str.Trim{@str.ToLower{%3}}};
  286. #if { "$uid" != "{[a-z]{3,}}" } {
  287. ppLog 添加 $list-name 失败,ID【$uid】格式有误。;
  288. #return;
  289. };
  290. #var {${list-var}[$uid]} {
  291. {uid} {$uid}
  292. };
  293. ppLog 【<179>@str.AlignLeft{$list-name;4}维护<299>】【<129>$uid<299>】【共 &{${list-var}[]} 位 VIP】【*{${list-var}[]}】;
  294. pp.store-vip;
  295. };
  296. #alias {pp.idle} {
  297. #if { $char[HP][最大内力] < $char[Skills][基本内功][jifa-level] * 10 } {
  298. pp.dazuo;
  299. };
  300. #elseif { $char[HP][最大精力] < $char[Skills][基本内功][jifa-level] * 10 } {
  301. pp.tuna;
  302. };
  303. };
  304. #alias {pp.tuna} {
  305. #if { "$char[HP][忙]" == "true" } {
  306. #return;
  307. };
  308. #if { $char[HP][当前精力] + 10 > $char[HP][最大精力] * 2 } {
  309. tuna 10;
  310. };
  311. #else {
  312. #if { $char[HP][精神百分比] < 10 || $char[HP][内力百分比] < 90 } {
  313. yun regenerate;
  314. };
  315. tuna max;
  316. };
  317. };
  318. #alias {pp.dazuo} {
  319. #if { "$char[HP][忙]" == "true" } {
  320. #return;
  321. };
  322. #if { $char[HP][当前内力] + 10 > $char[HP][最大内力] * 2 } {
  323. dazuo 10;
  324. };
  325. #else {
  326. #if { $char[HP][气血百分比] < 10 || $char[HP][内力百分比] < 90 } {
  327. yun recover;
  328. };
  329. dazuo max;
  330. };
  331. };
  332. #alias {pp.store-vip} {
  333. storage.Save {pp-server} {pp-vip-list;pp-svip-list;pp-black-list};
  334. };