ga.tin 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #nop vim: set filetype=tt:;
  2. /*
  3. 本文件属于 PaoTin++ 的一部分
  4. ===========
  5. PaoTin++ © 2020~2023 的所有版权均由担子炮(dzp <danzipao@gmail.com>) 享有并保留一切法律权利
  6. 你可以在遵照 GPLv3 协议的基础之上使用、修改及重新分发本程序。
  7. ===========
  8. */
  9. #var lib_ga[META] {
  10. {NAME} {GA}
  11. {DESC} {GA 处理。IAC GA 是服务器信息输出结尾符号}
  12. {AUTHOR} {担子炮}
  13. {NOTE} {本文件属于 PaoTin++ 的一部分}
  14. };
  15. #config {IAC GA} {ON};
  16. #func {lib_ga.Init} {
  17. #class data/lib/ga open;
  18. #list gXttPipeLine create {};
  19. #var gXttLastCmd {};
  20. #class data/lib/ga close;
  21. ttevent.Handle {SENT OUTPUT} {lib/ga} {lib/ga} {ga.send-output};
  22. ttevent.Handle {RECEIVED PROMPT} {lib/ga} {lib/ga} {ga.received-prompt};
  23. #return true;
  24. };
  25. load-lib telnet;
  26. event.Define {GA} {有参} {$MODULE} {接收到 IAC GA 时发射本事件,参数为造成本次输出的命令};
  27. #alias {ga.send-output} {
  28. #local cmd {$gTTEventArgZero};
  29. #replace cmd {{$TELNET[CR]?}$TELNET[LF]} {};
  30. #list gXttPipeLine add {$cmd};
  31. };
  32. #alias {ga.received-prompt} {
  33. #local line {$gTTEventArgv[1]};
  34. #if { "$line" == "== 未完继续 %*== (%*继续下一页%*)%*" } {
  35. #line gag; #cr; #return;
  36. };
  37. };
  38. #action {^> {$TELNET[GA]|$TELNET[EOR]}$} {
  39. #local line {%0};
  40. #replace line {{$TELNET[GA]|$TELNET[EOR]}$} {};
  41. #local cmd {};
  42. #if { &gXttPipeLine[] > 0 } {
  43. #local cmd {$gXttPipeLine[1]};
  44. #list gXttPipeLine delete {1};
  45. #var gXttLastCmd {$cmd};
  46. };
  47. event.Emit GA {} {$cmd};
  48. #line gag;
  49. } {1.000};
  50. #alias {ga.Off} {
  51. #send {$TELNET[IAC]$TELNET[WILL]$TELNET[LINEMODE]\};
  52. #send {$TELNET[IAC]$TELNET[DO]$TELNET[SGA]\};
  53. };
  54. #alias {ga.On} {
  55. #send {$TELNET[IAC]$TELNET[WILL]$TELNET[LINEMODE]\};
  56. #send {$TELNET[IAC]$TELNET[DONT]$TELNET[SGA]\};
  57. };
  58. #alias {ga.Sync} {
  59. sync.Wait {#0};
  60. };
  61. #alias {ga.Confirm} {
  62. #local cmd {%1};
  63. #if { &gXttPipeLine[] > 0 && {$gXttPipeLine[1]} !== {$cmd} } {
  64. dbgLog GA => GA 状态已失步,现在开始同步。;
  65. };
  66. #while { &gXttPipeLine[] > 0 && {$gXttPipeLine[1]} !== {$cmd} } {
  67. dbgLog GA => drop $gXttPipeLine[1];
  68. #list gXttPipeLine delete {1};
  69. };
  70. };
  71. ///=== {
  72. // ## ga.Wait <回调代码> [<钩子名称>]
  73. // 等待下一个 GA 的到来,并在那时执行回调代码。
  74. // 可选的钩子名称可以用来忽略回调行为。
  75. // };
  76. #alias {ga.Wait} {
  77. #local code {%21};
  78. #local hook {@default{{%2};@uuid{}}};
  79. #if { "$code" == "" || "$hook" == "" } {
  80. xtt.Usage ga.Wait;
  81. #return;
  82. };
  83. #line sub {escapes} event.HandleOnce GA {ga/$hook} {GA} {%21;#0};
  84. };
  85. ///=== {
  86. // ## ga.ClassWait <回调代码> [<钩子名称>]
  87. // 类似于 ga.Wait,但是会在当前 #class 消亡时自动注销。
  88. // 可选的钩子名称可以用来忽略回调行为。
  89. // };
  90. #alias {ga.ClassWait} {
  91. #local code {%21};
  92. #local hook {@default{{%2};@uuid{}}};
  93. #if { "$code" == "" } {
  94. xtt.Usage ga.ClassWait;
  95. #return;
  96. };
  97. #line sub {escapes} event.ClassHandleOnce GA {ga/$hook} {GA} {%21;#0};
  98. };
  99. ///=== {
  100. // ## ga.Ignore <钩子名称>
  101. // 忽略之前用 ga.Wait 或者 ga.ClassWait 注册的钩子。
  102. // };
  103. #alias {ga.Ignore} {
  104. #local hook {%1};
  105. #if { "$hook" == "" } {
  106. xtt.Usage ga.Ignore;
  107. #return;
  108. };
  109. event.UnHandle GA {ga/$hook} {GA};
  110. };
  111. #func {ga.ThisCmd} {
  112. #return {$gXttPipeLine[1]};
  113. };
  114. #func {ga.LastCmd} {
  115. #return {$gXttLastCmd};
  116. };
  117. #func {ga.IsUnderway} {
  118. #if { &gXttPipeLine[] > 1 } {
  119. #return 1;
  120. };
  121. #else {
  122. #return 0;
  123. };
  124. };
  125. #func {ga.AllDone} {
  126. #if { &gXttPipeLine[] == 0 } {
  127. #return 1;
  128. };
  129. #else {
  130. #return 0;
  131. };
  132. };