alert.tin 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. ///=== {
  8. ///// 全局警报器是一个公共模块,负责统一管理客户端各模块发出的警报信息,
  9. ///// 并提供统一的操作界面。
  10. ///// };
  11. #var lib_alert[META] {
  12. {NAME} {全局警报器}
  13. {DESC} {统一管理全局警报信息}
  14. {AUTHOR} {担子炮}
  15. };
  16. #nop 如果警报已经被看到,则短时间内不会重复报警。;
  17. VAR {上次看到警报的时间,时间戳} alert-focus {0};
  18. VAR {目前正在进行的警报,列表表格} alert-items {};
  19. load-lib storage;
  20. #func {lib_alert.Init} {
  21. storage.Load {alert} {alert-items};
  22. #return {true};
  23. };
  24. ///=== {
  25. // ## alert.Add <警报原因> [<间隔时间>] [<持续时间>]
  26. // 发出一个警报。每隔一段时间,就用蜂鸣器发出提醒声音。
  27. // 警报必须要有个原因,该原因连同解除该警报的按钮一起,会通过 prompt 显示在信息栏上。
  28. // 玩家可以用不同长短的间隔时间来表达不同的急促程度或其它含义,默认 60 秒。
  29. // 玩家也可以提供一个可选的持续时间,一旦超过持续时间,则警报将自动解除。默认持续时间为 3600 秒。
  30. // 间隔时间和持续时间均以秒为单位。
  31. // 进入警报状态后,某些终端可能会弹出桌面提醒。
  32. // 如果开启了蜂鸣器或者声音播放,你可能会听到声音。
  33. // 警报声会在玩家敲击任意键后暂时抑制,但除非手动关闭了所有信息栏的提示,否则一分钟后警报仍会继续。
  34. // };
  35. #alias {alert.Add} {
  36. #local reason {%1};
  37. #local interval {@defaultNum{%2;60}};
  38. #local duration {@defaultNum{%3;3600}};
  39. #if { @str.Width{reason} == 0 } {
  40. xtt.Usage alert.Add;
  41. #return;
  42. };
  43. alert.Remove {$reason};
  44. #list alert-items add {{
  45. {id} {@str.Plain{$reason}}
  46. {reason} {$reason}
  47. {begin} {@time.Now{}}
  48. {duration} {$duration}
  49. {interval} {$interval}
  50. }};
  51. storage.Save {alert} {alert-items};
  52. alert.perform;
  53. };
  54. ///=== {
  55. // ## alert.Remove <警报原因>
  56. // 解除警报。
  57. // };
  58. #alias {alert.Remove} {
  59. #local id {@str.Plain{%1}};
  60. #local idx {};
  61. #if { &alert-items[] == 0 } {
  62. #return;
  63. };
  64. #list alert-items indexate {id};
  65. #list alert-items find {$id} idx;
  66. #if { $idx > 0 } {
  67. #list alert-items delete {$idx};
  68. storage.Save {alert} {alert-items};
  69. alert.perform;
  70. };
  71. };
  72. #nop 警报持续期间,用本命令来检查并及时删除过期的警报。;
  73. #alias {alert.check} {
  74. #local duration {};
  75. #local changed {false};
  76. #while { &alert-items[] > 0 } {
  77. #local begin {$alert-items[1][begin]};
  78. #local duration {$alert-items[1][duration]};
  79. #local duration {@math.Eval{ $begin + $duration - @time.Now{} }};
  80. #if { $duration <= 0 } {
  81. #list alert-items delete 1;
  82. #local changed {true};
  83. };
  84. #else {
  85. #break;
  86. };
  87. };
  88. #if { @isTrue{$changed} } {
  89. storage.Save {alert} {alert-items};
  90. alert.perform;
  91. };
  92. #if { &alert-items[] > 0 } {
  93. #delay alert.check {alert.check} $duration;
  94. };
  95. };
  96. #alias {alert.beep} {
  97. #if { @time.Now{} - $alert-focus > 60 } {
  98. #bell;
  99. };
  100. };
  101. #alias {alert.perform} {
  102. #untick alert.beep;
  103. #if { &alert-items[] == 0 } {
  104. #var alert-focus {0};
  105. #undelay alert.check;
  106. #unevent {RECEIVED KEYPRESS};
  107. prompt.Set {{alert}{}};
  108. #return;
  109. };
  110. #list alert-items indexate {interval};
  111. #list alert-items order;
  112. #local interval {$alert-items[1][interval]};
  113. xtt.Tick alert.beep {alert.beep} $interval;
  114. #event {RECEIVED KEYPRESS} {#var alert-focus {@time.Now{}}};
  115. #list alert-items indexate {begin};
  116. #list alert-items order;
  117. alert.check;
  118. #local alerts {@fp.Map{{$alert-items}; VALUE[reason]<299>【<129>\@mslp.Exec{alert.Remove VALUE[id];了然}<299>】}};
  119. #list alerts {collapse} { };
  120. prompt.Set {{alert}{$alerts}};
  121. };
  122. #alias {alert.test} {
  123. #nop 奇怪的线索会有奖励;
  124. alert.Add {<129>奇怪的线索};
  125. #nop 推车密信需要及时处理;
  126. alert.Add {<139>推车密信} 30;
  127. #nop 推车乱入提醒手动处理;
  128. alert.Add <119>推车乱入 10;
  129. #nop 比武大会十五分钟内有效;
  130. alert.Add {<139>比武大会} {120} {900};
  131. };