pp-server.tin 12 KB

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