pymud 0.19.1__py3-none-any.whl → 0.19.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pymud/session.py CHANGED
@@ -9,6 +9,9 @@ from .settings import Settings
9
9
 
10
10
 
11
11
  class Session:
12
+ """
13
+ 会话管理主对象,每一个角色的所有处理实现均在该类中实现。
14
+ """
12
15
  #_esc_regx = re.compile("\x1b\\[[^mz]+[mz]")
13
16
  _esc_regx = re.compile("\x1b\\[[\d;]+[abcdmz]", flags = re.IGNORECASE)
14
17
 
@@ -124,9 +127,10 @@ class Session:
124
127
  self.encoding = encoding or self.encoding
125
128
  self.after_connect = after_connect
126
129
 
127
- for plugin in app.plugins.values():
128
- if isinstance(plugin, Plugin):
129
- plugin.onSessionCreate(self)
130
+ # 插件处置移动到 pymud.py 2024-3-22
131
+ # for plugin in app.plugins.values():
132
+ # if isinstance(plugin, Plugin):
133
+ # plugin.onSessionCreate(self)
130
134
 
131
135
  self._modules = OrderedDict()
132
136
 
@@ -191,7 +195,8 @@ class Session:
191
195
  self._state = "EXCEPTION"
192
196
 
193
197
  if Settings.client["auto_reconnect"]:
194
- asyncio.ensure_future(self.reconnect(), loop = self.loop)
198
+ wait = Settings.client.get("reconnect_wait", 15)
199
+ asyncio.ensure_future(self.reconnect(wait), loop = self.loop)
195
200
 
196
201
  async def reconnect(self, timeout = 15):
197
202
  self.info(f"{timeout}秒之后将自动重新连接...")
@@ -231,7 +236,8 @@ class Session:
231
236
  event_disconnected(self)
232
237
 
233
238
  if Settings.client["auto_reconnect"]:
234
- asyncio.ensure_future(self.reconnect(), loop = self.loop)
239
+ wait = Settings.client.get("reconnect_wait", 15)
240
+ asyncio.ensure_future(self.reconnect(wait), loop = self.loop)
235
241
 
236
242
  @property
237
243
  def connected(self):
@@ -455,9 +461,11 @@ class Session:
455
461
 
456
462
  def clean_finished_tasks(self):
457
463
  "清理已经完成的任务"
458
- for task in self._tasks:
459
- if isinstance(task, asyncio.Task) and task.done():
460
- self._tasks.remove(task)
464
+ # for task in self._tasks:
465
+ # if isinstance(task, asyncio.Task) and task.done():
466
+ # self._tasks.remove(task)
467
+
468
+ self._tasks = list((t for t in self._tasks if isinstance(t, asyncio.Task) and not t.done()))
461
469
 
462
470
  def write(self, data) -> None:
463
471
  "向服务器写入数据(RAW格式字节数组/字节串)"
@@ -668,7 +676,7 @@ class Session:
668
676
  """
669
677
 
670
678
  ## 以下为函数执行本体
671
- if not "#" in line:
679
+ if (not "#" in line) and (not "@" in line) and (not "%" in line):
672
680
  cmds = line.split(self.seperator)
673
681
  for cmd in cmds:
674
682
  self.exec_text(cmd)
@@ -692,7 +700,7 @@ class Session:
692
700
  """
693
701
 
694
702
  ## 以下为函数执行本体
695
- if not "#" in line:
703
+ if (not "#" in line) and (not "@" in line) and (not "%" in line):
696
704
  cmds = line.split(self.seperator)
697
705
  for cmd in cmds:
698
706
  await self.exec_text_async(cmd)
@@ -999,9 +1007,29 @@ class Session:
999
1007
  self.writetobuffer("#"*width, newline = True)
1000
1008
 
1001
1009
  def handle_help(self, code: CodeLine = None, *args, **kwargs):
1002
- "\x1b[1m命令\x1b[0m: #help {主题}\n" \
1003
- " 当不带参数时, #help会列出所有可用的帮助主题\n" \
1004
- "\x1b[1m相关\x1b[0m: session, exit\n"
1010
+ '''
1011
+ 嵌入命令 #help 的执行函数,在当前会话中现实帮助信息。
1012
+ 当不带参数时, #help会列出所有可用的帮助主题。
1013
+ 带参数显示该系统命令的帮助。参数中不需要#号。
1014
+ 该函数不应该在代码中直接调用。
1015
+
1016
+ 使用:
1017
+ - #help {topic}
1018
+ - 当不指定 topic: 列出所有可用的帮助主题。
1019
+ - 当指定 topic: 列出指定topic的帮助内容。该帮助类容由调用的函数的docstring确定。
1020
+
1021
+ 参数:
1022
+ :topic: 主题,支持所有的系统命令。在键入主题时,请忽略命令中的#号
1023
+
1024
+ 示例:
1025
+ - ``#help``
1026
+ 在当前会话中显示所有帮助主题。其中,绿色显示的命令为其他命令的别名。
1027
+ 注意,在没有当前会话时,命令不生效。
1028
+ - ``#help help``
1029
+ 显示 #help 有关的帮助(即本帮助)
1030
+ - ``#help session``
1031
+ 显示 #session 命令有关的帮助
1032
+ '''
1005
1033
 
1006
1034
  if code.length == 2:
1007
1035
  self._print_all_help()
@@ -1021,33 +1049,70 @@ class Session:
1021
1049
  else:
1022
1050
  docstring = f"未找到主题{topic}, 请确认输入是否正确."
1023
1051
 
1024
- self.writetobuffer(docstring)
1052
+ self.writetobuffer(docstring, True)
1025
1053
 
1026
1054
  def handle_exit(self, code: CodeLine = None, *args, **kwargs):
1027
- "\x1b[1m命令\x1b[0m: #exit \n" \
1028
- " 退出PYMUD程序\n" \
1029
- "\x1b[1m相关\x1b[0m: close\n"
1055
+ '''
1056
+ 嵌入命令 #exit 的执行函数,退出 `PyMudApp` 应用。
1057
+ 该函数不应该在代码中直接调用。
1058
+
1059
+ *注:当应用中存在还处于连接状态的会话时,#exit退出应用会逐个弹出对话框确认这些会话是否关闭*
1060
+
1061
+ 相关命令:
1062
+ - #close
1063
+ - #session
1064
+ '''
1065
+
1030
1066
  self.application.act_exit()
1031
1067
 
1032
1068
  def handle_close(self, code: CodeLine = None, *args, **kwargs):
1033
- "\x1b[1m命令\x1b[0m: #close \n" \
1034
- " 关闭当前会话。若当前会话处于连接状态,则会弹出对话框确认。\n" \
1035
- "\x1b[1m相关\x1b[0m: exit\n"
1069
+ '''
1070
+ 嵌入命令 #close 的执行函数,关闭当前会话,并将当前会话从 `PyMudApp` 的会话列表中移除。
1071
+ 该函数不应该在代码中直接调用。
1072
+
1073
+ *注:当前会话处于连接状态时,#close关闭会话会弹出对话框确认是否关闭*
1074
+
1075
+ 相关命令:
1076
+ - #exit
1077
+ - #session
1078
+ '''
1079
+
1036
1080
  self.application.close_session()
1037
1081
 
1038
1082
  async def handle_wait(self, code: CodeLine = None, *args, **kwargs):
1039
- "\x1b[1m命令\x1b[0m: #wait|#wa {ms} \n" \
1040
- " 异步延时等待ms时间,用于多个命令间的延时等待。\n" \
1041
- "\x1b[1m相关\x1b[0m: gag\n"
1083
+ '''
1084
+ 嵌入命令 #wait / #wa 的执行函数,异步延时等待指定时间,用于多个命令间的延时等待。
1085
+ 该函数不应该在代码中直接调用。
1086
+
1087
+ 使用:
1088
+ - #wa {ms}
1089
+
1090
+ 参数:
1091
+ - ms: 等待时间(毫秒)
1092
+
1093
+ 示例:
1094
+ - ``eat liang;#wa 300;drink jiudai``
1095
+ 吃干粮,延时300毫秒后,执行喝酒袋
1096
+
1097
+ 相关命令:
1098
+ - #gag
1099
+ - #replace
1100
+ '''
1101
+
1042
1102
  wait_time = code.code[2]
1043
1103
  if wait_time.isnumeric():
1044
1104
  msec = float(wait_time) / 1000.0
1045
1105
  await asyncio.sleep(msec)
1046
1106
 
1047
1107
  def handle_connect(self, code: CodeLine = None, *args, **kwargs):
1048
- "\x1b[1m命令\x1b[0m: #connect|#con\n" \
1049
- " 连接到远程服务器(仅当远程服务器未连接时有效)\n" \
1050
- "\x1b[1m相关\x1b[0m: disconnect\n"
1108
+ '''
1109
+ 嵌入命令 #connect / #con 的执行函数,连接到远程服务器(仅当远程服务器未连接时有效)。
1110
+ 该函数不应该在代码中直接调用。
1111
+
1112
+ 相关命令:
1113
+ - #close
1114
+ - #exit
1115
+ '''
1051
1116
 
1052
1117
  if not self.connected:
1053
1118
  self.open()
@@ -1067,12 +1132,24 @@ class Session:
1067
1132
  self.info("已经与服务器连接了 {}".format(time_msg))
1068
1133
 
1069
1134
  def handle_variable(self, code: CodeLine = None, *args, **kwargs):
1070
- "\x1b[1m命令\x1b[0m: #variable|#var\n" \
1071
- " 不带参数时,列出当前会话中所有的变量清单\n" \
1072
- " 带1个参数时,列出当前会话中名称为该参数的变量值\n" \
1073
- " 带2个参数时,设置名称为该参数的变量值\n" \
1074
- "\x1b[1m相关\x1b[0m: alias, trigger, command\n"
1075
-
1135
+ '''
1136
+ 嵌入命令 #variable / #var 的执行函数,操作会话变量。
1137
+ 该命令可以不带参数、带一个参数、两个参数。
1138
+ 该函数不应该在代码中直接调用。
1139
+
1140
+ 使用:
1141
+ - #var: 列出本会话所有变量
1142
+ - #var {name}: 列出本会话中名称为{name}的变量的值
1143
+ - #var {name} {value}: 将本会话中名称为{name}的变量设置值为{value},若不存在则创建
1144
+
1145
+ 参数:
1146
+ :name: 变量名称
1147
+ :value: 变量值。注意: 该值赋值后为str类型!
1148
+
1149
+ 相关命令:
1150
+ - #global
1151
+ '''
1152
+
1076
1153
  args = code.code[2:]
1077
1154
 
1078
1155
  if len(args) == 0:
@@ -1134,12 +1211,24 @@ class Session:
1134
1211
  self.setVariable(args[0], args[1])
1135
1212
 
1136
1213
  def handle_global(self, code: CodeLine = None, *args, **kwargs):
1137
- "\x1b[1m命令\x1b[0m: #global\n" \
1138
- " 不带参数时,列出程序当前所有全局变量清单\n" \
1139
- " 带1个参数时,列出程序当前名称我为该参数的全局变量值\n" \
1140
- " 带2个参数时,设置名称为该全局变量的变量值\n" \
1141
- "\x1b[1m相关\x1b[0m: variable\n"
1142
-
1214
+ '''
1215
+ 嵌入命令 #global 的执行函数,操作全局变量(跨会话共享)。
1216
+ 该命令可以不带参数、带一个参数、两个参数。
1217
+ 该函数不应该在代码中直接调用。
1218
+
1219
+ 使用:
1220
+ - #global: 列出所有全局变量
1221
+ - #global {name}: 列出中名称为{name}的全局变量的值
1222
+ - #global {name} {value}: 将名称为{name}的全局变量设置值为{value},若不存在则创建
1223
+
1224
+ 参数:
1225
+ :name: 变量名称
1226
+ :value: 变量值。注意: 该值赋值后为str类型!
1227
+
1228
+ 相关命令:
1229
+ - #variable
1230
+ '''
1231
+
1143
1232
  args = code.code[2:]
1144
1233
 
1145
1234
  if len(args) == 0:
@@ -1259,66 +1348,153 @@ class Session:
1259
1348
  self.info("创建Timer {} 成功: {}".format(ti.id, ti.__repr__()))
1260
1349
 
1261
1350
  def handle_alias(self, code: CodeLine = None, *args, **kwargs):
1262
- "\x1b[1m命令\x1b[0m: #alias|#ali\n" \
1263
- " 不指定参数时, 列出当前会话中所有的别名清单\n" \
1264
- " 为一个参数时, 该参数应为某个Alias的id, 可列出Alias的详细信息\n" \
1265
- " 为两个参数时, 可以进行如下操作\n" \
1266
- " 1. 当第一个参数为一个已存在Alias的id, 第二个为on/off时, 可修改Alias的使能状态\n" \
1267
- " 2. 当第一个参数为一个已存在Alias的id, 第二个为del时, 可从会话中删除该Alias\n" \
1268
- " 3. 当第一个参数不存在于Alias的id中时, 第一个参数被识别为pattern,第二个参数识别为执行的代码, 此时创建一个SimpleAlias \n" \
1269
- " 使用示例: \n " \
1270
- " 1. #ali ali_001 off -> 禁用id为ali_001的别名 \n" \
1271
- " 2. #ali ali_001 del -> 删除id为ali_001的别名 \n" \
1272
- " 3. #ali {^gp\s(.+)$} {get %1 from corpse} -> 创建一个SimpleAlias别名,模式和执行命令分别在两个参数中指定。两个参数均使用{}括起来 \n" \
1273
- "\x1b[1m相关\x1b[0m: variable, trigger, command, timer\n"
1274
-
1351
+ '''
1352
+ 嵌入命令 #alias / #ali 的执行函数,操作别名。该命令可以不带参数、带一个参数或者两个参数。
1353
+ 该函数不应该在代码中直接调用。
1354
+
1355
+ 使用:
1356
+ - #ali: 显示本会话所有别名
1357
+ - #ali {ali_id}: 显示本会话中id为{ali_id}的别名信息
1358
+ - #ali {ali_id} {on/off/del}: 使能/禁用/删除本会话中id为{ali_id}的别名
1359
+ - #ali {pattern} {code}: 创建一个新别名,匹配为{pattern},匹配时执行{code}
1360
+ - 别名的code中,可以使用%line代表行,%1~%9代表捕获信息
1361
+
1362
+ 参数:
1363
+ :ali_id: 别名Alias的id
1364
+ :on: 使能
1365
+ :off: 禁用
1366
+ :del: 删除
1367
+ :pattern: 新别名的匹配模式,应为合法的Python 正则表达式
1368
+ :code: 别名匹配成功后执行的内容
1369
+
1370
+ 示例:
1371
+ - ``#ali`` : 无参数, 打印列出当前会话中所有的别名清单
1372
+ - ``#ali my_ali`` : 一个参数, 列出id为my_ali的Alias对象的详细信息
1373
+ - ``#ali my_ali on`` : 两个参数,启用id为my_ali的Alias对象(enabled = True)
1374
+ - ``#ali my_ali off`` : 两个参数, 禁用id为my_ali的Alias对象(enabled = False)
1375
+ - ``#ali my_ali del`` : 两个参数,删除id为my_ali的Alias对象
1376
+ - ``#ali {^gp\s(.+)$} {get %1 from corpse}`` : 两个参数,新增创建一个Alias对象。使用时, ``gp gold = get gold from corpse``
1377
+
1378
+ 相关命令:
1379
+ - #trigger
1380
+ - #timer
1381
+ - #command
1382
+ '''
1383
+
1275
1384
  self._handle_objs("Alias", self._aliases, *code.code[2:])
1276
1385
 
1277
1386
  def handle_timer(self, code: CodeLine = None, *args, **kwargs):
1278
- "\x1b[1m命令\x1b[0m: #timer|#ti\n" \
1279
- " 不指定参数时, 列出当前会话中所有的定时器清单\n" \
1280
- " 为一个参数时, 该参数应为某个Timer的id, 可列出Timer的详细信息\n" \
1281
- " 为两个参数时, 可以进行如下操作\n" \
1282
- " 1. 当第一个参数为一个已存在Timer的id, 第二个为on/off时, 可修改Timer的使能状态\n" \
1283
- " 2. 当第一个参数为一个已存在Timer的id, 第二个为del时, 可从会话中删除该Timer\n" \
1284
- " 3. 当第一个参数为数字时,第一个参数被识别为定时器时间,第二个参数识别为执行的代码, 此时创建一个SimpleTimer \n" \
1285
- " 使用示例: \n " \
1286
- " 1. #ti ti_001 off -> 禁用id为ti_001的定时器 \n" \
1287
- " 2. #ti ti_001 del -> 删除id为ti_001的定时器 \n" \
1288
- " 3. #ti 100 {drink jiudai;#wa 200;eat liang} -> 创建一个每隔100s执行一次的定时器,执行内容使用{}括起来 \n" \
1289
- "\x1b[1m相关\x1b[0m: variable, alias, trigger, command\n"
1387
+ '''
1388
+ 嵌入命令 #timer / #ti 的执行函数,操作定时器。该命令可以不带参数、带一个参数或者两个参数。
1389
+ 该函数不应该在代码中直接调用。
1390
+
1391
+ 使用:
1392
+ - #ti: 显示本会话所有定时器
1393
+ - #ti {ti_id}: 显示本会话中id为{ti_id}的定时器信息
1394
+ - #ti {ti_id} {on/off/del}: 使能/禁用/删除本会话中id为{ti_id}的定时器
1395
+ - #ti {second} {code}: 创建一个新定时器,定时间隔为{second}秒,定时器到时间执行{code}
1396
+ - PyMUD支持同时任意多个定时器。
1397
+
1398
+ 参数:
1399
+ :ti_id: 定时器Timer的id
1400
+ :on: 使能
1401
+ :off: 禁用
1402
+ :del: 删除
1403
+ :second: 新定时器的定时时间,单位为秒
1404
+ :code: 定时器到时间后执行的内容
1405
+
1406
+ 示例:
1407
+ - ``#ti``: 无参数, 打印列出当前会话中所有的定时器清单
1408
+ - ``#ti my_timer``: 一个参数, 列出id为my_timer的Timer对象的详细信息
1409
+ - ``#ti my_timer on``: 两个参数,启用id为my_timer的Timer对象(enabled = True)
1410
+ - ``#ti my_timer off``: 两个参数, 禁用id为my_timer的Timer对象(enabled = False)
1411
+ - ``#ti my_timer del``: 两个参数,删除id为my_timer的Timer对象
1412
+ - ``#ti 100 {drink jiudai;#wa 200;eat liang}``: 两个参数,新增创建一个Timer对象。每隔100s,自动执行一次喝酒袋吃干粮。
1413
+
1414
+ 相关命令:
1415
+ - #alias
1416
+ - #trigger
1417
+ - #command
1418
+ '''
1290
1419
 
1291
1420
  self._handle_objs("Timer", self._timers, *code.code[2:])
1292
1421
 
1293
1422
  def handle_command(self, code: CodeLine = None, *args, **kwargs):
1294
- "\x1b[1m命令\x1b[0m: #command|#cmd\n" \
1295
- " 不指定参数时, 列出当前会话中所有的命令清单\n" \
1296
- " 为一个参数时, 该参数应为某个Command的id, 可列出Command的详细信息\n" \
1297
- " 为两个参数时, 第一个参数应为Command的id, 第二个应为on/off/del, 可修改Command的使能状态,或者从会话中移除该Command\n" \
1298
- "\x1b[1m相关\x1b[0m: alias, variable, trigger, timer\n"
1423
+ '''
1424
+ 嵌入命令 #command / #cmd 的执行函数,操作命令。该命令可以不带参数、带一个参数或者两个参数。
1425
+ 该函数不应该在代码中直接调用。
1426
+
1427
+ 使用:
1428
+ - #cmd: 显示本会话所有命令(Command及其子类)
1429
+ - #cmd {cmd_id}: 显示本会话中id为{cmd_id}的命令信息
1430
+ - #cmd {cmd_id} {on/off/del}: 使能/禁用/删除本会话中id为{cmd_id}的命令
1431
+ - 由于命令的特殊性,其只能使用脚本代码创建
1432
+
1433
+ 参数:
1434
+ :cmd_id: 命令Command的id
1435
+ :on: 使能
1436
+ :off: 禁用
1437
+ :del: 删除
1438
+
1439
+ 示例:
1440
+ - ``#cmd`` : 无参数, 打印列出当前会话中所有的命令清单
1441
+ - ``#cmd my_cmd`` : 一个参数, 列出id为my_cmd的Command对象的详细信息
1442
+ - ``#cmd my_cmd on`` : 两个参数,启用id为my_cmd的Command对象(enabled = True)
1443
+ - ``#cmd my_cmd off`` : 两个参数, 禁用id为my_cmd的Command对象(enabled = False)
1444
+ - ``#cmd my_cmd del`` : 两个参数,删除id为my_cmd的Command对象
1445
+
1446
+ 相关命令:
1447
+ - #alias
1448
+ - #trigger
1449
+ - #timer
1450
+ '''
1299
1451
 
1300
1452
  self._handle_objs("Command", self._commands, *code.code[2:])
1301
1453
 
1302
1454
  def handle_trigger(self, code: CodeLine = None, *args, **kwargs):
1303
- "\x1b[1m命令\x1b[0m: #trigger|#tri\n" \
1304
- " 不指定参数时, 列出当前会话中所有的触发器清单\n" \
1305
- " 为一个参数时, 该参数应为某个Trigger的id, 可列出Trigger的详细信息\n" \
1306
- " 为两个参数时, 可以进行如下操作\n" \
1307
- " 1. 当第一个参数为一个已存在Trigger的id, 第二个为on/off时, 可修改Trigger的使能状态\n" \
1308
- " 2. 当第一个参数为一个已存在Trigger的id, 第二个为del时, 可从会话中删除该\n" \
1309
- " 3. 当第一个参数不存在于Trigger的id中时, 第一个参数被识别为pattern,第二个参数识别为执行的代码, 此时创建一个SimpleTrigger \n" \
1310
- " 使用示例: \n " \
1311
- " 1. #tri tri_001 off -> 禁用id为tri_001的触发器 \n" \
1312
- " 2. #tri tri_001 del -> 删除id为tri_001的触发器 \n" \
1313
- " 3. #tri {^[> ]*你深深吸了口气,站了起来。} {dazuo 10} -> 创建一个SimpleTrigger触发器,模式和执行命令分别在两个参数中指定。两个参数均使用{}括起来 \n" \
1314
- "\x1b[1m相关\x1b[0m: alias, variable, command, timer\n"
1315
-
1455
+ '''
1456
+ 嵌入命令 #trigger / #tri / #action 的执行函数,操作触发器。该命令可以不带参数、带一个参数或者两个参数。
1457
+ 该函数不应该在代码中直接调用。
1458
+
1459
+ 使用:
1460
+ - #tri: 显示本会话所有触发器
1461
+ - #tri {tri_id}: 显示本会话中id为{tri_id}的触发器信息
1462
+ - #tri {tri_id} {on/off/del}: 使能/禁用/删除本会话中id为{tri_id}的触发器
1463
+ - #tri {pattern} {code}: 创建一个新触发器,匹配为{pattern},匹配时执行{code}
1464
+ - 触发器的code中,可以使用%line代表行,%1~%9代表捕获信息
1465
+
1466
+ 参数:
1467
+ :tri_id: 触发器Trigger的id
1468
+ :on: 使能
1469
+ :off: 禁用
1470
+ :del: 删除
1471
+ :pattern: 触发器的匹配模式,应为合法的Python正则表达式
1472
+ :code: 触发成功时执行的内容
1473
+
1474
+ 示例:
1475
+ - ``#tri``: 无参数, 打印列出当前会话中所有的触发器清单
1476
+ - ``#tri my_tri``: 一个参数, 列出id为my_tri的Trigger对象的详细信息
1477
+ - ``#tri my_tri on``: 两个参数,启用id为my_tri的Trigger对象(enabled = True)
1478
+ - ``#tri my_tri off``: 两个参数, 禁用id为my_tri的Trigger对象(enabled = False)
1479
+ - ``#tri my_tri del``: 两个参数,删除id为my_tri的Trigger对象
1480
+ - ``#tri {^[> ]*段誉脚下一个不稳.+} {get duan}``: 两个参数,新增创建一个Trigger对象。当段誉被打倒的时刻把他背起来。
1481
+
1482
+ 相关命令:
1483
+ - #alias
1484
+ - #timer
1485
+ - #command
1486
+ '''
1487
+
1316
1488
  self._handle_objs("Trigger", self._triggers, *code.code[2:])
1317
1489
 
1318
1490
  def handle_task(self, code: CodeLine = None, *args, **kwargs):
1319
- "\x1b[1m命令\x1b[0m: #task\n" \
1320
- " 不指定参数, 列出当前会话中所有受管理的任务清单\n" \
1321
- "\x1b[1m相关\x1b[0m: alias, variable, trigger, timer\n"
1491
+ '''
1492
+ 嵌入命令 #task 的执行函数,显示当前管理的所有任务清单(仅用于调试)。
1493
+ 该函数不应该在代码中直接调用。
1494
+
1495
+ 注意:
1496
+ 当管理任务很多时,该指令会影响系统响应。
1497
+ '''
1322
1498
 
1323
1499
  width = self.application.get_width()
1324
1500
  title = f" Tasks LIST IN SESSION {self.name} "
@@ -1333,11 +1509,29 @@ class Session:
1333
1509
 
1334
1510
 
1335
1511
  def handle_ignore(self, code: CodeLine = None, *args, **kwargs):
1336
- "\x1b[1m命令\x1b[0m: #ignore|#ig, #T+, #T-\n" \
1337
- " #ignore/#ig: 切换所有触发器是否被响应的状态。请注意:在触发器中使用#ig可能导致无法预料的影响。 \n" \
1338
- " #T+/#T-: 使能/禁用指定名称组的所有对象,包括触发器、别名、GMCP触发、命令、定时器等。如: #t+ mygroup \n"
1339
- "\x1b[1m相关\x1b[0m: Alias, Trigger, Timer\n"
1512
+ '''
1513
+ 嵌入命令 #ignore / #ig, #t+ / #t- 的执行函数,处理使能/禁用状态。
1514
+ 该函数不应该在代码中直接调用。
1340
1515
 
1516
+ 使用:
1517
+ - #ig: 切换触发器全局使能/禁用状态
1518
+ - #t+ {group}: 使能{group}组内的所有对象,包括别名、触发器、命令、定时器、GMCPTrigger等
1519
+ - #t- {group}: 禁用{group}组内的所有对象,包括别名、触发器、命令、定时器、GMCPTrigger等
1520
+
1521
+ 参数:
1522
+ :group: 组名
1523
+
1524
+ 示例:
1525
+ - ``#ig``: 切换全局触发器的使能/禁用状态。为禁用时,状态栏右下角会显示“全局已禁用”
1526
+ - ``#t+ mygroup``: 使能名称为 mygroup 的组内的所有对象,包括别名、触发器、命令、定时器、GMCPTrigger等
1527
+ - ``#t- mygroup``: 禁用名称为 mygroup 的组内的所有对象,包括别名、触发器、命令、定时器、GMCPTrigger等
1528
+
1529
+ 相关命令:
1530
+ - #trigger
1531
+ - #alias
1532
+ - #timer
1533
+ '''
1534
+
1341
1535
  cmd = code.code[1].lower()
1342
1536
  if cmd in ("ig", "ignore"):
1343
1537
  self._ignore = not self._ignore
@@ -1364,9 +1558,16 @@ class Session:
1364
1558
  self.info(f"组 {groupname} 中的 {cnts[0]} 个别名,{cnts[1]} 个触发器,{cnts[2]} 个命令,{cnts[3]} 个定时器,{cnts[4]} 个GMCP触发器均已禁用。")
1365
1559
 
1366
1560
  def handle_repeat(self, code: CodeLine = None, *args, **kwargs):
1367
- "\x1b[1m命令\x1b[0m: #repeat|#rep\n" \
1368
- " 重复向session输出上一次人工输入的命令 \n" \
1369
- "\x1b[1m相关\x1b[0m: num\n"
1561
+ '''
1562
+ 嵌入命令 #repeat / #rep 的执行函数,重复向session输出上一次人工输入的命令。
1563
+ 该函数不应该在代码中直接调用。
1564
+
1565
+ 使用:
1566
+ - #repeat
1567
+
1568
+ 注:
1569
+ 这条命令并没有啥实质性应用场景
1570
+ '''
1370
1571
 
1371
1572
  if self.connected and self.last_command:
1372
1573
  self.exec_command(self.last_command)
@@ -1374,10 +1575,27 @@ class Session:
1374
1575
  self.info("当前会话没有连接或没有键入过指令,repeat无效")
1375
1576
 
1376
1577
  async def handle_num(self, times, code: CodeLine = None, *args, **kwargs):
1377
- "\x1b[1m命令\x1b[0m: #{num} {cmd}\n" \
1378
- " 向session中输出{num}次{cmd} \n" \
1379
- " 如: #3 drink jiudai, 表示连喝3次酒袋 \n" \
1380
- "\x1b[1m相关\x1b[0m: repeat\n"
1578
+ '''
1579
+ 嵌入命令 #{num} 的执行函数,重复执行多次命令。
1580
+ 该函数不应该在代码中直接调用。
1581
+
1582
+ 使用:
1583
+ - #{num} {code}: 执行code代码num次
1584
+ - {num}必须大于等于1
1585
+ - 该命令可以嵌套使用
1586
+
1587
+ 参数:
1588
+ :num: 重复执行的次数
1589
+ :code: 重复执行的代码
1590
+
1591
+ 示例:
1592
+ - ``#3 get m1b from nang`` : 从锦囊中取出3次地*木灵
1593
+ - ``#3 {#3 get m1b from nang;#wa 500;combine gem;#wa 4000};xixi`` : 执行三次合并地*木灵宝石的操作,中间留够延时等待时间,全部结束后发出xixi。
1594
+
1595
+ 相关命令:
1596
+ - #all
1597
+ - #session
1598
+ '''
1381
1599
 
1382
1600
  cmd = CodeBlock(" ".join(code.code[2:]))
1383
1601
 
@@ -1386,17 +1604,52 @@ class Session:
1386
1604
  await cmd.async_execute(self, *args, **kwargs)
1387
1605
 
1388
1606
  def handle_gmcp(self, code: CodeLine = None, *args, **kwargs):
1389
- "\x1b[1m命令\x1b[0m: #gmcp {key}\n" \
1390
- " 指定key时,显示由GMCP收到的key信息\n" \
1391
- " 不指定key时,显示所有GMCP收到的信息\n" \
1392
- "\x1b[1m相关\x1b[0m: Trigger\n"
1607
+ '''
1608
+ 嵌入命令 #gmcp 的执行函数,操作GMCPTrigger。该命令可以不带参数、带一个参数或者两个参数。
1609
+ 该函数不应该在代码中直接调用。
1610
+
1611
+ 使用:
1612
+ - #gmcp: 显示本会话所有GMCPTrigger
1613
+ - #gmcp {gmcp_key}: 显示本会话中name为{gmcp_key}的GMCPTrigger信息
1614
+ - #gmcp {gmcp_key} {on/off/del}: 使能/禁用/删除本会话中name为{gmcp_key}的GMCPTrigger
1615
+ - 由于GMCPTrigger的特殊性,其只能使用脚本代码创建
1616
+
1617
+ 参数:
1618
+ :gmcp_key: GMCPTrigger的关键字name
1619
+ :on: 使能
1620
+ :off: 禁用
1621
+ :del: 删除
1622
+
1623
+ 示例:
1624
+ - ``#gmcp`` : 无参数, 打印列出当前会话中所有的命令清单
1625
+ - ``#gmcp GMCP.Move`` : 一个参数, 列出名称为 GMCP.Move 的 GMCPTrigger 对象的详细信息
1626
+ - ``#gmcp GMCP.Move on`` : 两个参数,启用名称为 GMCP.Move 的 GMCPTrigger 对象(enabled = True)
1627
+ - ``#gmcp GMCP.Move off`` : 两个参数, 禁用名称为 GMCP.Move 的 GMCPTrigger 对象(enabled = False)
1628
+ - ``#gmcp GMCP.Move del`` : 两个参数,删除名称为 GMCP.Move 的 GMCPTrigger 对象
1629
+
1630
+ 相关命令:
1631
+ - #alias
1632
+ - #trigger
1633
+ - #timer
1634
+ '''
1393
1635
 
1394
1636
  self._handle_objs("GMCPs", self._gmcp, *code.code[2:])
1395
1637
 
1396
1638
  def handle_message(self, code: CodeLine = None, *args, **kwargs):
1397
- "\x1b[1m命令\x1b[0m: #message|#mess {msg}\n" \
1398
- " 使用弹出窗体显示信息\n" \
1399
- "\x1b[1m相关\x1b[0m: 暂无\n"
1639
+ '''
1640
+ 嵌入命令 #message / #mess 的执行函数,弹出对话框显示给定信息。
1641
+ 该函数不应该在代码中直接调用。
1642
+
1643
+ 使用:
1644
+ - #mess {msg}: 以弹出对话框显示{msg}指定的信息
1645
+
1646
+ 参数:
1647
+ :msg: 需弹出的显示信息
1648
+
1649
+ 示例:
1650
+ - ``#mess 这是一行测试`` : 使用弹出窗口显示“这是一行测试”
1651
+ - ``#mess %line`` : 使用弹出窗口显示系统变量%line的值
1652
+ '''
1400
1653
 
1401
1654
  title = "来自会话 {} 的消息".format(self.name)
1402
1655
 
@@ -1406,9 +1659,24 @@ class Session:
1406
1659
 
1407
1660
 
1408
1661
  def handle_all(self, code: CodeLine = None, *args, **kwargs):
1409
- "\x1b[1m命令\x1b[0m: #all xxx \n" \
1410
- " 向所有的活动的session发送同样的命令\n" \
1411
- "\x1b[1m相关\x1b[0m: session\n"
1662
+ '''
1663
+ 嵌入命令 #all 的执行函数,向所有会话发送统一命令。
1664
+ 该函数不应该在代码中直接调用。
1665
+
1666
+ 使用:
1667
+ - #all {code}: 向所有会话发送code命令
1668
+
1669
+ 参数:
1670
+ :code: 重复执行的代码
1671
+
1672
+ 示例:
1673
+ - ``#all #cls`` : 所有会话统一执行#cls命令
1674
+ - ``#all quit`` : 所有会话的角色统一执行quit退出
1675
+
1676
+ 相关命令:
1677
+ - #num
1678
+ - #session
1679
+ '''
1412
1680
 
1413
1681
  new_cmd = " ".join(code.code[2:])
1414
1682
  for ss in self.application.sessions.values():
@@ -1560,23 +1828,67 @@ class Session:
1560
1828
 
1561
1829
 
1562
1830
  def handle_load(self, code: CodeLine = None, *args, **kwargs):
1563
- "\x1b[1m命令\x1b[0m: #load {config}\n" \
1564
- " 为当前session加载{config}指定的模块。当要加载多个模块时,使用空格或英文逗号隔开\n" \
1565
- " 多个模块加载时,按指定名称的先后顺序逐个加载(影响依赖关系) \n"
1566
- " 例, 加载名为pkuxkx的模块: #load pkuxkx \n"
1567
- " 加载名为pkuxkx和my的两个模块: #load pkuxkx my \n"
1568
- "\x1b[1m相关\x1b[0m: unload, reload\n"
1831
+ '''
1832
+ 嵌入命令 #load 的执行函数,为当前会话执行模块加载操作。当要加载多个模块时,使用空格或英文逗号隔开。
1833
+ 该函数不应该在代码中直接调用。
1834
+
1835
+ 使用:
1836
+ - #load {mod1}: 加载指定名称的模块
1837
+ - #load {mod1} {mod2} ... {modn}: 加载指定名称的多个模块
1838
+ - #load {mod1},{mod2},...{modn}: 加载指定名称的多个模块
1839
+ - 注: 多个模块加载时,将依次逐个加载。因此若模块之间有依赖关系请注意先后顺序
1840
+
1841
+ 参数:
1842
+ :modx: 模块名称
1843
+
1844
+ 示例:
1845
+ - ``#load myscript`` : 加载myscript模块,首先会从执行PyMUD应用的当前目录下查找myscript.py文件并进行加载
1846
+ - ``#load pymud.pkuxkx`` : 加载pymud.pkuxkx模块。相当于脚本中的 import pymud.pkuxkx 命令
1847
+ - ``#load myscript1 myscript2`` : 依次加载myscript1和myscript2模块
1848
+ - ``#load myscript1,myscript2`` : 多个脚本之间也可以用逗号分隔
1849
+
1850
+ 相关命令:
1851
+ - #unload
1852
+ - #reload
1853
+ - #module
1854
+ '''
1569
1855
 
1570
1856
  modules = ",".join(code.code[2:]).split(",")
1571
1857
  self.load_module(modules)
1572
1858
 
1573
1859
  def handle_reload(self, code: CodeLine = None, *args, **kwargs):
1574
- "\x1b[1m命令\x1b[0m: #reload {mods/plugins}\n" \
1575
- " 不带参数时(#reload),为当前session重新加载所有配置模块(不是重新加载插件) \n" \
1576
- " 带参数时(#reload {mods/plugins}, 若指定名称为模块,则重新加载模块;若指定名称为插件,则重新加载插件。\n" \
1577
- " 若指定名称既有模块也有插件,则仅重新加载模块(建议不要重名)。\n" \
1578
- " 若要重新加载多个模块,可以在参数中使用空格或英文逗号隔开多个模块名称 \n" \
1579
- "\x1b[1m相关\x1b[0m: load, unload\n"
1860
+ '''
1861
+ 嵌入命令 #reload 的执行函数,重新加载模块/插件。
1862
+ 该函数不应该在代码中直接调用。
1863
+
1864
+ 使用:
1865
+ - #reload: 重新加载所有已加载模块
1866
+ - #reload {modname}: 重新加载名称为modname的模块
1867
+ - #reload {plugins}: 重新加载名称为plugins的插件
1868
+ - #reload {mod1} {mod2} ... {modn}: 重新加载指定名称的多个模块/插件
1869
+ - #reload {mod1},{mod2},...{modn}: 重新加载指定名称的多个模块/插件
1870
+
1871
+ 参数:
1872
+ :modname: 模块名称
1873
+ :plugins: 插件名称
1874
+ :modn: 模块名称
1875
+
1876
+ 注意:
1877
+ 1. #reload只能重新加载#load方式加载的模块(包括在pymud.cfg中指定的),但不能重新加载import xxx导入的模块。
1878
+ 2. 若加载的模块脚本中有语法错误,#reload可能无法生效。此时需要退出PyMUD重新打开
1879
+ 3. 若加载时依次加载了不同模块,且模块之间存在依赖关系,那么重新加载时,应按原依赖关系顺序逐个重新加载,否则容易找不到依赖或依赖出错
1880
+
1881
+ 示例:
1882
+ - ``#reload`` : 重新加载所有已加载模块
1883
+ - ``#reload mymodule`` : 重新加载名为mymodule的模块
1884
+ - ``#reload myplugins`` : 重新加载名为myplugins的插件
1885
+ - ``#reload mymodule myplugins`` : 重新加载名为mymodule的模块和名为myplugins的插件。
1886
+
1887
+ 相关命令:
1888
+ - #load
1889
+ - #unload
1890
+ - #module
1891
+ '''
1580
1892
 
1581
1893
  args = list()
1582
1894
  if isinstance(code, CodeLine):
@@ -1599,14 +1911,29 @@ class Session:
1599
1911
  self.warning(f"指定名称 {mod} 既未找到模块,也未找到插件,重新加载失败..")
1600
1912
 
1601
1913
  def handle_unload(self, code: CodeLine = None, *args, **kwargs):
1602
- "\x1b[1m命令\x1b[0m: #unload {config}\n" \
1603
- " 为当前session卸载{config}指定的模块。当要卸载多个模块时,使用空格或英文逗号隔开\n" \
1604
- " 卸载模块时,将调用模块Configuration类的__del__方法,请将模块清理工作代码形式卸载此方法中 \n"
1605
- " 当不指定模块名称时,将卸载所有模块,并执行reset \n"
1606
- " 例, 卸载所有模块,并清除所有相关信息: #unload \n"
1607
- " 卸载名为pkuxkx的模块: #unload pkuxkx \n"
1608
- " 卸载名为pkuxkx和my的两个模块: #unload pkuxkx my \n"
1609
- "\x1b[1m相关\x1b[0m: load, reload\n"
1914
+ '''
1915
+ 嵌入命令 #unload 的执行函数,卸载模块。
1916
+ 该函数不应该在代码中直接调用。
1917
+
1918
+ 使用:
1919
+ - #unload {modname}: 卸载指定名称的已加载模块
1920
+ - #unload {mod1} {mod2} ... {modn}: 卸载指定名称的多个模块/插件
1921
+ - #unload {mod1},{mod2},...{modn}: 卸载加载指定名称的多个模块/插件
1922
+ - 注意: 卸载模块时并不会自动清理模块所创建的对象,而是调用模块Configuration类的unload方法,
1923
+ 若需要清理模块创建的对象,请将清理工作代码显式放在此方法中 。
1924
+
1925
+ 参数:
1926
+ :modname: 模块名称
1927
+ :modn: 模块名称
1928
+
1929
+ 示例:
1930
+ - ``#unload mymodule``: 卸载名为mymodule的模块(并调用其中Configuration类的unload方法【若有】)
1931
+
1932
+ 相关命令:
1933
+ - #load
1934
+ - #reload
1935
+ - #module
1936
+ '''
1610
1937
 
1611
1938
  args = code.code[2:]
1612
1939
 
@@ -1620,10 +1947,19 @@ class Session:
1620
1947
  self.unload_module(modules)
1621
1948
 
1622
1949
  def handle_modules(self, code: CodeLine = None, *args, **kwargs):
1623
- "\x1b[1m命令\x1b[0m: #modules/mods\n" \
1624
- " 模块命令,该命令不带参数。列出本程序当前已加载的所有模块信息. \n" \
1625
- "\x1b[1m相关\x1b[0m: load, unload, reload, plugins\n"
1626
-
1950
+ '''
1951
+ 嵌入命令 #modules / #mods 的执行函数,显示加载模块清单。该命令不带参数。
1952
+ 该函数不应该在代码中直接调用。
1953
+
1954
+ 使用:
1955
+ - #mods: 显示当前会话所加载的所有模块清单
1956
+
1957
+ 相关命令:
1958
+ - #load
1959
+ - #unload
1960
+ - #reload
1961
+ '''
1962
+
1627
1963
  count = len(self._modules.keys())
1628
1964
  if count == 0:
1629
1965
  self.info("当前会话并未加载任何模块。", "MODULES")
@@ -1631,16 +1967,40 @@ class Session:
1631
1967
  self.info(f"当前会话已加载 {count} 个模块,包括(按加载顺序排列):{list(self._modules.keys())}", "MODULES")
1632
1968
 
1633
1969
  def handle_reset(self, code: CodeLine = None, *args, **kwargs):
1634
- "\x1b[1m命令\x1b[0m: #reset\n" \
1635
- " 复位全部脚本。将复位所有的触发器、命令、未完成的任务,并清空所有触发器、命令、别名、变量等待. \n" \
1636
- "\x1b[1m相关\x1b[0m: load, unload, reload, modules\n"
1970
+ '''
1971
+ 嵌入命令 #reset 的执行函数,复位全部脚本。该命令不带参数。
1972
+ 复位操作将复位所有的触发器、命令、未完成的任务,并清空所有触发器、命令、别名、变量。
1973
+ 该函数不应该在代码中直接调用。
1974
+
1975
+ 使用:
1976
+ - #reset: 复位全部脚本
1977
+
1978
+ 相关命令:
1979
+ - #load
1980
+ - #unload
1981
+ - #reload
1982
+ '''
1983
+
1637
1984
  self.reset()
1638
1985
 
1639
1986
  def handle_save(self, code: CodeLine = None, *args, **kwargs):
1640
- "\x1b[1m命令\x1b[0m: #save\n" \
1641
- " 将当前会话中的变量保存到文件,系统变量(即%开头的)除外 \n" \
1642
- " 文件保存在当前目录下,文件名为 {会话名}.mud \n" \
1643
- "\x1b[1m相关\x1b[0m: variable\n"
1987
+ '''
1988
+ 嵌入命令 #save 的执行函数,保存当前会话变量(系统变量除外)至文件。该命令不带参数。
1989
+ 该函数不应该在代码中直接调用。
1990
+
1991
+ 使用:
1992
+ - #save: 保存当前会话变量
1993
+
1994
+ 注意:
1995
+ 1. 文件保存在当前目录下,文件名为 {会话名}.mud
1996
+ 2. 变量保存使用了python的pickle模块,因此所有变量都应是类型自省的
1997
+ 3. 虽然变量支持所有的Python类型,但是仍然建议仅在变量中使用可以序列化的类型。
1998
+ 4. namedtuple不建议使用,因为加载后在类型匹配比较时会失败,不认为两个相同定义的namedtuple是同一种类型。
1999
+
2000
+ 相关命令:
2001
+ - #variable
2002
+ '''
2003
+
1644
2004
  file = f"{self.name}.mud"
1645
2005
 
1646
2006
  with open(file, "wb") as fp:
@@ -1657,15 +2017,31 @@ class Session:
1657
2017
  self.info(f"会话变量信息已保存到{file}")
1658
2018
 
1659
2019
  def handle_clear(self, code: CodeLine = None, *args, **kwargs):
1660
- "\x1b[1m命令\x1b[0m: #clear #cls {msg}\n" \
1661
- " 清屏命令,清除当前会话所有缓存显示内容\n" \
1662
- "\x1b[1m相关\x1b[0m: connect, exit\n"
2020
+ '''
2021
+ 嵌入命令 #clear / #cls 的执行函数,清空当前会话缓冲与显示。
2022
+ 该函数不应该在代码中直接调用。
2023
+
2024
+ 使用:
2025
+ - #cls: 清空当前会话缓冲及显示
2026
+ '''
2027
+
1663
2028
  self.buffer.text = ""
1664
2029
 
1665
2030
  def handle_test(self, code: CodeLine = None, *args, **kwargs):
1666
- "\x1b[1m命令\x1b[0m: #test {msg}\n" \
1667
- " 用于测试脚本的命令,会将msg发送并显示在session中,同时触发触发器\n" \
1668
- "\x1b[1m相关\x1b[0m: trigger\n"
2031
+ '''
2032
+ 嵌入命令 #test 的执行函数,触发器测试命令。类似于zmud的#show命令。
2033
+ 该函数不应该在代码中直接调用。
2034
+
2035
+ 使用:
2036
+ - #test {some_text}: 测试服务器收到{some_text}时的触发器响应情况
2037
+
2038
+ 示例:
2039
+ - ``#test 你深深吸了口气,站了起来。`` : 模拟服务器收到“你深深吸了口气,站了起来。”时的情况进行触发测试
2040
+ - ``#test %copy``: 复制一句话,模拟服务器再次收到复制的这句内容时的情况进行触发器测试
2041
+
2042
+ 注意:
2043
+ - #test命令测试触发器时,enabled为False的触发器不会响应。
2044
+ '''
1669
2045
 
1670
2046
  new_cmd_text, new_code = code.expand(self, *args, **kwargs)
1671
2047
  line = new_cmd_text[6:] # 取出#test 之后的所有内容
@@ -1704,10 +2080,17 @@ class Session:
1704
2080
  self.info(raw_line, "PYMUD TRIGGER TEST")
1705
2081
 
1706
2082
  def handle_plugins(self, code: CodeLine = None, *args, **kwargs):
1707
- "\x1b[1m命令\x1b[0m: #plugins {plugin_name}\n" \
1708
- " 插件命令。当不带参数时,列出本程序当前已加载的所有插件信息 \n" \
1709
- " 当带参数时,列出指定名称插件的详细信息 \n"
1710
- "\x1b[1m相关\x1b[0m: modules, reload\n"
2083
+ '''
2084
+ 嵌入命令 #plugins 的执行函数,显示插件信息。该命令可以不带参数、带一个参数。
2085
+ 该函数不应该在代码中直接调用。
2086
+
2087
+ 使用:
2088
+ - #plugins: 显示当前会话所加载的所有插件清单
2089
+ - #plugins {myplug}: 显示名称为myplug的插件的详细信息
2090
+
2091
+ 相关命令:
2092
+ - #modules
2093
+ '''
1711
2094
 
1712
2095
  args = code.code[2:]
1713
2096
 
@@ -1728,28 +2111,59 @@ class Session:
1728
2111
  self.writetobuffer(plugin.help)
1729
2112
 
1730
2113
  def handle_replace(self, code: CodeLine = None, *args, **kwargs):
1731
- "\x1b[1m命令\x1b[0m: #replace {msg}\n" \
1732
- " 修改显示内容,将当前行原本显示内容替换为msg显示。不需要增加换行符\n" \
1733
- " 注意:在触发器中使用。多行触发器时,替代只替代最后一行"
1734
- "\x1b[1m相关\x1b[0m: gag\n"
2114
+ '''
2115
+ 嵌入命令 #replace 的执行函数,修改显示内容,将当前行原本显示内容替换为msg显示。不需要增加换行符。
2116
+ 该函数不应该在代码中直接调用。
2117
+
2118
+ 使用:
2119
+ - #replace {new_display}: 将当前行显示替换为{new_display}
2120
+
2121
+ 参数:
2122
+ - :new_display: 替换后的显示,可支持ANSI颜色代码
2123
+
2124
+ 示例:
2125
+ - ``#replace %raw - 捕获到此行`` : 将捕获的当前行信息后面增加标注
2126
+
2127
+ 注意:
2128
+ - 应在触发器的同步处理中使用。多行触发器时,替代只替代最后一行。
2129
+
2130
+ 相关命令:
2131
+ - #gag
2132
+ '''
1735
2133
 
1736
2134
  new_text, new_code = code.expand(self, *args, **kwargs)
1737
2135
  self.replace(new_text[9:])
1738
- #self.replace(code.commandText[9:])
1739
- #self.display_line = code.commandText[9:]
1740
2136
 
1741
2137
  def handle_gag(self, code: CodeLine = None, *args, **kwargs):
1742
- "\x1b[1m命令\x1b[0m: #gag\n" \
1743
- " 在主窗口中不显示当前行\n" \
1744
- " 注意:一旦当前行被gag之后,无论如何都不会再显示此行内容,但对应的触发器不会不生效"
1745
- "\x1b[1m相关\x1b[0m: replace\n"
2138
+ '''
2139
+ 嵌入命令 #gag 的执行函数,在主窗口中不显示当前行内容,一般用于触发器中。
2140
+ 该函数不应该在代码中直接调用。
2141
+
2142
+ 使用:
2143
+ - #gag
2144
+
2145
+ 注意:
2146
+ - 一旦当前行被gag之后,无论如何都不会再显示此行内容,但对应的触发器仍会生效
2147
+
2148
+ 相关命令:
2149
+ - #replace
2150
+ '''
2151
+
1746
2152
  self.display_line = ""
1747
2153
 
1748
2154
  def handle_py(self, code: CodeLine = None, *args, **kwargs):
1749
- "\x1b[1m命令\x1b[0m: #py python-sentence\n" \
1750
- " 直接执行后面跟着的python语句\n" \
1751
- " 执行语句时,环境为当前上下文环境,此时self代表当前会话。"
1752
- "\x1b[1m相关\x1b[0m: 暂无\n"
2155
+ '''
2156
+ 嵌入命令 #py 的执行函数,执行 Python 语句。
2157
+ 该函数不应该在代码中直接调用。
2158
+
2159
+ 使用:
2160
+ - #py {py_code}: 在当前上下文中执行py_code
2161
+ - 环境为当前上下文环境,此时self代表当前会话
2162
+
2163
+ 示例:
2164
+ - ``#py self.info("hello")`` : 相当于在当前会话中调用 ``session.info("hello")``
2165
+ - ``#py self.enableGroup("group1", False)`` : 相当于调用 ``session.enableGroup("group1", False)``
2166
+ '''
1753
2167
 
1754
2168
  try:
1755
2169
  exec(code.commandText[4:])
@@ -1757,25 +2171,49 @@ class Session:
1757
2171
  self.error(f"Python执行错误:{e}")
1758
2172
 
1759
2173
  def handle_info(self, code: CodeLine = None, *args, **kwargs):
1760
- "\x1b[1m命令\x1b[0m: #info {msg}\n" \
1761
- " 使用info输出一行, 主要用于测试\n" \
1762
- "\x1b[1m相关\x1b[0m: warning, error\n"
2174
+ '''
2175
+ 嵌入命令 #info 的执行函数,使用 session.info 输出一行,主要用于测试。
2176
+ 该函数不应该在代码中直接调用。
2177
+
2178
+ 使用:
2179
+ - #info {msg}
2180
+
2181
+ 相关命令:
2182
+ - #warning
2183
+ - #error
2184
+ '''
1763
2185
 
1764
2186
  new_text, new_code = code.expand(self, *args, **kwargs)
1765
2187
  self.info(new_text[6:])
1766
2188
 
1767
2189
  def handle_warning(self, code: CodeLine = None, *args, **kwargs):
1768
- "\x1b[1m命令\x1b[0m: #warning {msg}\n" \
1769
- " 使用warning输出一行, 主要用于测试\n" \
1770
- "\x1b[1m相关\x1b[0m: info, error\n"
2190
+ '''
2191
+ 嵌入命令 #warning 的执行函数,使用 session.warning 输出一行,主要用于测试。
2192
+ 该函数不应该在代码中直接调用。
2193
+
2194
+ 使用:
2195
+ - #warning {msg}
2196
+
2197
+ 相关命令:
2198
+ - #info
2199
+ - #error
2200
+ '''
1771
2201
 
1772
2202
  new_text, new_code = code.expand(self, *args, **kwargs)
1773
2203
  self.warning(new_text[6:])
1774
2204
 
1775
2205
  def handle_error(self, code: CodeLine = None, *args, **kwargs):
1776
- "\x1b[1m命令\x1b[0m: #error {msg}\n" \
1777
- " 使用error输出一行, 主要用于测试\n" \
1778
- "\x1b[1m相关\x1b[0m: info, warning\n"
2206
+ '''
2207
+ 嵌入命令 #error 的执行函数,使用 session.error 输出一行,主要用于测试。
2208
+ 该函数不应该在代码中直接调用。
2209
+
2210
+ 使用:
2211
+ - #error {msg}
2212
+
2213
+ 相关命令:
2214
+ - #info
2215
+ - #warning
2216
+ '''
1779
2217
 
1780
2218
  new_text, new_code = code.expand(self, *args, **kwargs)
1781
2219
  self.error(new_text[6:])