Name | pymud JSON |
Version |
0.21.8
JSON |
| download |
home_page | None |
Summary | a MUD Client written in Python |
upload_time | 2025-08-08 07:12:25 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.8 |
license | None |
keywords |
mud
multi-user dungeon
client
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# PyMUD - Python原生MUD客户端
## 简介
+ 北侠WIKI: https://www.pkuxkx.net/wiki/tools/pymud
+ 源代码地址: https://github.com/crapex/pymud
+ 帮助文档地址: https://pymud.readthedocs.io
+ PyPi项目地址: https://pypi.org/project/pymud
+ 由deepwiki自动生成的项目理解文档地址: https://deepwiki.com/crapex/pymud
+ PyMUD用户shanghua写的入门教程文档:https://www.pkuxkx.net/forum/forum.php?mod=viewthread&tid=49999&forumuid=12067
+ 交流QQ群:554672580
### 北大侠客行Mud (www.pkuxkx.net),最好的中文Mud游戏!
### PyMUD是我为了更好的玩北大侠客行,特意自行开发的MUD客户端。PyMUD具有以下特点:
+ 原生Python开发,除 `prompt-toolkit <https://python-prompt-toolkit.readthedocs.io>`_ 及其依赖库 wcwidth, pygment, pyperclip 外,不需要其他第三方库支持
+ 原生Python的asyncio实现的通信协议处理,支持async/await语法在脚本中直接应用,脚本实现的同步异步两种模式由你自己选择
+ 基于控制台的全屏UI界面设计,支持鼠标操作(Android上支持触摸屏操作),极低资源需求,在单核1GB内存的Linux VPS上也可流畅运行
+ 支持分屏显示,在数据快速滚动的时候,上半屏保持不动,以确保不错过信息
+ 解决了99%情况下,北大侠客行中文对不齐,也就是看不清字符画的问题
+ 真正的支持多session会话,支持命令或鼠标切换会话
+ 原生支持多种服务器端编码方式,不论是GBK、BIG5、还是UTF-8
+ 支持NWAS、MTTS协商,支持GMCP、MSDP、MSSP协议
+ 一次脚本开发,多平台运行。只要能在该平台上运行python,就可以运行PyMUD客户端
+ 脚本所有语法均采用Python原生语法,因此你只要会用Python,就可以自己写脚本,免去了再去学习lua、熟悉各类APP的使用的难处
+ 全开源代码,因此脚本也可以很方便的使用visual studio code等工具进行调试,可以设置断点、查看变量等
+ Python拥有极为强大的文字处理能力,用于处理文本的MUD最为合适
+ Python拥有极为丰富的第三方库,能支持的第三方库,就能在PyMUD中支持
+ 多语言支持框架已搭好,目前提供中文、英文支持,可以自己增加翻译后的其他语言版本
+ 我自己还在玩,所以本客户端会持续进行更新:)
### 哪些人适合使用PyMUD
+ 比较熟悉Python语言,会使用Python写代码的 -> PyMUD是纯Python原生开发,不会有其他客户端对Python的支持能比得过PyMUD
+ 虽不太熟悉Python语言,但有想法想学习Python语言的 -> 正好使用PyMUD玩北侠写脚本的过程中学习Python语言
+ 觉得还有些功能现在所有客户端都没有的 -> 你有需求,我来增加,就是这么方便
+ 觉得也想自己整一个定制客户端玩玩的 -> PyMUD完全开源,且除ui框架外全部都是一行一行代码自己写的,可以直接参考PyMUD的设计
## 版本更新信息
### 0.21.8 (2025-08-08)
+ 功能新增: 现在可以通过调用 exec 系列函数来调用 #session 命令了。
+ 功能新增: 现在 #close 命令可以带参数了。可以使用会话名指定关闭哪个会话,不指定时默认关闭当前会话。可以使用 -f 或 --force 参数强制关闭会话,此时即使会话连接状态,也不弹出确认对话框。
### 0.21.7 (2025-08-02)
+ 问题修复: 删除了插件加载的冗余错误代码。
+ 问题修复: 修复了插件加载报错时的错误提示语句不显示的问题。
+ 功能新增: 针对应用退出时的资源释放和清理进行了完善,确保插件中申请的资源可以正常卸载。
+ 功能新增: 可以通过pymud.cfg在client字段中的cursor字段来设置光标形状。支持的光标包括: UNDERLINE, BEAM, BLOCK, BLINKING_BLOCK, BLINKING_UNDERLINE, BLINKING_BEAM。默认为闪烁竖线 BLINKING_BEAM。
### 0.21.6 (2025-06-29)
+ 问题修复: 修复了连接报错时,异常信息不显示的问题。
+ 问题修复: 修复了在脚本中发生同步触发器运行异常时,连接会中断的问题。
+ 问题修复: 修复了在初始化时,默认会指定当前目录为脚本目录而不能接受用户如数的问题。
+ 功能调整: 在初始化时,原先会根据检测到的系统语言进行语言选择,现增加了人工确认环节,可以手动切换。
+ 功能调整: 颜色校正追溯调整为更多行,解决当打印异常追踪行数过多时,红色背景会中断恢复的情况。
+ 功能新增: #var命令现在支持查询仅知道开头或者结尾的变量。例如,使用 #var abc* 会仅打印所有以 abc 开头的变量,使用 #var *abc 会仅打印所有以 abc 结尾的变量。
+ 问题修复: 修复了个别函数中,部分执行路径无返回值的问题。
### 0.21.5post2 (2025-06-10)
+ 功能完善: 完善了美化功能,已知情况下,基本不会出现断行和不对齐问题了。
+ 功能完善: 在向服务器送出单个回车命令后,本地显示也强制换行。在出现『未完待续』情况时,回车后不会再跟在后面显示了,而是会强制从下一行开始。
+ 功能完善: 当对行进行双击选择时,背景增加的选择标记(灰色)会按照实际显示的宽度进行匹配,而不是按照原始数据的宽度进行匹配。
### 0.21.4 (2025-06-08)
+ 问题修复: 修复了在多行选择碰到空行时,会导致从头开始全选的问题。
+ 问题修复: 修复了从后往前选择时,若再往后选择,会导致起始位置错误的问题。
+ 问题修复: 修复了纯文本行单行部分复制时,最后一个字符无法被选中和复制的问题。
+ 问题修复: 修复了美化模式下,当服务器使用tab对齐在本地显示中无法对齐的问题。为配合对齐,默认tabstop已修改为8。
+ 功能调整: 当上下分屏显示时,上半屏也能显示到最后一行,而不是仅显示到分屏处位置。
### 0.21.3 (2025-06-02)
+ 问题修复: 修复了当缓存行数超过规定值时,由于代码错误导致清屏的问题。
+ 功能增强: 增加清除任务时的异常保护,此时产生asyncio.CancelledError异常为正常现象,因此捕获后禁止异常处理。
+ 功能增强: 对reset进行了异常提示保护,此时产生异常(大部分为asyncio.CancelledError)为正常现象,因此捕获后禁止异常处理。
### 0.21.2 (2025-06-01)
+ 问题修复: 修复了当自动重连启动时,即使会话关闭了,也会自动重连的问题。
+ 实现调整: 重写了专用的会话缓冲、记录缓冲与PyMUD缓冲显示控制器,在prompt_toolkit的原Buffer和BufferControl的基础仅提供了PyMUD所需的基础功能,以降低内存占用。
经测试,当前内存基本稳定,视会话数量和脚本情况差异,维持在几百兆左右(500M以下),且不会有大幅波动。重写后,低配置的VPS也可以稳定运行PyMUD。
### 0.21.0 (2025-05-20)
+ 功能新增: 各类对象的group属性,新增组、子组概念,用于快速成组操作对象。组可以包括子组,子组可以再包括子组。
组名以点号.分隔,例如:group1.subgroup1.subsubgroup1。组的层级没有限制。
组的概念可以用于快速处理多个对象,例如启用/禁用一组对象、删除一组对象等。例如,以下几个组的关系:
- mygroup1
- mygroup1.subgroup1 # 属于 mygroup1的子组
- mygroup1.subgroup2 # 属于 mygroup1的子组
- mygroup1.subgroup2.subsubgroup1 # 属于 mygroup1.subgroup2的子组,也同样属于更高层级mygroup1的子组
- mygroup2
- mygroup2.subgroup1 # 属于 mygroup2的子组
+ 功能新增: 新增了deleteGroup函数,用于删除指定的对象组。可同时指定组名、是否包含子组名、有效类型范围。函数定义和示例代码如下:
``` Python
def deleteGroup(self, group: str, subgroup = True, types: Union[Type, Union[Tuple, List]] = (Alias, Trigger, Command, Timer, GMCPTrigger)):
pass
# 各参数含义:
# group: 要删除的组名,可以是完整的组名,也可以是部分组名。例如:"group1" 或 "group1.subgroup1" 等。
# subgroup: 是否包含子组。如果为True,则删除指定组及其所有子组的对象。如果为False,则仅删除指定组的对象,不包括子组。
# types: 要删除的对象类型范围。可以是单个类型,也可以是类型的元组或列表。例如:Trigger, Alias, Command, Timer, GMCPTrigger 等。
# 示例代码:
# 删除所有属于group1的Trigger和Alias对象,包括子组如 group1.subgroup1 和 group1.subgroup2 等
self.session.deleteGroup("group1", True, [Trigger, Alias])
# 删除所有属于group1的Trigger对象,但不包括子组
self.session.deleteGroup("group1", False, [Trigger])
```
+ 功能新增: 对 #trigger, #alias, #timer, #gmcp, #command, #t+, #t- 等命令新增了组处理选项,用于对整组对象进行处理。各命令的语法格式类似。
处理组时,组名应以大于号>或者等于号=开头,紧跟组名(无空格)。当使用>时,表示操作针对当前组及所有所属子组,当使用=时,表示操作仅针对当前组。
例如下面代码:
```
#t+ >group1 表示启用所有属于group1以及其子组的所有可管理对象,包括Trigger、Alias、Command、Timer、GMCPTrigger
#t- =group1.subgroup1 表示禁用所有仅属于group1.subgroup1的Trigger、Alias、Command、Timer、GMCPTrigger等对象
#tri >group1 off 表示禁用所有属于group1以及其子组的Trigger对象
#ali =group1.subgroup1 on 表示启用所有仅属于group1.subgroup1的Alias对象
```
+ 功能新增: 调整了enableGroup处理,可以通过组名支持子组操作,也可以指定有效类型范围。例如下面代码:
``` Python
class MyTestConfig(IConfig):
def __init__(self, session, *args, **kwargs):
self._objs = [
Trigger(session, "tri1", group = "group1"),
Trigger(session, "tri2", group = "group1.subgroup1"),
Trigger(session, "tri3", group = "group1.subgroup2"),
Alias(session, "alias1", group = "group1"),
Alias(session, "alias2", group = "group1.subgroup1"),
Timer(session, 5, group = "group1.subgroup1")
]
#以下调用可以同时禁用上述6个对象,因为 group1.subgroup1 和 group1.subgroup2 都属于 group1 的子组
session.enableGroup("group1", False)
#以下调用可以同时仅启用触发器tri1和别名alias1,因为通过subgroup参数限定了不传递到子组
session.enableGroup("group1", True, subgroup = False)
# 以下调用可以同时禁用对应发器和别名,但不禁用定时器,因为通过types参数指定了有效范围:
session.enableGroup("group1.subgroup1", False, types = [Trigger, Alias])
```
+ 功能新增: 增加了多处异常追踪提示。在模块或插件的脚本中发生错误时,均会打印错误追踪信息,方便定位错误。
+ 功能新增: 新增 #echo 命令,类似于 #test 命令,但该命令只会模拟收到服务器数据,直接激发各匹配触发器,但不显示触发测试结果。
+ 功能新增: #load / #unload 现在支持当前会话对插件的临时启用和禁用,实现方式为调用插件里的PLUGIN_SESSION_CREATE和PLUGIN_SESSION_DESTROYE函数。群文件的moving.py插件写法可以支持。
+ 功能调整: 各会话变量保存的.mud文件,统一移到save子目录下。原来当前目录下的.mud文件,在对应会话重新加载时会自动移动,无需人工处理。
+ 功能新增: 增加了国际化(i18n)支持,原生开发语言为中文简体,目前使用AI翻译生成了英文。应用语言通过Settings中新增的language配置来控制,默认为"chs",可以在pymud.cfg中覆盖该配置。其值目前可以为"chs"、"eng"。自行翻译的语言可以在pymud/lang目录下下新增语言文件,文件名为i18n_加语言代码,例如"i18n_chs.py"表示可以使用"chs"语言,其中使用Python字典方式定义了所有需动态显示的文本内容。
+ 功能新增: 新增了使用元类型及装饰器来管理PyMUD对象,包括Alias, Trigger, Timer, GMCPTrigger四种可以使用对应的装饰器,@alias, @trigger, @timer, @gmcp来直接在标记函数上创建。可以参考本版本中的pkuxkx.py文件写法和注意事项。
+ 功能新增: 新增了两个装饰器,@exception和@async_exception,用于捕获异常并调用session.error进行显示。@exception用于捕获同步异常,@async_exception用于捕获异步异常。参考如下:
``` Python
from pymud import Command, Trigger, IConfig, exception, async_exception
class MyCustomCommand(Command, IConfig):
@exception
def a_sync_routine(self, args: list[str]):
# 这里的代码抛出的异常会被self.session.error捕获并显示
something_that_may_raise_an_exception()
@async_exception
async def execute(self, args: list[str]):
# 这里的代码抛出的异常会被self.session.error捕获并显示
await something_that_may_raise_another_exception()
# 上述代码相当于以下代码
class MyCustomCommand(Command, IConfig):
def a_sync_routine(self, args: list[str]):
try:
something_that_may_raise_an_exception()
except Exception as e:
self.session.error(error_msg_of_e)
async def execute(self, args: list[str]):
try:
await something_that_may_raise_another_exception()
except Exception as e:
self.session.error(error_msg_of_e)
```
+ 问题修复: 修复了Alias和Command执行时的优先级判断。之前未进行优先级判断,因此遇到能同时匹配的多个时,不一定优先级高的被触发。现在对Alias和Command进行了优先级判断,优先级高的先触发。
+ 问题修复: 修复Alias中的keepEval参数和oneShot参数。keepEval参数支持多个匹配成功的别名同时生效,oneShot参数支持一个匹配成功的别名生效后,后续的匹配不再生效。
+ 问题修复: 修复Command中的keepEval参数。以往同时匹配生效的Command会覆盖后续Command和Alias,当前会持续匹配。
+ 功能增强: 对几乎所有函数的参数进行了类型标注,增加了类型检查,提高了代码的可读性和可维护性,也便于自行编写脚本时的提示。
+ 功能增强: 为Session类型增加了commandHistory属性,用于查询发送到服务器的命令历史。保存的命令历史的数量由pymud.cfg中的client["history_records"]控制,默认为500。当该值为0时,不会保存命令历史。为-1时,会保存所有命令历史。
+ 功能调整: #help命令时,增加了上下两行分隔符显示,以便明显区分帮助输出和游戏输出。
+ 功能增强: 当前PyMUD界面中显示的版本号会自动从pyproject.toml中读取,以确保版本号的准确性和唯一性。
+ 问题修复: 修复了代码中的部分编码错误。新版Python中能容忍一些错误,但老版本不行。经修复,当前代码支持的Python版本已测试3.8确保可用。建议使用3.10或更高版本的Python。
+ 问题修复: 删除了extras.py中多余的MenuItem类型定义,该定义与prompt_toolkit中的MenuItem定义冲突。
+ 问题修复: 调整了众多代码中未检查对象是否为None即调用、使用的局部变量可能未经过初始化和赋值路径等的情况,保证程序运行的健壮性。
+ 问题修复: 修复了#test命令的帮助内容错误。实际#show命令不触发脚本,仅测试;而#test会触发脚本。
+ 问题修复: 修复了协议处理中MSDP编码解码处理错误的问题;修复了协议处理中默认encoding不传递导致某些情况下报解码错误的问题。
+ 示例更新: 更新了包中自带的pkuxkx.py,增加了@alias, @trigger, @timer, @gmcp的示例以及状态窗口的示例。
### 0.20.4 (2025-03-30)
+ 功能调整: 为插件功能新增了 PLUGIN_PYMUD_DESTROY 方法,用于在插件被卸载时,进行一些清理工作。
+ 功能调整: 将插件的 PLUGIN_PYMUD_START 方法的调用,从插件加载时刻移动到事件循环启动之后,这样在加载时,可以使用 asyncio.create_task或 asyncio.ensure_future 来执行一些异步操作
### 0.20.3 (2025-03-05)
+ 功能调整: 为适应MacOS下的快捷键,增加Shift+左右箭头同样作为切换会话的快捷键。
+ 功能调整: 会话关闭和APP退出时,偶尔受网络影响导致服务器掉线但本地未检测到时会无法退出。现增加最长10s等待,超时后会中断,强制退出。
### 0.20.2 (2024-11-26)
+ 功能调整: MTTS协商中,将256 Color明确写入协商回复。原先仅包含ANSI 和 TrueColor。推测武庙特殊颜色偶尔不正常与此有关(已测试无关)。
+ 功能调整: 修复了纯文本正则处理,目前理论上支持所有ANSI控制代码的处置,以正确响应纯文本触发器。
+ 功能调整: 修改了#var和#global的显示实现,提高了变量打印排列的整齐度和辨识度,以适应长值变量和复杂变量。
+ 问题修复: 修复了单行颜色代码跨行无法显示问题。现在星宿毒草可以正常辨认颜色了。
+ 功能调整: 调整了info/warning/error的显示处理,默认样式进行了修改。
+ 功能新增: 新增菜单选项:打开/关闭美化,以便于更好的在触发器时复制出正确的内容(以前计算可能不准确)。
+ 功能新增: 状态栏的分隔符可以通过本地设置取消了。在pymud.cfg的client中新增设置,将 status_divider 设置为 false 即可。
+ 功能调整: 在pymud.cfg的client中可以支持将buffer_lines设置为0了,表示不清除缓存。
+ 功能新增: 为状态栏显示函数增加了异常保护,再有status_maker出错的时候,状态栏会显示出错信息。
### 0.20.1 (2024-11-16)
+ 功能调整: 会话中触发器匹配实现进行部分调整,减少循环次数以提高响应速度
+ 功能调整: #test / #show 触发器测试功能调整,现在会对使能的和未使能的触发器均进行匹配测试。其中,#show 命令仅测试,而 #test 命令会导致触发器真正响应。
+ 功能新增: PyMUD对象新增了一个持续运行的1s的周期定时任务。该任务中会刷新页面显示。可以使用 session.application.addTimerTickCallback 和 session.application.removeTimerTickCallback 来注册和解除定时器回调。
### 0.20.0 (2024-08-25)
+ 功能调整: 将模块主入口函数从__main__.py中移动到main.py中,以使可以在当前目录下,可直接使用pymud,也可使用python -m pymud启动
+ 功能调整: 使用argsparser标准模块来配置命令行,可以使用 pymud -h 查看命令行具体参数及说明
+ 功能新增: 命令行参数增加指定启动目录的功能,参数为 -s, --startup_dir。即可以从任意目录通过指定脚本目录方式启动PyMUD了。
- 例如, PS C:\> pymud -s d:\prog\pkuxkx 相当于 PS D:\prog\pkuxk> pymud
+ 问题修复: MacOS下 python -m pymud init 创建目录报错的问题。同时,将所有系统上的默认目录均使用 ~/pkuxkx (影响windows)
+ 功能调整: 恢复在__init__.py中增加PyMudApp的导出,可以恢复使用from pymud import PyMudApp了
+ 功能新增: 增加log功能,详见 #log 命令介绍、类参考中的 Logger 类,以及 Session 类的 handle_log 方法
+ 功能新增: 增加 #disconnect, #dis 命令,可以使当前会话从服务器断开。相当于操作菜单 会话->断开连接
+ 功能调整: 在没有session的时候,也可以执行#exit命令
+ 功能新增: #session 命令增加快捷创建会话功能,假如已有快捷菜单 世界->pkuxkx->newstart , 则可以通过 #session pkuxkx.newstart 直接创建该会话,效果等同于点击该菜单
+ 功能调整: 点击菜单创建会话时,若会话已存在,则将该会话切换为当前会话
+ 重大更新: 完全重写了模块的加载、卸载、重新加载方法,修复模块使用中的问题
+ 功能调整: 现在只要将一个类型继承 IConfig 接口,即被识别为配置类型。这种类型在模块加载时会自动创建其实例。当然,名称为Configuration的类型也同样被认为是配置类型,保持向前兼容性。唯一要求是,该类型的构造函数允许仅传递一个session对象。
+ 功能新增: 各类配置类型的卸载现在既可以定义在__unload__方法中,也可以定义在unload方法中。可以根据自己喜好选择一个即可。
+ 功能调整: 各配置类型加载和重新加载前,会自动调用模块的__unload__方法或unload方法(若有)
+ 功能新增: Command基类增加__unload__方法和unload方法,二者在从会话中移除该 Command 时均会自动调用。自定义的Command子类应覆盖这两种方法中的一种方法,并在其中增加清除类型自行创建的 Trigger, Alias 等会话对象。这样,模块卸载时只要移除命令本身,在命令中新建的其他关联对象将被一同移除。
+ 功能新增: 所有PyMUD基础对象类型及其子类型,包括 Alias, Trigger, Timer, Command, GMCPTrigger 及它们的子类型,在创建的时候会自动添加到会话中,无需再进行 addObject 等操作了
+ 问题修复: 修复部分正则表达式书写错误问题
+ 功能新增: Session类新增waitfor函数,用于执行一段代码后立即等待某个触发器的情况,简化原三行代码写法
``` Python
# 原来为确保await triggered的任务在输入前等待,有时候需要这么写:
task = self.create_task(self.tri1.triggered())
await asyncio.sleep(0.05)
self.session.writeline('dazuo')
await task
# 现在可以一句话简写:
await self.session.waitfor('dazuo', self.create_task(self.tri1.triggered()))
```
+ 功能调整: Session类的addTriggers等方法接受的dict中,会将对象本身id作为会话处理id。当该id与key不一致时,会同时显示警告。
+ 功能新增: Session类新增addObject, addObjects, delObject, delObjects用于操作别名、定时器、触发器、GMCP触发器、命令等对象。
- 使用示例:
```Python
# 所有对象均可以使用 delObject 直接从会话中移除,会自动根据对象类型推断,无需通过函数名区分
session.delObject(self.tri1)
session.delObject(self.ali1)
session.delObject(self.timer1)
objs = [
Trigger(session, xxx, xxx),
Alias(session, xxx),
SimpleCommand(session, xxx),
Timer(session, xxx),
GMCPTrigger(session, xxx)
]
session.delObjects(objs) # 可以直接从会话中移除一个数组中的所有对象,会自动判断对象类别
```
+ 功能新增: Session类型新增idletime属性,可以获取本会话发呆秒数(float类型)。当会话处于未连接状态时,返回 -1。可以利用定时器,在其中检测 idletime 值,以在机器人出错后处理恢复
+ 功能新增: Session的所有异步命令调用函数增加返回值,现在调用 session.exec_async, exec_command_async 等方法执行的内容若匹配为命令时,会返回最后最后一个 Command 对象的 execute 函数的返回值
- 例如, result = await self.session.cmds.cmd_runto.execute('rt yz') 与 result = await self.session.exec_async('rt yz') 等价,返回值相同
- 但 result = await self.session.exec_async('rt yz;dzt'),该返回的result 仅是 dzt 命令的 execute 的返回值。 rt yz 命令返回值被丢弃。
+ 功能新增: 增加临时变量概念,变量名以下划线开头的为临时变量,此类变量不会被保存到 .mud 文件中。
+ 功能新增: 为 BaseObject 基类的 self.session 增加了 Session 类型限定,现在自定义 Command 等时候,使用 self.session 时会有 IntelliSence 函数智能提示了,所有帮助说明已补全
+ 问题修复: 修复 #var 等命令中,若含有中文则等号位置不对齐的问题
+ 功能调整: 在 #tri 等命令中,当对象的 group 为空时,将不再显示 group 属性,减少无用信息
### 0.19.4 (2024-04-20)
+ 功能调整: info 现在 msg 恢复为可接受任何类型参数,不一定是 str
+ 功能调整: #var, #global 指令中,现在可以使用参数扩展了,例如 #var max_qi @qi
+ 功能调整: #var, #global 指令中,现在对字符串会先使用 eval 转换类型,转换失败时使用 str 类型。例如, #var myvar 1 时,myvar类型将为int
+ 功能调整: 变量替代时,会自动实现类型转化,当被替代变量值为非 str 类型时不会再报错
+ 问题修复: 修复之前从后向前选择时,无法复制的问题
### 0.19.3post2 (2024-04-05)
+ 问题修复: 一次发送多个命令时,发送顺序可能不正确的情况
+ 功能增加: 新增一个exec_async函数,是exec函数的异步形式。可以在其他会话中异步执行一段代码
+ 帮助完善: 帮助文档逻辑完善,已完成整个包的内置文档的编写和修改
+ 注: 由于我没弄太明白 readthedocs.io 网站对于读取github源代码的逻辑,目前只能通过新发布正式版本的形式来使 readthedocs.io 网站的文档中的类参考自动更新。
+ 问题修复: 修复退出程序时的小bug
### 0.19.2post2 (2024-03-24)
+ 错误修复:订正部分错别字、错误帮助、错别格式
+ 系统完善:完善帮助体系,按reST格式重写所有有关的docstring
+ 功能调整:session.exec_command / exec_command_async / exec 系列命令调整,现在可以在exec时带变量参数了。例如 session.exec("dazuo @dzpt"),直接调用 dzpt的变量值
+ 功能调整: settings.py中,client字典增加配置reconnect_wait,为自动重连的等待时间,默认15s,可本地覆盖
+ 功能调整: 变通解决了菜单栏右边单击 帮助 菜单会响应问题
+ 错误修复: 修复了会话关闭时插件卸载的代码错误
+ 功能调整: 在会话关闭、程序退出时增加等待,确保收到服务器断开命令之后才关闭和退出
+ 问题修复: 在退出程序时增加了插件卸载调用
+ 实现调整: 在清除task的列表推导过程中去掉了类型判断以减少任务时间占用
+ 其他调整: 从包中删除了拷贝过来作为参考的文件
+ 帮助完善: 帮助文档逻辑完善
+ 实现调整: 改用官方示例的task清除方式,每个任务结束后清除
### 0.19.1 (2024-03-06)
+ 功能新增: 新增鼠标启用禁用功能,以适用于ssh远程情况下的复制功能。F2快捷键可以切换状态。当鼠标禁用时,底部状态栏右侧会显示“鼠标已禁用状态”
+ 功能新增: 新增快捷键F1会直接通过浏览器打开帮助网址 https://pymud.readthedocs.io/
+ 功能新增: 新增默认快捷键F3=#ig, F4=#cls, F11=#close, F12=#exit。此几个快捷键通过配置文件进行配置,可以自行定义或修改。F1、F2为写死的系统功能。
+ 功能调整: 将除#session之外的所有其他#命令实现统一到Session类中实现,这些命令均支持通过Session.exec_command运行
+ 功能调整: python -m pymud init时,创建的pymud.cfg文件增加了keys字典
### 0.19.0 (2024-03-01)
+ 实现调整: session.info/warning/error处理多行时,会给每一行加上同样颜色
+ 功能新增: 初次运行时,可以使用python -m pymud init来初始化环境,自动创建目录并在该目录中建立配置文件和样例脚本文件
+ 实现调整: 将缓冲清除行数的实现调整到SessionBuffer中,减少代码耦合并进一步降低内存占用
+ 功能新增: 新增命令行命令#T+, #T-, 可以使能/禁用指定组,相当于session.enableGroup操作
+ 功能新增: 新增命令行命令#task,可以列出所有系统管理的Task清单,主要用于开发测试
+ 实现调整: 调整系统管理Task的清空和退出机制,减少处理时间占用和内存占用
+ 实现调整: 调整COPY-RAW模式复制,即使仅选中行中的部分内容,也自动识别整行(多行模式也是整个多行)
+ 功能新增: Settings中新增keys字典,用于定义快捷键。可定义快捷键参见prompt_toolkit中Keys的定义。其值为可在session.exec_command运行支持的所有内容。该字典内容可以被pymud.cfg所覆盖。
### 0.18.4post4 (2024-02-23)
+ 功能新增:新增Settings.client["buffer_lines"],表示保留的缓冲行数(默认5000)。当Session内容缓冲行数达到该值2倍时(10000行),将截取一半(5000行),后一半内容进行保留,前一半丢弃。此功能是为了减少长时挂机的内存消耗和响应时间。
+ 功能修复:解决在显示美化(Settings.client["beautify"])打开之后,复制部分文字不能正确判断起始终止的问题。
+ 功能调整:修改缓冲行数判断逻辑,加快客户端判断响应速度。
+ 问题调整:修改缓冲截取处理中的小BUG。
+ 功能调整:将帮助窗口中的链接改到帮助网址: https://pymud.readthedocs.org
+ 问题修复:修复了随包提供的pkuxkx.py样例脚本中的几处错误
### 0.18.3 (2024-02-07)
+ 功能调整:原#unload时通过调用__del__来实现卸载的时间不可控,现将模块卸载改为调用unload函数。若需卸载时人工清除有关定时器、触发器等,请在Configuration类下新增unload函数(参数仅self),并在其中进行实现
+ 功能新增:新增会话Variable和全局Global的删除接口。可以通过session.delVariable(name)删除一个变量,可以通过session.delGlobal(name)来删除一个全局Global变量
### 0.18.2 (2024-02-06)
+ 问题修复:修改了定时器实现,以避免出现递归调用超限异常
+ 问题修复:修改了参数替代时的默认值,从None改为字符串"None",以避免替代时报None异常
### 0.18.1 (2024-02-05)
+ 问题修复:统一处置了task.cancel的参数和create_task的name属性,以适应更低版本的python环境(低至3.8)
+ 实现调整:为解决同步/异步执行问题,在CodeLine和CodeBlock的实现中,会通过调用命令来判断是否使用同步模式(默认为异步)。#gag、#replace为强制同步,#wa为强制异步。当同时存在时,同步失效,异步执行。
+ 实现调整:将%line、%raw的访问传递到触发器内部的执行中,避免同步异步问题。
+ 新增文档:将帮助文档添加到本项目,帮助文档自动同步到 pymud.readthedocs.org (文档内容暂未更新)
### 0.18.0 (2024-01-24)
+ 问题修复:修复了delTrigger/delAlias等等无法删除对象的问题
+ 功能调整:delTrigger等函数,修改为既可以接受Trigger对象本身,也可以接受其id。其他类似
+ 功能增加:增加了delTriggers(注意,带s)等函数,可以删除多个指定对象。可接受列表、元组等可迭代对象,并且其内容既可以为对象本身,也可以为id。
+ 功能增加:增加了session.reset()功能,可清除会话所有有关脚本信息。也可以在命令行使用#reset调用,另外,#unload不带参数调用时,有同样效果
+ 功能增加:增加了#ignore/#ig参数,类似于zmud的#ignore功能,可以切换全局触发器禁用状态。当全局被禁用时,底部状态栏右侧会显示此状态。(未全局禁用时不显示)
+ 功能调整:移除了会话切换时,状态栏显示的内容
+ 功能调整:会话命令的执行整体进行了实现调整,将参数替代延迟到特定命令执行时刻。(此实现影响面较大,请大家使用中发现BUG时都报告下,我及时修改)
+ 功能调整:代码块现在可以使用{}括起来了。这种情况下,命令和命令可以嵌套了。例如,#3 {#3 get g1b from bo yu;combine gem;pack gem;#wa 3000},该代码可以执行三次合并g1b宝石
+ 功能新增:增加了#ali,#tri,#ti的三参数使用,可以在命令行直接代码创建SimpleAlias, SimpleTrigger和SimpleTimer。
+ 使用示例:#ali {gp\s(\S+)} {get %1 from corpse}, #tri {^[> ]*【\S+】.+} {#mess %line}, #ti 10 {xixi;haha}
+ 功能新增:新增#session_name cmd命令,可以直接使名为session_name的会话执行cmd命令
+ 功能新增:session类型新增exec方法,使用方法为:session.exec(cmd, session_name)。可以使名为session_name的会话执行cmd命令。当不指定session_name时,在当前会话执行。
+ 功能调整:定时器创建时若不指定id,其自动生成的id前缀由tmr调整为ti
+ 实现调整:将#all、#session_name cmd等命令的实现从pymud.py中移动到了session.py中,这样可以在脚本中使用session.exec_command("#all xixi")。
+ 问题修复:修复了点击菜单"重新加载脚本配置"报错的问题
+ 功能调整:从菜单里点击创建会话时,会自动以登录名为本会话创建id变量
+ 当前已知问题:由于同步/异步执行问题,在SimpleTrigger中,#gag和#replace的执行结果会很奇怪,可能会隐藏和替换掉非触发行。可行的办法为在onSuccess里,调用session.replace进行处理。
### 0.17.4 (2024-01-08)
+ 问题修复:修复了DotDict在dump时出现错误的问题
+ 问题修复:修改了reconnect的实现方式,修复了断开重连时报错的问题
+ 功能增加:为Session增加两个事件属性,分别为event_connected和event_disconnected,接受一个带有session参数的函数,在连接和连接断开时触发。
+ 功能调整:调整了时间显示格式,只显示到秒,不显示毫秒数。
### 0.17.3 (2024-01-02)
+ 问题修复:修复了原有的#repeat功能。命令行#repeat/#rep可以重复输入上一次命令(这个基本没用,主要是我在远程连接时,手机上没有方向键...)
+ 问题修复:修改定时器的实现方式,真正修复了定时器每reload后会新增一个的bug。
+ 功能增加:命令行使用#tri, #ali, #cmd, #ti时,除了接受on/off参数外,增加了del参数,可以删除对应的触发器、别名、命令、定时器。例如:#ti tm_test del 可以删除id为“tm_test”的定时器。
+ 功能调整:调整了#help {cmd}的显示格式,最后一行也增加了换行符,确保后续数据在下一行出现。
+ 功能调整:调整了Timer和SimpleTimer在#timer时的显示格式。
+ 实现调整:调整了Session.clean实现中各对象清理的顺序,将任务清除移到了最后。
### 0.17.2post4 (2023-12-29)
+ 功能修改:会话菜单 "显示/隐藏命令" 和 "打开/关闭自动重连" 操作后,增加在当前会话中提示状态信息。
+ 功能修改:Timer实现进行修改,以确保一个定时器仅创建一个任务。
+ 功能调整:Timer对象在复位Session对象时,也同时复位。目的是确保reload时不重新创建定时器任务。
+ 功能调整:在会话连接时,不再复位Session有关对象信息。该复位活动仅在连接断开时和脚本重新加载时进行。
+ 功能调整:启动PyMUD时,会将控制台标题设置为PyMUD+版本号。
+ 问题修复:修复会话特定脚本模块会被其他会话加载的bug。
+ 问题修复:修复定时器Timer中的bug。
### 0.17.1post1 (2023-12-27)
本版对模块功能进行了整体调整,支持加载/卸载/重载/预加载多个模块,具体内容如下:
+ 当模块中存在名为Configuration类时,以主模块形式加载,即:自动创建该Configuration类的实例(与原脚本相同)
+ 当模块中不存在名为Configuration类时,以子模块形式加载,即:仅加载该模块,但不会创建Configuration的实例
+ \#load命令支持同时加载多个模块,模块名以半角逗号(,)隔开即可。此时按给定的名称顺序逐一加载。如:#load mod1,mod2
+ 增加#unload命令,卸载卸载名称模块,同时卸载多个模块时,模块名以半角逗号(,)隔开即可。卸载时,如果该模块有Configuration类,会自动调用其__del__方法
+ 修改reload命令功能,当不带参数时,重新加载所有已加载模块,带参数时,首先尝试重新加载指定名称模块,若模块中不存在该名称模块,则重新加载指定名称的插件。若存在同名模块和插件,则仅重新加载插件(建议不要让插件和模块同名)
+ 增加#modules(简写为#mods)命令,可以列出所有已经加载的模块清单
+ Session类新增load_module方法,可以在脚本中调用以加载给定名称的模块。该方法接受1个参数,可以使用元组/列表形式指定多个模块,也可以使用字符串指定单个模块
+ Session类新增unload_module方法,可以在脚本中调用以卸载给定名称的模块。参数与load_module类似。
+ Session类新增reload_module方法,可以在脚本中调用以重新加载给定名称的模块。当不指定参数时,重新加载所有模块。当指定1个参数时,与load_module和unload_module方法类似
+ 修改Settings.py和本地pymud.cfg文件中sessions块脚本的定义的可接受值。默认加载脚本default_script现可接受字符串和列表以支持多个模块加载。多个模块加载有两种形式,既可以用列表形式指定多个,如["script1","script2"],也可以用字符串以逗号隔开指定多个,如"script1,script2"
+ 修改Settings.py和本地pymud.cfg文件中sessions块脚本中chars指定的会话菜单参数。当前,菜单后面的列表参数可以支持额外增加第3个对象,其中第3个为该会话特定需要加载的模块。该参数也可以使用逗号分隔或者列表形式。
+ 当创建会话时,自动加载的模块会首先加载default_script中指定的模块名称,然后再加载chars中指定的模块名称。
+ 上述所有修改均向下兼容,不影响原脚本使用。
+ 一个新的修改后的pymud.cfg示例如下
```
{
"sessions": {
"pkuxkx" : {
"host" : "mud.pkuxkx.net",
"port" : "8081",
"encoding" : "utf8",
"autologin" : "{0};{1}",
"default_script": ["pkuxkx.common", "pkuxkx.commands", "pkuxkx.main"],
"chars" : {
"char1": ["yourid1", "yourpassword1"],
"char2": ["yourid2", "yourpassword2", "pkuxkx.wudang"],
"char3": ["yourid3", "yourpassword3", "pkuxkx.wudang,pkuxkx.lingwu"],
"char4": ["yourid4", "yourpassword4", ["pkuxkx.shaolin","pkuxkx.lingwu"]]
}
}
}
}
```
+ 问题修复:修复enableGroup中定时器处的bug
+ 功能修改:会话连接和重新连接时,取消原定时器停止的设定,目前保留为只清除所有task、复位Command
+ 功能修改:auto_reconnect设定目前对正常/异常断开均有效。若设置为True,当连接断开后15s后自动重连
+ 功能修改:会话菜单下增加“打开/关闭自动重连”子菜单,可以动态切换自动重连是否打开。
### 0.17.0 (2023-12-24)
+ 功能修改:调整修改GMCP数据的wildcards处理方式,恢复为eval,其余不变。(回滚0.16.2版更改)
+ 功能修改:将本地pymud.cfg文件的读取默认编码调整为utf8,以避免加载出现问题
+ 问题修复:sessions.py中,修复系统command与会话command重名的问题(这次才发现)
+ 功能修改:将自动脚本加载调整到session创建初始,而不论是否连接服务器
+ 功能修改:脚本load和reload时,不再清空任何对象,保留内容包括:中止并清空所有task,关闭所有定时器,将所有异步对象复位
+ 功能修改:去掉了左右边框
+ 问题修复:修复了当使用session.addCommand/addTrigger/addAlias等添加对象,而对象是Command/Trigger/Alias等的子类时,由于类型检查失败导致无法成功的问题
+ 功能修改:增加自动重连配置,Settings.client["auto_reconnect"]配置,当为True时,若连接过程中出现异常断开,则10秒后自动重连。该配置默认为False。
+ 功能修改:当连接过程中出现异常时,异常提示中增加异常时刻。
+ 功能修改:#reload指令增加可以重新加载插件功能。例如,#reload chathook会重新加载名为chathook的插件。
+ 功能增加:增加#py指令,可以直接在命令行中写代码并执行。执行的上下文环境为当前环境,即self代表当前session。例如,#py self.writeline("xixi")相当于直接在脚本会话中调用发送xixi指令
+ 功能新增:新增插件(Plugins)功能。将自动读取pymud模块目录的plugins子目录以及当前脚本目录的plugins子目录下的.py文件,若发现遵照插件规范脚本,将自动加载该模块到pymud。可以使用#plugins查看所有被加载的插件,可以直接带参数插件名(如#plugins myplugin)查看插件的详细信息(自动打印插件的__doc__属性,即写在文件最前面的字符串常量)插件文件中必须有以下定义:
|名称|类型|状态|含义|
|-|-|-|-|
|PLUGIN_NAME|str|必须有|插件唯一名称|
|PLUGIN_DESC|dict|必须有|插件描述信息的详情,必要关键字包含VERSION(版本)、AUTHOR(作者)、RELEASE_DATE(发布日期)、DESCRIPTION(简要描述)|
|PLUGIN_PYMUD_START|func(app)|函数定义必须有,函数体可以为空|PyMUD自动读取并加载插件时自动调用的函数, app为PyMudApp(PyMUD管理类)。该函数仅会在程序运行时,自动加载一次|
|PLUGIN_SESSION_CREATE|func(session)|函数定义必须有,函数体可以为空|在会话中加载插件时自动调用的函数, session为加载插件的会话。该函数在每一个会话创建时均被自动加载一次|
|PLUGIN_SESSION_DESTROY|func(session)|函数定义必须有,函数体可以为空|在会话中卸载插件时自动调用的函数, session为卸载插件的会话。卸载在每一个会话关闭时均被自动运行一次。|
|PLUGIN_PYMUD_DESTROY|func(app)|函数定义必须有,函数体可以为空|在PyMUD程序退出时自动调用的函数, app为PyMUD管理类。该函数仅会在程序运行时,自动卸载一次|
+ 功能修改:对session自动加载mud文件中变量失败时的异常进行管理,此时将不加载变量,自动继续进行
+ 功能修改:所有匹配类对象的匹配模式patterns支持动态修改,涉及Alias,Trigger,Command。修改方式为直接对其patterns属性赋值。如tri.patterns = aNewPattern
+ 功能修改:连接/断开连接时刻都会在提示中增加时刻信息,而不论是否异常。
### 0.16.2 (2023-12-19)
+ 功能修改:归一化#命令和非#命令处理,使session.exec_command、exec_command_async、exec_command_after均可以处理#命令,例如session.exec_command("#save")。同时,也可以在命令行使用#all发送#命令,如"#all #save"此类
+ 功能修改:调整脚本加载与变量自动加载的顺序。当前为连接自动加载时,首先加载变量,然后再加载脚本。目的是使脚本的变化可以覆盖加载的变量内容,而不是反向覆盖。
+ 功能修改:会话变量保存和加载可以配置是否打开,默认为打开。见Settings.client["var_autosave] 和 Settings.client["var_autoload"]。同理,该配置可以被本地pymud.cfg所覆盖
+ 功能修改:将MatchObject的同步onSuccess和异步await的执行顺序进行调整,以确保一定是同步onSuccess先执行。涉及Trigger、Command等。
+ 功能修改:修改了GMCPTrigger的onSuccess处置和await triggered处置参数,以保持与Trigger同步。当前,onSuccess函数传递3个参数,name,line(GMCP收到的原始str数据),wildcards(经eval处理的GMCP数据,大概率是dict,偶尔也可能eval失败,返回与line相同值)。await triggered返回与Triggerd的await triggered相同,均为BaseObject.State,包含4个参数的元组,result(永为True),name(GMCP的id),line(GMCP原始数据),wildcards(GMCP处理后数据)。其中,后3个参数与onSuccess函数调用时传递参数相同。
+ 功能修改:增加GMCP默认处理。当未使用GMCPTrigger对对应的GMCP消息进行处理时,默认使用[GMCP] name: value的形式输出GMCP收到的消息,以便于个人脚本调试。
+ 功能修改:修改GMCP数据的处理方式从eval修改为json.load,其余不变。
### 0.16.1.post2 (2023-12-12)
+ 问题修复:修复__init__.py中的__all__变量为字符串
+ 功能增加:可以加载自定义Settings。在执行python -m pymud时,会自动从当前目录读取pymud.cfg文件。使用json格式将配置信息写在该文件中即可。支持模块中settings.py里的sessions, client, server, styles, text字段内容。
+ 功能增加:增加全局变量集,可以使用session.setGlobal和session.getGlobal进行访问,以便于跨session通信。也可以使用#global在命令行访问
+ 功能增加:增加变量的持久化,持久化文件保存于当前目录,文件名为session名称.mud,该文件在会话初始化时自动读取,会话断开时自动保存,其他时候使用#save保存。
+ 功能增加:在extras.py中增加DotDict,用于支持字典的.访问方式
+ 功能增加:使用DotDict增加了session有关对象的点访问方式(.)的快捷访问,包括变量vars,全局变量globals,触发器tris,别名alis,命令cmds,定时器timers,gmcp。例如:session.vars.charname,相当于session.getVariable('charname')
+ 功能增加:增加#all命令,可以向当前所有活动会话发送同一消息,例如#all xixi,可以使所有连接的会话都发送emote
+ 功能增加:增加%copy系统变量,当复制后,会将复制内容赋值给%copy变量
+ 功能增加:增加Trigger测试功能,使用#test {msg}在命令行输入后,会如同接收到服务端数据一样引发触发反应,并且会使用[PYMUD TRIGGER TEST]进行信息显示。
+ 功能增加:匹配#test命令和%copy变量使用如下:窗体中复制有关行,然后命令行中输入#test %copy可使用复制的行来测试触发器
+ 功能修改:将原CodeBlock修改为CodeBlock和CodeLine组成,以适应新的#test命令
+ 功能修改:session对命令的输入异步处理函数handle_input_async进行微小调整,以适应#test命令使用
+ 功能修改:退出时未断开session时的提示窗口文字改为红色(原黄色对比度问题,看不清楚)
+ 功能修改:恢复了#help功能,可以在任意会话中使用#help列出所有帮助主题,#help {topic}可以查看主题详情
+ 功能修改:在#reload重新加载脚本时,保留变量数据
+ 问题修复:修复版本显示,更正为0.16.1(原0.16.0)
+ 问题修复:发布日期标志修改为当前时间
+ 功能修改:CodeLine的执行运行处理修改为不删除中间的多余空白
+ 问题修复:修改github项目地址为原pymud地址
### 0.15.8 (2023-12-05)
首次发布到pip。
Raw data
{
"_id": null,
"home_page": null,
"name": "pymud",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "\"newstart@pkuxkx\" <crapex@hotmail.com>",
"keywords": "MUD, multi-user dungeon, client",
"author": null,
"author_email": "\"newstart@pkuxkx\" <crapex@hotmail.com>",
"download_url": "https://files.pythonhosted.org/packages/ca/76/bf50b24d733284e6858081c2bba1eda0e2f4d71a1b566f3cbf9962767b1d/pymud-0.21.8.tar.gz",
"platform": null,
"description": "# PyMUD - Python\u539f\u751fMUD\u5ba2\u6237\u7aef\n## \u7b80\u4ecb\n\n+ \u5317\u4fa0WIKI\uff1a https://www.pkuxkx.net/wiki/tools/pymud\n+ \u6e90\u4ee3\u7801\u5730\u5740: https://github.com/crapex/pymud\n+ \u5e2e\u52a9\u6587\u6863\u5730\u5740\uff1a https://pymud.readthedocs.io\n+ PyPi\u9879\u76ee\u5730\u5740\uff1a https://pypi.org/project/pymud\n+ \u7531deepwiki\u81ea\u52a8\u751f\u6210\u7684\u9879\u76ee\u7406\u89e3\u6587\u6863\u5730\u5740\uff1a https://deepwiki.com/crapex/pymud\n+ PyMUD\u7528\u6237shanghua\u5199\u7684\u5165\u95e8\u6559\u7a0b\u6587\u6863\uff1ahttps://www.pkuxkx.net/forum/forum.php?mod=viewthread&tid=49999&forumuid=12067\n+ \u4ea4\u6d41QQ\u7fa4\uff1a554672580\n\n\n### \u5317\u5927\u4fa0\u5ba2\u884cMud (www.pkuxkx.net)\uff0c\u6700\u597d\u7684\u4e2d\u6587Mud\u6e38\u620f\uff01\n### PyMUD\u662f\u6211\u4e3a\u4e86\u66f4\u597d\u7684\u73a9\u5317\u5927\u4fa0\u5ba2\u884c\uff0c\u7279\u610f\u81ea\u884c\u5f00\u53d1\u7684MUD\u5ba2\u6237\u7aef\u3002PyMUD\u5177\u6709\u4ee5\u4e0b\u7279\u70b9\uff1a\n+ \u539f\u751fPython\u5f00\u53d1\uff0c\u9664 `prompt-toolkit <https://python-prompt-toolkit.readthedocs.io>`_ \u53ca\u5176\u4f9d\u8d56\u5e93 wcwidth, pygment, pyperclip \u5916\uff0c\u4e0d\u9700\u8981\u5176\u4ed6\u7b2c\u4e09\u65b9\u5e93\u652f\u6301\n+ \u539f\u751fPython\u7684asyncio\u5b9e\u73b0\u7684\u901a\u4fe1\u534f\u8bae\u5904\u7406\uff0c\u652f\u6301async/await\u8bed\u6cd5\u5728\u811a\u672c\u4e2d\u76f4\u63a5\u5e94\u7528\uff0c\u811a\u672c\u5b9e\u73b0\u7684\u540c\u6b65\u5f02\u6b65\u4e24\u79cd\u6a21\u5f0f\u7531\u4f60\u81ea\u5df1\u9009\u62e9\n+ \u57fa\u4e8e\u63a7\u5236\u53f0\u7684\u5168\u5c4fUI\u754c\u9762\u8bbe\u8ba1\uff0c\u652f\u6301\u9f20\u6807\u64cd\u4f5c\uff08Android\u4e0a\u652f\u6301\u89e6\u6478\u5c4f\u64cd\u4f5c\uff09\uff0c\u6781\u4f4e\u8d44\u6e90\u9700\u6c42\uff0c\u5728\u5355\u68381GB\u5185\u5b58\u7684Linux VPS\u4e0a\u4e5f\u53ef\u6d41\u7545\u8fd0\u884c\n+ \u652f\u6301\u5206\u5c4f\u663e\u793a\uff0c\u5728\u6570\u636e\u5feb\u901f\u6eda\u52a8\u7684\u65f6\u5019\uff0c\u4e0a\u534a\u5c4f\u4fdd\u6301\u4e0d\u52a8\uff0c\u4ee5\u786e\u4fdd\u4e0d\u9519\u8fc7\u4fe1\u606f\n+ \u89e3\u51b3\u4e8699%\u60c5\u51b5\u4e0b\uff0c\u5317\u5927\u4fa0\u5ba2\u884c\u4e2d\u6587\u5bf9\u4e0d\u9f50\uff0c\u4e5f\u5c31\u662f\u770b\u4e0d\u6e05\u5b57\u7b26\u753b\u7684\u95ee\u9898\n+ \u771f\u6b63\u7684\u652f\u6301\u591asession\u4f1a\u8bdd\uff0c\u652f\u6301\u547d\u4ee4\u6216\u9f20\u6807\u5207\u6362\u4f1a\u8bdd\n+ \u539f\u751f\u652f\u6301\u591a\u79cd\u670d\u52a1\u5668\u7aef\u7f16\u7801\u65b9\u5f0f\uff0c\u4e0d\u8bba\u662fGBK\u3001BIG5\u3001\u8fd8\u662fUTF-8\n+ \u652f\u6301NWAS\u3001MTTS\u534f\u5546\uff0c\u652f\u6301GMCP\u3001MSDP\u3001MSSP\u534f\u8bae\n+ \u4e00\u6b21\u811a\u672c\u5f00\u53d1\uff0c\u591a\u5e73\u53f0\u8fd0\u884c\u3002\u53ea\u8981\u80fd\u5728\u8be5\u5e73\u53f0\u4e0a\u8fd0\u884cpython\uff0c\u5c31\u53ef\u4ee5\u8fd0\u884cPyMUD\u5ba2\u6237\u7aef\n+ \u811a\u672c\u6240\u6709\u8bed\u6cd5\u5747\u91c7\u7528Python\u539f\u751f\u8bed\u6cd5\uff0c\u56e0\u6b64\u4f60\u53ea\u8981\u4f1a\u7528Python\uff0c\u5c31\u53ef\u4ee5\u81ea\u5df1\u5199\u811a\u672c\uff0c\u514d\u53bb\u4e86\u518d\u53bb\u5b66\u4e60lua\u3001\u719f\u6089\u5404\u7c7bAPP\u7684\u4f7f\u7528\u7684\u96be\u5904\n+ \u5168\u5f00\u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u811a\u672c\u4e5f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u4f7f\u7528visual studio code\u7b49\u5de5\u5177\u8fdb\u884c\u8c03\u8bd5\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u65ad\u70b9\u3001\u67e5\u770b\u53d8\u91cf\u7b49\n+ Python\u62e5\u6709\u6781\u4e3a\u5f3a\u5927\u7684\u6587\u5b57\u5904\u7406\u80fd\u529b\uff0c\u7528\u4e8e\u5904\u7406\u6587\u672c\u7684MUD\u6700\u4e3a\u5408\u9002\n+ Python\u62e5\u6709\u6781\u4e3a\u4e30\u5bcc\u7684\u7b2c\u4e09\u65b9\u5e93\uff0c\u80fd\u652f\u6301\u7684\u7b2c\u4e09\u65b9\u5e93\uff0c\u5c31\u80fd\u5728PyMUD\u4e2d\u652f\u6301\n+ \u591a\u8bed\u8a00\u652f\u6301\u6846\u67b6\u5df2\u642d\u597d\uff0c\u76ee\u524d\u63d0\u4f9b\u4e2d\u6587\u3001\u82f1\u6587\u652f\u6301\uff0c\u53ef\u4ee5\u81ea\u5df1\u589e\u52a0\u7ffb\u8bd1\u540e\u7684\u5176\u4ed6\u8bed\u8a00\u7248\u672c\n+ \u6211\u81ea\u5df1\u8fd8\u5728\u73a9\uff0c\u6240\u4ee5\u672c\u5ba2\u6237\u7aef\u4f1a\u6301\u7eed\u8fdb\u884c\u66f4\u65b0:)\n\n### \u54ea\u4e9b\u4eba\u9002\u5408\u4f7f\u7528PyMUD\n+ \u6bd4\u8f83\u719f\u6089Python\u8bed\u8a00\uff0c\u4f1a\u4f7f\u7528Python\u5199\u4ee3\u7801\u7684 -> PyMUD\u662f\u7eafPython\u539f\u751f\u5f00\u53d1\uff0c\u4e0d\u4f1a\u6709\u5176\u4ed6\u5ba2\u6237\u7aef\u5bf9Python\u7684\u652f\u6301\u80fd\u6bd4\u5f97\u8fc7PyMUD\n+ \u867d\u4e0d\u592a\u719f\u6089Python\u8bed\u8a00\uff0c\u4f46\u6709\u60f3\u6cd5\u60f3\u5b66\u4e60Python\u8bed\u8a00\u7684 -> \u6b63\u597d\u4f7f\u7528PyMUD\u73a9\u5317\u4fa0\u5199\u811a\u672c\u7684\u8fc7\u7a0b\u4e2d\u5b66\u4e60Python\u8bed\u8a00\n+ \u89c9\u5f97\u8fd8\u6709\u4e9b\u529f\u80fd\u73b0\u5728\u6240\u6709\u5ba2\u6237\u7aef\u90fd\u6ca1\u6709\u7684 -> \u4f60\u6709\u9700\u6c42\uff0c\u6211\u6765\u589e\u52a0\uff0c\u5c31\u662f\u8fd9\u4e48\u65b9\u4fbf\n+ \u89c9\u5f97\u4e5f\u60f3\u81ea\u5df1\u6574\u4e00\u4e2a\u5b9a\u5236\u5ba2\u6237\u7aef\u73a9\u73a9\u7684 -> PyMUD\u5b8c\u5168\u5f00\u6e90\uff0c\u4e14\u9664ui\u6846\u67b6\u5916\u5168\u90e8\u90fd\u662f\u4e00\u884c\u4e00\u884c\u4ee3\u7801\u81ea\u5df1\u5199\u7684\uff0c\u53ef\u4ee5\u76f4\u63a5\u53c2\u8003PyMUD\u7684\u8bbe\u8ba1\n\n## \u7248\u672c\u66f4\u65b0\u4fe1\u606f\n\n### 0.21.8 (2025-08-08)\n\n+ \u529f\u80fd\u65b0\u589e: \u73b0\u5728\u53ef\u4ee5\u901a\u8fc7\u8c03\u7528 exec \u7cfb\u5217\u51fd\u6570\u6765\u8c03\u7528 #session \u547d\u4ee4\u4e86\u3002\n+ \u529f\u80fd\u65b0\u589e: \u73b0\u5728 #close \u547d\u4ee4\u53ef\u4ee5\u5e26\u53c2\u6570\u4e86\u3002\u53ef\u4ee5\u4f7f\u7528\u4f1a\u8bdd\u540d\u6307\u5b9a\u5173\u95ed\u54ea\u4e2a\u4f1a\u8bdd\uff0c\u4e0d\u6307\u5b9a\u65f6\u9ed8\u8ba4\u5173\u95ed\u5f53\u524d\u4f1a\u8bdd\u3002\u53ef\u4ee5\u4f7f\u7528 -f \u6216 --force \u53c2\u6570\u5f3a\u5236\u5173\u95ed\u4f1a\u8bdd\uff0c\u6b64\u65f6\u5373\u4f7f\u4f1a\u8bdd\u8fde\u63a5\u72b6\u6001\uff0c\u4e5f\u4e0d\u5f39\u51fa\u786e\u8ba4\u5bf9\u8bdd\u6846\u3002\n\n### 0.21.7 (2025-08-02)\n\n+ \u95ee\u9898\u4fee\u590d: \u5220\u9664\u4e86\u63d2\u4ef6\u52a0\u8f7d\u7684\u5197\u4f59\u9519\u8bef\u4ee3\u7801\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u63d2\u4ef6\u52a0\u8f7d\u62a5\u9519\u65f6\u7684\u9519\u8bef\u63d0\u793a\u8bed\u53e5\u4e0d\u663e\u793a\u7684\u95ee\u9898\u3002\n+ \u529f\u80fd\u65b0\u589e: \u9488\u5bf9\u5e94\u7528\u9000\u51fa\u65f6\u7684\u8d44\u6e90\u91ca\u653e\u548c\u6e05\u7406\u8fdb\u884c\u4e86\u5b8c\u5584\uff0c\u786e\u4fdd\u63d2\u4ef6\u4e2d\u7533\u8bf7\u7684\u8d44\u6e90\u53ef\u4ee5\u6b63\u5e38\u5378\u8f7d\u3002\n+ \u529f\u80fd\u65b0\u589e: \u53ef\u4ee5\u901a\u8fc7pymud.cfg\u5728client\u5b57\u6bb5\u4e2d\u7684cursor\u5b57\u6bb5\u6765\u8bbe\u7f6e\u5149\u6807\u5f62\u72b6\u3002\u652f\u6301\u7684\u5149\u6807\u5305\u62ec\uff1a UNDERLINE, BEAM, BLOCK, BLINKING_BLOCK, BLINKING_UNDERLINE, BLINKING_BEAM\u3002\u9ed8\u8ba4\u4e3a\u95ea\u70c1\u7ad6\u7ebf BLINKING_BEAM\u3002\n\n### 0.21.6 (2025-06-29)\n\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u8fde\u63a5\u62a5\u9519\u65f6\uff0c\u5f02\u5e38\u4fe1\u606f\u4e0d\u663e\u793a\u7684\u95ee\u9898\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u5728\u811a\u672c\u4e2d\u53d1\u751f\u540c\u6b65\u89e6\u53d1\u5668\u8fd0\u884c\u5f02\u5e38\u65f6\uff0c\u8fde\u63a5\u4f1a\u4e2d\u65ad\u7684\u95ee\u9898\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u5728\u521d\u59cb\u5316\u65f6\uff0c\u9ed8\u8ba4\u4f1a\u6307\u5b9a\u5f53\u524d\u76ee\u5f55\u4e3a\u811a\u672c\u76ee\u5f55\u800c\u4e0d\u80fd\u63a5\u53d7\u7528\u6237\u5982\u6570\u7684\u95ee\u9898\u3002\n+ \u529f\u80fd\u8c03\u6574: \u5728\u521d\u59cb\u5316\u65f6\uff0c\u539f\u5148\u4f1a\u6839\u636e\u68c0\u6d4b\u5230\u7684\u7cfb\u7edf\u8bed\u8a00\u8fdb\u884c\u8bed\u8a00\u9009\u62e9\uff0c\u73b0\u589e\u52a0\u4e86\u4eba\u5de5\u786e\u8ba4\u73af\u8282\uff0c\u53ef\u4ee5\u624b\u52a8\u5207\u6362\u3002\n+ \u529f\u80fd\u8c03\u6574: \u989c\u8272\u6821\u6b63\u8ffd\u6eaf\u8c03\u6574\u4e3a\u66f4\u591a\u884c\uff0c\u89e3\u51b3\u5f53\u6253\u5370\u5f02\u5e38\u8ffd\u8e2a\u884c\u6570\u8fc7\u591a\u65f6\uff0c\u7ea2\u8272\u80cc\u666f\u4f1a\u4e2d\u65ad\u6062\u590d\u7684\u60c5\u51b5\u3002\n+ \u529f\u80fd\u65b0\u589e: #var\u547d\u4ee4\u73b0\u5728\u652f\u6301\u67e5\u8be2\u4ec5\u77e5\u9053\u5f00\u5934\u6216\u8005\u7ed3\u5c3e\u7684\u53d8\u91cf\u3002\u4f8b\u5982\uff0c\u4f7f\u7528 #var abc* \u4f1a\u4ec5\u6253\u5370\u6240\u6709\u4ee5 abc \u5f00\u5934\u7684\u53d8\u91cf\uff0c\u4f7f\u7528 #var *abc \u4f1a\u4ec5\u6253\u5370\u6240\u6709\u4ee5 abc \u7ed3\u5c3e\u7684\u53d8\u91cf\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u4e2a\u522b\u51fd\u6570\u4e2d\uff0c\u90e8\u5206\u6267\u884c\u8def\u5f84\u65e0\u8fd4\u56de\u503c\u7684\u95ee\u9898\u3002\n\n### 0.21.5post2 (2025-06-10)\n\n+ \u529f\u80fd\u5b8c\u5584: \u5b8c\u5584\u4e86\u7f8e\u5316\u529f\u80fd\uff0c\u5df2\u77e5\u60c5\u51b5\u4e0b\uff0c\u57fa\u672c\u4e0d\u4f1a\u51fa\u73b0\u65ad\u884c\u548c\u4e0d\u5bf9\u9f50\u95ee\u9898\u4e86\u3002\n+ \u529f\u80fd\u5b8c\u5584: \u5728\u5411\u670d\u52a1\u5668\u9001\u51fa\u5355\u4e2a\u56de\u8f66\u547d\u4ee4\u540e\uff0c\u672c\u5730\u663e\u793a\u4e5f\u5f3a\u5236\u6362\u884c\u3002\u5728\u51fa\u73b0\u300e\u672a\u5b8c\u5f85\u7eed\u300f\u60c5\u51b5\u65f6\uff0c\u56de\u8f66\u540e\u4e0d\u4f1a\u518d\u8ddf\u5728\u540e\u9762\u663e\u793a\u4e86\uff0c\u800c\u662f\u4f1a\u5f3a\u5236\u4ece\u4e0b\u4e00\u884c\u5f00\u59cb\u3002\n+ \u529f\u80fd\u5b8c\u5584: \u5f53\u5bf9\u884c\u8fdb\u884c\u53cc\u51fb\u9009\u62e9\u65f6\uff0c\u80cc\u666f\u589e\u52a0\u7684\u9009\u62e9\u6807\u8bb0\uff08\u7070\u8272\uff09\u4f1a\u6309\u7167\u5b9e\u9645\u663e\u793a\u7684\u5bbd\u5ea6\u8fdb\u884c\u5339\u914d\uff0c\u800c\u4e0d\u662f\u6309\u7167\u539f\u59cb\u6570\u636e\u7684\u5bbd\u5ea6\u8fdb\u884c\u5339\u914d\u3002\n\n### 0.21.4 (2025-06-08)\n\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u5728\u591a\u884c\u9009\u62e9\u78b0\u5230\u7a7a\u884c\u65f6\uff0c\u4f1a\u5bfc\u81f4\u4ece\u5934\u5f00\u59cb\u5168\u9009\u7684\u95ee\u9898\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u4ece\u540e\u5f80\u524d\u9009\u62e9\u65f6\uff0c\u82e5\u518d\u5f80\u540e\u9009\u62e9\uff0c\u4f1a\u5bfc\u81f4\u8d77\u59cb\u4f4d\u7f6e\u9519\u8bef\u7684\u95ee\u9898\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u7eaf\u6587\u672c\u884c\u5355\u884c\u90e8\u5206\u590d\u5236\u65f6\uff0c\u6700\u540e\u4e00\u4e2a\u5b57\u7b26\u65e0\u6cd5\u88ab\u9009\u4e2d\u548c\u590d\u5236\u7684\u95ee\u9898\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u7f8e\u5316\u6a21\u5f0f\u4e0b\uff0c\u5f53\u670d\u52a1\u5668\u4f7f\u7528tab\u5bf9\u9f50\u5728\u672c\u5730\u663e\u793a\u4e2d\u65e0\u6cd5\u5bf9\u9f50\u7684\u95ee\u9898\u3002\u4e3a\u914d\u5408\u5bf9\u9f50\uff0c\u9ed8\u8ba4tabstop\u5df2\u4fee\u6539\u4e3a8\u3002\n+ \u529f\u80fd\u8c03\u6574: \u5f53\u4e0a\u4e0b\u5206\u5c4f\u663e\u793a\u65f6\uff0c\u4e0a\u534a\u5c4f\u4e5f\u80fd\u663e\u793a\u5230\u6700\u540e\u4e00\u884c\uff0c\u800c\u4e0d\u662f\u4ec5\u663e\u793a\u5230\u5206\u5c4f\u5904\u4f4d\u7f6e\u3002\n\n### 0.21.3 (2025-06-02)\n\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u5f53\u7f13\u5b58\u884c\u6570\u8d85\u8fc7\u89c4\u5b9a\u503c\u65f6\uff0c\u7531\u4e8e\u4ee3\u7801\u9519\u8bef\u5bfc\u81f4\u6e05\u5c4f\u7684\u95ee\u9898\u3002\n+ \u529f\u80fd\u589e\u5f3a: \u589e\u52a0\u6e05\u9664\u4efb\u52a1\u65f6\u7684\u5f02\u5e38\u4fdd\u62a4\uff0c\u6b64\u65f6\u4ea7\u751fasyncio.CancelledError\u5f02\u5e38\u4e3a\u6b63\u5e38\u73b0\u8c61\uff0c\u56e0\u6b64\u6355\u83b7\u540e\u7981\u6b62\u5f02\u5e38\u5904\u7406\u3002\n+ \u529f\u80fd\u589e\u5f3a: \u5bf9reset\u8fdb\u884c\u4e86\u5f02\u5e38\u63d0\u793a\u4fdd\u62a4\uff0c\u6b64\u65f6\u4ea7\u751f\u5f02\u5e38\uff08\u5927\u90e8\u5206\u4e3aasyncio.CancelledError\uff09\u4e3a\u6b63\u5e38\u73b0\u8c61\uff0c\u56e0\u6b64\u6355\u83b7\u540e\u7981\u6b62\u5f02\u5e38\u5904\u7406\u3002\n\n### 0.21.2 (2025-06-01)\n\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u5f53\u81ea\u52a8\u91cd\u8fde\u542f\u52a8\u65f6\uff0c\u5373\u4f7f\u4f1a\u8bdd\u5173\u95ed\u4e86\uff0c\u4e5f\u4f1a\u81ea\u52a8\u91cd\u8fde\u7684\u95ee\u9898\u3002\n+ \u5b9e\u73b0\u8c03\u6574: \u91cd\u5199\u4e86\u4e13\u7528\u7684\u4f1a\u8bdd\u7f13\u51b2\u3001\u8bb0\u5f55\u7f13\u51b2\u4e0ePyMUD\u7f13\u51b2\u663e\u793a\u63a7\u5236\u5668\uff0c\u5728prompt_toolkit\u7684\u539fBuffer\u548cBufferControl\u7684\u57fa\u7840\u4ec5\u63d0\u4f9b\u4e86PyMUD\u6240\u9700\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4ee5\u964d\u4f4e\u5185\u5b58\u5360\u7528\u3002\n \u7ecf\u6d4b\u8bd5\uff0c\u5f53\u524d\u5185\u5b58\u57fa\u672c\u7a33\u5b9a\uff0c\u89c6\u4f1a\u8bdd\u6570\u91cf\u548c\u811a\u672c\u60c5\u51b5\u5dee\u5f02\uff0c\u7ef4\u6301\u5728\u51e0\u767e\u5146\u5de6\u53f3\uff08500M\u4ee5\u4e0b\uff09\uff0c\u4e14\u4e0d\u4f1a\u6709\u5927\u5e45\u6ce2\u52a8\u3002\u91cd\u5199\u540e\uff0c\u4f4e\u914d\u7f6e\u7684VPS\u4e5f\u53ef\u4ee5\u7a33\u5b9a\u8fd0\u884cPyMUD\u3002\n\n### 0.21.0 (2025-05-20)\n\n+ \u529f\u80fd\u65b0\u589e: \u5404\u7c7b\u5bf9\u8c61\u7684group\u5c5e\u6027\uff0c\u65b0\u589e\u7ec4\u3001\u5b50\u7ec4\u6982\u5ff5\uff0c\u7528\u4e8e\u5feb\u901f\u6210\u7ec4\u64cd\u4f5c\u5bf9\u8c61\u3002\u7ec4\u53ef\u4ee5\u5305\u62ec\u5b50\u7ec4\uff0c\u5b50\u7ec4\u53ef\u4ee5\u518d\u5305\u62ec\u5b50\u7ec4\u3002\n \u7ec4\u540d\u4ee5\u70b9\u53f7.\u5206\u9694\uff0c\u4f8b\u5982\uff1agroup1.subgroup1.subsubgroup1\u3002\u7ec4\u7684\u5c42\u7ea7\u6ca1\u6709\u9650\u5236\u3002\n \u7ec4\u7684\u6982\u5ff5\u53ef\u4ee5\u7528\u4e8e\u5feb\u901f\u5904\u7406\u591a\u4e2a\u5bf9\u8c61\uff0c\u4f8b\u5982\u542f\u7528/\u7981\u7528\u4e00\u7ec4\u5bf9\u8c61\u3001\u5220\u9664\u4e00\u7ec4\u5bf9\u8c61\u7b49\u3002\u4f8b\u5982\uff0c\u4ee5\u4e0b\u51e0\u4e2a\u7ec4\u7684\u5173\u7cfb\uff1a\n - mygroup1\n - mygroup1.subgroup1 # \u5c5e\u4e8e mygroup1\u7684\u5b50\u7ec4\n - mygroup1.subgroup2 # \u5c5e\u4e8e mygroup1\u7684\u5b50\u7ec4\n - mygroup1.subgroup2.subsubgroup1 # \u5c5e\u4e8e mygroup1.subgroup2\u7684\u5b50\u7ec4\uff0c\u4e5f\u540c\u6837\u5c5e\u4e8e\u66f4\u9ad8\u5c42\u7ea7mygroup1\u7684\u5b50\u7ec4\n - mygroup2\n - mygroup2.subgroup1 # \u5c5e\u4e8e mygroup2\u7684\u5b50\u7ec4\n\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e\u4e86deleteGroup\u51fd\u6570\uff0c\u7528\u4e8e\u5220\u9664\u6307\u5b9a\u7684\u5bf9\u8c61\u7ec4\u3002\u53ef\u540c\u65f6\u6307\u5b9a\u7ec4\u540d\u3001\u662f\u5426\u5305\u542b\u5b50\u7ec4\u540d\u3001\u6709\u6548\u7c7b\u578b\u8303\u56f4\u3002\u51fd\u6570\u5b9a\u4e49\u548c\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a\n\n ``` Python\n def deleteGroup(self, group: str, subgroup = True, types: Union[Type, Union[Tuple, List]] = (Alias, Trigger, Command, Timer, GMCPTrigger)):\n pass\n # \u5404\u53c2\u6570\u542b\u4e49:\n # group: \u8981\u5220\u9664\u7684\u7ec4\u540d\uff0c\u53ef\u4ee5\u662f\u5b8c\u6574\u7684\u7ec4\u540d\uff0c\u4e5f\u53ef\u4ee5\u662f\u90e8\u5206\u7ec4\u540d\u3002\u4f8b\u5982\uff1a\"group1\" \u6216 \"group1.subgroup1\" \u7b49\u3002\n # subgroup: \u662f\u5426\u5305\u542b\u5b50\u7ec4\u3002\u5982\u679c\u4e3aTrue\uff0c\u5219\u5220\u9664\u6307\u5b9a\u7ec4\u53ca\u5176\u6240\u6709\u5b50\u7ec4\u7684\u5bf9\u8c61\u3002\u5982\u679c\u4e3aFalse\uff0c\u5219\u4ec5\u5220\u9664\u6307\u5b9a\u7ec4\u7684\u5bf9\u8c61\uff0c\u4e0d\u5305\u62ec\u5b50\u7ec4\u3002\n # types: \u8981\u5220\u9664\u7684\u5bf9\u8c61\u7c7b\u578b\u8303\u56f4\u3002\u53ef\u4ee5\u662f\u5355\u4e2a\u7c7b\u578b\uff0c\u4e5f\u53ef\u4ee5\u662f\u7c7b\u578b\u7684\u5143\u7ec4\u6216\u5217\u8868\u3002\u4f8b\u5982\uff1aTrigger, Alias, Command, Timer, GMCPTrigger \u7b49\u3002\n # \u793a\u4f8b\u4ee3\u7801\uff1a\n # \u5220\u9664\u6240\u6709\u5c5e\u4e8egroup1\u7684Trigger\u548cAlias\u5bf9\u8c61\uff0c\u5305\u62ec\u5b50\u7ec4\u5982 group1.subgroup1 \u548c group1.subgroup2 \u7b49\n self.session.deleteGroup(\"group1\", True, [Trigger, Alias])\n # \u5220\u9664\u6240\u6709\u5c5e\u4e8egroup1\u7684Trigger\u5bf9\u8c61\uff0c\u4f46\u4e0d\u5305\u62ec\u5b50\u7ec4\n self.session.deleteGroup(\"group1\", False, [Trigger])\n ```\n\n+ \u529f\u80fd\u65b0\u589e: \u5bf9 #trigger, #alias, #timer, #gmcp, #command, #t+, #t- \u7b49\u547d\u4ee4\u65b0\u589e\u4e86\u7ec4\u5904\u7406\u9009\u9879\uff0c\u7528\u4e8e\u5bf9\u6574\u7ec4\u5bf9\u8c61\u8fdb\u884c\u5904\u7406\u3002\u5404\u547d\u4ee4\u7684\u8bed\u6cd5\u683c\u5f0f\u7c7b\u4f3c\u3002\n \u5904\u7406\u7ec4\u65f6\uff0c\u7ec4\u540d\u5e94\u4ee5\u5927\u4e8e\u53f7>\u6216\u8005\u7b49\u4e8e\u53f7=\u5f00\u5934\uff0c\u7d27\u8ddf\u7ec4\u540d\uff08\u65e0\u7a7a\u683c\uff09\u3002\u5f53\u4f7f\u7528>\u65f6\uff0c\u8868\u793a\u64cd\u4f5c\u9488\u5bf9\u5f53\u524d\u7ec4\u53ca\u6240\u6709\u6240\u5c5e\u5b50\u7ec4\uff0c\u5f53\u4f7f\u7528=\u65f6\uff0c\u8868\u793a\u64cd\u4f5c\u4ec5\u9488\u5bf9\u5f53\u524d\u7ec4\u3002\n \u4f8b\u5982\u4e0b\u9762\u4ee3\u7801\uff1a\n\n ```\n #t+ >group1 \u8868\u793a\u542f\u7528\u6240\u6709\u5c5e\u4e8egroup1\u4ee5\u53ca\u5176\u5b50\u7ec4\u7684\u6240\u6709\u53ef\u7ba1\u7406\u5bf9\u8c61\uff0c\u5305\u62ecTrigger\u3001Alias\u3001Command\u3001Timer\u3001GMCPTrigger\n #t- =group1.subgroup1 \u8868\u793a\u7981\u7528\u6240\u6709\u4ec5\u5c5e\u4e8egroup1.subgroup1\u7684Trigger\u3001Alias\u3001Command\u3001Timer\u3001GMCPTrigger\u7b49\u5bf9\u8c61\n #tri >group1 off \u8868\u793a\u7981\u7528\u6240\u6709\u5c5e\u4e8egroup1\u4ee5\u53ca\u5176\u5b50\u7ec4\u7684Trigger\u5bf9\u8c61\n #ali =group1.subgroup1 on \u8868\u793a\u542f\u7528\u6240\u6709\u4ec5\u5c5e\u4e8egroup1.subgroup1\u7684Alias\u5bf9\u8c61\n ```\n\n+ \u529f\u80fd\u65b0\u589e: \u8c03\u6574\u4e86enableGroup\u5904\u7406\uff0c\u53ef\u4ee5\u901a\u8fc7\u7ec4\u540d\u652f\u6301\u5b50\u7ec4\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u6307\u5b9a\u6709\u6548\u7c7b\u578b\u8303\u56f4\u3002\u4f8b\u5982\u4e0b\u9762\u4ee3\u7801\uff1a\n ``` Python\n class MyTestConfig(IConfig):\n def __init__(self, session, *args, **kwargs):\n self._objs = [\n Trigger(session, \"tri1\", group = \"group1\"),\n Trigger(session, \"tri2\", group = \"group1.subgroup1\"),\n Trigger(session, \"tri3\", group = \"group1.subgroup2\"),\n Alias(session, \"alias1\", group = \"group1\"),\n Alias(session, \"alias2\", group = \"group1.subgroup1\"),\n Timer(session, 5, group = \"group1.subgroup1\")\n ]\n \n #\u4ee5\u4e0b\u8c03\u7528\u53ef\u4ee5\u540c\u65f6\u7981\u7528\u4e0a\u8ff06\u4e2a\u5bf9\u8c61\uff0c\u56e0\u4e3a group1.subgroup1 \u548c group1.subgroup2 \u90fd\u5c5e\u4e8e group1 \u7684\u5b50\u7ec4\n session.enableGroup(\"group1\", False)\n #\u4ee5\u4e0b\u8c03\u7528\u53ef\u4ee5\u540c\u65f6\u4ec5\u542f\u7528\u89e6\u53d1\u5668tri1\u548c\u522b\u540dalias1\uff0c\u56e0\u4e3a\u901a\u8fc7subgroup\u53c2\u6570\u9650\u5b9a\u4e86\u4e0d\u4f20\u9012\u5230\u5b50\u7ec4\n session.enableGroup(\"group1\", True, subgroup = False)\n # \u4ee5\u4e0b\u8c03\u7528\u53ef\u4ee5\u540c\u65f6\u7981\u7528\u5bf9\u5e94\u53d1\u5668\u548c\u522b\u540d\uff0c\u4f46\u4e0d\u7981\u7528\u5b9a\u65f6\u5668\uff0c\u56e0\u4e3a\u901a\u8fc7types\u53c2\u6570\u6307\u5b9a\u4e86\u6709\u6548\u8303\u56f4\uff1a\n session.enableGroup(\"group1.subgroup1\", False, types = [Trigger, Alias])\n\n ```\n\n+ \u529f\u80fd\u65b0\u589e: \u589e\u52a0\u4e86\u591a\u5904\u5f02\u5e38\u8ffd\u8e2a\u63d0\u793a\u3002\u5728\u6a21\u5757\u6216\u63d2\u4ef6\u7684\u811a\u672c\u4e2d\u53d1\u751f\u9519\u8bef\u65f6\uff0c\u5747\u4f1a\u6253\u5370\u9519\u8bef\u8ffd\u8e2a\u4fe1\u606f\uff0c\u65b9\u4fbf\u5b9a\u4f4d\u9519\u8bef\u3002\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e #echo \u547d\u4ee4\uff0c\u7c7b\u4f3c\u4e8e #test \u547d\u4ee4\uff0c\u4f46\u8be5\u547d\u4ee4\u53ea\u4f1a\u6a21\u62df\u6536\u5230\u670d\u52a1\u5668\u6570\u636e\uff0c\u76f4\u63a5\u6fc0\u53d1\u5404\u5339\u914d\u89e6\u53d1\u5668\uff0c\u4f46\u4e0d\u663e\u793a\u89e6\u53d1\u6d4b\u8bd5\u7ed3\u679c\u3002\n+ \u529f\u80fd\u65b0\u589e: #load / #unload \u73b0\u5728\u652f\u6301\u5f53\u524d\u4f1a\u8bdd\u5bf9\u63d2\u4ef6\u7684\u4e34\u65f6\u542f\u7528\u548c\u7981\u7528\uff0c\u5b9e\u73b0\u65b9\u5f0f\u4e3a\u8c03\u7528\u63d2\u4ef6\u91cc\u7684PLUGIN_SESSION_CREATE\u548cPLUGIN_SESSION_DESTROYE\u51fd\u6570\u3002\u7fa4\u6587\u4ef6\u7684moving.py\u63d2\u4ef6\u5199\u6cd5\u53ef\u4ee5\u652f\u6301\u3002\n+ \u529f\u80fd\u8c03\u6574: \u5404\u4f1a\u8bdd\u53d8\u91cf\u4fdd\u5b58\u7684.mud\u6587\u4ef6\uff0c\u7edf\u4e00\u79fb\u5230save\u5b50\u76ee\u5f55\u4e0b\u3002\u539f\u6765\u5f53\u524d\u76ee\u5f55\u4e0b\u7684.mud\u6587\u4ef6\uff0c\u5728\u5bf9\u5e94\u4f1a\u8bdd\u91cd\u65b0\u52a0\u8f7d\u65f6\u4f1a\u81ea\u52a8\u79fb\u52a8\uff0c\u65e0\u9700\u4eba\u5de5\u5904\u7406\u3002\n+ \u529f\u80fd\u65b0\u589e: \u589e\u52a0\u4e86\u56fd\u9645\u5316(i18n)\u652f\u6301\uff0c\u539f\u751f\u5f00\u53d1\u8bed\u8a00\u4e3a\u4e2d\u6587\u7b80\u4f53\uff0c\u76ee\u524d\u4f7f\u7528AI\u7ffb\u8bd1\u751f\u6210\u4e86\u82f1\u6587\u3002\u5e94\u7528\u8bed\u8a00\u901a\u8fc7Settings\u4e2d\u65b0\u589e\u7684language\u914d\u7f6e\u6765\u63a7\u5236\uff0c\u9ed8\u8ba4\u4e3a\"chs\"\uff0c\u53ef\u4ee5\u5728pymud.cfg\u4e2d\u8986\u76d6\u8be5\u914d\u7f6e\u3002\u5176\u503c\u76ee\u524d\u53ef\u4ee5\u4e3a\"chs\"\u3001\"eng\"\u3002\u81ea\u884c\u7ffb\u8bd1\u7684\u8bed\u8a00\u53ef\u4ee5\u5728pymud/lang\u76ee\u5f55\u4e0b\u4e0b\u65b0\u589e\u8bed\u8a00\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3ai18n_\u52a0\u8bed\u8a00\u4ee3\u7801\uff0c\u4f8b\u5982\"i18n_chs.py\"\u8868\u793a\u53ef\u4ee5\u4f7f\u7528\"chs\"\u8bed\u8a00\uff0c\u5176\u4e2d\u4f7f\u7528Python\u5b57\u5178\u65b9\u5f0f\u5b9a\u4e49\u4e86\u6240\u6709\u9700\u52a8\u6001\u663e\u793a\u7684\u6587\u672c\u5185\u5bb9\u3002\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e\u4e86\u4f7f\u7528\u5143\u7c7b\u578b\u53ca\u88c5\u9970\u5668\u6765\u7ba1\u7406PyMUD\u5bf9\u8c61\uff0c\u5305\u62ecAlias, Trigger, Timer, GMCPTrigger\u56db\u79cd\u53ef\u4ee5\u4f7f\u7528\u5bf9\u5e94\u7684\u88c5\u9970\u5668\uff0c@alias, @trigger, @timer, @gmcp\u6765\u76f4\u63a5\u5728\u6807\u8bb0\u51fd\u6570\u4e0a\u521b\u5efa\u3002\u53ef\u4ee5\u53c2\u8003\u672c\u7248\u672c\u4e2d\u7684pkuxkx.py\u6587\u4ef6\u5199\u6cd5\u548c\u6ce8\u610f\u4e8b\u9879\u3002\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e\u4e86\u4e24\u4e2a\u88c5\u9970\u5668\uff0c@exception\u548c@async_exception\uff0c\u7528\u4e8e\u6355\u83b7\u5f02\u5e38\u5e76\u8c03\u7528session.error\u8fdb\u884c\u663e\u793a\u3002@exception\u7528\u4e8e\u6355\u83b7\u540c\u6b65\u5f02\u5e38\uff0c@async_exception\u7528\u4e8e\u6355\u83b7\u5f02\u6b65\u5f02\u5e38\u3002\u53c2\u8003\u5982\u4e0b\uff1a\n``` Python\n from pymud import Command, Trigger, IConfig, exception, async_exception\n\n class MyCustomCommand(Command, IConfig):\n @exception\n def a_sync_routine(self, args: list[str]):\n # \u8fd9\u91cc\u7684\u4ee3\u7801\u629b\u51fa\u7684\u5f02\u5e38\u4f1a\u88abself.session.error\u6355\u83b7\u5e76\u663e\u793a\n something_that_may_raise_an_exception()\n\n @async_exception\n async def execute(self, args: list[str]):\n # \u8fd9\u91cc\u7684\u4ee3\u7801\u629b\u51fa\u7684\u5f02\u5e38\u4f1a\u88abself.session.error\u6355\u83b7\u5e76\u663e\u793a\n await something_that_may_raise_another_exception()\n\n # \u4e0a\u8ff0\u4ee3\u7801\u76f8\u5f53\u4e8e\u4ee5\u4e0b\u4ee3\u7801\n class MyCustomCommand(Command, IConfig):\n def a_sync_routine(self, args: list[str]):\n try:\n something_that_may_raise_an_exception()\n except Exception as e:\n self.session.error(error_msg_of_e)\n\n async def execute(self, args: list[str]):\n try:\n await something_that_may_raise_another_exception()\n except Exception as e:\n self.session.error(error_msg_of_e)\n```\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86Alias\u548cCommand\u6267\u884c\u65f6\u7684\u4f18\u5148\u7ea7\u5224\u65ad\u3002\u4e4b\u524d\u672a\u8fdb\u884c\u4f18\u5148\u7ea7\u5224\u65ad\uff0c\u56e0\u6b64\u9047\u5230\u80fd\u540c\u65f6\u5339\u914d\u7684\u591a\u4e2a\u65f6\uff0c\u4e0d\u4e00\u5b9a\u4f18\u5148\u7ea7\u9ad8\u7684\u88ab\u89e6\u53d1\u3002\u73b0\u5728\u5bf9Alias\u548cCommand\u8fdb\u884c\u4e86\u4f18\u5148\u7ea7\u5224\u65ad\uff0c\u4f18\u5148\u7ea7\u9ad8\u7684\u5148\u89e6\u53d1\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590dAlias\u4e2d\u7684keepEval\u53c2\u6570\u548coneShot\u53c2\u6570\u3002keepEval\u53c2\u6570\u652f\u6301\u591a\u4e2a\u5339\u914d\u6210\u529f\u7684\u522b\u540d\u540c\u65f6\u751f\u6548\uff0coneShot\u53c2\u6570\u652f\u6301\u4e00\u4e2a\u5339\u914d\u6210\u529f\u7684\u522b\u540d\u751f\u6548\u540e\uff0c\u540e\u7eed\u7684\u5339\u914d\u4e0d\u518d\u751f\u6548\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590dCommand\u4e2d\u7684keepEval\u53c2\u6570\u3002\u4ee5\u5f80\u540c\u65f6\u5339\u914d\u751f\u6548\u7684Command\u4f1a\u8986\u76d6\u540e\u7eedCommand\u548cAlias\uff0c\u5f53\u524d\u4f1a\u6301\u7eed\u5339\u914d\u3002\n+ \u529f\u80fd\u589e\u5f3a: \u5bf9\u51e0\u4e4e\u6240\u6709\u51fd\u6570\u7684\u53c2\u6570\u8fdb\u884c\u4e86\u7c7b\u578b\u6807\u6ce8\uff0c\u589e\u52a0\u4e86\u7c7b\u578b\u68c0\u67e5\uff0c\u63d0\u9ad8\u4e86\u4ee3\u7801\u7684\u53ef\u8bfb\u6027\u548c\u53ef\u7ef4\u62a4\u6027\uff0c\u4e5f\u4fbf\u4e8e\u81ea\u884c\u7f16\u5199\u811a\u672c\u65f6\u7684\u63d0\u793a\u3002\n+ \u529f\u80fd\u589e\u5f3a: \u4e3aSession\u7c7b\u578b\u589e\u52a0\u4e86commandHistory\u5c5e\u6027\uff0c\u7528\u4e8e\u67e5\u8be2\u53d1\u9001\u5230\u670d\u52a1\u5668\u7684\u547d\u4ee4\u5386\u53f2\u3002\u4fdd\u5b58\u7684\u547d\u4ee4\u5386\u53f2\u7684\u6570\u91cf\u7531pymud.cfg\u4e2d\u7684client[\"history_records\"]\u63a7\u5236\uff0c\u9ed8\u8ba4\u4e3a500\u3002\u5f53\u8be5\u503c\u4e3a0\u65f6\uff0c\u4e0d\u4f1a\u4fdd\u5b58\u547d\u4ee4\u5386\u53f2\u3002\u4e3a-1\u65f6\uff0c\u4f1a\u4fdd\u5b58\u6240\u6709\u547d\u4ee4\u5386\u53f2\u3002\n+ \u529f\u80fd\u8c03\u6574: #help\u547d\u4ee4\u65f6\uff0c\u589e\u52a0\u4e86\u4e0a\u4e0b\u4e24\u884c\u5206\u9694\u7b26\u663e\u793a\uff0c\u4ee5\u4fbf\u660e\u663e\u533a\u5206\u5e2e\u52a9\u8f93\u51fa\u548c\u6e38\u620f\u8f93\u51fa\u3002\n+ \u529f\u80fd\u589e\u5f3a: \u5f53\u524dPyMUD\u754c\u9762\u4e2d\u663e\u793a\u7684\u7248\u672c\u53f7\u4f1a\u81ea\u52a8\u4ecepyproject.toml\u4e2d\u8bfb\u53d6\uff0c\u4ee5\u786e\u4fdd\u7248\u672c\u53f7\u7684\u51c6\u786e\u6027\u548c\u552f\u4e00\u6027\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u4ee3\u7801\u4e2d\u7684\u90e8\u5206\u7f16\u7801\u9519\u8bef\u3002\u65b0\u7248Python\u4e2d\u80fd\u5bb9\u5fcd\u4e00\u4e9b\u9519\u8bef\uff0c\u4f46\u8001\u7248\u672c\u4e0d\u884c\u3002\u7ecf\u4fee\u590d\uff0c\u5f53\u524d\u4ee3\u7801\u652f\u6301\u7684Python\u7248\u672c\u5df2\u6d4b\u8bd53.8\u786e\u4fdd\u53ef\u7528\u3002\u5efa\u8bae\u4f7f\u75283.10\u6216\u66f4\u9ad8\u7248\u672c\u7684Python\u3002\n+ \u95ee\u9898\u4fee\u590d: \u5220\u9664\u4e86extras.py\u4e2d\u591a\u4f59\u7684MenuItem\u7c7b\u578b\u5b9a\u4e49\uff0c\u8be5\u5b9a\u4e49\u4e0eprompt_toolkit\u4e2d\u7684MenuItem\u5b9a\u4e49\u51b2\u7a81\u3002\n+ \u95ee\u9898\u4fee\u590d: \u8c03\u6574\u4e86\u4f17\u591a\u4ee3\u7801\u4e2d\u672a\u68c0\u67e5\u5bf9\u8c61\u662f\u5426\u4e3aNone\u5373\u8c03\u7528\u3001\u4f7f\u7528\u7684\u5c40\u90e8\u53d8\u91cf\u53ef\u80fd\u672a\u7ecf\u8fc7\u521d\u59cb\u5316\u548c\u8d4b\u503c\u8def\u5f84\u7b49\u7684\u60c5\u51b5\uff0c\u4fdd\u8bc1\u7a0b\u5e8f\u8fd0\u884c\u7684\u5065\u58ee\u6027\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86#test\u547d\u4ee4\u7684\u5e2e\u52a9\u5185\u5bb9\u9519\u8bef\u3002\u5b9e\u9645#show\u547d\u4ee4\u4e0d\u89e6\u53d1\u811a\u672c\uff0c\u4ec5\u6d4b\u8bd5\uff1b\u800c#test\u4f1a\u89e6\u53d1\u811a\u672c\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u534f\u8bae\u5904\u7406\u4e2dMSDP\u7f16\u7801\u89e3\u7801\u5904\u7406\u9519\u8bef\u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u534f\u8bae\u5904\u7406\u4e2d\u9ed8\u8ba4encoding\u4e0d\u4f20\u9012\u5bfc\u81f4\u67d0\u4e9b\u60c5\u51b5\u4e0b\u62a5\u89e3\u7801\u9519\u8bef\u7684\u95ee\u9898\u3002\n+ \u793a\u4f8b\u66f4\u65b0: \u66f4\u65b0\u4e86\u5305\u4e2d\u81ea\u5e26\u7684pkuxkx.py\uff0c\u589e\u52a0\u4e86@alias, @trigger, @timer, @gmcp\u7684\u793a\u4f8b\u4ee5\u53ca\u72b6\u6001\u7a97\u53e3\u7684\u793a\u4f8b\u3002\n\n### 0.20.4 (2025-03-30)\n+ \u529f\u80fd\u8c03\u6574: \u4e3a\u63d2\u4ef6\u529f\u80fd\u65b0\u589e\u4e86 PLUGIN_PYMUD_DESTROY \u65b9\u6cd5\uff0c\u7528\u4e8e\u5728\u63d2\u4ef6\u88ab\u5378\u8f7d\u65f6\uff0c\u8fdb\u884c\u4e00\u4e9b\u6e05\u7406\u5de5\u4f5c\u3002\n+ \u529f\u80fd\u8c03\u6574: \u5c06\u63d2\u4ef6\u7684 PLUGIN_PYMUD_START \u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u4ece\u63d2\u4ef6\u52a0\u8f7d\u65f6\u523b\u79fb\u52a8\u5230\u4e8b\u4ef6\u5faa\u73af\u542f\u52a8\u4e4b\u540e\uff0c\u8fd9\u6837\u5728\u52a0\u8f7d\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528 asyncio.create_task\u6216 asyncio.ensure_future \u6765\u6267\u884c\u4e00\u4e9b\u5f02\u6b65\u64cd\u4f5c\n\n### 0.20.3 (2025-03-05)\n+ \u529f\u80fd\u8c03\u6574: \u4e3a\u9002\u5e94MacOS\u4e0b\u7684\u5feb\u6377\u952e\uff0c\u589e\u52a0Shift+\u5de6\u53f3\u7bad\u5934\u540c\u6837\u4f5c\u4e3a\u5207\u6362\u4f1a\u8bdd\u7684\u5feb\u6377\u952e\u3002\n+ \u529f\u80fd\u8c03\u6574: \u4f1a\u8bdd\u5173\u95ed\u548cAPP\u9000\u51fa\u65f6\uff0c\u5076\u5c14\u53d7\u7f51\u7edc\u5f71\u54cd\u5bfc\u81f4\u670d\u52a1\u5668\u6389\u7ebf\u4f46\u672c\u5730\u672a\u68c0\u6d4b\u5230\u65f6\u4f1a\u65e0\u6cd5\u9000\u51fa\u3002\u73b0\u589e\u52a0\u6700\u957f10s\u7b49\u5f85\uff0c\u8d85\u65f6\u540e\u4f1a\u4e2d\u65ad\uff0c\u5f3a\u5236\u9000\u51fa\u3002\n\n### 0.20.2 (2024-11-26)\n+ \u529f\u80fd\u8c03\u6574: MTTS\u534f\u5546\u4e2d\uff0c\u5c06256 Color\u660e\u786e\u5199\u5165\u534f\u5546\u56de\u590d\u3002\u539f\u5148\u4ec5\u5305\u542bANSI \u548c TrueColor\u3002\u63a8\u6d4b\u6b66\u5e99\u7279\u6b8a\u989c\u8272\u5076\u5c14\u4e0d\u6b63\u5e38\u4e0e\u6b64\u6709\u5173\uff08\u5df2\u6d4b\u8bd5\u65e0\u5173\uff09\u3002\n+ \u529f\u80fd\u8c03\u6574: \u4fee\u590d\u4e86\u7eaf\u6587\u672c\u6b63\u5219\u5904\u7406\uff0c\u76ee\u524d\u7406\u8bba\u4e0a\u652f\u6301\u6240\u6709ANSI\u63a7\u5236\u4ee3\u7801\u7684\u5904\u7f6e\uff0c\u4ee5\u6b63\u786e\u54cd\u5e94\u7eaf\u6587\u672c\u89e6\u53d1\u5668\u3002\n+ \u529f\u80fd\u8c03\u6574: \u4fee\u6539\u4e86#var\u548c#global\u7684\u663e\u793a\u5b9e\u73b0\uff0c\u63d0\u9ad8\u4e86\u53d8\u91cf\u6253\u5370\u6392\u5217\u7684\u6574\u9f50\u5ea6\u548c\u8fa8\u8bc6\u5ea6\uff0c\u4ee5\u9002\u5e94\u957f\u503c\u53d8\u91cf\u548c\u590d\u6742\u53d8\u91cf\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e86\u5355\u884c\u989c\u8272\u4ee3\u7801\u8de8\u884c\u65e0\u6cd5\u663e\u793a\u95ee\u9898\u3002\u73b0\u5728\u661f\u5bbf\u6bd2\u8349\u53ef\u4ee5\u6b63\u5e38\u8fa8\u8ba4\u989c\u8272\u4e86\u3002\n+ \u529f\u80fd\u8c03\u6574: \u8c03\u6574\u4e86info/warning/error\u7684\u663e\u793a\u5904\u7406\uff0c\u9ed8\u8ba4\u6837\u5f0f\u8fdb\u884c\u4e86\u4fee\u6539\u3002\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e\u83dc\u5355\u9009\u9879\uff1a\u6253\u5f00/\u5173\u95ed\u7f8e\u5316\uff0c\u4ee5\u4fbf\u4e8e\u66f4\u597d\u7684\u5728\u89e6\u53d1\u5668\u65f6\u590d\u5236\u51fa\u6b63\u786e\u7684\u5185\u5bb9\uff08\u4ee5\u524d\u8ba1\u7b97\u53ef\u80fd\u4e0d\u51c6\u786e\uff09\u3002\n+ \u529f\u80fd\u65b0\u589e: \u72b6\u6001\u680f\u7684\u5206\u9694\u7b26\u53ef\u4ee5\u901a\u8fc7\u672c\u5730\u8bbe\u7f6e\u53d6\u6d88\u4e86\u3002\u5728pymud.cfg\u7684client\u4e2d\u65b0\u589e\u8bbe\u7f6e\uff0c\u5c06 status_divider \u8bbe\u7f6e\u4e3a false \u5373\u53ef\u3002\n+ \u529f\u80fd\u8c03\u6574: \u5728pymud.cfg\u7684client\u4e2d\u53ef\u4ee5\u652f\u6301\u5c06buffer_lines\u8bbe\u7f6e\u4e3a0\u4e86\uff0c\u8868\u793a\u4e0d\u6e05\u9664\u7f13\u5b58\u3002\n+ \u529f\u80fd\u65b0\u589e: \u4e3a\u72b6\u6001\u680f\u663e\u793a\u51fd\u6570\u589e\u52a0\u4e86\u5f02\u5e38\u4fdd\u62a4\uff0c\u518d\u6709status_maker\u51fa\u9519\u7684\u65f6\u5019\uff0c\u72b6\u6001\u680f\u4f1a\u663e\u793a\u51fa\u9519\u4fe1\u606f\u3002\n\n### 0.20.1 (2024-11-16)\n+ \u529f\u80fd\u8c03\u6574: \u4f1a\u8bdd\u4e2d\u89e6\u53d1\u5668\u5339\u914d\u5b9e\u73b0\u8fdb\u884c\u90e8\u5206\u8c03\u6574\uff0c\u51cf\u5c11\u5faa\u73af\u6b21\u6570\u4ee5\u63d0\u9ad8\u54cd\u5e94\u901f\u5ea6\n+ \u529f\u80fd\u8c03\u6574: #test / #show \u89e6\u53d1\u5668\u6d4b\u8bd5\u529f\u80fd\u8c03\u6574\uff0c\u73b0\u5728\u4f1a\u5bf9\u4f7f\u80fd\u7684\u548c\u672a\u4f7f\u80fd\u7684\u89e6\u53d1\u5668\u5747\u8fdb\u884c\u5339\u914d\u6d4b\u8bd5\u3002\u5176\u4e2d\uff0c#show \u547d\u4ee4\u4ec5\u6d4b\u8bd5\uff0c\u800c #test \u547d\u4ee4\u4f1a\u5bfc\u81f4\u89e6\u53d1\u5668\u771f\u6b63\u54cd\u5e94\u3002\n+ \u529f\u80fd\u65b0\u589e: PyMUD\u5bf9\u8c61\u65b0\u589e\u4e86\u4e00\u4e2a\u6301\u7eed\u8fd0\u884c\u76841s\u7684\u5468\u671f\u5b9a\u65f6\u4efb\u52a1\u3002\u8be5\u4efb\u52a1\u4e2d\u4f1a\u5237\u65b0\u9875\u9762\u663e\u793a\u3002\u53ef\u4ee5\u4f7f\u7528 session.application.addTimerTickCallback \u548c session.application.removeTimerTickCallback \u6765\u6ce8\u518c\u548c\u89e3\u9664\u5b9a\u65f6\u5668\u56de\u8c03\u3002\n\n### 0.20.0 (2024-08-25)\n+ \u529f\u80fd\u8c03\u6574: \u5c06\u6a21\u5757\u4e3b\u5165\u53e3\u51fd\u6570\u4ece__main__.py\u4e2d\u79fb\u52a8\u5230main.py\u4e2d\uff0c\u4ee5\u4f7f\u53ef\u4ee5\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528pymud\uff0c\u4e5f\u53ef\u4f7f\u7528python -m pymud\u542f\u52a8\n+ \u529f\u80fd\u8c03\u6574: \u4f7f\u7528argsparser\u6807\u51c6\u6a21\u5757\u6765\u914d\u7f6e\u547d\u4ee4\u884c\uff0c\u53ef\u4ee5\u4f7f\u7528 pymud -h \u67e5\u770b\u547d\u4ee4\u884c\u5177\u4f53\u53c2\u6570\u53ca\u8bf4\u660e\n+ \u529f\u80fd\u65b0\u589e: \u547d\u4ee4\u884c\u53c2\u6570\u589e\u52a0\u6307\u5b9a\u542f\u52a8\u76ee\u5f55\u7684\u529f\u80fd\uff0c\u53c2\u6570\u4e3a -s, --startup_dir\u3002\u5373\u53ef\u4ee5\u4ece\u4efb\u610f\u76ee\u5f55\u901a\u8fc7\u6307\u5b9a\u811a\u672c\u76ee\u5f55\u65b9\u5f0f\u542f\u52a8PyMUD\u4e86\u3002\n - \u4f8b\u5982\uff0c PS C:\\> pymud -s d:\\prog\\pkuxkx \u76f8\u5f53\u4e8e PS D:\\prog\\pkuxk> pymud\n+ \u95ee\u9898\u4fee\u590d: MacOS\u4e0b python -m pymud init \u521b\u5efa\u76ee\u5f55\u62a5\u9519\u7684\u95ee\u9898\u3002\u540c\u65f6\uff0c\u5c06\u6240\u6709\u7cfb\u7edf\u4e0a\u7684\u9ed8\u8ba4\u76ee\u5f55\u5747\u4f7f\u7528 ~/pkuxkx \uff08\u5f71\u54cdwindows\uff09\n+ \u529f\u80fd\u8c03\u6574: \u6062\u590d\u5728__init__.py\u4e2d\u589e\u52a0PyMudApp\u7684\u5bfc\u51fa\uff0c\u53ef\u4ee5\u6062\u590d\u4f7f\u7528from pymud import PyMudApp\u4e86\n+ \u529f\u80fd\u65b0\u589e: \u589e\u52a0log\u529f\u80fd\uff0c\u8be6\u89c1 #log \u547d\u4ee4\u4ecb\u7ecd\u3001\u7c7b\u53c2\u8003\u4e2d\u7684 Logger \u7c7b\uff0c\u4ee5\u53ca Session \u7c7b\u7684 handle_log \u65b9\u6cd5\n+ \u529f\u80fd\u65b0\u589e: \u589e\u52a0 #disconnect, #dis \u547d\u4ee4\uff0c\u53ef\u4ee5\u4f7f\u5f53\u524d\u4f1a\u8bdd\u4ece\u670d\u52a1\u5668\u65ad\u5f00\u3002\u76f8\u5f53\u4e8e\u64cd\u4f5c\u83dc\u5355 \u4f1a\u8bdd->\u65ad\u5f00\u8fde\u63a5\n+ \u529f\u80fd\u8c03\u6574: \u5728\u6ca1\u6709session\u7684\u65f6\u5019\uff0c\u4e5f\u53ef\u4ee5\u6267\u884c#exit\u547d\u4ee4\n+ \u529f\u80fd\u65b0\u589e: #session \u547d\u4ee4\u589e\u52a0\u5feb\u6377\u521b\u5efa\u4f1a\u8bdd\u529f\u80fd\uff0c\u5047\u5982\u5df2\u6709\u5feb\u6377\u83dc\u5355 \u4e16\u754c->pkuxkx->newstart , \u5219\u53ef\u4ee5\u901a\u8fc7 #session pkuxkx.newstart \u76f4\u63a5\u521b\u5efa\u8be5\u4f1a\u8bdd\uff0c\u6548\u679c\u7b49\u540c\u4e8e\u70b9\u51fb\u8be5\u83dc\u5355\n+ \u529f\u80fd\u8c03\u6574: \u70b9\u51fb\u83dc\u5355\u521b\u5efa\u4f1a\u8bdd\u65f6\uff0c\u82e5\u4f1a\u8bdd\u5df2\u5b58\u5728\uff0c\u5219\u5c06\u8be5\u4f1a\u8bdd\u5207\u6362\u4e3a\u5f53\u524d\u4f1a\u8bdd\n+ \u91cd\u5927\u66f4\u65b0: \u5b8c\u5168\u91cd\u5199\u4e86\u6a21\u5757\u7684\u52a0\u8f7d\u3001\u5378\u8f7d\u3001\u91cd\u65b0\u52a0\u8f7d\u65b9\u6cd5\uff0c\u4fee\u590d\u6a21\u5757\u4f7f\u7528\u4e2d\u7684\u95ee\u9898\n+ \u529f\u80fd\u8c03\u6574: \u73b0\u5728\u53ea\u8981\u5c06\u4e00\u4e2a\u7c7b\u578b\u7ee7\u627f IConfig \u63a5\u53e3\uff0c\u5373\u88ab\u8bc6\u522b\u4e3a\u914d\u7f6e\u7c7b\u578b\u3002\u8fd9\u79cd\u7c7b\u578b\u5728\u6a21\u5757\u52a0\u8f7d\u65f6\u4f1a\u81ea\u52a8\u521b\u5efa\u5176\u5b9e\u4f8b\u3002\u5f53\u7136\uff0c\u540d\u79f0\u4e3aConfiguration\u7684\u7c7b\u578b\u4e5f\u540c\u6837\u88ab\u8ba4\u4e3a\u662f\u914d\u7f6e\u7c7b\u578b\uff0c\u4fdd\u6301\u5411\u524d\u517c\u5bb9\u6027\u3002\u552f\u4e00\u8981\u6c42\u662f\uff0c\u8be5\u7c7b\u578b\u7684\u6784\u9020\u51fd\u6570\u5141\u8bb8\u4ec5\u4f20\u9012\u4e00\u4e2asession\u5bf9\u8c61\u3002\n+ \u529f\u80fd\u65b0\u589e: \u5404\u7c7b\u914d\u7f6e\u7c7b\u578b\u7684\u5378\u8f7d\u73b0\u5728\u65e2\u53ef\u4ee5\u5b9a\u4e49\u5728__unload__\u65b9\u6cd5\u4e2d\uff0c\u4e5f\u53ef\u4ee5\u5b9a\u4e49\u5728unload\u65b9\u6cd5\u4e2d\u3002\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u559c\u597d\u9009\u62e9\u4e00\u4e2a\u5373\u53ef\u3002\n+ \u529f\u80fd\u8c03\u6574: \u5404\u914d\u7f6e\u7c7b\u578b\u52a0\u8f7d\u548c\u91cd\u65b0\u52a0\u8f7d\u524d\uff0c\u4f1a\u81ea\u52a8\u8c03\u7528\u6a21\u5757\u7684__unload__\u65b9\u6cd5\u6216unload\u65b9\u6cd5\uff08\u82e5\u6709\uff09\n+ \u529f\u80fd\u65b0\u589e: Command\u57fa\u7c7b\u589e\u52a0__unload__\u65b9\u6cd5\u548cunload\u65b9\u6cd5\uff0c\u4e8c\u8005\u5728\u4ece\u4f1a\u8bdd\u4e2d\u79fb\u9664\u8be5 Command \u65f6\u5747\u4f1a\u81ea\u52a8\u8c03\u7528\u3002\u81ea\u5b9a\u4e49\u7684Command\u5b50\u7c7b\u5e94\u8986\u76d6\u8fd9\u4e24\u79cd\u65b9\u6cd5\u4e2d\u7684\u4e00\u79cd\u65b9\u6cd5\uff0c\u5e76\u5728\u5176\u4e2d\u589e\u52a0\u6e05\u9664\u7c7b\u578b\u81ea\u884c\u521b\u5efa\u7684 Trigger, Alias \u7b49\u4f1a\u8bdd\u5bf9\u8c61\u3002\u8fd9\u6837\uff0c\u6a21\u5757\u5378\u8f7d\u65f6\u53ea\u8981\u79fb\u9664\u547d\u4ee4\u672c\u8eab\uff0c\u5728\u547d\u4ee4\u4e2d\u65b0\u5efa\u7684\u5176\u4ed6\u5173\u8054\u5bf9\u8c61\u5c06\u88ab\u4e00\u540c\u79fb\u9664\u3002\n+ \u529f\u80fd\u65b0\u589e: \u6240\u6709PyMUD\u57fa\u7840\u5bf9\u8c61\u7c7b\u578b\u53ca\u5176\u5b50\u7c7b\u578b\uff0c\u5305\u62ec Alias, Trigger, Timer, Command, GMCPTrigger \u53ca\u5b83\u4eec\u7684\u5b50\u7c7b\u578b\uff0c\u5728\u521b\u5efa\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u6dfb\u52a0\u5230\u4f1a\u8bdd\u4e2d\uff0c\u65e0\u9700\u518d\u8fdb\u884c addObject \u7b49\u64cd\u4f5c\u4e86\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u90e8\u5206\u6b63\u5219\u8868\u8fbe\u5f0f\u4e66\u5199\u9519\u8bef\u95ee\u9898\n+ \u529f\u80fd\u65b0\u589e: Session\u7c7b\u65b0\u589ewaitfor\u51fd\u6570\uff0c\u7528\u4e8e\u6267\u884c\u4e00\u6bb5\u4ee3\u7801\u540e\u7acb\u5373\u7b49\u5f85\u67d0\u4e2a\u89e6\u53d1\u5668\u7684\u60c5\u51b5\uff0c\u7b80\u5316\u539f\u4e09\u884c\u4ee3\u7801\u5199\u6cd5\n\n ``` Python\n # \u539f\u6765\u4e3a\u786e\u4fddawait triggered\u7684\u4efb\u52a1\u5728\u8f93\u5165\u524d\u7b49\u5f85\uff0c\u6709\u65f6\u5019\u9700\u8981\u8fd9\u4e48\u5199\uff1a\n task = self.create_task(self.tri1.triggered())\n await asyncio.sleep(0.05)\n self.session.writeline('dazuo')\n await task\n\n # \u73b0\u5728\u53ef\u4ee5\u4e00\u53e5\u8bdd\u7b80\u5199\uff1a\n await self.session.waitfor('dazuo', self.create_task(self.tri1.triggered()))\n ```\n\n+ \u529f\u80fd\u8c03\u6574: Session\u7c7b\u7684addTriggers\u7b49\u65b9\u6cd5\u63a5\u53d7\u7684dict\u4e2d\uff0c\u4f1a\u5c06\u5bf9\u8c61\u672c\u8eabid\u4f5c\u4e3a\u4f1a\u8bdd\u5904\u7406id\u3002\u5f53\u8be5id\u4e0ekey\u4e0d\u4e00\u81f4\u65f6\uff0c\u4f1a\u540c\u65f6\u663e\u793a\u8b66\u544a\u3002\n+ \u529f\u80fd\u65b0\u589e: Session\u7c7b\u65b0\u589eaddObject, addObjects, delObject, delObjects\u7528\u4e8e\u64cd\u4f5c\u522b\u540d\u3001\u5b9a\u65f6\u5668\u3001\u89e6\u53d1\u5668\u3001GMCP\u89e6\u53d1\u5668\u3001\u547d\u4ee4\u7b49\u5bf9\u8c61\u3002\n - \u4f7f\u7528\u793a\u4f8b:\n\n ```Python\n # \u6240\u6709\u5bf9\u8c61\u5747\u53ef\u4ee5\u4f7f\u7528 delObject \u76f4\u63a5\u4ece\u4f1a\u8bdd\u4e2d\u79fb\u9664\uff0c\u4f1a\u81ea\u52a8\u6839\u636e\u5bf9\u8c61\u7c7b\u578b\u63a8\u65ad\uff0c\u65e0\u9700\u901a\u8fc7\u51fd\u6570\u540d\u533a\u5206\n session.delObject(self.tri1)\n session.delObject(self.ali1)\n session.delObject(self.timer1)\n\n objs = [\n Trigger(session, xxx, xxx),\n Alias(session, xxx),\n SimpleCommand(session, xxx),\n Timer(session, xxx),\n GMCPTrigger(session, xxx)\n ]\n\n session.delObjects(objs) # \u53ef\u4ee5\u76f4\u63a5\u4ece\u4f1a\u8bdd\u4e2d\u79fb\u9664\u4e00\u4e2a\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u5bf9\u8c61\uff0c\u4f1a\u81ea\u52a8\u5224\u65ad\u5bf9\u8c61\u7c7b\u522b\n ```\n\n+ \u529f\u80fd\u65b0\u589e: Session\u7c7b\u578b\u65b0\u589eidletime\u5c5e\u6027\uff0c\u53ef\u4ee5\u83b7\u53d6\u672c\u4f1a\u8bdd\u53d1\u5446\u79d2\u6570\uff08float\u7c7b\u578b\uff09\u3002\u5f53\u4f1a\u8bdd\u5904\u4e8e\u672a\u8fde\u63a5\u72b6\u6001\u65f6\uff0c\u8fd4\u56de -1\u3002\u53ef\u4ee5\u5229\u7528\u5b9a\u65f6\u5668\uff0c\u5728\u5176\u4e2d\u68c0\u6d4b idletime \u503c\uff0c\u4ee5\u5728\u673a\u5668\u4eba\u51fa\u9519\u540e\u5904\u7406\u6062\u590d\n+ \u529f\u80fd\u65b0\u589e: Session\u7684\u6240\u6709\u5f02\u6b65\u547d\u4ee4\u8c03\u7528\u51fd\u6570\u589e\u52a0\u8fd4\u56de\u503c\uff0c\u73b0\u5728\u8c03\u7528 session.exec_async, exec_command_async \u7b49\u65b9\u6cd5\u6267\u884c\u7684\u5185\u5bb9\u82e5\u5339\u914d\u4e3a\u547d\u4ee4\u65f6\uff0c\u4f1a\u8fd4\u56de\u6700\u540e\u6700\u540e\u4e00\u4e2a Command \u5bf9\u8c61\u7684 execute \u51fd\u6570\u7684\u8fd4\u56de\u503c\n - \u4f8b\u5982\uff0c result = await self.session.cmds.cmd_runto.execute('rt yz') \u4e0e result = await self.session.exec_async('rt yz') \u7b49\u4ef7\uff0c\u8fd4\u56de\u503c\u76f8\u540c\n - \u4f46 result = await self.session.exec_async('rt yz;dzt')\uff0c\u8be5\u8fd4\u56de\u7684result \u4ec5\u662f dzt \u547d\u4ee4\u7684 execute \u7684\u8fd4\u56de\u503c\u3002 rt yz \u547d\u4ee4\u8fd4\u56de\u503c\u88ab\u4e22\u5f03\u3002\n+ \u529f\u80fd\u65b0\u589e: \u589e\u52a0\u4e34\u65f6\u53d8\u91cf\u6982\u5ff5\uff0c\u53d8\u91cf\u540d\u4ee5\u4e0b\u5212\u7ebf\u5f00\u5934\u7684\u4e3a\u4e34\u65f6\u53d8\u91cf\uff0c\u6b64\u7c7b\u53d8\u91cf\u4e0d\u4f1a\u88ab\u4fdd\u5b58\u5230 .mud \u6587\u4ef6\u4e2d\u3002\n+ \u529f\u80fd\u65b0\u589e: \u4e3a BaseObject \u57fa\u7c7b\u7684 self.session \u589e\u52a0\u4e86 Session \u7c7b\u578b\u9650\u5b9a\uff0c\u73b0\u5728\u81ea\u5b9a\u4e49 Command \u7b49\u65f6\u5019\uff0c\u4f7f\u7528 self.session \u65f6\u4f1a\u6709 IntelliSence \u51fd\u6570\u667a\u80fd\u63d0\u793a\u4e86\uff0c\u6240\u6709\u5e2e\u52a9\u8bf4\u660e\u5df2\u8865\u5168\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d #var \u7b49\u547d\u4ee4\u4e2d\uff0c\u82e5\u542b\u6709\u4e2d\u6587\u5219\u7b49\u53f7\u4f4d\u7f6e\u4e0d\u5bf9\u9f50\u7684\u95ee\u9898\n+ \u529f\u80fd\u8c03\u6574: \u5728 #tri \u7b49\u547d\u4ee4\u4e2d\uff0c\u5f53\u5bf9\u8c61\u7684 group \u4e3a\u7a7a\u65f6\uff0c\u5c06\u4e0d\u518d\u663e\u793a group \u5c5e\u6027\uff0c\u51cf\u5c11\u65e0\u7528\u4fe1\u606f\n\n### 0.19.4 (2024-04-20)\n+ \u529f\u80fd\u8c03\u6574: info \u73b0\u5728 msg \u6062\u590d\u4e3a\u53ef\u63a5\u53d7\u4efb\u4f55\u7c7b\u578b\u53c2\u6570\uff0c\u4e0d\u4e00\u5b9a\u662f str\n+ \u529f\u80fd\u8c03\u6574: #var, #global \u6307\u4ee4\u4e2d\uff0c\u73b0\u5728\u53ef\u4ee5\u4f7f\u7528\u53c2\u6570\u6269\u5c55\u4e86\uff0c\u4f8b\u5982 #var max_qi @qi\n+ \u529f\u80fd\u8c03\u6574: #var, #global \u6307\u4ee4\u4e2d\uff0c\u73b0\u5728\u5bf9\u5b57\u7b26\u4e32\u4f1a\u5148\u4f7f\u7528 eval \u8f6c\u6362\u7c7b\u578b\uff0c\u8f6c\u6362\u5931\u8d25\u65f6\u4f7f\u7528 str \u7c7b\u578b\u3002\u4f8b\u5982\uff0c #var myvar 1 \u65f6\uff0cmyvar\u7c7b\u578b\u5c06\u4e3aint\n+ \u529f\u80fd\u8c03\u6574: \u53d8\u91cf\u66ff\u4ee3\u65f6\uff0c\u4f1a\u81ea\u52a8\u5b9e\u73b0\u7c7b\u578b\u8f6c\u5316\uff0c\u5f53\u88ab\u66ff\u4ee3\u53d8\u91cf\u503c\u4e3a\u975e str \u7c7b\u578b\u65f6\u4e0d\u4f1a\u518d\u62a5\u9519\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u4e4b\u524d\u4ece\u540e\u5411\u524d\u9009\u62e9\u65f6\uff0c\u65e0\u6cd5\u590d\u5236\u7684\u95ee\u9898\n\n### 0.19.3post2 \uff082024-04-05\uff09\n+ \u95ee\u9898\u4fee\u590d: \u4e00\u6b21\u53d1\u9001\u591a\u4e2a\u547d\u4ee4\u65f6\uff0c\u53d1\u9001\u987a\u5e8f\u53ef\u80fd\u4e0d\u6b63\u786e\u7684\u60c5\u51b5\n+ \u529f\u80fd\u589e\u52a0: \u65b0\u589e\u4e00\u4e2aexec_async\u51fd\u6570\uff0c\u662fexec\u51fd\u6570\u7684\u5f02\u6b65\u5f62\u5f0f\u3002\u53ef\u4ee5\u5728\u5176\u4ed6\u4f1a\u8bdd\u4e2d\u5f02\u6b65\u6267\u884c\u4e00\u6bb5\u4ee3\u7801\n+ \u5e2e\u52a9\u5b8c\u5584: \u5e2e\u52a9\u6587\u6863\u903b\u8f91\u5b8c\u5584\uff0c\u5df2\u5b8c\u6210\u6574\u4e2a\u5305\u7684\u5185\u7f6e\u6587\u6863\u7684\u7f16\u5199\u548c\u4fee\u6539\n+ \u6ce8: \u7531\u4e8e\u6211\u6ca1\u5f04\u592a\u660e\u767d readthedocs.io \u7f51\u7ad9\u5bf9\u4e8e\u8bfb\u53d6github\u6e90\u4ee3\u7801\u7684\u903b\u8f91\uff0c\u76ee\u524d\u53ea\u80fd\u901a\u8fc7\u65b0\u53d1\u5e03\u6b63\u5f0f\u7248\u672c\u7684\u5f62\u5f0f\u6765\u4f7f readthedocs.io \u7f51\u7ad9\u7684\u6587\u6863\u4e2d\u7684\u7c7b\u53c2\u8003\u81ea\u52a8\u66f4\u65b0\u3002\n+ \u95ee\u9898\u4fee\u590d: \u4fee\u590d\u9000\u51fa\u7a0b\u5e8f\u65f6\u7684\u5c0fbug\n\n### 0.19.2post2 \uff082024-03-24\uff09\n+ \u9519\u8bef\u4fee\u590d\uff1a\u8ba2\u6b63\u90e8\u5206\u9519\u522b\u5b57\u3001\u9519\u8bef\u5e2e\u52a9\u3001\u9519\u522b\u683c\u5f0f\n+ \u7cfb\u7edf\u5b8c\u5584\uff1a\u5b8c\u5584\u5e2e\u52a9\u4f53\u7cfb\uff0c\u6309reST\u683c\u5f0f\u91cd\u5199\u6240\u6709\u6709\u5173\u7684docstring\n+ \u529f\u80fd\u8c03\u6574\uff1asession.exec_command / exec_command_async / exec \u7cfb\u5217\u547d\u4ee4\u8c03\u6574\uff0c\u73b0\u5728\u53ef\u4ee5\u5728exec\u65f6\u5e26\u53d8\u91cf\u53c2\u6570\u4e86\u3002\u4f8b\u5982 session.exec(\"dazuo @dzpt\")\uff0c\u76f4\u63a5\u8c03\u7528 dzpt\u7684\u53d8\u91cf\u503c\n+ \u529f\u80fd\u8c03\u6574: settings.py\u4e2d\uff0cclient\u5b57\u5178\u589e\u52a0\u914d\u7f6ereconnect_wait\uff0c\u4e3a\u81ea\u52a8\u91cd\u8fde\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u9ed8\u8ba415s\uff0c\u53ef\u672c\u5730\u8986\u76d6\n+ \u529f\u80fd\u8c03\u6574: \u53d8\u901a\u89e3\u51b3\u4e86\u83dc\u5355\u680f\u53f3\u8fb9\u5355\u51fb \u5e2e\u52a9 \u83dc\u5355\u4f1a\u54cd\u5e94\u95ee\u9898\n+ \u9519\u8bef\u4fee\u590d: \u4fee\u590d\u4e86\u4f1a\u8bdd\u5173\u95ed\u65f6\u63d2\u4ef6\u5378\u8f7d\u7684\u4ee3\u7801\u9519\u8bef\n+ \u529f\u80fd\u8c03\u6574: \u5728\u4f1a\u8bdd\u5173\u95ed\u3001\u7a0b\u5e8f\u9000\u51fa\u65f6\u589e\u52a0\u7b49\u5f85\uff0c\u786e\u4fdd\u6536\u5230\u670d\u52a1\u5668\u65ad\u5f00\u547d\u4ee4\u4e4b\u540e\u624d\u5173\u95ed\u548c\u9000\u51fa\n+ \u95ee\u9898\u4fee\u590d: \u5728\u9000\u51fa\u7a0b\u5e8f\u65f6\u589e\u52a0\u4e86\u63d2\u4ef6\u5378\u8f7d\u8c03\u7528\n+ \u5b9e\u73b0\u8c03\u6574: \u5728\u6e05\u9664task\u7684\u5217\u8868\u63a8\u5bfc\u8fc7\u7a0b\u4e2d\u53bb\u6389\u4e86\u7c7b\u578b\u5224\u65ad\u4ee5\u51cf\u5c11\u4efb\u52a1\u65f6\u95f4\u5360\u7528\n+ \u5176\u4ed6\u8c03\u6574: \u4ece\u5305\u4e2d\u5220\u9664\u4e86\u62f7\u8d1d\u8fc7\u6765\u4f5c\u4e3a\u53c2\u8003\u7684\u6587\u4ef6\n+ \u5e2e\u52a9\u5b8c\u5584: \u5e2e\u52a9\u6587\u6863\u903b\u8f91\u5b8c\u5584\n+ \u5b9e\u73b0\u8c03\u6574: \u6539\u7528\u5b98\u65b9\u793a\u4f8b\u7684task\u6e05\u9664\u65b9\u5f0f\uff0c\u6bcf\u4e2a\u4efb\u52a1\u7ed3\u675f\u540e\u6e05\u9664\n\n### 0.19.1 \uff082024-03-06\uff09\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e\u9f20\u6807\u542f\u7528\u7981\u7528\u529f\u80fd\uff0c\u4ee5\u9002\u7528\u4e8essh\u8fdc\u7a0b\u60c5\u51b5\u4e0b\u7684\u590d\u5236\u529f\u80fd\u3002F2\u5feb\u6377\u952e\u53ef\u4ee5\u5207\u6362\u72b6\u6001\u3002\u5f53\u9f20\u6807\u7981\u7528\u65f6\uff0c\u5e95\u90e8\u72b6\u6001\u680f\u53f3\u4fa7\u4f1a\u663e\u793a\u201c\u9f20\u6807\u5df2\u7981\u7528\u72b6\u6001\u201d\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e\u5feb\u6377\u952eF1\u4f1a\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00\u5e2e\u52a9\u7f51\u5740 https://pymud.readthedocs.io/\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e\u9ed8\u8ba4\u5feb\u6377\u952eF3=#ig, F4=#cls, F11=#close, F12=#exit\u3002\u6b64\u51e0\u4e2a\u5feb\u6377\u952e\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u8fdb\u884c\u914d\u7f6e\uff0c\u53ef\u4ee5\u81ea\u884c\u5b9a\u4e49\u6216\u4fee\u6539\u3002F1\u3001F2\u4e3a\u5199\u6b7b\u7684\u7cfb\u7edf\u529f\u80fd\u3002\n+ \u529f\u80fd\u8c03\u6574: \u5c06\u9664#session\u4e4b\u5916\u7684\u6240\u6709\u5176\u4ed6#\u547d\u4ee4\u5b9e\u73b0\u7edf\u4e00\u5230Session\u7c7b\u4e2d\u5b9e\u73b0\uff0c\u8fd9\u4e9b\u547d\u4ee4\u5747\u652f\u6301\u901a\u8fc7Session.exec_command\u8fd0\u884c\n+ \u529f\u80fd\u8c03\u6574: python -m pymud init\u65f6\uff0c\u521b\u5efa\u7684pymud.cfg\u6587\u4ef6\u589e\u52a0\u4e86keys\u5b57\u5178\n\n### 0.19.0 (2024-03-01)\n+ \u5b9e\u73b0\u8c03\u6574: session.info/warning/error\u5904\u7406\u591a\u884c\u65f6\uff0c\u4f1a\u7ed9\u6bcf\u4e00\u884c\u52a0\u4e0a\u540c\u6837\u989c\u8272\n+ \u529f\u80fd\u65b0\u589e: \u521d\u6b21\u8fd0\u884c\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528python -m pymud init\u6765\u521d\u59cb\u5316\u73af\u5883\uff0c\u81ea\u52a8\u521b\u5efa\u76ee\u5f55\u5e76\u5728\u8be5\u76ee\u5f55\u4e2d\u5efa\u7acb\u914d\u7f6e\u6587\u4ef6\u548c\u6837\u4f8b\u811a\u672c\u6587\u4ef6\n+ \u5b9e\u73b0\u8c03\u6574: \u5c06\u7f13\u51b2\u6e05\u9664\u884c\u6570\u7684\u5b9e\u73b0\u8c03\u6574\u5230SessionBuffer\u4e2d\uff0c\u51cf\u5c11\u4ee3\u7801\u8026\u5408\u5e76\u8fdb\u4e00\u6b65\u964d\u4f4e\u5185\u5b58\u5360\u7528\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e\u547d\u4ee4\u884c\u547d\u4ee4#T+, #T-, \u53ef\u4ee5\u4f7f\u80fd/\u7981\u7528\u6307\u5b9a\u7ec4\uff0c\u76f8\u5f53\u4e8esession.enableGroup\u64cd\u4f5c\n+ \u529f\u80fd\u65b0\u589e: \u65b0\u589e\u547d\u4ee4\u884c\u547d\u4ee4#task\uff0c\u53ef\u4ee5\u5217\u51fa\u6240\u6709\u7cfb\u7edf\u7ba1\u7406\u7684Task\u6e05\u5355\uff0c\u4e3b\u8981\u7528\u4e8e\u5f00\u53d1\u6d4b\u8bd5\n+ \u5b9e\u73b0\u8c03\u6574: \u8c03\u6574\u7cfb\u7edf\u7ba1\u7406Task\u7684\u6e05\u7a7a\u548c\u9000\u51fa\u673a\u5236\uff0c\u51cf\u5c11\u5904\u7406\u65f6\u95f4\u5360\u7528\u548c\u5185\u5b58\u5360\u7528\n+ \u5b9e\u73b0\u8c03\u6574: \u8c03\u6574COPY-RAW\u6a21\u5f0f\u590d\u5236\uff0c\u5373\u4f7f\u4ec5\u9009\u4e2d\u884c\u4e2d\u7684\u90e8\u5206\u5185\u5bb9\uff0c\u4e5f\u81ea\u52a8\u8bc6\u522b\u6574\u884c\uff08\u591a\u884c\u6a21\u5f0f\u4e5f\u662f\u6574\u4e2a\u591a\u884c\uff09\n+ \u529f\u80fd\u65b0\u589e: Settings\u4e2d\u65b0\u589ekeys\u5b57\u5178\uff0c\u7528\u4e8e\u5b9a\u4e49\u5feb\u6377\u952e\u3002\u53ef\u5b9a\u4e49\u5feb\u6377\u952e\u53c2\u89c1prompt_toolkit\u4e2dKeys\u7684\u5b9a\u4e49\u3002\u5176\u503c\u4e3a\u53ef\u5728session.exec_command\u8fd0\u884c\u652f\u6301\u7684\u6240\u6709\u5185\u5bb9\u3002\u8be5\u5b57\u5178\u5185\u5bb9\u53ef\u4ee5\u88abpymud.cfg\u6240\u8986\u76d6\u3002\n\n### 0.18.4post4 (2024-02-23)\n+ \u529f\u80fd\u65b0\u589e\uff1a\u65b0\u589eSettings.client[\"buffer_lines\"]\uff0c\u8868\u793a\u4fdd\u7559\u7684\u7f13\u51b2\u884c\u6570\uff08\u9ed8\u8ba45000\uff09\u3002\u5f53Session\u5185\u5bb9\u7f13\u51b2\u884c\u6570\u8fbe\u5230\u8be5\u503c2\u500d\u65f6\uff0810000\u884c\uff09\uff0c\u5c06\u622a\u53d6\u4e00\u534a\uff085000\u884c\uff09\uff0c\u540e\u4e00\u534a\u5185\u5bb9\u8fdb\u884c\u4fdd\u7559\uff0c\u524d\u4e00\u534a\u4e22\u5f03\u3002\u6b64\u529f\u80fd\u662f\u4e3a\u4e86\u51cf\u5c11\u957f\u65f6\u6302\u673a\u7684\u5185\u5b58\u6d88\u8017\u548c\u54cd\u5e94\u65f6\u95f4\u3002\n+ \u529f\u80fd\u4fee\u590d\uff1a\u89e3\u51b3\u5728\u663e\u793a\u7f8e\u5316\uff08Settings.client[\"beautify\"]\uff09\u6253\u5f00\u4e4b\u540e\uff0c\u590d\u5236\u90e8\u5206\u6587\u5b57\u4e0d\u80fd\u6b63\u786e\u5224\u65ad\u8d77\u59cb\u7ec8\u6b62\u7684\u95ee\u9898\u3002\n+ \u529f\u80fd\u8c03\u6574\uff1a\u4fee\u6539\u7f13\u51b2\u884c\u6570\u5224\u65ad\u903b\u8f91\uff0c\u52a0\u5feb\u5ba2\u6237\u7aef\u5224\u65ad\u54cd\u5e94\u901f\u5ea6\u3002\n+ \u95ee\u9898\u8c03\u6574\uff1a\u4fee\u6539\u7f13\u51b2\u622a\u53d6\u5904\u7406\u4e2d\u7684\u5c0fBUG\u3002\n+ \u529f\u80fd\u8c03\u6574\uff1a\u5c06\u5e2e\u52a9\u7a97\u53e3\u4e2d\u7684\u94fe\u63a5\u6539\u5230\u5e2e\u52a9\u7f51\u5740\uff1a https://pymud.readthedocs.org\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d\u4e86\u968f\u5305\u63d0\u4f9b\u7684pkuxkx.py\u6837\u4f8b\u811a\u672c\u4e2d\u7684\u51e0\u5904\u9519\u8bef\n\n### 0.18.3 (2024-02-07)\n+ \u529f\u80fd\u8c03\u6574\uff1a\u539f#unload\u65f6\u901a\u8fc7\u8c03\u7528__del__\u6765\u5b9e\u73b0\u5378\u8f7d\u7684\u65f6\u95f4\u4e0d\u53ef\u63a7\uff0c\u73b0\u5c06\u6a21\u5757\u5378\u8f7d\u6539\u4e3a\u8c03\u7528unload\u51fd\u6570\u3002\u82e5\u9700\u5378\u8f7d\u65f6\u4eba\u5de5\u6e05\u9664\u6709\u5173\u5b9a\u65f6\u5668\u3001\u89e6\u53d1\u5668\u7b49\uff0c\u8bf7\u5728Configuration\u7c7b\u4e0b\u65b0\u589eunload\u51fd\u6570\uff08\u53c2\u6570\u4ec5self\uff09\uff0c\u5e76\u5728\u5176\u4e2d\u8fdb\u884c\u5b9e\u73b0\n+ \u529f\u80fd\u65b0\u589e\uff1a\u65b0\u589e\u4f1a\u8bddVariable\u548c\u5168\u5c40Global\u7684\u5220\u9664\u63a5\u53e3\u3002\u53ef\u4ee5\u901a\u8fc7session.delVariable(name)\u5220\u9664\u4e00\u4e2a\u53d8\u91cf\uff0c\u53ef\u4ee5\u901a\u8fc7session.delGlobal(name)\u6765\u5220\u9664\u4e00\u4e2a\u5168\u5c40Global\u53d8\u91cf\n\n### 0.18.2 (2024-02-06)\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u6539\u4e86\u5b9a\u65f6\u5668\u5b9e\u73b0\uff0c\u4ee5\u907f\u514d\u51fa\u73b0\u9012\u5f52\u8c03\u7528\u8d85\u9650\u5f02\u5e38\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u6539\u4e86\u53c2\u6570\u66ff\u4ee3\u65f6\u7684\u9ed8\u8ba4\u503c\uff0c\u4eceNone\u6539\u4e3a\u5b57\u7b26\u4e32\"None\"\uff0c\u4ee5\u907f\u514d\u66ff\u4ee3\u65f6\u62a5None\u5f02\u5e38\n\n### 0.18.1 (2024-02-05)\n+ \u95ee\u9898\u4fee\u590d\uff1a\u7edf\u4e00\u5904\u7f6e\u4e86task.cancel\u7684\u53c2\u6570\u548ccreate_task\u7684name\u5c5e\u6027\uff0c\u4ee5\u9002\u5e94\u66f4\u4f4e\u7248\u672c\u7684python\u73af\u5883\uff08\u4f4e\u81f33.8\uff09\n+ \u5b9e\u73b0\u8c03\u6574\uff1a\u4e3a\u89e3\u51b3\u540c\u6b65/\u5f02\u6b65\u6267\u884c\u95ee\u9898\uff0c\u5728CodeLine\u548cCodeBlock\u7684\u5b9e\u73b0\u4e2d\uff0c\u4f1a\u901a\u8fc7\u8c03\u7528\u547d\u4ee4\u6765\u5224\u65ad\u662f\u5426\u4f7f\u7528\u540c\u6b65\u6a21\u5f0f\uff08\u9ed8\u8ba4\u4e3a\u5f02\u6b65\uff09\u3002#gag\u3001#replace\u4e3a\u5f3a\u5236\u540c\u6b65\uff0c#wa\u4e3a\u5f3a\u5236\u5f02\u6b65\u3002\u5f53\u540c\u65f6\u5b58\u5728\u65f6\uff0c\u540c\u6b65\u5931\u6548\uff0c\u5f02\u6b65\u6267\u884c\u3002\n+ \u5b9e\u73b0\u8c03\u6574\uff1a\u5c06%line\u3001%raw\u7684\u8bbf\u95ee\u4f20\u9012\u5230\u89e6\u53d1\u5668\u5185\u90e8\u7684\u6267\u884c\u4e2d\uff0c\u907f\u514d\u540c\u6b65\u5f02\u6b65\u95ee\u9898\u3002\n+ \u65b0\u589e\u6587\u6863\uff1a\u5c06\u5e2e\u52a9\u6587\u6863\u6dfb\u52a0\u5230\u672c\u9879\u76ee\uff0c\u5e2e\u52a9\u6587\u6863\u81ea\u52a8\u540c\u6b65\u5230 pymud.readthedocs.org \uff08\u6587\u6863\u5185\u5bb9\u6682\u672a\u66f4\u65b0\uff09\n\n### 0.18.0 (2024-01-24) \n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d\u4e86delTrigger/delAlias\u7b49\u7b49\u65e0\u6cd5\u5220\u9664\u5bf9\u8c61\u7684\u95ee\u9898\n+ \u529f\u80fd\u8c03\u6574\uff1adelTrigger\u7b49\u51fd\u6570\uff0c\u4fee\u6539\u4e3a\u65e2\u53ef\u4ee5\u63a5\u53d7Trigger\u5bf9\u8c61\u672c\u8eab\uff0c\u4e5f\u53ef\u4ee5\u63a5\u53d7\u5176id\u3002\u5176\u4ed6\u7c7b\u4f3c\n+ \u529f\u80fd\u589e\u52a0\uff1a\u589e\u52a0\u4e86delTriggers\uff08\u6ce8\u610f\uff0c\u5e26s\uff09\u7b49\u51fd\u6570\uff0c\u53ef\u4ee5\u5220\u9664\u591a\u4e2a\u6307\u5b9a\u5bf9\u8c61\u3002\u53ef\u63a5\u53d7\u5217\u8868\u3001\u5143\u7ec4\u7b49\u53ef\u8fed\u4ee3\u5bf9\u8c61\uff0c\u5e76\u4e14\u5176\u5185\u5bb9\u65e2\u53ef\u4ee5\u4e3a\u5bf9\u8c61\u672c\u8eab\uff0c\u4e5f\u53ef\u4ee5\u4e3aid\u3002\n+ \u529f\u80fd\u589e\u52a0\uff1a\u589e\u52a0\u4e86session.reset()\u529f\u80fd\uff0c\u53ef\u6e05\u9664\u4f1a\u8bdd\u6240\u6709\u6709\u5173\u811a\u672c\u4fe1\u606f\u3002\u4e5f\u53ef\u4ee5\u5728\u547d\u4ee4\u884c\u4f7f\u7528#reset\u8c03\u7528\uff0c\u53e6\u5916\uff0c#unload\u4e0d\u5e26\u53c2\u6570\u8c03\u7528\u65f6\uff0c\u6709\u540c\u6837\u6548\u679c\n+ \u529f\u80fd\u589e\u52a0\uff1a\u589e\u52a0\u4e86#ignore/#ig\u53c2\u6570\uff0c\u7c7b\u4f3c\u4e8ezmud\u7684#ignore\u529f\u80fd\uff0c\u53ef\u4ee5\u5207\u6362\u5168\u5c40\u89e6\u53d1\u5668\u7981\u7528\u72b6\u6001\u3002\u5f53\u5168\u5c40\u88ab\u7981\u7528\u65f6\uff0c\u5e95\u90e8\u72b6\u6001\u680f\u53f3\u4fa7\u4f1a\u663e\u793a\u6b64\u72b6\u6001\u3002\uff08\u672a\u5168\u5c40\u7981\u7528\u65f6\u4e0d\u663e\u793a\uff09\n+ \u529f\u80fd\u8c03\u6574\uff1a\u79fb\u9664\u4e86\u4f1a\u8bdd\u5207\u6362\u65f6\uff0c\u72b6\u6001\u680f\u663e\u793a\u7684\u5185\u5bb9\n+ \u529f\u80fd\u8c03\u6574\uff1a\u4f1a\u8bdd\u547d\u4ee4\u7684\u6267\u884c\u6574\u4f53\u8fdb\u884c\u4e86\u5b9e\u73b0\u8c03\u6574\uff0c\u5c06\u53c2\u6570\u66ff\u4ee3\u5ef6\u8fdf\u5230\u7279\u5b9a\u547d\u4ee4\u6267\u884c\u65f6\u523b\u3002\uff08\u6b64\u5b9e\u73b0\u5f71\u54cd\u9762\u8f83\u5927\uff0c\u8bf7\u5927\u5bb6\u4f7f\u7528\u4e2d\u53d1\u73b0BUG\u65f6\u90fd\u62a5\u544a\u4e0b\uff0c\u6211\u53ca\u65f6\u4fee\u6539\uff09\n+ \u529f\u80fd\u8c03\u6574\uff1a\u4ee3\u7801\u5757\u73b0\u5728\u53ef\u4ee5\u4f7f\u7528{}\u62ec\u8d77\u6765\u4e86\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u547d\u4ee4\u548c\u547d\u4ee4\u53ef\u4ee5\u5d4c\u5957\u4e86\u3002\u4f8b\u5982\uff0c#3 {#3 get g1b from bo yu;combine gem;pack gem;#wa 3000}\uff0c\u8be5\u4ee3\u7801\u53ef\u4ee5\u6267\u884c\u4e09\u6b21\u5408\u5e76g1b\u5b9d\u77f3\n+ \u529f\u80fd\u65b0\u589e\uff1a\u589e\u52a0\u4e86#ali,#tri,#ti\u7684\u4e09\u53c2\u6570\u4f7f\u7528\uff0c\u53ef\u4ee5\u5728\u547d\u4ee4\u884c\u76f4\u63a5\u4ee3\u7801\u521b\u5efaSimpleAlias, SimpleTrigger\u548cSimpleTimer\u3002\n+ \u4f7f\u7528\u793a\u4f8b\uff1a#ali {gp\\s(\\S+)} {get %1 from corpse}, #tri {^[> ]*\u3010\\S+\u3011.+} {#mess %line}, #ti 10 {xixi;haha}\n+ \u529f\u80fd\u65b0\u589e\uff1a\u65b0\u589e#session_name cmd\u547d\u4ee4\uff0c\u53ef\u4ee5\u76f4\u63a5\u4f7f\u540d\u4e3asession_name\u7684\u4f1a\u8bdd\u6267\u884ccmd\u547d\u4ee4\n+ \u529f\u80fd\u65b0\u589e\uff1asession\u7c7b\u578b\u65b0\u589eexec\u65b9\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u4e3a\uff1asession.exec(cmd, session_name)\u3002\u53ef\u4ee5\u4f7f\u540d\u4e3asession_name\u7684\u4f1a\u8bdd\u6267\u884ccmd\u547d\u4ee4\u3002\u5f53\u4e0d\u6307\u5b9asession_name\u65f6\uff0c\u5728\u5f53\u524d\u4f1a\u8bdd\u6267\u884c\u3002\n+ \u529f\u80fd\u8c03\u6574\uff1a\u5b9a\u65f6\u5668\u521b\u5efa\u65f6\u82e5\u4e0d\u6307\u5b9aid\uff0c\u5176\u81ea\u52a8\u751f\u6210\u7684id\u524d\u7f00\u7531tmr\u8c03\u6574\u4e3ati\n+ \u5b9e\u73b0\u8c03\u6574\uff1a\u5c06#all\u3001#session_name cmd\u7b49\u547d\u4ee4\u7684\u5b9e\u73b0\u4ecepymud.py\u4e2d\u79fb\u52a8\u5230\u4e86session.py\u4e2d\uff0c\u8fd9\u6837\u53ef\u4ee5\u5728\u811a\u672c\u4e2d\u4f7f\u7528session.exec_command(\"#all xixi\")\u3002\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d\u4e86\u70b9\u51fb\u83dc\u5355\"\u91cd\u65b0\u52a0\u8f7d\u811a\u672c\u914d\u7f6e\"\u62a5\u9519\u7684\u95ee\u9898\n+ \u529f\u80fd\u8c03\u6574\uff1a\u4ece\u83dc\u5355\u91cc\u70b9\u51fb\u521b\u5efa\u4f1a\u8bdd\u65f6\uff0c\u4f1a\u81ea\u52a8\u4ee5\u767b\u5f55\u540d\u4e3a\u672c\u4f1a\u8bdd\u521b\u5efaid\u53d8\u91cf\n+ \u5f53\u524d\u5df2\u77e5\u95ee\u9898\uff1a\u7531\u4e8e\u540c\u6b65/\u5f02\u6b65\u6267\u884c\u95ee\u9898\uff0c\u5728SimpleTrigger\u4e2d\uff0c#gag\u548c#replace\u7684\u6267\u884c\u7ed3\u679c\u4f1a\u5f88\u5947\u602a\uff0c\u53ef\u80fd\u4f1a\u9690\u85cf\u548c\u66ff\u6362\u6389\u975e\u89e6\u53d1\u884c\u3002\u53ef\u884c\u7684\u529e\u6cd5\u4e3a\u5728onSuccess\u91cc\uff0c\u8c03\u7528session.replace\u8fdb\u884c\u5904\u7406\u3002\n\n### 0.17.4 (2024-01-08)\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d\u4e86DotDict\u5728dump\u65f6\u51fa\u73b0\u9519\u8bef\u7684\u95ee\u9898\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u6539\u4e86reconnect\u7684\u5b9e\u73b0\u65b9\u5f0f\uff0c\u4fee\u590d\u4e86\u65ad\u5f00\u91cd\u8fde\u65f6\u62a5\u9519\u7684\u95ee\u9898\n+ \u529f\u80fd\u589e\u52a0\uff1a\u4e3aSession\u589e\u52a0\u4e24\u4e2a\u4e8b\u4ef6\u5c5e\u6027\uff0c\u5206\u522b\u4e3aevent_connected\u548cevent_disconnected\uff0c\u63a5\u53d7\u4e00\u4e2a\u5e26\u6709session\u53c2\u6570\u7684\u51fd\u6570\uff0c\u5728\u8fde\u63a5\u548c\u8fde\u63a5\u65ad\u5f00\u65f6\u89e6\u53d1\u3002\n+ \u529f\u80fd\u8c03\u6574\uff1a\u8c03\u6574\u4e86\u65f6\u95f4\u663e\u793a\u683c\u5f0f\uff0c\u53ea\u663e\u793a\u5230\u79d2\uff0c\u4e0d\u663e\u793a\u6beb\u79d2\u6570\u3002\n\n### 0.17.3 (2024-01-02)\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d\u4e86\u539f\u6709\u7684#repeat\u529f\u80fd\u3002\u547d\u4ee4\u884c#repeat/#rep\u53ef\u4ee5\u91cd\u590d\u8f93\u5165\u4e0a\u4e00\u6b21\u547d\u4ee4\uff08\u8fd9\u4e2a\u57fa\u672c\u6ca1\u7528\uff0c\u4e3b\u8981\u662f\u6211\u5728\u8fdc\u7a0b\u8fde\u63a5\u65f6\uff0c\u624b\u673a\u4e0a\u6ca1\u6709\u65b9\u5411\u952e...\uff09\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u6539\u5b9a\u65f6\u5668\u7684\u5b9e\u73b0\u65b9\u5f0f\uff0c\u771f\u6b63\u4fee\u590d\u4e86\u5b9a\u65f6\u5668\u6bcfreload\u540e\u4f1a\u65b0\u589e\u4e00\u4e2a\u7684bug\u3002\n+ \u529f\u80fd\u589e\u52a0\uff1a\u547d\u4ee4\u884c\u4f7f\u7528#tri, #ali, #cmd, #ti\u65f6\uff0c\u9664\u4e86\u63a5\u53d7on/off\u53c2\u6570\u5916\uff0c\u589e\u52a0\u4e86del\u53c2\u6570\uff0c\u53ef\u4ee5\u5220\u9664\u5bf9\u5e94\u7684\u89e6\u53d1\u5668\u3001\u522b\u540d\u3001\u547d\u4ee4\u3001\u5b9a\u65f6\u5668\u3002\u4f8b\u5982\uff1a#ti tm_test del \u53ef\u4ee5\u5220\u9664id\u4e3a\u201ctm_test\u201d\u7684\u5b9a\u65f6\u5668\u3002\n+ \u529f\u80fd\u8c03\u6574\uff1a\u8c03\u6574\u4e86#help {cmd}\u7684\u663e\u793a\u683c\u5f0f\uff0c\u6700\u540e\u4e00\u884c\u4e5f\u589e\u52a0\u4e86\u6362\u884c\u7b26\uff0c\u786e\u4fdd\u540e\u7eed\u6570\u636e\u5728\u4e0b\u4e00\u884c\u51fa\u73b0\u3002\n+ \u529f\u80fd\u8c03\u6574\uff1a\u8c03\u6574\u4e86Timer\u548cSimpleTimer\u5728#timer\u65f6\u7684\u663e\u793a\u683c\u5f0f\u3002\n+ \u5b9e\u73b0\u8c03\u6574\uff1a\u8c03\u6574\u4e86Session.clean\u5b9e\u73b0\u4e2d\u5404\u5bf9\u8c61\u6e05\u7406\u7684\u987a\u5e8f\uff0c\u5c06\u4efb\u52a1\u6e05\u9664\u79fb\u5230\u4e86\u6700\u540e\u3002\n\n### 0.17.2post4 (2023-12-29)\n+ \u529f\u80fd\u4fee\u6539\uff1a\u4f1a\u8bdd\u83dc\u5355 \"\u663e\u793a/\u9690\u85cf\u547d\u4ee4\" \u548c \"\u6253\u5f00/\u5173\u95ed\u81ea\u52a8\u91cd\u8fde\" \u64cd\u4f5c\u540e\uff0c\u589e\u52a0\u5728\u5f53\u524d\u4f1a\u8bdd\u4e2d\u63d0\u793a\u72b6\u6001\u4fe1\u606f\u3002\n+ \u529f\u80fd\u4fee\u6539\uff1aTimer\u5b9e\u73b0\u8fdb\u884c\u4fee\u6539\uff0c\u4ee5\u786e\u4fdd\u4e00\u4e2a\u5b9a\u65f6\u5668\u4ec5\u521b\u5efa\u4e00\u4e2a\u4efb\u52a1\u3002\n+ \u529f\u80fd\u8c03\u6574\uff1aTimer\u5bf9\u8c61\u5728\u590d\u4f4dSession\u5bf9\u8c61\u65f6\uff0c\u4e5f\u540c\u65f6\u590d\u4f4d\u3002\u76ee\u7684\u662f\u786e\u4fddreload\u65f6\u4e0d\u91cd\u65b0\u521b\u5efa\u5b9a\u65f6\u5668\u4efb\u52a1\u3002\n+ \u529f\u80fd\u8c03\u6574\uff1a\u5728\u4f1a\u8bdd\u8fde\u63a5\u65f6\uff0c\u4e0d\u518d\u590d\u4f4dSession\u6709\u5173\u5bf9\u8c61\u4fe1\u606f\u3002\u8be5\u590d\u4f4d\u6d3b\u52a8\u4ec5\u5728\u8fde\u63a5\u65ad\u5f00\u65f6\u548c\u811a\u672c\u91cd\u65b0\u52a0\u8f7d\u65f6\u8fdb\u884c\u3002\n+ \u529f\u80fd\u8c03\u6574\uff1a\u542f\u52a8PyMUD\u65f6\uff0c\u4f1a\u5c06\u63a7\u5236\u53f0\u6807\u9898\u8bbe\u7f6e\u4e3aPyMUD+\u7248\u672c\u53f7\u3002\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d\u4f1a\u8bdd\u7279\u5b9a\u811a\u672c\u6a21\u5757\u4f1a\u88ab\u5176\u4ed6\u4f1a\u8bdd\u52a0\u8f7d\u7684bug\u3002\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d\u5b9a\u65f6\u5668Timer\u4e2d\u7684bug\u3002\n\n### 0.17.1post1 (2023-12-27)\n\u672c\u7248\u5bf9\u6a21\u5757\u529f\u80fd\u8fdb\u884c\u4e86\u6574\u4f53\u8c03\u6574\uff0c\u652f\u6301\u52a0\u8f7d/\u5378\u8f7d/\u91cd\u8f7d/\u9884\u52a0\u8f7d\u591a\u4e2a\u6a21\u5757\uff0c\u5177\u4f53\u5185\u5bb9\u5982\u4e0b\uff1a\n+ \u5f53\u6a21\u5757\u4e2d\u5b58\u5728\u540d\u4e3aConfiguration\u7c7b\u65f6\uff0c\u4ee5\u4e3b\u6a21\u5757\u5f62\u5f0f\u52a0\u8f7d\uff0c\u5373\uff1a\u81ea\u52a8\u521b\u5efa\u8be5Configuration\u7c7b\u7684\u5b9e\u4f8b\uff08\u4e0e\u539f\u811a\u672c\u76f8\u540c\uff09\n+ \u5f53\u6a21\u5757\u4e2d\u4e0d\u5b58\u5728\u540d\u4e3aConfiguration\u7c7b\u65f6\uff0c\u4ee5\u5b50\u6a21\u5757\u5f62\u5f0f\u52a0\u8f7d\uff0c\u5373\uff1a\u4ec5\u52a0\u8f7d\u8be5\u6a21\u5757\uff0c\u4f46\u4e0d\u4f1a\u521b\u5efaConfiguration\u7684\u5b9e\u4f8b\n+ \\#load\u547d\u4ee4\u652f\u6301\u540c\u65f6\u52a0\u8f7d\u591a\u4e2a\u6a21\u5757\uff0c\u6a21\u5757\u540d\u4ee5\u534a\u89d2\u9017\u53f7\uff08,\uff09\u9694\u5f00\u5373\u53ef\u3002\u6b64\u65f6\u6309\u7ed9\u5b9a\u7684\u540d\u79f0\u987a\u5e8f\u9010\u4e00\u52a0\u8f7d\u3002\u5982\uff1a#load mod1,mod2\n+ \u589e\u52a0#unload\u547d\u4ee4\uff0c\u5378\u8f7d\u5378\u8f7d\u540d\u79f0\u6a21\u5757\uff0c\u540c\u65f6\u5378\u8f7d\u591a\u4e2a\u6a21\u5757\u65f6\uff0c\u6a21\u5757\u540d\u4ee5\u534a\u89d2\u9017\u53f7\uff08,\uff09\u9694\u5f00\u5373\u53ef\u3002\u5378\u8f7d\u65f6\uff0c\u5982\u679c\u8be5\u6a21\u5757\u6709Configuration\u7c7b\uff0c\u4f1a\u81ea\u52a8\u8c03\u7528\u5176__del__\u65b9\u6cd5\n+ \u4fee\u6539reload\u547d\u4ee4\u529f\u80fd\uff0c\u5f53\u4e0d\u5e26\u53c2\u6570\u65f6\uff0c\u91cd\u65b0\u52a0\u8f7d\u6240\u6709\u5df2\u52a0\u8f7d\u6a21\u5757\uff0c\u5e26\u53c2\u6570\u65f6\uff0c\u9996\u5148\u5c1d\u8bd5\u91cd\u65b0\u52a0\u8f7d\u6307\u5b9a\u540d\u79f0\u6a21\u5757\uff0c\u82e5\u6a21\u5757\u4e2d\u4e0d\u5b58\u5728\u8be5\u540d\u79f0\u6a21\u5757\uff0c\u5219\u91cd\u65b0\u52a0\u8f7d\u6307\u5b9a\u540d\u79f0\u7684\u63d2\u4ef6\u3002\u82e5\u5b58\u5728\u540c\u540d\u6a21\u5757\u548c\u63d2\u4ef6\uff0c\u5219\u4ec5\u91cd\u65b0\u52a0\u8f7d\u63d2\u4ef6\uff08\u5efa\u8bae\u4e0d\u8981\u8ba9\u63d2\u4ef6\u548c\u6a21\u5757\u540c\u540d\uff09\n+ \u589e\u52a0#modules\uff08\u7b80\u5199\u4e3a#mods\uff09\u547d\u4ee4\uff0c\u53ef\u4ee5\u5217\u51fa\u6240\u6709\u5df2\u7ecf\u52a0\u8f7d\u7684\u6a21\u5757\u6e05\u5355\n+ Session\u7c7b\u65b0\u589eload_module\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5728\u811a\u672c\u4e2d\u8c03\u7528\u4ee5\u52a0\u8f7d\u7ed9\u5b9a\u540d\u79f0\u7684\u6a21\u5757\u3002\u8be5\u65b9\u6cd5\u63a5\u53d71\u4e2a\u53c2\u6570\uff0c\u53ef\u4ee5\u4f7f\u7528\u5143\u7ec4/\u5217\u8868\u5f62\u5f0f\u6307\u5b9a\u591a\u4e2a\u6a21\u5757\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u5b57\u7b26\u4e32\u6307\u5b9a\u5355\u4e2a\u6a21\u5757\n+ Session\u7c7b\u65b0\u589eunload_module\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5728\u811a\u672c\u4e2d\u8c03\u7528\u4ee5\u5378\u8f7d\u7ed9\u5b9a\u540d\u79f0\u7684\u6a21\u5757\u3002\u53c2\u6570\u4e0eload_module\u7c7b\u4f3c\u3002\n+ Session\u7c7b\u65b0\u589ereload_module\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5728\u811a\u672c\u4e2d\u8c03\u7528\u4ee5\u91cd\u65b0\u52a0\u8f7d\u7ed9\u5b9a\u540d\u79f0\u7684\u6a21\u5757\u3002\u5f53\u4e0d\u6307\u5b9a\u53c2\u6570\u65f6\uff0c\u91cd\u65b0\u52a0\u8f7d\u6240\u6709\u6a21\u5757\u3002\u5f53\u6307\u5b9a1\u4e2a\u53c2\u6570\u65f6\uff0c\u4e0eload_module\u548cunload_module\u65b9\u6cd5\u7c7b\u4f3c\n+ \u4fee\u6539Settings.py\u548c\u672c\u5730pymud.cfg\u6587\u4ef6\u4e2dsessions\u5757\u811a\u672c\u7684\u5b9a\u4e49\u7684\u53ef\u63a5\u53d7\u503c\u3002\u9ed8\u8ba4\u52a0\u8f7d\u811a\u672cdefault_script\u73b0\u53ef\u63a5\u53d7\u5b57\u7b26\u4e32\u548c\u5217\u8868\u4ee5\u652f\u6301\u591a\u4e2a\u6a21\u5757\u52a0\u8f7d\u3002\u591a\u4e2a\u6a21\u5757\u52a0\u8f7d\u6709\u4e24\u79cd\u5f62\u5f0f\uff0c\u65e2\u53ef\u4ee5\u7528\u5217\u8868\u5f62\u5f0f\u6307\u5b9a\u591a\u4e2a\uff0c\u5982[\"script1\",\"script2\"]\uff0c\u4e5f\u53ef\u4ee5\u7528\u5b57\u7b26\u4e32\u4ee5\u9017\u53f7\u9694\u5f00\u6307\u5b9a\u591a\u4e2a\uff0c\u5982\"script1,script2\"\n+ \u4fee\u6539Settings.py\u548c\u672c\u5730pymud.cfg\u6587\u4ef6\u4e2dsessions\u5757\u811a\u672c\u4e2dchars\u6307\u5b9a\u7684\u4f1a\u8bdd\u83dc\u5355\u53c2\u6570\u3002\u5f53\u524d\uff0c\u83dc\u5355\u540e\u9762\u7684\u5217\u8868\u53c2\u6570\u53ef\u4ee5\u652f\u6301\u989d\u5916\u589e\u52a0\u7b2c3\u4e2a\u5bf9\u8c61\uff0c\u5176\u4e2d\u7b2c3\u4e2a\u4e3a\u8be5\u4f1a\u8bdd\u7279\u5b9a\u9700\u8981\u52a0\u8f7d\u7684\u6a21\u5757\u3002\u8be5\u53c2\u6570\u4e5f\u53ef\u4ee5\u4f7f\u7528\u9017\u53f7\u5206\u9694\u6216\u8005\u5217\u8868\u5f62\u5f0f\u3002\n+ \u5f53\u521b\u5efa\u4f1a\u8bdd\u65f6\uff0c\u81ea\u52a8\u52a0\u8f7d\u7684\u6a21\u5757\u4f1a\u9996\u5148\u52a0\u8f7ddefault_script\u4e2d\u6307\u5b9a\u7684\u6a21\u5757\u540d\u79f0\uff0c\u7136\u540e\u518d\u52a0\u8f7dchars\u4e2d\u6307\u5b9a\u7684\u6a21\u5757\u540d\u79f0\u3002\n+ \u4e0a\u8ff0\u6240\u6709\u4fee\u6539\u5747\u5411\u4e0b\u517c\u5bb9\uff0c\u4e0d\u5f71\u54cd\u539f\u811a\u672c\u4f7f\u7528\u3002\n+ \u4e00\u4e2a\u65b0\u7684\u4fee\u6539\u540e\u7684pymud.cfg\u793a\u4f8b\u5982\u4e0b\n```\n{\n \"sessions\": {\n \"pkuxkx\" : {\n \"host\" : \"mud.pkuxkx.net\",\n \"port\" : \"8081\",\n \"encoding\" : \"utf8\",\n \"autologin\" : \"{0};{1}\",\n \"default_script\": [\"pkuxkx.common\", \"pkuxkx.commands\", \"pkuxkx.main\"],\n \"chars\" : {\n \"char1\": [\"yourid1\", \"yourpassword1\"],\n \"char2\": [\"yourid2\", \"yourpassword2\", \"pkuxkx.wudang\"],\n \"char3\": [\"yourid3\", \"yourpassword3\", \"pkuxkx.wudang,pkuxkx.lingwu\"],\n \"char4\": [\"yourid4\", \"yourpassword4\", [\"pkuxkx.shaolin\",\"pkuxkx.lingwu\"]]\n }\n }\n }\n }\n```\n\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590denableGroup\u4e2d\u5b9a\u65f6\u5668\u5904\u7684bug\n+ \u529f\u80fd\u4fee\u6539\uff1a\u4f1a\u8bdd\u8fde\u63a5\u548c\u91cd\u65b0\u8fde\u63a5\u65f6\uff0c\u53d6\u6d88\u539f\u5b9a\u65f6\u5668\u505c\u6b62\u7684\u8bbe\u5b9a\uff0c\u76ee\u524d\u4fdd\u7559\u4e3a\u53ea\u6e05\u9664\u6240\u6709task\u3001\u590d\u4f4dCommand\n+ \u529f\u80fd\u4fee\u6539\uff1aauto_reconnect\u8bbe\u5b9a\u76ee\u524d\u5bf9\u6b63\u5e38/\u5f02\u5e38\u65ad\u5f00\u5747\u6709\u6548\u3002\u82e5\u8bbe\u7f6e\u4e3aTrue\uff0c\u5f53\u8fde\u63a5\u65ad\u5f00\u540e15s\u540e\u81ea\u52a8\u91cd\u8fde\n+ \u529f\u80fd\u4fee\u6539\uff1a\u4f1a\u8bdd\u83dc\u5355\u4e0b\u589e\u52a0\u201c\u6253\u5f00/\u5173\u95ed\u81ea\u52a8\u91cd\u8fde\u201d\u5b50\u83dc\u5355\uff0c\u53ef\u4ee5\u52a8\u6001\u5207\u6362\u81ea\u52a8\u91cd\u8fde\u662f\u5426\u6253\u5f00\u3002\n\n### 0.17.0 (2023-12-24)\n+ \u529f\u80fd\u4fee\u6539\uff1a\u8c03\u6574\u4fee\u6539GMCP\u6570\u636e\u7684wildcards\u5904\u7406\u65b9\u5f0f\uff0c\u6062\u590d\u4e3aeval\uff0c\u5176\u4f59\u4e0d\u53d8\u3002\uff08\u56de\u6eda0.16.2\u7248\u66f4\u6539\uff09\n+ \u529f\u80fd\u4fee\u6539\uff1a\u5c06\u672c\u5730pymud.cfg\u6587\u4ef6\u7684\u8bfb\u53d6\u9ed8\u8ba4\u7f16\u7801\u8c03\u6574\u4e3autf8\uff0c\u4ee5\u907f\u514d\u52a0\u8f7d\u51fa\u73b0\u95ee\u9898\n+ \u95ee\u9898\u4fee\u590d\uff1asessions.py\u4e2d\uff0c\u4fee\u590d\u7cfb\u7edfcommand\u4e0e\u4f1a\u8bddcommand\u91cd\u540d\u7684\u95ee\u9898\uff08\u8fd9\u6b21\u624d\u53d1\u73b0\uff09\n+ \u529f\u80fd\u4fee\u6539\uff1a\u5c06\u81ea\u52a8\u811a\u672c\u52a0\u8f7d\u8c03\u6574\u5230session\u521b\u5efa\u521d\u59cb\uff0c\u800c\u4e0d\u8bba\u662f\u5426\u8fde\u63a5\u670d\u52a1\u5668\n+ \u529f\u80fd\u4fee\u6539\uff1a\u811a\u672cload\u548creload\u65f6\uff0c\u4e0d\u518d\u6e05\u7a7a\u4efb\u4f55\u5bf9\u8c61\uff0c\u4fdd\u7559\u5185\u5bb9\u5305\u62ec\uff1a\u4e2d\u6b62\u5e76\u6e05\u7a7a\u6240\u6709task\uff0c\u5173\u95ed\u6240\u6709\u5b9a\u65f6\u5668\uff0c\u5c06\u6240\u6709\u5f02\u6b65\u5bf9\u8c61\u590d\u4f4d\n+ \u529f\u80fd\u4fee\u6539\uff1a\u53bb\u6389\u4e86\u5de6\u53f3\u8fb9\u6846\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d\u4e86\u5f53\u4f7f\u7528session.addCommand/addTrigger/addAlias\u7b49\u6dfb\u52a0\u5bf9\u8c61\uff0c\u800c\u5bf9\u8c61\u662fCommand/Trigger/Alias\u7b49\u7684\u5b50\u7c7b\u65f6\uff0c\u7531\u4e8e\u7c7b\u578b\u68c0\u67e5\u5931\u8d25\u5bfc\u81f4\u65e0\u6cd5\u6210\u529f\u7684\u95ee\u9898\n+ \u529f\u80fd\u4fee\u6539\uff1a\u589e\u52a0\u81ea\u52a8\u91cd\u8fde\u914d\u7f6e\uff0cSettings.client[\"auto_reconnect\"]\u914d\u7f6e\uff0c\u5f53\u4e3aTrue\u65f6\uff0c\u82e5\u8fde\u63a5\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u5f02\u5e38\u65ad\u5f00\uff0c\u521910\u79d2\u540e\u81ea\u52a8\u91cd\u8fde\u3002\u8be5\u914d\u7f6e\u9ed8\u8ba4\u4e3aFalse\u3002\n+ \u529f\u80fd\u4fee\u6539\uff1a\u5f53\u8fde\u63a5\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u5f02\u5e38\u65f6\uff0c\u5f02\u5e38\u63d0\u793a\u4e2d\u589e\u52a0\u5f02\u5e38\u65f6\u523b\u3002\n+ \u529f\u80fd\u4fee\u6539\uff1a#reload\u6307\u4ee4\u589e\u52a0\u53ef\u4ee5\u91cd\u65b0\u52a0\u8f7d\u63d2\u4ef6\u529f\u80fd\u3002\u4f8b\u5982\uff0c#reload chathook\u4f1a\u91cd\u65b0\u52a0\u8f7d\u540d\u4e3achathook\u7684\u63d2\u4ef6\u3002\n+ \u529f\u80fd\u589e\u52a0\uff1a\u589e\u52a0#py\u6307\u4ee4\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u4e2d\u5199\u4ee3\u7801\u5e76\u6267\u884c\u3002\u6267\u884c\u7684\u4e0a\u4e0b\u6587\u73af\u5883\u4e3a\u5f53\u524d\u73af\u5883\uff0c\u5373self\u4ee3\u8868\u5f53\u524dsession\u3002\u4f8b\u5982\uff0c#py self.writeline(\"xixi\")\u76f8\u5f53\u4e8e\u76f4\u63a5\u5728\u811a\u672c\u4f1a\u8bdd\u4e2d\u8c03\u7528\u53d1\u9001xixi\u6307\u4ee4\n+ \u529f\u80fd\u65b0\u589e\uff1a\u65b0\u589e\u63d2\u4ef6\uff08Plugins\uff09\u529f\u80fd\u3002\u5c06\u81ea\u52a8\u8bfb\u53d6pymud\u6a21\u5757\u76ee\u5f55\u7684plugins\u5b50\u76ee\u5f55\u4ee5\u53ca\u5f53\u524d\u811a\u672c\u76ee\u5f55\u7684plugins\u5b50\u76ee\u5f55\u4e0b\u7684.py\u6587\u4ef6\uff0c\u82e5\u53d1\u73b0\u9075\u7167\u63d2\u4ef6\u89c4\u8303\u811a\u672c\uff0c\u5c06\u81ea\u52a8\u52a0\u8f7d\u8be5\u6a21\u5757\u5230pymud\u3002\u53ef\u4ee5\u4f7f\u7528#plugins\u67e5\u770b\u6240\u6709\u88ab\u52a0\u8f7d\u7684\u63d2\u4ef6\uff0c\u53ef\u4ee5\u76f4\u63a5\u5e26\u53c2\u6570\u63d2\u4ef6\u540d\uff08\u5982#plugins myplugin\uff09\u67e5\u770b\u63d2\u4ef6\u7684\u8be6\u7ec6\u4fe1\u606f\uff08\u81ea\u52a8\u6253\u5370\u63d2\u4ef6\u7684__doc__\u5c5e\u6027\uff0c\u5373\u5199\u5728\u6587\u4ef6\u6700\u524d\u9762\u7684\u5b57\u7b26\u4e32\u5e38\u91cf\uff09\u63d2\u4ef6\u6587\u4ef6\u4e2d\u5fc5\u987b\u6709\u4ee5\u4e0b\u5b9a\u4e49\uff1a\n\n |\u540d\u79f0|\u7c7b\u578b|\u72b6\u6001|\u542b\u4e49|\n |-|-|-|-|\n |PLUGIN_NAME|str|\u5fc5\u987b\u6709|\u63d2\u4ef6\u552f\u4e00\u540d\u79f0|\n |PLUGIN_DESC|dict|\u5fc5\u987b\u6709|\u63d2\u4ef6\u63cf\u8ff0\u4fe1\u606f\u7684\u8be6\u60c5\uff0c\u5fc5\u8981\u5173\u952e\u5b57\u5305\u542bVERSION\uff08\u7248\u672c\uff09\u3001AUTHOR\uff08\u4f5c\u8005\uff09\u3001RELEASE_DATE\uff08\u53d1\u5e03\u65e5\u671f\uff09\u3001DESCRIPTION\uff08\u7b80\u8981\u63cf\u8ff0\uff09|\n |PLUGIN_PYMUD_START|func(app)|\u51fd\u6570\u5b9a\u4e49\u5fc5\u987b\u6709\uff0c\u51fd\u6570\u4f53\u53ef\u4ee5\u4e3a\u7a7a|PyMUD\u81ea\u52a8\u8bfb\u53d6\u5e76\u52a0\u8f7d\u63d2\u4ef6\u65f6\u81ea\u52a8\u8c03\u7528\u7684\u51fd\u6570\uff0c app\u4e3aPyMudApp\uff08PyMUD\u7ba1\u7406\u7c7b\uff09\u3002\u8be5\u51fd\u6570\u4ec5\u4f1a\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u81ea\u52a8\u52a0\u8f7d\u4e00\u6b21|\n |PLUGIN_SESSION_CREATE|func(session)|\u51fd\u6570\u5b9a\u4e49\u5fc5\u987b\u6709\uff0c\u51fd\u6570\u4f53\u53ef\u4ee5\u4e3a\u7a7a|\u5728\u4f1a\u8bdd\u4e2d\u52a0\u8f7d\u63d2\u4ef6\u65f6\u81ea\u52a8\u8c03\u7528\u7684\u51fd\u6570\uff0c session\u4e3a\u52a0\u8f7d\u63d2\u4ef6\u7684\u4f1a\u8bdd\u3002\u8be5\u51fd\u6570\u5728\u6bcf\u4e00\u4e2a\u4f1a\u8bdd\u521b\u5efa\u65f6\u5747\u88ab\u81ea\u52a8\u52a0\u8f7d\u4e00\u6b21|\n |PLUGIN_SESSION_DESTROY|func(session)|\u51fd\u6570\u5b9a\u4e49\u5fc5\u987b\u6709\uff0c\u51fd\u6570\u4f53\u53ef\u4ee5\u4e3a\u7a7a|\u5728\u4f1a\u8bdd\u4e2d\u5378\u8f7d\u63d2\u4ef6\u65f6\u81ea\u52a8\u8c03\u7528\u7684\u51fd\u6570\uff0c session\u4e3a\u5378\u8f7d\u63d2\u4ef6\u7684\u4f1a\u8bdd\u3002\u5378\u8f7d\u5728\u6bcf\u4e00\u4e2a\u4f1a\u8bdd\u5173\u95ed\u65f6\u5747\u88ab\u81ea\u52a8\u8fd0\u884c\u4e00\u6b21\u3002|\n |PLUGIN_PYMUD_DESTROY|func(app)|\u51fd\u6570\u5b9a\u4e49\u5fc5\u987b\u6709\uff0c\u51fd\u6570\u4f53\u53ef\u4ee5\u4e3a\u7a7a|\u5728PyMUD\u7a0b\u5e8f\u9000\u51fa\u65f6\u81ea\u52a8\u8c03\u7528\u7684\u51fd\u6570\uff0c app\u4e3aPyMUD\u7ba1\u7406\u7c7b\u3002\u8be5\u51fd\u6570\u4ec5\u4f1a\u5728\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u81ea\u52a8\u5378\u8f7d\u4e00\u6b21|\n\n+ \u529f\u80fd\u4fee\u6539\uff1a\u5bf9session\u81ea\u52a8\u52a0\u8f7dmud\u6587\u4ef6\u4e2d\u53d8\u91cf\u5931\u8d25\u65f6\u7684\u5f02\u5e38\u8fdb\u884c\u7ba1\u7406\uff0c\u6b64\u65f6\u5c06\u4e0d\u52a0\u8f7d\u53d8\u91cf\uff0c\u81ea\u52a8\u7ee7\u7eed\u8fdb\u884c\n+ \u529f\u80fd\u4fee\u6539\uff1a\u6240\u6709\u5339\u914d\u7c7b\u5bf9\u8c61\u7684\u5339\u914d\u6a21\u5f0fpatterns\u652f\u6301\u52a8\u6001\u4fee\u6539\uff0c\u6d89\u53caAlias\uff0cTrigger\uff0cCommand\u3002\u4fee\u6539\u65b9\u5f0f\u4e3a\u76f4\u63a5\u5bf9\u5176patterns\u5c5e\u6027\u8d4b\u503c\u3002\u5982tri.patterns = aNewPattern\n+ \u529f\u80fd\u4fee\u6539\uff1a\u8fde\u63a5/\u65ad\u5f00\u8fde\u63a5\u65f6\u523b\u90fd\u4f1a\u5728\u63d0\u793a\u4e2d\u589e\u52a0\u65f6\u523b\u4fe1\u606f\uff0c\u800c\u4e0d\u8bba\u662f\u5426\u5f02\u5e38\u3002\n\n### 0.16.2 (2023-12-19)\n+ \u529f\u80fd\u4fee\u6539\uff1a\u5f52\u4e00\u5316#\u547d\u4ee4\u548c\u975e#\u547d\u4ee4\u5904\u7406\uff0c\u4f7fsession.exec_command\u3001exec_command_async\u3001exec_command_after\u5747\u53ef\u4ee5\u5904\u7406#\u547d\u4ee4\uff0c\u4f8b\u5982session.exec_command(\"#save\")\u3002\u540c\u65f6\uff0c\u4e5f\u53ef\u4ee5\u5728\u547d\u4ee4\u884c\u4f7f\u7528#all\u53d1\u9001#\u547d\u4ee4\uff0c\u5982\"#all #save\"\u6b64\u7c7b\n+ \u529f\u80fd\u4fee\u6539\uff1a\u8c03\u6574\u811a\u672c\u52a0\u8f7d\u4e0e\u53d8\u91cf\u81ea\u52a8\u52a0\u8f7d\u7684\u987a\u5e8f\u3002\u5f53\u524d\u4e3a\u8fde\u63a5\u81ea\u52a8\u52a0\u8f7d\u65f6\uff0c\u9996\u5148\u52a0\u8f7d\u53d8\u91cf\uff0c\u7136\u540e\u518d\u52a0\u8f7d\u811a\u672c\u3002\u76ee\u7684\u662f\u4f7f\u811a\u672c\u7684\u53d8\u5316\u53ef\u4ee5\u8986\u76d6\u52a0\u8f7d\u7684\u53d8\u91cf\u5185\u5bb9\uff0c\u800c\u4e0d\u662f\u53cd\u5411\u8986\u76d6\u3002\n+ \u529f\u80fd\u4fee\u6539\uff1a\u4f1a\u8bdd\u53d8\u91cf\u4fdd\u5b58\u548c\u52a0\u8f7d\u53ef\u4ee5\u914d\u7f6e\u662f\u5426\u6253\u5f00\uff0c\u9ed8\u8ba4\u4e3a\u6253\u5f00\u3002\u89c1Settings.client[\"var_autosave] \u548c Settings.client[\"var_autoload\"]\u3002\u540c\u7406\uff0c\u8be5\u914d\u7f6e\u53ef\u4ee5\u88ab\u672c\u5730pymud.cfg\u6240\u8986\u76d6\n+ \u529f\u80fd\u4fee\u6539\uff1a\u5c06MatchObject\u7684\u540c\u6b65onSuccess\u548c\u5f02\u6b65await\u7684\u6267\u884c\u987a\u5e8f\u8fdb\u884c\u8c03\u6574\uff0c\u4ee5\u786e\u4fdd\u4e00\u5b9a\u662f\u540c\u6b65onSuccess\u5148\u6267\u884c\u3002\u6d89\u53caTrigger\u3001Command\u7b49\u3002\n+ \u529f\u80fd\u4fee\u6539\uff1a\u4fee\u6539\u4e86GMCPTrigger\u7684onSuccess\u5904\u7f6e\u548cawait triggered\u5904\u7f6e\u53c2\u6570\uff0c\u4ee5\u4fdd\u6301\u4e0eTrigger\u540c\u6b65\u3002\u5f53\u524d\uff0conSuccess\u51fd\u6570\u4f20\u90123\u4e2a\u53c2\u6570\uff0cname\uff0cline\uff08GMCP\u6536\u5230\u7684\u539f\u59cbstr\u6570\u636e\uff09,wildcards\uff08\u7ecfeval\u5904\u7406\u7684GMCP\u6570\u636e\uff0c\u5927\u6982\u7387\u662fdict\uff0c\u5076\u5c14\u4e5f\u53ef\u80fdeval\u5931\u8d25\uff0c\u8fd4\u56de\u4e0eline\u76f8\u540c\u503c\uff09\u3002await triggered\u8fd4\u56de\u4e0eTriggerd\u7684await triggered\u76f8\u540c\uff0c\u5747\u4e3aBaseObject.State\uff0c\u5305\u542b4\u4e2a\u53c2\u6570\u7684\u5143\u7ec4\uff0cresult\uff08\u6c38\u4e3aTrue)\uff0cname\uff08GMCP\u7684id)\uff0cline\uff08GMCP\u539f\u59cb\u6570\u636e\uff09\uff0cwildcards\uff08GMCP\u5904\u7406\u540e\u6570\u636e\uff09\u3002\u5176\u4e2d\uff0c\u540e3\u4e2a\u53c2\u6570\u4e0eonSuccess\u51fd\u6570\u8c03\u7528\u65f6\u4f20\u9012\u53c2\u6570\u76f8\u540c\u3002\n+ \u529f\u80fd\u4fee\u6539\uff1a\u589e\u52a0GMCP\u9ed8\u8ba4\u5904\u7406\u3002\u5f53\u672a\u4f7f\u7528GMCPTrigger\u5bf9\u5bf9\u5e94\u7684GMCP\u6d88\u606f\u8fdb\u884c\u5904\u7406\u65f6\uff0c\u9ed8\u8ba4\u4f7f\u7528[GMCP] name: value\u7684\u5f62\u5f0f\u8f93\u51faGMCP\u6536\u5230\u7684\u6d88\u606f\uff0c\u4ee5\u4fbf\u4e8e\u4e2a\u4eba\u811a\u672c\u8c03\u8bd5\u3002\n+ \u529f\u80fd\u4fee\u6539\uff1a\u4fee\u6539GMCP\u6570\u636e\u7684\u5904\u7406\u65b9\u5f0f\u4eceeval\u4fee\u6539\u4e3ajson.load\uff0c\u5176\u4f59\u4e0d\u53d8\u3002\n\n### 0.16.1.post2 (2023-12-12)\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d__init__.py\u4e2d\u7684__all__\u53d8\u91cf\u4e3a\u5b57\u7b26\u4e32\n+ \u529f\u80fd\u589e\u52a0\uff1a\u53ef\u4ee5\u52a0\u8f7d\u81ea\u5b9a\u4e49Settings\u3002\u5728\u6267\u884cpython -m pymud\u65f6\uff0c\u4f1a\u81ea\u52a8\u4ece\u5f53\u524d\u76ee\u5f55\u8bfb\u53d6pymud.cfg\u6587\u4ef6\u3002\u4f7f\u7528json\u683c\u5f0f\u5c06\u914d\u7f6e\u4fe1\u606f\u5199\u5728\u8be5\u6587\u4ef6\u4e2d\u5373\u53ef\u3002\u652f\u6301\u6a21\u5757\u4e2dsettings.py\u91cc\u7684sessions, client, server, styles, text\u5b57\u6bb5\u5185\u5bb9\u3002\n+ \u529f\u80fd\u589e\u52a0\uff1a\u589e\u52a0\u5168\u5c40\u53d8\u91cf\u96c6\uff0c\u53ef\u4ee5\u4f7f\u7528session.setGlobal\u548csession.getGlobal\u8fdb\u884c\u8bbf\u95ee\uff0c\u4ee5\u4fbf\u4e8e\u8de8session\u901a\u4fe1\u3002\u4e5f\u53ef\u4ee5\u4f7f\u7528#global\u5728\u547d\u4ee4\u884c\u8bbf\u95ee\n+ \u529f\u80fd\u589e\u52a0\uff1a\u589e\u52a0\u53d8\u91cf\u7684\u6301\u4e45\u5316\uff0c\u6301\u4e45\u5316\u6587\u4ef6\u4fdd\u5b58\u4e8e\u5f53\u524d\u76ee\u5f55\uff0c\u6587\u4ef6\u540d\u4e3asession\u540d\u79f0.mud\uff0c\u8be5\u6587\u4ef6\u5728\u4f1a\u8bdd\u521d\u59cb\u5316\u65f6\u81ea\u52a8\u8bfb\u53d6\uff0c\u4f1a\u8bdd\u65ad\u5f00\u65f6\u81ea\u52a8\u4fdd\u5b58\uff0c\u5176\u4ed6\u65f6\u5019\u4f7f\u7528#save\u4fdd\u5b58\u3002\n+ \u529f\u80fd\u589e\u52a0\uff1a\u5728extras.py\u4e2d\u589e\u52a0DotDict\uff0c\u7528\u4e8e\u652f\u6301\u5b57\u5178\u7684.\u8bbf\u95ee\u65b9\u5f0f\n+ \u529f\u80fd\u589e\u52a0\uff1a\u4f7f\u7528DotDict\u589e\u52a0\u4e86session\u6709\u5173\u5bf9\u8c61\u7684\u70b9\u8bbf\u95ee\u65b9\u5f0f\uff08.\uff09\u7684\u5feb\u6377\u8bbf\u95ee\uff0c\u5305\u62ec\u53d8\u91cfvars\uff0c\u5168\u5c40\u53d8\u91cfglobals\uff0c\u89e6\u53d1\u5668tris\uff0c\u522b\u540dalis\uff0c\u547d\u4ee4cmds\uff0c\u5b9a\u65f6\u5668timers\uff0cgmcp\u3002\u4f8b\u5982\uff1asession.vars.charname\uff0c\u76f8\u5f53\u4e8esession.getVariable('charname')\n+ \u529f\u80fd\u589e\u52a0\uff1a\u589e\u52a0#all\u547d\u4ee4\uff0c\u53ef\u4ee5\u5411\u5f53\u524d\u6240\u6709\u6d3b\u52a8\u4f1a\u8bdd\u53d1\u9001\u540c\u4e00\u6d88\u606f\uff0c\u4f8b\u5982#all xixi\uff0c\u53ef\u4ee5\u4f7f\u6240\u6709\u8fde\u63a5\u7684\u4f1a\u8bdd\u90fd\u53d1\u9001emote\n+ \u529f\u80fd\u589e\u52a0\uff1a\u589e\u52a0%copy\u7cfb\u7edf\u53d8\u91cf\uff0c\u5f53\u590d\u5236\u540e\uff0c\u4f1a\u5c06\u590d\u5236\u5185\u5bb9\u8d4b\u503c\u7ed9%copy\u53d8\u91cf\n+ \u529f\u80fd\u589e\u52a0\uff1a\u589e\u52a0Trigger\u6d4b\u8bd5\u529f\u80fd\uff0c\u4f7f\u7528#test {msg}\u5728\u547d\u4ee4\u884c\u8f93\u5165\u540e\uff0c\u4f1a\u5982\u540c\u63a5\u6536\u5230\u670d\u52a1\u7aef\u6570\u636e\u4e00\u6837\u5f15\u53d1\u89e6\u53d1\u53cd\u5e94\uff0c\u5e76\u4e14\u4f1a\u4f7f\u7528[PYMUD TRIGGER TEST]\u8fdb\u884c\u4fe1\u606f\u663e\u793a\u3002\n+ \u529f\u80fd\u589e\u52a0\uff1a\u5339\u914d#test\u547d\u4ee4\u548c%copy\u53d8\u91cf\u4f7f\u7528\u5982\u4e0b\uff1a\u7a97\u4f53\u4e2d\u590d\u5236\u6709\u5173\u884c\uff0c\u7136\u540e\u547d\u4ee4\u884c\u4e2d\u8f93\u5165#test %copy\u53ef\u4f7f\u7528\u590d\u5236\u7684\u884c\u6765\u6d4b\u8bd5\u89e6\u53d1\u5668\n+ \u529f\u80fd\u4fee\u6539\uff1a\u5c06\u539fCodeBlock\u4fee\u6539\u4e3aCodeBlock\u548cCodeLine\u7ec4\u6210\uff0c\u4ee5\u9002\u5e94\u65b0\u7684#test\u547d\u4ee4\n+ \u529f\u80fd\u4fee\u6539\uff1asession\u5bf9\u547d\u4ee4\u7684\u8f93\u5165\u5f02\u6b65\u5904\u7406\u51fd\u6570handle_input_async\u8fdb\u884c\u5fae\u5c0f\u8c03\u6574\uff0c\u4ee5\u9002\u5e94#test\u547d\u4ee4\u4f7f\u7528\n+ \u529f\u80fd\u4fee\u6539\uff1a\u9000\u51fa\u65f6\u672a\u65ad\u5f00session\u65f6\u7684\u63d0\u793a\u7a97\u53e3\u6587\u5b57\u6539\u4e3a\u7ea2\u8272\uff08\u539f\u9ec4\u8272\u5bf9\u6bd4\u5ea6\u95ee\u9898\uff0c\u770b\u4e0d\u6e05\u695a\uff09\n+ \u529f\u80fd\u4fee\u6539\uff1a\u6062\u590d\u4e86#help\u529f\u80fd\uff0c\u53ef\u4ee5\u5728\u4efb\u610f\u4f1a\u8bdd\u4e2d\u4f7f\u7528#help\u5217\u51fa\u6240\u6709\u5e2e\u52a9\u4e3b\u9898\uff0c#help {topic}\u53ef\u4ee5\u67e5\u770b\u4e3b\u9898\u8be6\u60c5\n+ \u529f\u80fd\u4fee\u6539\uff1a\u5728#reload\u91cd\u65b0\u52a0\u8f7d\u811a\u672c\u65f6\uff0c\u4fdd\u7559\u53d8\u91cf\u6570\u636e\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u590d\u7248\u672c\u663e\u793a\uff0c\u66f4\u6b63\u4e3a0.16.1\uff08\u539f0.16.0\uff09\n+ \u95ee\u9898\u4fee\u590d\uff1a\u53d1\u5e03\u65e5\u671f\u6807\u5fd7\u4fee\u6539\u4e3a\u5f53\u524d\u65f6\u95f4\n+ \u529f\u80fd\u4fee\u6539\uff1aCodeLine\u7684\u6267\u884c\u8fd0\u884c\u5904\u7406\u4fee\u6539\u4e3a\u4e0d\u5220\u9664\u4e2d\u95f4\u7684\u591a\u4f59\u7a7a\u767d\n+ \u95ee\u9898\u4fee\u590d\uff1a\u4fee\u6539github\u9879\u76ee\u5730\u5740\u4e3a\u539fpymud\u5730\u5740\n\n### 0.15.8 (2023-12-05)\n\u9996\u6b21\u53d1\u5e03\u5230pip\u3002\n",
"bugtrack_url": null,
"license": null,
"summary": "a MUD Client written in Python",
"version": "0.21.8",
"project_urls": {
"Bug Reports": "https://github.com/crapex/pymud/issues",
"Homepage": "https://github.com/crapex/pymud/",
"Source": "https://github.com/crapex/pymud/",
"document": "https://pymud.readthedocs.io/"
},
"split_keywords": [
"mud",
" multi-user dungeon",
" client"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "75a0d696319177bfc0a279d742a68126eb4ebc7f9dda880d2378807e854005bb",
"md5": "1ca604dfffeb06962da2d531052431e1",
"sha256": "a9ab01390f7eb04ee22425019927bc9fda9ef879146e6267f18052ab9dc70db2"
},
"downloads": -1,
"filename": "pymud-0.21.8-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1ca604dfffeb06962da2d531052431e1",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 147882,
"upload_time": "2025-08-08T07:12:23",
"upload_time_iso_8601": "2025-08-08T07:12:23.776042Z",
"url": "https://files.pythonhosted.org/packages/75/a0/d696319177bfc0a279d742a68126eb4ebc7f9dda880d2378807e854005bb/pymud-0.21.8-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ca76bf50b24d733284e6858081c2bba1eda0e2f4d71a1b566f3cbf9962767b1d",
"md5": "e8625052834b923c9b0c6926ffdd1cda",
"sha256": "1f3476c08acebd6e65d1b468017d4ae707ac42c07f91d4eaf8e41d97ff798335"
},
"downloads": -1,
"filename": "pymud-0.21.8.tar.gz",
"has_sig": false,
"md5_digest": "e8625052834b923c9b0c6926ffdd1cda",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 175859,
"upload_time": "2025-08-08T07:12:25",
"upload_time_iso_8601": "2025-08-08T07:12:25.478231Z",
"url": "https://files.pythonhosted.org/packages/ca/76/bf50b24d733284e6858081c2bba1eda0e2f4d71a1b566f3cbf9962767b1d/pymud-0.21.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-08 07:12:25",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "crapex",
"github_project": "pymud",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"tox": true,
"lcname": "pymud"
}