sync.tin 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分。
  4. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  5. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  6. */
  7. ///=== {
  8. ///// sync 是一个服务器同步机制,可以确保服务器已经处理完了之前发送的命令队列。
  9. ///// 假设服务器是按照顺序处理客户端发送的命令,那么因为存在网络延迟,因此客户端
  10. ///// 可能已经发送了多个命令在网络上,但还没有到达服务器,或者服务器因为繁忙所以
  11. ///// 将其放入了命令缓冲队列尚未响应。
  12. /////
  13. ///// 但有些时候,客户端需要明确服务器是否已经处理了之前发送的命令。此时可以使用
  14. ///// 本模块。其基本原理是,通过发送别致同步符号,并请求服务器回显该符号,以等待
  15. ///// 服务器处理完之前发送的命令。如果收到了服务器的回显,则认为命令缓冲已空,并
  16. ///// 可以进行后续操作。
  17. ///// };
  18. #var lib_sync[META] {
  19. {NAME} {服务器同步}
  20. {DESC} {和服务器进行同步,本模块为北侠版}
  21. {AUTHOR} {担子炮}
  22. {NOTE} {}
  23. {CONFIG} {}
  24. };
  25. #nop sync.UUID 可以用来生成一个唯一的同步符号。;
  26. #func {sync.UUID} {
  27. #return {@uuid{}};
  28. };
  29. /*
  30. sync.Wait 可以用来和服务器进行同步,该方法有两个参数:
  31. 1. 回调代码
  32. 回调代码会在与服务器同步之后执行。
  33. 2. 同步符号(可选)
  34. 同步符号参数用来对本次同步进行唯一标识,只能由字母、数字、汉字、减号构成。
  35. 不能包含空格、分号等在 TinTin++ 中有特殊含义的字符。
  36. 也不能包含在正则表达式中有特殊含义的字符。
  37. 本参数为可选值,如果省略,则无法通过 sync.Ignore 取消回调
  38. */
  39. #alias {sync.Wait} {
  40. #local callback {%1};
  41. #local uuid {%2};
  42. #if { {$callback} == {} } {
  43. errLog 回调代码不能为空;
  44. #return;
  45. };
  46. #if { {$uuid} == {%*{[^a-zA-Z0-9_./-]}%*} } {
  47. errLog 同步符号不能这么写;
  48. #return;
  49. };
  50. #if { "$uuid" == "" } {
  51. #format uuid {%U};
  52. };
  53. sync.handle {$uuid} {$callback};
  54. #send response R:sync-$uuid;
  55. };
  56. /*
  57. 函数版的 sync.Wait 相比别名版的 sync.Wait,省略了同步符号参数要求,
  58. 改由 sync 模块自行生成,并作为返回值返回给用户。
  59. */
  60. #func {sync.Wait} {
  61. #local callback {%1};
  62. #if { {$callback} == {} } {
  63. errLog 回调代码不能为空;
  64. #return;
  65. };
  66. #local uuid {};
  67. #format uuid {%U};
  68. sync.Wait {$callback} {$uuid};
  69. #return {$uuid};
  70. };
  71. #nop 这里保存同步符号和回调代码的对应关系。;
  72. #var gSyncHandlers {};
  73. #alias {sync.handle} {
  74. #local uuid {%1};
  75. #local callback {%2};
  76. #var {gSyncHandlers[$uuid]} {$callback};
  77. };
  78. #nop sync.Ignore 可以忽略指定的同步信息,将不会再触发回调代码。;
  79. #alias {sync.Ignore} {
  80. #local uuid {%1};
  81. #unvar {gSyncHandlers[$uuid]};
  82. };
  83. #nop 根据服务器返回的信息,调用相应的回调代码。;
  84. #action {^系统回馈:R:sync-%*$E} {
  85. #local uuid {%1};
  86. #local callback {$gSyncHandlers[$uuid]};
  87. #unvar {gSyncHandlers[$uuid]};
  88. #if { {$callback} != {} } {
  89. $callback;
  90. };
  91. #line gag;
  92. };