busy.tin 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. ///=== {
  8. ///// busy 模块向其它模块提供 busy 检查机制。
  9. ///// };
  10. #var basic_busy[META] {
  11. {NAME} {busy检查}
  12. {DESC} {检查角色是否处于 busy 状态,并在 busy 结束时回调代码}
  13. {AUTHOR} {担子炮}
  14. };
  15. #func {basic_busy.Init} {
  16. event.Handle {char/nobusy} {busy.on-idle} {basic/busy} {busy.on-idle};
  17. #return {true};
  18. };
  19. VAR {正在等待的回调列表} busy.wait-list {};
  20. ///=== {
  21. // ## busy.Wait <回调代码>
  22. // 检查角色是否处于 busy 状态,如果是,则等待 busy 状态结束后执行回调代码。
  23. // 否则立即执行回调代码。
  24. // };
  25. #alias {busy.Wait} {
  26. #local code {%1};
  27. #local len {&busy.wait-list[]};
  28. #list busy.wait-list add {{$code}};
  29. #if { $len == 0 } {
  30. #if { @isTrue{$char[HP][忙]} } {
  31. #delay busy.checkbusy {checkbusy} 10;
  32. };
  33. #else {
  34. #delay busy.checkbusy {checkbusy} 0;
  35. };
  36. };
  37. };
  38. ///=== {
  39. // ## busy.Halt <回调代码>
  40. // 检查角色是否处于 busy 状态,如果是,则用 halt 解除 busy,解除成功后,执行回调代码。
  41. // 否则立即执行回调代码。
  42. // };
  43. #alias {busy.Halt} {
  44. #local code {%1};
  45. #if { "$code" == "" } {
  46. #local code {#untick busy.Halt};
  47. };
  48. #else {
  49. #local code {
  50. #untick busy.Halt;
  51. $code;
  52. };
  53. };
  54. busy.Wait {$code};
  55. #if { @isTrue{$char[HP][忙]} } {
  56. halt;
  57. };
  58. #tick busy.Halt {halt; checkbusy} 1;
  59. };
  60. #alias {busy.on-idle} {
  61. #undelay busy.checkbusy;
  62. #undelay busy.on-idle;
  63. #untick busy.Halt;
  64. #local todo {$busy.wait-list};
  65. #var busy.wait-list {};
  66. #while { &todo[] > 0 } {
  67. #local code {$todo[1]};
  68. #list todo delete 1;
  69. $code
  70. };
  71. };
  72. #action {^你正忙{|ID=basic/busy}$} {
  73. #undelay busy.on-idle;
  74. #if { &busy.wait-list[] == 0 } {
  75. #return;
  76. };
  77. #if { @isTrue{$gGMCP[Channels][Status]} } {
  78. #delay busy.checkbusy {checkbusy} 10;
  79. };
  80. #else {
  81. #delay busy.checkbusy {checkbusy} 1;
  82. };
  83. #line gag;
  84. };
  85. #action {^你不忙{|ID=basic/busy}$} {
  86. #undelay busy.checkbusy;
  87. #delay {busy.on-idle} {busy.on-idle} 0;
  88. #line gag;
  89. };