pymud 0.22.3.post1
a MUD Client written in Python
Requires Python: >=3.8
Keywords: MUD, multi-user dungeon, client

[English Version](README.en.md) [中文版本]

# PyMUD - Python原生MUD客户端
## 简介

+ 官方网站：  https://www.pymud.cn
+ 官方文档： https://www.pymud.cn/doc
+ 官方论坛:  https://bbs.pymud.cn
+ 源代码地址: https://github.com/crapex/pymud
+ PyPi项目地址： https://pypi.org/project/pymud
+ 由deepwiki自动生成的项目理解文档地址： https://deepwiki.com/crapex/pymud
+ 交流QQ群：554672580


### 北大侠客行Mud (www.pkuxkx.net)，最好的中文Mud游戏！
### PyMUD是我为了更好的玩北大侠客行，特意自行开发的MUD客户端。PyMUD具有以下特点：
+ 原生Python开发，除 `prompt-toolkit <https://python-prompt-toolkit.readthedocs.io>` 及其依赖库 wcwidth, pygments, 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中支持
+ 多语言支持框架已搭好，目前提供中文、英文支持，可以自己增加翻译后的其他语言版本
+ 为北侠版提供了基于web的网页客户端界面插件，界面上可以直接操作角色，直接多端同步显示数据、状态，fullme图片（见QQ群文件）。
+ 我自己还在玩，所以本客户端会持续进行更新:)

### 哪些人适合使用PyMUD
+ 比较熟悉Python语言，会使用Python写代码的 -> PyMUD是纯Python原生开发，不会有其他客户端对Python的支持能比得过PyMUD
+ 虽不太熟悉Python语言，但有想法想学习Python语言的 -> 正好使用PyMUD玩北侠写脚本的过程中学习Python语言
+ 觉得还有些功能现在所有客户端都没有的 -> 你有需求，我来增加，就是这么方便
+ 觉得也想自己整一个定制客户端玩玩的 -> PyMUD完全开源，且除ui框架外全部都是一行一行代码自己写的，可以直接参考PyMUD的设计

## 版本更新信息

### 0.22.3 (2026-01-18)

+ 问题修复: 删除了各代码文件中不需要的引用，经测试，Python 3.8 版可以正常运行。
+ 问题修复: 修复了getVariable方法中，如果有非字母字符时会导致获取变量值为None的情况。
+ 问题修复: 修复了#var对嵌套变量的支持中的BUG，原先如果使用数字作为dict的key时，会被识别为list然后返回None。
+ 功能优化: #mem diff现在是与首次启动时的内存进行对比，而不是与上一次执行时的内存进行对比。
+ 其他变更: #close的帮助中增加了对参数的描述，支持 -f 参数和 session_name 参数。之前只有改功能，帮助中未说明。
+ 其他变更: 修改了多处语法不规范、代码弃用替代的情况。

### 0.22.2 (2026-01-11)

+ 功能新增: 可以通过.cfg文件指定 "auto_chars" 来定义启动pymud时自动打开的会话。
+ 问题修复: 修复GMCPTrigger类型enabled属性不生效问题。 
+ 问题修复: 原本enabled的定时器，修复了在会话断开重连后不会生效的问题。
+ 问题修复: 修复添加/删除系统时钟回调时，可能会导致的异常问题。
+ 问题修复: 修复在增加系统时钟回调时，如果回调函数代码错误产生异常，会导致系统时钟停顿的问题。
+ 功能优化: 优化了SessionBuffer的实现方式，改为环形缓冲+缓存缓冲双缓冲形式，减少运行中内存分配和清除的次数。
+ 功能新增: #var增加了对嵌套变量的显示支持，可以支持list、dict等嵌套类型的变量，详细请查看论坛信息。
+ 功能新增: 增加了#mem/#memory命令以支持内存监控，增加了启动时的-m参数在启动时直接打开内存监控，详细请#help memory或者查看论坛信息。
+ 其他变更: F1快捷键指向的帮助网站修改为官方网站的文档页面 https://www.pymud.cn/doc/

### 0.22.1 (2025-09-01)

+ 问题修复: 修复脚本错误的异常提示问题。

### 0.22.0 (2025-08-23)

+ 问题修复: beautify 对齐恢复成以往的实现方式，即统一在右侧添加字符。
+ 问题修复: 修复了 #var 命令中，使用中文变量名时，= 显示不对齐的问题。
+ 问题修复: 修复了当使用多重继承创建脚本，同时继承 Command 和 IConfig 时，装饰器无法使用的问题。现在仅需一次 super() 调用即可解决。
+ 问题修复: 修复了使用unload/reload时，有时候不显示卸载成功的问题。现在可以正常的报出卸载中的错误了。
+ 问题修复: 现在可以正常的使用 remain_last_input 配置保留命令行输入了（感谢 @cantus 提供的代码）。
+ 功能新增: client 新增配置 split_ratio，用于设置分屏比例。默认值为0.5，即上下分屏比例为50%。另外，可以通过快捷键 Shift + ↑/↓ 来动态调整分屏比例 (感谢 @cantus 提供的代码)。
+ 功能新增: 现在上箭头在光标处于最右侧时，也是优先使用自动补完了。若无自动补完，则进行历史命令切换。
+ 功能新增: 按键ESC可以直接清除命令行中的全部内容（受限于终端对按键的处理，需要连续按三次ESC按键才能生效）。
+ 功能新增: 现在Tab按键也具有自动补完功能了。
+ 功能新增: 为IConfigBase接口新增了info, warning, error方法，以后继承 IConfig 的类型，可以直接 self.info 了。
+ 功能新增: 现在 @alias, @trigger, @timer, @gmcp, @exception 等装饰器可以直接装饰在async def的异步函数上了。同步的，所有继承自 BaseObject 对象的类型，包括 Trigger, Alias, Timer, GMCPTrigger 等， 其onSuccess, onFailure等回调可以直接赋值为异步函数。
+ 功能调整: 移除了顶部菜单栏最右侧阻挡事件响应的空白菜单。原因是有时焦点位于此空白菜单时，单击窗口焦点不能正常移动到命令栏，会造成误解。
+ 功能新增: 在 @exception 输出异常信息时，会定位标记了 @exception 并产生异常的函数及所在文件。
+ 功能新增: 为 Session 类型新增了一个 wait_triggers 方法，可以简化等待多个触发器的处理代码。
+ 弃用预告: 由于 @exception 装饰器可以直接对异步函数使用， @async_exception 装饰器将在下一版本移除。

### 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对