pp-server.tin 12 KB

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