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/__main__.py +10 -1
- pymud/pymud.py +79 -11
- pymud/session.py +607 -169
- pymud/settings.py +3 -2
- pymud/statemachine.py +1525 -0
- {pymud-0.19.1.dist-info → pymud-0.19.2.dist-info}/METADATA +10 -1
- pymud-0.19.2.dist-info/RECORD +17 -0
- {pymud-0.19.1.dist-info → pymud-0.19.2.dist-info}/WHEEL +1 -1
- pymud-0.19.1.dist-info/RECORD +0 -16
- {pymud-0.19.1.dist-info → pymud-0.19.2.dist-info}/LICENSE.txt +0 -0
- {pymud-0.19.1.dist-info → pymud-0.19.2.dist-info}/entry_points.txt +0 -0
- {pymud-0.19.1.dist-info → pymud-0.19.2.dist-info}/top_level.txt +0 -0
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
|
-
|
128
|
-
|
129
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
460
|
-
|
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
|
-
|
1003
|
-
|
1004
|
-
|
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
|
-
|
1028
|
-
|
1029
|
-
|
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
|
-
|
1034
|
-
|
1035
|
-
|
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
|
-
|
1040
|
-
|
1041
|
-
|
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
|
-
|
1049
|
-
|
1050
|
-
|
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
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
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
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
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
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
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
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
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
|
-
|
1295
|
-
|
1296
|
-
|
1297
|
-
|
1298
|
-
|
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
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
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
|
-
|
1320
|
-
|
1321
|
-
|
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
|
-
|
1337
|
-
|
1338
|
-
|
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
|
-
|
1368
|
-
|
1369
|
-
|
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
|
-
|
1378
|
-
|
1379
|
-
|
1380
|
-
|
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
|
-
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
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
|
-
|
1398
|
-
|
1399
|
-
|
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
|
-
|
1410
|
-
|
1411
|
-
|
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
|
-
|
1564
|
-
|
1565
|
-
|
1566
|
-
|
1567
|
-
|
1568
|
-
|
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
|
-
|
1575
|
-
|
1576
|
-
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
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
|
-
|
1603
|
-
|
1604
|
-
|
1605
|
-
|
1606
|
-
|
1607
|
-
|
1608
|
-
|
1609
|
-
|
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
|
-
|
1624
|
-
|
1625
|
-
|
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
|
-
|
1635
|
-
|
1636
|
-
|
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
|
-
|
1641
|
-
|
1642
|
-
|
1643
|
-
|
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
|
-
|
1661
|
-
|
1662
|
-
|
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
|
-
|
1667
|
-
|
1668
|
-
|
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
|
-
|
1708
|
-
|
1709
|
-
|
1710
|
-
|
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
|
-
|
1732
|
-
|
1733
|
-
|
1734
|
-
|
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
|
-
|
1743
|
-
|
1744
|
-
|
1745
|
-
|
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
|
-
|
1750
|
-
|
1751
|
-
|
1752
|
-
|
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
|
-
|
1761
|
-
|
1762
|
-
|
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
|
-
|
1769
|
-
|
1770
|
-
|
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
|
-
|
1777
|
-
|
1778
|
-
|
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:])
|