pymud 0.20.2__tar.gz → 0.20.2a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {pymud-0.20.2/src/pymud.egg-info → pymud-0.20.2a1}/PKG-INFO +24 -30
  2. {pymud-0.20.2 → pymud-0.20.2a1}/README.md +24 -30
  3. {pymud-0.20.2 → pymud-0.20.2a1}/pyproject.toml +1 -1
  4. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/extras.py +28 -35
  5. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/pymud.py +7 -24
  6. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/session.py +138 -71
  7. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/settings.py +5 -7
  8. {pymud-0.20.2 → pymud-0.20.2a1/src/pymud.egg-info}/PKG-INFO +24 -30
  9. {pymud-0.20.2 → pymud-0.20.2a1}/LICENSE.txt +0 -0
  10. {pymud-0.20.2 → pymud-0.20.2a1}/setup.cfg +0 -0
  11. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/__init__.py +0 -0
  12. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/__main__.py +0 -0
  13. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/dialogs.py +0 -0
  14. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/logger.py +0 -0
  15. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/main.py +0 -0
  16. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/modules.py +0 -0
  17. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/objects.py +0 -0
  18. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/pkuxkx.py +0 -0
  19. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud/protocol.py +0 -0
  20. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud.egg-info/SOURCES.txt +0 -0
  21. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud.egg-info/dependency_links.txt +0 -0
  22. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud.egg-info/entry_points.txt +0 -0
  23. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud.egg-info/requires.txt +0 -0
  24. {pymud-0.20.2 → pymud-0.20.2a1}/src/pymud.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pymud
3
- Version: 0.20.2
3
+ Version: 0.20.2a1
4
4
  Summary: a MUD Client written in Python
5
5
  Author-email: "newstart@pkuxkx" <crapex@hotmail.com>
6
6
  Maintainer-email: "newstart@pkuxkx" <crapex@hotmail.com>
@@ -737,23 +737,17 @@ Requires-Dist: prompt-toolkit
737
737
 
738
738
  ## 版本更新信息
739
739
 
740
- ### 0.20.2 (2024-11-26)
741
- + 功能调整: MTTS协商中,将256 Color明确写入协商回复。原先仅包含ANSI 和 TrueColor。推测武庙特殊颜色偶尔不正常与此有关(已测试无关)。
740
+ ## 0.20.2 (2024-11-18)
741
+ + 功能调整: MTTS协商中,将256 Color明确写入协商回复。原先仅包含ANSI 和 TrueColor
742
742
  + 功能调整: 修复了纯文本正则处理,目前理论上支持所有ANSI控制代码的处置,以正确响应纯文本触发器。
743
743
  + 功能调整: 修改了#var和#global的显示实现,提高了变量打印排列的整齐度和辨识度,以适应长值变量和复杂变量。
744
- + 问题修复: 修复了单行颜色代码跨行无法显示问题。现在星宿毒草可以正常辨认颜色了。
745
- + 功能调整: 调整了info/warning/error的显示处理,默认样式进行了修改。
746
- + 功能新增: 新增菜单选项:打开/关闭美化,以便于更好的在触发器时复制出正确的内容(以前计算可能不准确)。
747
- + 功能新增: 状态栏的分隔符可以通过本地设置取消了。在pymud.cfg的client中新增设置,将 status_divider 设置为 false 即可。
748
- + 功能调整: 在pymud.cfg的client中可以支持将buffer_lines设置为0了,表示不清除缓存。
749
- + 功能新增: 为状态栏显示函数增加了异常保护,再有status_maker出错的时候,状态栏会显示出错信息。
750
744
 
751
- ### 0.20.1 (2024-11-16)
745
+ ## 0.20.1 (2024-11-16)
752
746
  + 功能调整: 会话中触发器匹配实现进行部分调整,减少循环次数以提高响应速度
753
747
  + 功能调整: #test / #show 触发器测试功能调整,现在会对使能的和未使能的触发器均进行匹配测试。其中,#show 命令仅测试,而 #test 命令会导致触发器真正响应。
754
748
  + 功能新增: pymud对象新增了一个持续运行的1s的周期定时任务。该任务中会刷新页面显示。可以使用 session.application.addTimerTickCallback 和 session.application.removeTimerTickCallback 来注册和解除定时器回调。
755
749
 
756
- ### 0.20.0 (2024-08-25)
750
+ ## 0.20.0 (2024-08-25)
757
751
  + 功能调整: 将模块主入口函数从__main__.py中移动到main.py中,以使可以在当前目录下,可直接使用pymud,也可使用python -m pymud启动
758
752
  + 功能调整: 使用argsparser标准模块来配置命令行,可以使用 pymud -h 查看命令行具体参数及说明
759
753
  + 功能新增: 命令行参数增加指定启动目录的功能,参数为 -s, --startup_dir。即可以从任意目录通过指定脚本目录方式启动PyMUD了。
@@ -815,21 +809,21 @@ Requires-Dist: prompt-toolkit
815
809
  + 问题修复: 修复 #var 等命令中,若含有中文则等号位置不对齐的问题
816
810
  + 功能调整: 在 #tri 等命令中,当对象的 group 为空时,将不再显示 group 属性,减少无用信息
817
811
 
818
- ### 0.19.4 (2024-04-20)
812
+ ## 0.19.4 (2024-04-20)
819
813
  + 功能调整: info 现在 msg 恢复为可接受任何类型参数,不一定是 str
820
814
  + 功能调整: #var, #global 指令中,现在可以使用参数扩展了,例如 #var max_qi @qi
821
815
  + 功能调整: #var, #global 指令中,现在对字符串会先使用 eval 转换类型,转换失败时使用 str 类型。例如, #var myvar 1 时,myvar类型将为int
822
816
  + 功能调整: 变量替代时,会自动实现类型转化,当被替代变量值为非 str 类型时不会再报错
823
817
  + 问题修复: 修复之前从后向前选择时,无法复制的问题
824
818
 
825
- ### 0.19.3post2 (2024-04-05)
819
+ ## 0.19.3post2 (2024-04-05)
826
820
  + 问题修复: 一次发送多个命令时,发送顺序可能不正确的情况
827
821
  + 功能增加: 新增一个exec_async函数,是exec函数的异步形式。可以在其他会话中异步执行一段代码
828
822
  + 帮助完善: 帮助文档逻辑完善,已完成整个包的内置文档的编写和修改
829
823
  + 注: 由于我没弄太明白 readthedocs.io 网站对于读取github源代码的逻辑,目前只能通过新发布正式版本的形式来使 readthedocs.io 网站的文档中的类参考自动更新。
830
824
  + 问题修复: 修复退出程序时的小bug
831
825
 
832
- ### 0.19.2post2 (2024-03-24)
826
+ ## 0.19.2post2 (2024-03-24)
833
827
  + 错误修复:订正部分错别字、错误帮助、错别格式
834
828
  + 系统完善:完善帮助体系,按reST格式重写所有有关的docstring
835
829
  + 功能调整:session.exec_command / exec_command_async / exec 系列命令调整,现在可以在exec时带变量参数了。例如 session.exec("dazuo @dzpt"),直接调用 dzpt的变量值
@@ -843,14 +837,14 @@ Requires-Dist: prompt-toolkit
843
837
  + 帮助完善: 帮助文档逻辑完善
844
838
  + 实现调整: 改用官方示例的task清除方式,每个任务结束后清除
845
839
 
846
- ### 0.19.1 (2024-03-06)
840
+ ## 0.19.1 (2024-03-06)
847
841
  + 功能新增: 新增鼠标启用禁用功能,以适用于ssh远程情况下的复制功能。F2快捷键可以切换状态。当鼠标禁用时,底部状态栏右侧会显示“鼠标已禁用状态”
848
842
  + 功能新增: 新增快捷键F1会直接通过浏览器打开帮助网址 https://pymud.readthedocs.io/
849
843
  + 功能新增: 新增默认快捷键F3=#ig, F4=#cls, F11=#close, F12=#exit。此几个快捷键通过配置文件进行配置,可以自行定义或修改。F1、F2为写死的系统功能。
850
844
  + 功能调整: 将除#session之外的所有其他#命令实现统一到Session类中实现,这些命令均支持通过Session.exec_command运行
851
845
  + 功能调整: python -m pymud init时,创建的pymud.cfg文件增加了keys字典
852
846
 
853
- ### 0.19.0 (2024-03-01)
847
+ ## 0.19.0 (2024-03-01)
854
848
  + 实现调整: session.info/warning/error处理多行时,会给每一行加上同样颜色
855
849
  + 功能新增: 初次运行时,可以使用python -m pymud init来初始化环境,自动创建目录并在该目录中建立配置文件和样例脚本文件
856
850
  + 实现调整: 将缓冲清除行数的实现调整到SessionBuffer中,减少代码耦合并进一步降低内存占用
@@ -860,7 +854,7 @@ Requires-Dist: prompt-toolkit
860
854
  + 实现调整: 调整COPY-RAW模式复制,即使仅选中行中的部分内容,也自动识别整行(多行模式也是整个多行)
861
855
  + 功能新增: Settings中新增keys字典,用于定义快捷键。可定义快捷键参见prompt_toolkit中Keys的定义。其值为可在session.exec_command运行支持的所有内容。该字典内容可以被pymud.cfg所覆盖。
862
856
 
863
- ### 0.18.4post4 (2024-02-23)
857
+ ## 0.18.4post4 (2024-02-23)
864
858
  + 功能新增:新增Settings.client["buffer_lines"],表示保留的缓冲行数(默认5000)。当Session内容缓冲行数达到该值2倍时(10000行),将截取一半(5000行),后一半内容进行保留,前一半丢弃。此功能是为了减少长时挂机的内存消耗和响应时间。
865
859
  + 功能修复:解决在显示美化(Settings.client["beautify"])打开之后,复制部分文字不能正确判断起始终止的问题。
866
860
  + 功能调整:修改缓冲行数判断逻辑,加快客户端判断响应速度。
@@ -868,21 +862,21 @@ Requires-Dist: prompt-toolkit
868
862
  + 功能调整:将帮助窗口中的链接改到帮助网址: https://pymud.readthedocs.org
869
863
  + 问题修复:修复了随包提供的pkuxkx.py样例脚本中的几处错误
870
864
 
871
- ### 0.18.3 (2024-02-07)
865
+ ## 0.18.3 (2024-02-07)
872
866
  + 功能调整:原#unload时通过调用__del__来实现卸载的时间不可控,现将模块卸载改为调用unload函数。若需卸载时人工清除有关定时器、触发器等,请在Configuration类下新增unload函数(参数仅self),并在其中进行实现
873
867
  + 功能新增:新增会话Variable和全局Global的删除接口。可以通过session.delVariable(name)删除一个变量,可以通过session.delGlobal(name)来删除一个全局Global变量
874
868
 
875
- ### 0.18.2 (2024-02-06)
869
+ ## 0.18.2 (2024-02-06)
876
870
  + 问题修复:修改了定时器实现,以避免出现递归调用超限异常
877
871
  + 问题修复:修改了参数替代时的默认值,从None改为字符串"None",以避免替代时报None异常
878
872
 
879
- ### 0.18.1 (2024-02-05)
873
+ ## 0.18.1 (2024-02-05)
880
874
  + 问题修复:统一处置了task.cancel的参数和create_task的name属性,以适应更低版本的python环境(低至3.7)
881
875
  + 实现调整:为解决同步/异步执行问题,在CodeLine和CodeBlock的实现中,会通过调用命令来判断是否使用同步模式(默认为异步)。#gag、#replace为强制同步,#wa为强制异步。当同时存在时,同步失效,异步执行。
882
876
  + 实现调整:将%line、%raw的访问传递到触发器内部的执行中,避免同步异步问题。
883
877
  + 新增文档:将帮助文档添加到本项目,帮助文档自动同步到 pymud.readthedocs.org (文档内容暂未更新)
884
878
 
885
- ### 0.18.0 (2024-01-24)
879
+ ## 0.18.0 (2024-01-24)
886
880
  + 问题修复:修复了delTrigger/delAlias等等无法删除对象的问题
887
881
  + 功能调整:delTrigger等函数,修改为既可以接受Trigger对象本身,也可以接受其id。其他类似
888
882
  + 功能增加:增加了delTriggers(注意,带s)等函数,可以删除多个指定对象。可接受列表、元组等可迭代对象,并且其内容既可以为对象本身,也可以为id。
@@ -901,13 +895,13 @@ Requires-Dist: prompt-toolkit
901
895
  + 功能调整:从菜单里点击创建会话时,会自动以登录名为本会话创建id变量
902
896
  + 当前已知问题:由于同步/异步执行问题,在SimpleTrigger中,#gag和#replace的执行结果会很奇怪,可能会隐藏和替换掉非触发行。可行的办法为在onSuccess里,调用session.replace进行处理。
903
897
 
904
- ### 0.17.4 (2024-01-08)
898
+ ## 0.17.4 (2024-01-08)
905
899
  + 问题修复:修复了DotDict在dump时出现错误的问题
906
900
  + 问题修复:修改了reconnect的实现方式,修复了断开重连时报错的问题
907
901
  + 功能增加:为Session增加两个事件属性,分别为event_connected和event_disconnected,接受一个带有session参数的函数,在连接和连接断开时触发。
908
902
  + 功能调整:调整了时间显示格式,只显示到秒,不显示毫秒数。
909
903
 
910
- ### 0.17.3 (2024-01-02)
904
+ ## 0.17.3 (2024-01-02)
911
905
  + 问题修复:修复了原有的#repeat功能。命令行#repeat/#rep可以重复输入上一次命令(这个基本没用,主要是我在远程连接时,手机上没有方向键...)
912
906
  + 问题修复:修改定时器的实现方式,真正修复了定时器每reload后会新增一个的bug。
913
907
  + 功能增加:命令行使用#tri, #ali, #cmd, #ti时,除了接受on/off参数外,增加了del参数,可以删除对应的触发器、别名、命令、定时器。例如:#ti tm_test del 可以删除id为“tm_test”的定时器。
@@ -915,7 +909,7 @@ Requires-Dist: prompt-toolkit
915
909
  + 功能调整:调整了Timer和SimpleTimer在#timer时的显示格式。
916
910
  + 实现调整:调整了Session.clean实现中各对象清理的顺序,将任务清除移到了最后。
917
911
 
918
- ### 0.17.2post4 (2023-12-29)
912
+ ## 0.17.2post4 (2023-12-29)
919
913
  + 功能修改:会话菜单 "显示/隐藏命令" 和 "打开/关闭自动重连" 操作后,增加在当前会话中提示状态信息。
920
914
  + 功能修改:Timer实现进行修改,以确保一个定时器仅创建一个任务。
921
915
  + 功能调整:Timer对象在复位Session对象时,也同时复位。目的是确保reload时不重新创建定时器任务。
@@ -924,7 +918,7 @@ Requires-Dist: prompt-toolkit
924
918
  + 问题修复:修复会话特定脚本模块会被其他会话加载的bug。
925
919
  + 问题修复:修复定时器Timer中的bug。
926
920
 
927
- ### 0.17.1post1 (2023-12-27)
921
+ ## 0.17.1post1 (2023-12-27)
928
922
  本版对模块功能进行了整体调整,支持加载/卸载/重载/预加载多个模块,具体内容如下:
929
923
  + 当模块中存在名为Configuration类时,以主模块形式加载,即:自动创建该Configuration类的实例(与原脚本相同)
930
924
  + 当模块中不存在名为Configuration类时,以子模块形式加载,即:仅加载该模块,但不会创建Configuration的实例
@@ -965,7 +959,7 @@ Requires-Dist: prompt-toolkit
965
959
  + 功能修改:auto_reconnect设定目前对正常/异常断开均有效。若设置为True,当连接断开后15s后自动重连
966
960
  + 功能修改:会话菜单下增加“打开/关闭自动重连”子菜单,可以动态切换自动重连是否打开。
967
961
 
968
- ### 0.17.0 (2023-12-24)
962
+ ## 0.17.0 (2023-12-24)
969
963
  + 功能修改:调整修改GMCP数据的wildcards处理方式,恢复为eval,其余不变。(回滚0.16.2版更改)
970
964
  + 功能修改:将本地pymud.cfg文件的读取默认编码调整为utf8,以避免加载出现问题
971
965
  + 问题修复:sessions.py中,修复系统command与会话command重名的问题(这次才发现)
@@ -991,7 +985,7 @@ Requires-Dist: prompt-toolkit
991
985
  + 功能修改:所有匹配类对象的匹配模式patterns支持动态修改,涉及Alias,Trigger,Command。修改方式为直接对其patterns属性赋值。如tri.patterns = aNewPattern
992
986
  + 功能修改:连接/断开连接时刻都会在提示中增加时刻信息,而不论是否异常。
993
987
 
994
- ### 0.16.2 (2023-12-19)
988
+ ## 0.16.2 (2023-12-19)
995
989
  + 功能修改:归一化#命令和非#命令处理,使session.exec_command、exec_command_async、exec_command_after均可以处理#命令,例如session.exec_command("#save")。同时,也可以在命令行使用#all发送#命令,如"#all #save"此类
996
990
  + 功能修改:调整脚本加载与变量自动加载的顺序。当前为连接自动加载时,首先加载变量,然后再加载脚本。目的是使脚本的变化可以覆盖加载的变量内容,而不是反向覆盖。
997
991
  + 功能修改:会话变量保存和加载可以配置是否打开,默认为打开。见Settings.client["var_autosave] 和 Settings.client["var_autoload"]。同理,该配置可以被本地pymud.cfg所覆盖
@@ -1000,7 +994,7 @@ Requires-Dist: prompt-toolkit
1000
994
  + 功能修改:增加GMCP默认处理。当未使用GMCPTrigger对对应的GMCP消息进行处理时,默认使用[GMCP] name: value的形式输出GMCP收到的消息,以便于个人脚本调试。
1001
995
  + 功能修改:修改GMCP数据的处理方式从eval修改为json.load,其余不变。
1002
996
 
1003
- ### 0.16.1.post2 (2023-12-12)
997
+ ## 0.16.1.post2 (2023-12-12)
1004
998
  + 问题修复:修复__init__.py中的__all__变量为字符串
1005
999
  + 功能增加:可以加载自定义Settings。在执行python -m pymud时,会自动从当前目录读取pymud.cfg文件。使用json格式将配置信息写在该文件中即可。支持模块中settings.py里的sessions, client, server, styles, text字段内容。
1006
1000
  + 功能增加:增加全局变量集,可以使用session.setGlobal和session.getGlobal进行访问,以便于跨session通信。也可以使用#global在命令行访问
@@ -1021,5 +1015,5 @@ Requires-Dist: prompt-toolkit
1021
1015
  + 功能修改:CodeLine的执行运行处理修改为不删除中间的多余空白
1022
1016
  + 问题修复:修改github项目地址为原pymud地址
1023
1017
 
1024
- ### 0.15.8 (2023-12-05)
1025
- 首次发布到pip
1018
+ ## 0.15.8 (2023-12-05)
1019
+ 首次发布到pip,增加模块使用
@@ -31,23 +31,17 @@
31
31
 
32
32
  ## 版本更新信息
33
33
 
34
- ### 0.20.2 (2024-11-26)
35
- + 功能调整: MTTS协商中,将256 Color明确写入协商回复。原先仅包含ANSI 和 TrueColor。推测武庙特殊颜色偶尔不正常与此有关(已测试无关)。
34
+ ## 0.20.2 (2024-11-18)
35
+ + 功能调整: MTTS协商中,将256 Color明确写入协商回复。原先仅包含ANSI 和 TrueColor
36
36
  + 功能调整: 修复了纯文本正则处理,目前理论上支持所有ANSI控制代码的处置,以正确响应纯文本触发器。
37
37
  + 功能调整: 修改了#var和#global的显示实现,提高了变量打印排列的整齐度和辨识度,以适应长值变量和复杂变量。
38
- + 问题修复: 修复了单行颜色代码跨行无法显示问题。现在星宿毒草可以正常辨认颜色了。
39
- + 功能调整: 调整了info/warning/error的显示处理,默认样式进行了修改。
40
- + 功能新增: 新增菜单选项:打开/关闭美化,以便于更好的在触发器时复制出正确的内容(以前计算可能不准确)。
41
- + 功能新增: 状态栏的分隔符可以通过本地设置取消了。在pymud.cfg的client中新增设置,将 status_divider 设置为 false 即可。
42
- + 功能调整: 在pymud.cfg的client中可以支持将buffer_lines设置为0了,表示不清除缓存。
43
- + 功能新增: 为状态栏显示函数增加了异常保护,再有status_maker出错的时候,状态栏会显示出错信息。
44
-
45
- ### 0.20.1 (2024-11-16)
38
+
39
+ ## 0.20.1 (2024-11-16)
46
40
  + 功能调整: 会话中触发器匹配实现进行部分调整,减少循环次数以提高响应速度
47
41
  + 功能调整: #test / #show 触发器测试功能调整,现在会对使能的和未使能的触发器均进行匹配测试。其中,#show 命令仅测试,而 #test 命令会导致触发器真正响应。
48
42
  + 功能新增: pymud对象新增了一个持续运行的1s的周期定时任务。该任务中会刷新页面显示。可以使用 session.application.addTimerTickCallback 和 session.application.removeTimerTickCallback 来注册和解除定时器回调。
49
43
 
50
- ### 0.20.0 (2024-08-25)
44
+ ## 0.20.0 (2024-08-25)
51
45
  + 功能调整: 将模块主入口函数从__main__.py中移动到main.py中,以使可以在当前目录下,可直接使用pymud,也可使用python -m pymud启动
52
46
  + 功能调整: 使用argsparser标准模块来配置命令行,可以使用 pymud -h 查看命令行具体参数及说明
53
47
  + 功能新增: 命令行参数增加指定启动目录的功能,参数为 -s, --startup_dir。即可以从任意目录通过指定脚本目录方式启动PyMUD了。
@@ -109,21 +103,21 @@
109
103
  + 问题修复: 修复 #var 等命令中,若含有中文则等号位置不对齐的问题
110
104
  + 功能调整: 在 #tri 等命令中,当对象的 group 为空时,将不再显示 group 属性,减少无用信息
111
105
 
112
- ### 0.19.4 (2024-04-20)
106
+ ## 0.19.4 (2024-04-20)
113
107
  + 功能调整: info 现在 msg 恢复为可接受任何类型参数,不一定是 str
114
108
  + 功能调整: #var, #global 指令中,现在可以使用参数扩展了,例如 #var max_qi @qi
115
109
  + 功能调整: #var, #global 指令中,现在对字符串会先使用 eval 转换类型,转换失败时使用 str 类型。例如, #var myvar 1 时,myvar类型将为int
116
110
  + 功能调整: 变量替代时,会自动实现类型转化,当被替代变量值为非 str 类型时不会再报错
117
111
  + 问题修复: 修复之前从后向前选择时,无法复制的问题
118
112
 
119
- ### 0.19.3post2 (2024-04-05)
113
+ ## 0.19.3post2 (2024-04-05)
120
114
  + 问题修复: 一次发送多个命令时,发送顺序可能不正确的情况
121
115
  + 功能增加: 新增一个exec_async函数,是exec函数的异步形式。可以在其他会话中异步执行一段代码
122
116
  + 帮助完善: 帮助文档逻辑完善,已完成整个包的内置文档的编写和修改
123
117
  + 注: 由于我没弄太明白 readthedocs.io 网站对于读取github源代码的逻辑,目前只能通过新发布正式版本的形式来使 readthedocs.io 网站的文档中的类参考自动更新。
124
118
  + 问题修复: 修复退出程序时的小bug
125
119
 
126
- ### 0.19.2post2 (2024-03-24)
120
+ ## 0.19.2post2 (2024-03-24)
127
121
  + 错误修复:订正部分错别字、错误帮助、错别格式
128
122
  + 系统完善:完善帮助体系,按reST格式重写所有有关的docstring
129
123
  + 功能调整:session.exec_command / exec_command_async / exec 系列命令调整,现在可以在exec时带变量参数了。例如 session.exec("dazuo @dzpt"),直接调用 dzpt的变量值
@@ -137,14 +131,14 @@
137
131
  + 帮助完善: 帮助文档逻辑完善
138
132
  + 实现调整: 改用官方示例的task清除方式,每个任务结束后清除
139
133
 
140
- ### 0.19.1 (2024-03-06)
134
+ ## 0.19.1 (2024-03-06)
141
135
  + 功能新增: 新增鼠标启用禁用功能,以适用于ssh远程情况下的复制功能。F2快捷键可以切换状态。当鼠标禁用时,底部状态栏右侧会显示“鼠标已禁用状态”
142
136
  + 功能新增: 新增快捷键F1会直接通过浏览器打开帮助网址 https://pymud.readthedocs.io/
143
137
  + 功能新增: 新增默认快捷键F3=#ig, F4=#cls, F11=#close, F12=#exit。此几个快捷键通过配置文件进行配置,可以自行定义或修改。F1、F2为写死的系统功能。
144
138
  + 功能调整: 将除#session之外的所有其他#命令实现统一到Session类中实现,这些命令均支持通过Session.exec_command运行
145
139
  + 功能调整: python -m pymud init时,创建的pymud.cfg文件增加了keys字典
146
140
 
147
- ### 0.19.0 (2024-03-01)
141
+ ## 0.19.0 (2024-03-01)
148
142
  + 实现调整: session.info/warning/error处理多行时,会给每一行加上同样颜色
149
143
  + 功能新增: 初次运行时,可以使用python -m pymud init来初始化环境,自动创建目录并在该目录中建立配置文件和样例脚本文件
150
144
  + 实现调整: 将缓冲清除行数的实现调整到SessionBuffer中,减少代码耦合并进一步降低内存占用
@@ -154,7 +148,7 @@
154
148
  + 实现调整: 调整COPY-RAW模式复制,即使仅选中行中的部分内容,也自动识别整行(多行模式也是整个多行)
155
149
  + 功能新增: Settings中新增keys字典,用于定义快捷键。可定义快捷键参见prompt_toolkit中Keys的定义。其值为可在session.exec_command运行支持的所有内容。该字典内容可以被pymud.cfg所覆盖。
156
150
 
157
- ### 0.18.4post4 (2024-02-23)
151
+ ## 0.18.4post4 (2024-02-23)
158
152
  + 功能新增:新增Settings.client["buffer_lines"],表示保留的缓冲行数(默认5000)。当Session内容缓冲行数达到该值2倍时(10000行),将截取一半(5000行),后一半内容进行保留,前一半丢弃。此功能是为了减少长时挂机的内存消耗和响应时间。
159
153
  + 功能修复:解决在显示美化(Settings.client["beautify"])打开之后,复制部分文字不能正确判断起始终止的问题。
160
154
  + 功能调整:修改缓冲行数判断逻辑,加快客户端判断响应速度。
@@ -162,21 +156,21 @@
162
156
  + 功能调整:将帮助窗口中的链接改到帮助网址: https://pymud.readthedocs.org
163
157
  + 问题修复:修复了随包提供的pkuxkx.py样例脚本中的几处错误
164
158
 
165
- ### 0.18.3 (2024-02-07)
159
+ ## 0.18.3 (2024-02-07)
166
160
  + 功能调整:原#unload时通过调用__del__来实现卸载的时间不可控,现将模块卸载改为调用unload函数。若需卸载时人工清除有关定时器、触发器等,请在Configuration类下新增unload函数(参数仅self),并在其中进行实现
167
161
  + 功能新增:新增会话Variable和全局Global的删除接口。可以通过session.delVariable(name)删除一个变量,可以通过session.delGlobal(name)来删除一个全局Global变量
168
162
 
169
- ### 0.18.2 (2024-02-06)
163
+ ## 0.18.2 (2024-02-06)
170
164
  + 问题修复:修改了定时器实现,以避免出现递归调用超限异常
171
165
  + 问题修复:修改了参数替代时的默认值,从None改为字符串"None",以避免替代时报None异常
172
166
 
173
- ### 0.18.1 (2024-02-05)
167
+ ## 0.18.1 (2024-02-05)
174
168
  + 问题修复:统一处置了task.cancel的参数和create_task的name属性,以适应更低版本的python环境(低至3.7)
175
169
  + 实现调整:为解决同步/异步执行问题,在CodeLine和CodeBlock的实现中,会通过调用命令来判断是否使用同步模式(默认为异步)。#gag、#replace为强制同步,#wa为强制异步。当同时存在时,同步失效,异步执行。
176
170
  + 实现调整:将%line、%raw的访问传递到触发器内部的执行中,避免同步异步问题。
177
171
  + 新增文档:将帮助文档添加到本项目,帮助文档自动同步到 pymud.readthedocs.org (文档内容暂未更新)
178
172
 
179
- ### 0.18.0 (2024-01-24)
173
+ ## 0.18.0 (2024-01-24)
180
174
  + 问题修复:修复了delTrigger/delAlias等等无法删除对象的问题
181
175
  + 功能调整:delTrigger等函数,修改为既可以接受Trigger对象本身,也可以接受其id。其他类似
182
176
  + 功能增加:增加了delTriggers(注意,带s)等函数,可以删除多个指定对象。可接受列表、元组等可迭代对象,并且其内容既可以为对象本身,也可以为id。
@@ -195,13 +189,13 @@
195
189
  + 功能调整:从菜单里点击创建会话时,会自动以登录名为本会话创建id变量
196
190
  + 当前已知问题:由于同步/异步执行问题,在SimpleTrigger中,#gag和#replace的执行结果会很奇怪,可能会隐藏和替换掉非触发行。可行的办法为在onSuccess里,调用session.replace进行处理。
197
191
 
198
- ### 0.17.4 (2024-01-08)
192
+ ## 0.17.4 (2024-01-08)
199
193
  + 问题修复:修复了DotDict在dump时出现错误的问题
200
194
  + 问题修复:修改了reconnect的实现方式,修复了断开重连时报错的问题
201
195
  + 功能增加:为Session增加两个事件属性,分别为event_connected和event_disconnected,接受一个带有session参数的函数,在连接和连接断开时触发。
202
196
  + 功能调整:调整了时间显示格式,只显示到秒,不显示毫秒数。
203
197
 
204
- ### 0.17.3 (2024-01-02)
198
+ ## 0.17.3 (2024-01-02)
205
199
  + 问题修复:修复了原有的#repeat功能。命令行#repeat/#rep可以重复输入上一次命令(这个基本没用,主要是我在远程连接时,手机上没有方向键...)
206
200
  + 问题修复:修改定时器的实现方式,真正修复了定时器每reload后会新增一个的bug。
207
201
  + 功能增加:命令行使用#tri, #ali, #cmd, #ti时,除了接受on/off参数外,增加了del参数,可以删除对应的触发器、别名、命令、定时器。例如:#ti tm_test del 可以删除id为“tm_test”的定时器。
@@ -209,7 +203,7 @@
209
203
  + 功能调整:调整了Timer和SimpleTimer在#timer时的显示格式。
210
204
  + 实现调整:调整了Session.clean实现中各对象清理的顺序,将任务清除移到了最后。
211
205
 
212
- ### 0.17.2post4 (2023-12-29)
206
+ ## 0.17.2post4 (2023-12-29)
213
207
  + 功能修改:会话菜单 "显示/隐藏命令" 和 "打开/关闭自动重连" 操作后,增加在当前会话中提示状态信息。
214
208
  + 功能修改:Timer实现进行修改,以确保一个定时器仅创建一个任务。
215
209
  + 功能调整:Timer对象在复位Session对象时,也同时复位。目的是确保reload时不重新创建定时器任务。
@@ -218,7 +212,7 @@
218
212
  + 问题修复:修复会话特定脚本模块会被其他会话加载的bug。
219
213
  + 问题修复:修复定时器Timer中的bug。
220
214
 
221
- ### 0.17.1post1 (2023-12-27)
215
+ ## 0.17.1post1 (2023-12-27)
222
216
  本版对模块功能进行了整体调整,支持加载/卸载/重载/预加载多个模块,具体内容如下:
223
217
  + 当模块中存在名为Configuration类时,以主模块形式加载,即:自动创建该Configuration类的实例(与原脚本相同)
224
218
  + 当模块中不存在名为Configuration类时,以子模块形式加载,即:仅加载该模块,但不会创建Configuration的实例
@@ -259,7 +253,7 @@
259
253
  + 功能修改:auto_reconnect设定目前对正常/异常断开均有效。若设置为True,当连接断开后15s后自动重连
260
254
  + 功能修改:会话菜单下增加“打开/关闭自动重连”子菜单,可以动态切换自动重连是否打开。
261
255
 
262
- ### 0.17.0 (2023-12-24)
256
+ ## 0.17.0 (2023-12-24)
263
257
  + 功能修改:调整修改GMCP数据的wildcards处理方式,恢复为eval,其余不变。(回滚0.16.2版更改)
264
258
  + 功能修改:将本地pymud.cfg文件的读取默认编码调整为utf8,以避免加载出现问题
265
259
  + 问题修复:sessions.py中,修复系统command与会话command重名的问题(这次才发现)
@@ -285,7 +279,7 @@
285
279
  + 功能修改:所有匹配类对象的匹配模式patterns支持动态修改,涉及Alias,Trigger,Command。修改方式为直接对其patterns属性赋值。如tri.patterns = aNewPattern
286
280
  + 功能修改:连接/断开连接时刻都会在提示中增加时刻信息,而不论是否异常。
287
281
 
288
- ### 0.16.2 (2023-12-19)
282
+ ## 0.16.2 (2023-12-19)
289
283
  + 功能修改:归一化#命令和非#命令处理,使session.exec_command、exec_command_async、exec_command_after均可以处理#命令,例如session.exec_command("#save")。同时,也可以在命令行使用#all发送#命令,如"#all #save"此类
290
284
  + 功能修改:调整脚本加载与变量自动加载的顺序。当前为连接自动加载时,首先加载变量,然后再加载脚本。目的是使脚本的变化可以覆盖加载的变量内容,而不是反向覆盖。
291
285
  + 功能修改:会话变量保存和加载可以配置是否打开,默认为打开。见Settings.client["var_autosave] 和 Settings.client["var_autoload"]。同理,该配置可以被本地pymud.cfg所覆盖
@@ -294,7 +288,7 @@
294
288
  + 功能修改:增加GMCP默认处理。当未使用GMCPTrigger对对应的GMCP消息进行处理时,默认使用[GMCP] name: value的形式输出GMCP收到的消息,以便于个人脚本调试。
295
289
  + 功能修改:修改GMCP数据的处理方式从eval修改为json.load,其余不变。
296
290
 
297
- ### 0.16.1.post2 (2023-12-12)
291
+ ## 0.16.1.post2 (2023-12-12)
298
292
  + 问题修复:修复__init__.py中的__all__变量为字符串
299
293
  + 功能增加:可以加载自定义Settings。在执行python -m pymud时,会自动从当前目录读取pymud.cfg文件。使用json格式将配置信息写在该文件中即可。支持模块中settings.py里的sessions, client, server, styles, text字段内容。
300
294
  + 功能增加:增加全局变量集,可以使用session.setGlobal和session.getGlobal进行访问,以便于跨session通信。也可以使用#global在命令行访问
@@ -315,5 +309,5 @@
315
309
  + 功能修改:CodeLine的执行运行处理修改为不删除中间的多余空白
316
310
  + 问题修复:修改github项目地址为原pymud地址
317
311
 
318
- ### 0.15.8 (2023-12-05)
319
- 首次发布到pip
312
+ ## 0.15.8 (2023-12-05)
313
+ 首次发布到pip,增加模块使用
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
 
3
3
  name = "pymud" # Required
4
- version = "0.20.2" # Required
4
+ version = "0.20.2a1" # Required
5
5
  description = "a MUD Client written in Python" # Optional
6
6
  readme = "README.md" # Optional
7
7
  requires-python = ">=3.7"
@@ -40,8 +40,6 @@ from prompt_toolkit.layout.controls import (
40
40
  )
41
41
  from prompt_toolkit.layout.processors import (
42
42
  Processor,
43
- TransformationInput,
44
- Transformation
45
43
  )
46
44
  from prompt_toolkit.lexers import Lexer
47
45
  from prompt_toolkit.mouse_events import MouseEvent, MouseEventType
@@ -66,11 +64,10 @@ class MudFormatProcessor(Processor):
66
64
  self.FULL_BLOCKS = set("▂▃▅▆▇▄█")
67
65
  self.SINGLE_LINES = set("┌└├┬┼┴╭╰─")
68
66
  self.DOUBLE_LINES = set("╔╚╠╦╪╩═")
69
- self.ALL_COLOR_REGX = re.compile(r"(?:\[[\d;]+m)+")
70
- self.AVAI_COLOR_REGX = re.compile(r"(?:\[[\d;]+m)+(?!$)")
67
+ self.START_COLOR_REGX = re.compile(r"^\[[\d;]+m")
68
+ self.COLOR_REGX = re.compile(r"\[[\d;]+m")
71
69
  self._color_start = ""
72
70
  self._color_correction = False
73
- self._color_line_index = 0
74
71
 
75
72
  def width_correction(self, line: str) -> str:
76
73
  new_str = []
@@ -94,52 +91,48 @@ class MudFormatProcessor(Processor):
94
91
  def tab_correction(self, line: str):
95
92
  return line.replace("\t", " " * Settings.client["tabstop"])
96
93
 
94
+ def color_correction(self, line: str):
95
+ # 注:发现processer处理并非自上而下逐行处理的,因此不能使用这种颜色校正方式。
96
+ if self._color_correction:
97
+ other = self.COLOR_REGX.findall(line)
98
+
99
+ line = f"{self._color_start}{line}"
100
+ logging.debug(f"已校正增加颜色标志 {self._color_start}: {line}")
101
+
102
+ if other:
103
+ self._color_correction = False
104
+ self._color_start = ""
105
+ logging.debug(f"颜色校正结束: {line}")
106
+ else:
107
+ color = self.START_COLOR_REGX.findall(line)
108
+ if color:
109
+ other = self.COLOR_REGX.findall(line)
110
+ if len(other) == 1:
111
+ self._color_correction = True
112
+ self._color_start = color[0]
113
+ logging.debug(f"获取到一个颜色开头 {color[0]}: {line}")
114
+
115
+ return line
116
+
97
117
  def line_correction(self, line: str):
98
118
  # 处理\r符号(^M)
99
119
  line = self.return_correction(line)
100
120
  # 处理Tab(\r)符号(^I)
101
121
  line = self.tab_correction(line)
102
-
122
+ # 处理颜色跨行问题。发现processer处理并非自上而下逐行处理的,因此不能使用这种颜色校正方式。
123
+ # line = self.color_correction(line)
103
124
  # 美化(解决中文英文在Console中不对齐的问题)
104
125
  if Settings.client["beautify"]:
105
126
  line = self.width_correction(line)
106
127
 
107
128
  return line
108
129
 
109
- def apply_transformation(self, transformation_input: TransformationInput):
130
+ def apply_transformation(self, transformation_input):
110
131
  # 准备(先还原为str)
111
132
  line = fragment_list_to_text(transformation_input.fragments)
112
-
113
- # 颜色校正
114
- thislinecolors = len(self.AVAI_COLOR_REGX.findall(line))
115
- if thislinecolors == 0:
116
- lineno = transformation_input.lineno - 1
117
- while lineno > 0:
118
- lastline = transformation_input.document.lines[lineno]
119
- allcolors = self.ALL_COLOR_REGX.findall(lastline)
120
-
121
- if len(allcolors) == 0:
122
- lineno = lineno - 1
123
-
124
- elif len(allcolors) == 1:
125
- colors = self.AVAI_COLOR_REGX.findall(lastline)
126
-
127
- if len(colors) == 1:
128
- line = f"{colors[0]}{line}"
129
- break
130
-
131
- else:
132
- break
133
-
134
- else:
135
- break
136
-
137
- # 其他校正
138
133
  line = self.line_correction(line)
139
-
140
134
  # 处理ANSI标记(生成FormmatedText)
141
135
  fragments = to_formatted_text(ANSI(line))
142
-
143
136
  return Transformation(fragments)
144
137
 
145
138
  class SessionBuffer(Buffer):
@@ -229,8 +229,7 @@ class PyMudApp:
229
229
  content = HSplit(
230
230
  [
231
231
  self.console,
232
- ConditionalContainer(content = Window(char = "—", height = 1), filter = Settings.client["status_divider"]),
233
- #Window(char = "—", height = 1),
232
+ Window(char = "—", height = 1),
234
233
  Window(content = self.statusView, height = Settings.client["status_height"]),
235
234
  ]
236
235
  ),
@@ -242,7 +241,7 @@ class PyMudApp:
242
241
  content = VSplit(
243
242
  [
244
243
  self.console,
245
- ConditionalContainer(content = Window(char = "|", width = 1), filter = Settings.client["status_divider"]),
244
+ Window(char = "|", width = 1),
246
245
  Window(content = self.statusView, width = Settings.client["status_width"]),
247
246
  ]
248
247
  ),
@@ -312,14 +311,12 @@ class PyMudApp:
312
311
  MenuItem(Settings.text["closesession"], handler = self.act_close_session),
313
312
  MenuItem(Settings.text["autoreconnect"], handler = self.act_autoreconnect),
314
313
  MenuItem("-", disabled=True),
315
- MenuItem(Settings.text["nosplit"], handler = self.act_nosplit),
316
314
  MenuItem(Settings.text["echoinput"], handler = self.act_echoinput),
317
- MenuItem(Settings.text["beautify"], handler = self.act_beautify),
315
+ MenuItem(Settings.text["nosplit"], handler = self.act_nosplit),
318
316
  MenuItem(Settings.text["copy"], handler = self.act_copy),
319
317
  MenuItem(Settings.text["copyraw"], handler = self.act_copyraw),
320
318
  MenuItem(Settings.text["clearsession"], handler = self.act_clearsession),
321
319
  MenuItem("-", disabled=True),
322
-
323
320
  MenuItem(Settings.text["reloadconfig"], handler = self.act_reload),
324
321
  ]
325
322
  ),
@@ -739,13 +736,6 @@ class PyMudApp:
739
736
  new_sess = list(self.sessions.keys())[0]
740
737
  self.activate_session(new_sess)
741
738
 
742
- def act_beautify(self):
743
- "菜单: 打开/关闭美化显示"
744
- val = not Settings.client["beautify"]
745
- Settings.client["beautify"] = val
746
- if self.current_session:
747
- self.current_session.info(f"显示美化已{'打开' if val else '关闭'}!")
748
-
749
739
  def act_echoinput(self):
750
740
  "菜单: 显示/隐藏输入指令"
751
741
  val = not Settings.client["echo_input"]
@@ -892,10 +882,7 @@ class PyMudApp:
892
882
 
893
883
  def get_statusbar_right_text(self):
894
884
  "状态栏右侧内容"
895
- con_str, mouse_support, tri_status, beautify = "", "", "", ""
896
- if not Settings.client["beautify"]:
897
- beautify = "美化已关闭 "
898
-
885
+ con_str, mouse_support, tri_status = "", "", ""
899
886
  if not self._mouse_support:
900
887
  mouse_support = "鼠标已禁用 "
901
888
 
@@ -925,17 +912,13 @@ class PyMudApp:
925
912
  else:
926
913
  con_str = "已连接:{:.0f}秒".format(sec)
927
914
 
928
- return "{}{}{}{} {} {} ".format(beautify, mouse_support, tri_status, con_str, Settings.__appname__, Settings.__version__)
915
+ return "{}{}{} {} {} ".format(mouse_support, tri_status, con_str, Settings.__appname__, Settings.__version__)
929
916
 
930
917
  def get_statuswindow_text(self):
931
918
  "状态窗口: status_maker 的内容"
932
919
  text = ""
933
-
934
- try:
935
- if self.current_session:
936
- text = self.current_session.get_status()
937
- except Exception as e:
938
- text = f"{e}"
920
+ if self.current_session:
921
+ text = self.current_session.get_status()
939
922
 
940
923
  return text
941
924
 
@@ -1949,6 +1949,7 @@ class Session:
1949
1949
  if remain:
1950
1950
  strlist.append(str[startindex:])
1951
1951
 
1952
+ #self.info(f"原: {str}, 分隔为 {printable_length}, 结果为 {strlist}")
1952
1953
  return strlist
1953
1954
 
1954
1955
  def buildDisplayLines(self, vars: DotDict, title: str):
@@ -1961,7 +1962,7 @@ class Session:
1961
1962
  vars_complex = {}
1962
1963
 
1963
1964
  for k, v in vars.items():
1964
- if k in ("%line", "%raw", "%copy"):
1965
+ if k in ("%line", "%raw"):
1965
1966
  continue
1966
1967
 
1967
1968
  if dataclasses.is_dataclass(v) or (isinstance(v, Iterable) and not isinstance(v, str)):
@@ -1996,7 +1997,7 @@ class Session:
1996
1997
  name = key.rjust(KEY_WIDTH + VAR_WIDTH)
1997
1998
 
1998
1999
  value_dis = vars_simple[key].__repr__()
1999
- var_display = "{0} = {1}".format(name, value_dis)
2000
+ var_display = "{} = {}".format(name, value_dis)
2000
2001
 
2001
2002
  if (cursor + wcswidth(var_display) > totalWidth) or (var_count >= vars_per_line):
2002
2003
  display_lines.append(line)
@@ -2034,31 +2035,17 @@ class Session:
2034
2035
  if isinstance(value, dict):
2035
2036
  max_len = self.getMaxLength(value.keys())
2036
2037
  line += '{'
2037
- display_lines.append(line)
2038
- line = " " * (left_margin + KEY_WIDTH + 4)
2039
2038
  for k, v in value.items():
2040
- subvalue_dis = "{},".format(v.__repr__())
2041
- allow_len_subvalue = allow_len - max_len - 4
2042
- if wcswidth(subvalue_dis) > allow_len_subvalue:
2043
- subvalue_lines = self.splitByPrintableWidth(subvalue_dis, allow_len_subvalue)
2044
- line += "{0}: ".format(k.ljust(max_len))
2045
- for subline in subvalue_lines:
2046
- line += subline
2047
- display_lines.append(line)
2048
- line = " " * (left_margin + KEY_WIDTH + 4 + max_len + 2)
2049
-
2050
- line = " " * (left_margin + KEY_WIDTH + 4)
2051
- else:
2052
- val_line = "{0}: {1}".format(k.ljust(max_len), subvalue_dis)
2053
- line += val_line
2054
- display_lines.append(line)
2055
- line = " " * (left_margin + KEY_WIDTH + 4)
2039
+ val_line = "{0}: {1},".format(k.ljust(max_len), v)
2040
+ line += val_line
2041
+ display_lines.append(line)
2042
+ line = " " * (left_margin + KEY_WIDTH + 4)
2056
2043
  line = line[:-1] + '}'
2057
2044
  display_lines.append(line)
2058
2045
  elif isinstance(value, list):
2059
2046
  line += '['
2060
2047
  for v in value:
2061
- val_line = "{0},".format(v.__repr__())
2048
+ val_line = "{0},".format(v)
2062
2049
  line += val_line
2063
2050
  display_lines.append(line)
2064
2051
  line = " " * (left_margin + KEY_WIDTH + 4)
@@ -2103,6 +2090,61 @@ class Session:
2103
2090
  #args = code.code[2:]
2104
2091
 
2105
2092
  if len(args) == 0:
2093
+ # vars = self._variables
2094
+ # vars_simple = {}
2095
+ # vars_complex = {}
2096
+ # for k, v in vars.items():
2097
+ # # 不显示line, raw两个系统变量
2098
+ # if k in ("%line", "%raw"):
2099
+ # continue
2100
+
2101
+ # if isinstance(v, Iterable) and not isinstance(v, str):
2102
+ # vars_complex[k] = v
2103
+ # else:
2104
+ # vars_simple[k] = v
2105
+
2106
+ # width = self.application.get_width() - 2 # 保留2个字符,防止 > 导致换行
2107
+
2108
+ # title = f" VARIABLE LIST IN SESSION {self.name} "
2109
+ # left = (width - len(title)) // 2
2110
+ # right = width - len(title) - left
2111
+ # self.writetobuffer("="*left + title + "="*right, newline = True)
2112
+
2113
+ # # print vars in simple, 每个变量占40格,一行可以多个变量
2114
+ # # 这里可以考虑调整一下,默认40, 但如果一个变量值太长,则选择占两个位置
2115
+ # var_count = len(vars_simple)
2116
+ # var_per_line = (width - 2) // 40
2117
+ # lines = math.ceil(var_count / var_per_line)
2118
+ # left_space = (width - var_per_line * 40) // 2
2119
+ # if left_space > 4: left_space = 4
2120
+
2121
+ # var_keys = sorted(vars_simple.keys())
2122
+
2123
+ # for idx in range(0, lines):
2124
+ # start = idx * var_per_line
2125
+ # end = (idx + 1) * var_per_line
2126
+ # if end > var_count: end = var_count
2127
+ # self.writetobuffer(" " * left_space)
2128
+ # line_vars = var_keys[start:end]
2129
+ # for var in line_vars:
2130
+ # repr = vars_simple[var].__repr__()
2131
+ # vwidth = 22 - (wcswidth(repr) - len(repr))
2132
+ # self.writetobuffer("{0} = {1}".format(var.rjust(20), repr.ljust(vwidth)))
2133
+ # #self.writetobuffer("{0:>18} = {1:<19}".format(var, vars_simple[var].__repr__()))
2134
+
2135
+ # self.writetobuffer("", newline = True)
2136
+
2137
+ # # print vars in complex, 每个变量占1行
2138
+ # var_keys = sorted(vars_complex.keys())
2139
+ # for key in var_keys:
2140
+ # self.writetobuffer(" " * left_space)
2141
+ # self.writetobuffer("{0:>20} = {1}".format(key, vars_complex[key].__repr__()), newline = True)
2142
+
2143
+ # self.writetobuffer("="*width, newline = True)
2144
+ # row, col = self.buffer.document.translate_index_to_position(len(self.buffer.text))
2145
+ # if col:
2146
+ # self.writetobuffer("", newline = True)
2147
+
2106
2148
  lines = self.buildDisplayLines(self._variables, f" VARIABLE LIST IN SESSION {self.name} ")
2107
2149
 
2108
2150
  for line in lines:
@@ -2111,12 +2153,7 @@ class Session:
2111
2153
  elif len(args) == 1:
2112
2154
  if args[0] in self._variables.keys():
2113
2155
  obj = self.getVariable(args[0])
2114
- var_dict = {args[0] : obj}
2115
- lines = self.buildDisplayLines(var_dict, f" VARIABLE [{args[0]}] IN SESSION {self.name} ")
2116
-
2117
- for line in lines:
2118
- self.writetobuffer(line, newline = True)
2119
-
2156
+ self.info(f"变量{args[0]}值为:{obj}")
2120
2157
  else:
2121
2158
  self.warning(f"当前session中不存在名称为 {args[0]} 的变量")
2122
2159
 
@@ -2128,7 +2165,6 @@ class Session:
2128
2165
  val = args[1]
2129
2166
 
2130
2167
  self.setVariable(args[0], val)
2131
- self.info(f"成功设置变量 {args[0]} 值为 {val}")
2132
2168
 
2133
2169
  def handle_global(self, code: CodeLine = None, *args, **kwargs):
2134
2170
  '''
@@ -2154,6 +2190,51 @@ class Session:
2154
2190
  #args = code.code[2:]
2155
2191
 
2156
2192
  if len(args) == 0:
2193
+ # vars = self.application.globals
2194
+ # vars_simple = {}
2195
+ # vars_complex = {}
2196
+ # for k, v in vars.items():
2197
+ # if isinstance(v, Iterable) and not isinstance(v, str):
2198
+ # vars_complex[k] = v
2199
+ # else:
2200
+ # vars_simple[k] = v
2201
+
2202
+ # width = self.application.get_width() - 2 # 保留2个字符,防止 > 导致换行
2203
+
2204
+ # title = f" GLOBAL VARIABLES LIST "
2205
+ # left = (width - len(title)) // 2
2206
+ # right = width - len(title) - left
2207
+ # self.writetobuffer("="*left + title + "="*right, newline = True)
2208
+
2209
+ # # print vars in simple, 每个变量占40格,一行可以多个变量
2210
+ # var_count = len(vars_simple)
2211
+ # var_per_line = (width - 2) // 40
2212
+ # lines = math.ceil(var_count / var_per_line)
2213
+ # left_space = (width - var_per_line * 40) // 2
2214
+ # if left_space > 4: left_space = 4
2215
+
2216
+ # var_keys = sorted(vars_simple.keys())
2217
+
2218
+ # for idx in range(0, lines):
2219
+ # start = idx * var_per_line
2220
+ # end = (idx + 1) * var_per_line
2221
+ # if end > var_count: end = var_count
2222
+ # self.writetobuffer(" " * left_space)
2223
+ # line_vars = var_keys[start:end]
2224
+ # for var in line_vars:
2225
+ # repr = vars_simple[var].__repr__()
2226
+ # vwidth = 22 - (wcswidth(repr) - len(repr))
2227
+ # self.writetobuffer("{0} = {1}".format(var.rjust(20), repr.ljust(vwidth)))
2228
+
2229
+ # self.writetobuffer("", newline = True)
2230
+
2231
+ # # print vars in complex, 每个变量占1行
2232
+ # for k, v in vars_complex.items():
2233
+ # self.writetobuffer(" " * left_space)
2234
+ # self.writetobuffer("{0:>20} = {1}".format(k, v.__repr__()), newline = True)
2235
+
2236
+ # self.writetobuffer("="*width, newline = True)
2237
+
2157
2238
  lines = self.buildDisplayLines(self.application.globals, f" GLOBAL VARIABLES LIST ")
2158
2239
 
2159
2240
  for line in lines:
@@ -2162,13 +2243,7 @@ class Session:
2162
2243
  elif len(args) == 1:
2163
2244
  var = args[0]
2164
2245
  if var in self.application.globals.keys():
2165
- # self.info("{0:>20} = {1:<22}".format(var, self.application.get_globals(var).__repr__()), "全局变量")
2166
-
2167
- var_dict = {var : self.application.get_globals(var)}
2168
- lines = self.buildDisplayLines(var_dict, f" GLOBAL VARIABLE [{var}] ")
2169
-
2170
- for line in lines:
2171
- self.writetobuffer(line, newline = True)
2246
+ self.info("{0:>20} = {1:<22}".format(var, self.application.get_globals(var).__repr__()), "全局变量")
2172
2247
  else:
2173
2248
  self.info("全局空间不存在名称为 {} 的变量".format(var), "全局变量")
2174
2249
 
@@ -2179,7 +2254,6 @@ class Session:
2179
2254
  except:
2180
2255
  val = args[1]
2181
2256
  self.application.set_globals(args[0], val)
2182
- self.info(f"成功设置全局变量 {args[0]} 值为 {val}")
2183
2257
 
2184
2258
  def _handle_objs(self, name: str, objs: dict, *args):
2185
2259
  if len(args) == 0:
@@ -3010,18 +3084,14 @@ class Session:
3010
3084
  triggered_enabled += 1
3011
3085
  if not block:
3012
3086
  triggered += 1
3013
- # info_enabled.append(f" {Settings.INFO_STYLE}{tri.__detailed__()} 正常触发。{Settings.CLR_STYLE}")
3014
- # info_enabled.append(f" {Settings.INFO_STYLE}捕获:{state.wildcards}{Settings.CLR_STYLE}")
3015
- info_enabled.append(f" {tri.__detailed__()} 正常触发。")
3016
- info_enabled.append(f" 捕获:{state.wildcards}")
3087
+ info_enabled.append(f" {Settings.INFO_STYLE}{tri.__detailed__()} 正常触发。{Settings.CLR_STYLE}")
3088
+ info_enabled.append(f" {Settings.INFO_STYLE}捕获:{state.wildcards}{Settings.CLR_STYLE}")
3017
3089
 
3018
3090
  if not tri.keepEval: # 非持续匹配的trigger,匹配成功后停止检测后续Trigger
3019
- info_enabled.append(f" {Settings.WARN_STYLE}该触发器未开启keepEval, 会阻止后续触发器。{Settings.CLR_STYLE}")
3020
- #info_enabled.append(f" 该触发器未开启keepEval, 会阻止后续触发器。")
3091
+ info_enabled.append(f" {Settings.WARN_STYLE}该触发器未开启keepEval, 会阻止后续触发器。{Settings.CLR_STYLE}")
3021
3092
  block = True
3022
3093
  else:
3023
- info_enabled.append(f" {Settings.WARN_STYLE}{tri.__detailed__()} 可以触发,但由于优先级与keepEval设定,触发器不会触发。{Settings.CLR_STYLE}")
3024
- #info_enabled.append(f" {tri.__detailed__()} 可以触发,但由于优先级与keepEval设定,触发器不会触发。")
3094
+ info_enabled.append(f" {Settings.WARN_STYLE}{tri.__detailed__()} 可以触发,但由于优先级与keepEval设定,触发器不会触发。{Settings.CLR_STYLE}")
3025
3095
 
3026
3096
 
3027
3097
  for tri in tris_disabled:
@@ -3032,38 +3102,35 @@ class Session:
3032
3102
 
3033
3103
  if state.result == Trigger.SUCCESS:
3034
3104
  triggered_disabled += 1
3035
- # info_disabled.append(f" {Settings.INFO_STYLE}{tri.__detailed__()} 可以匹配触发。{Settings.CLR_STYLE}")
3036
- info_disabled.append(f" {tri.__detailed__()} 可以匹配触发。")
3105
+ info_disabled.append(f" {Settings.INFO_STYLE}{tri.__detailed__()} 可以匹配触发。{Settings.CLR_STYLE}")
3037
3106
 
3038
3107
  if triggered_enabled + triggered_disabled == 0:
3039
3108
  info_all.append("")
3040
3109
 
3041
3110
  if triggered_enabled == 0:
3042
- info_enabled.insert(0, f"{Settings.INFO_STYLE} 使能的触发器中,没有可以触发的。")
3111
+ info_enabled.insert(0, f"使能的触发器中,没有可以触发的。")
3043
3112
  elif triggered < triggered_enabled:
3044
- info_enabled.insert(0, f"{Settings.INFO_STYLE} 使能的触发器中,共有 {triggered_enabled} 个可以触发,实际触发 {triggered} 个,另有 {triggered_enabled - triggered} 个由于 keepEval 原因实际不会触发。")
3113
+ info_enabled.insert(0, f"使能的触发器中,共有 {triggered_enabled} 个可以触发,实际触发 {triggered} 个,另有 {triggered_enabled - triggered} 个由于 keepEval 原因实际不会触发。")
3045
3114
  else:
3046
- info_enabled.insert(0, f"{Settings.INFO_STYLE} 使能的触发器中,共有 {triggered_enabled} 个全部可以被正常触发。")
3115
+ info_enabled.insert(0, f"使能的触发器中,共有 {triggered_enabled} 个全部可以被正常触发。")
3047
3116
 
3048
3117
  if triggered_disabled > 0:
3049
- info_disabled.insert(0, f"{Settings.INFO_STYLE} 未使能的触发器中,共有 {triggered_disabled} 个可以匹配。")
3118
+ info_disabled.insert(0, f"未使能的触发器中,共有 {triggered_disabled} 个可以匹配。")
3050
3119
  else:
3051
- info_disabled.insert(0, f"{Settings.INFO_STYLE} 未使能触发器,没有可以匹配的。")
3052
-
3053
- info_all.append("")
3120
+ info_disabled.insert(0, f"未使能触发器,没有可以匹配的。")
3121
+
3054
3122
  if triggered_enabled + triggered_disabled == 0:
3055
- #info_all.append(f"PYMUD 触发器测试: {'响应模式' if docallback else '测试模式'}")
3123
+ info_all.append(f"PYMUD 触发器测试: {'响应模式' if docallback else '测试模式'}")
3056
3124
  info_all.append(f" 测试内容: {line}")
3057
3125
  info_all.append(f" 测试结果: 没有可以匹配的触发器。")
3058
3126
  else:
3059
- #info_all.append(f"PYMUD 触发器测试: {'响应模式' if docallback else '测试模式'}")
3127
+ info_all.append(f"PYMUD 触发器测试: {'响应模式' if docallback else '测试模式'}")
3060
3128
  info_all.append(f" 测试内容: {line}")
3061
3129
  info_all.append(f" 测试结果: 有{triggered}个触发器可以被正常触发,一共有{triggered_enabled + triggered_disabled}个满足匹配触发要求。")
3062
3130
  info_all.extend(info_enabled)
3063
3131
  info_all.extend(info_disabled)
3064
-
3065
- title = f"触发器测试 - {'响应模式' if docallback else '测试模式'}"
3066
- self.info("\n".join(info_all), title)
3132
+
3133
+ self.info("\n".join(info_all), "PYMUD 触发器测试")
3067
3134
  #self.info("PYMUD 触发器测试 完毕")
3068
3135
 
3069
3136
  def handle_plugins(self, code: CodeLine = None, *args, **kwargs):
@@ -3187,7 +3254,7 @@ class Session:
3187
3254
  '''
3188
3255
 
3189
3256
  new_text, new_code = code.expand(self, *args, **kwargs)
3190
- self.warning(new_text[9:])
3257
+ self.warning(new_text[6:])
3191
3258
 
3192
3259
  def handle_error(self, code: CodeLine = None, *args, **kwargs):
3193
3260
  '''
@@ -3203,23 +3270,23 @@ class Session:
3203
3270
  '''
3204
3271
 
3205
3272
  new_text, new_code = code.expand(self, *args, **kwargs)
3206
- self.error(new_text[7:])
3273
+ self.error(new_text[6:])
3207
3274
 
3208
- def info2(self, msg, title = "消息", style = Settings.INFO_STYLE):
3275
+ def info2(self, msg, title = "PYMUD INFO", style = Settings.INFO_STYLE):
3209
3276
  msg = f"{msg}"
3210
3277
 
3211
- # if Settings.client["newline"] in msg:
3212
- # new_lines = list()
3213
- # msg_lines = msg.split(Settings.client["newline"])
3214
- # for line in msg_lines:
3215
- # new_lines.append("{}{}".format(style, line))
3278
+ if Settings.client["newline"] in msg:
3279
+ new_lines = list()
3280
+ msg_lines = msg.split(Settings.client["newline"])
3281
+ for line in msg_lines:
3282
+ new_lines.append("{}{}".format(style, line))
3216
3283
 
3217
- # msg = Settings.client["newline"].join(new_lines)
3284
+ msg = Settings.client["newline"].join(new_lines)
3218
3285
 
3219
3286
  # 将颜色跨行显示移动到了MudFormatProcessor中,此处无需再处理(不行,还得恢复)
3220
- self.writetobuffer("{}{}{}{}".format(style, title, msg, Settings.CLR_STYLE), newline = True)
3287
+ self.writetobuffer("{}[{}] {}{}".format(style, title, msg, Settings.CLR_STYLE), newline = True)
3221
3288
 
3222
- def info(self, msg, title = "提示", style = Settings.INFO_STYLE):
3289
+ def info(self, msg, title = "PYMUD INFO", style = Settings.INFO_STYLE):
3223
3290
  """
3224
3291
  使用默认的INFO_STYLE(绿色)输出信息,并自动换行。信息格式类似 [title] msg
3225
3292
 
@@ -3229,7 +3296,7 @@ class Session:
3229
3296
  """
3230
3297
  self.info2(msg, title, style)
3231
3298
 
3232
- def warning(self, msg, title = "警告", style = Settings.WARN_STYLE):
3299
+ def warning(self, msg, title = "PYMUD WARNING", style = Settings.WARN_STYLE):
3233
3300
  """
3234
3301
  使用默认的WARN_STYLE(黄色)输出信息,并自动换行。信息格式类似 [title] msg
3235
3302
 
@@ -3239,7 +3306,7 @@ class Session:
3239
3306
  """
3240
3307
  self.info2(msg, title, style)
3241
3308
 
3242
- def error(self, msg, title = "错误", style = Settings.ERR_STYLE):
3309
+ def error(self, msg, title = "PYMUD ERROR", style = Settings.ERR_STYLE):
3243
3310
  """
3244
3311
  使用默认的ERR_STYLE(红色)输出信息,并自动换行。信息格式类似 [title] msg
3245
3312
 
@@ -11,9 +11,9 @@ class Settings:
11
11
  "APP 名称, 默认PYMUD"
12
12
  __appdesc__ = "a MUD client written in Python"
13
13
  "APP 简要描述"
14
- __version__ = "0.20.2"
14
+ __version__ = "0.20.1"
15
15
  "APP 当前版本"
16
- __release__ = "2024-11-25"
16
+ __release__ = "2024-11-16"
17
17
  "APP 当前版本发布日期"
18
18
  __author__ = "本牛(newstart)@北侠"
19
19
  "APP 作者"
@@ -69,7 +69,6 @@ class Settings:
69
69
  "echo_input" : False,
70
70
  "beautify" : True, # 专门为解决控制台下PKUXKX字符画对不齐的问题
71
71
 
72
- "status_divider" : True, # 是否显示状态栏的分隔线
73
72
  "status_display" : 1, # 状态窗口显示情况设置,0-不显示,1-显示在下方,2-显示在右侧
74
73
  "status_width" : 30, # 右侧状态栏的宽度
75
74
  "status_height" : 6, # 下侧状态栏的高度
@@ -85,7 +84,6 @@ class Settings:
85
84
  "session" : "会话",
86
85
  "connect" : "连接/重新连接",
87
86
  "disconnect" : "断开连接",
88
- "beautify" : "打开/关闭美化显示",
89
87
  "echoinput" : "显示/隐藏输入指令",
90
88
  "nosplit" : "取消分屏",
91
89
  "copy" : "复制(纯文本)",
@@ -176,8 +174,8 @@ class Settings:
176
174
  "value" : "fg:green",
177
175
  }
178
176
 
179
- INFO_STYLE = "\x1b[48;5;22m\x1b[38;5;252m" #"\x1b[38;2;0;128;255m"
180
- WARN_STYLE = "\x1b[48;5;220m\x1b[38;5;238m"
181
- ERR_STYLE = "\x1b[48;5;160m\x1b[38;5;252m"
177
+ INFO_STYLE = "\x1b[32m" #"\x1b[38;2;0;128;255m"
178
+ WARN_STYLE = "\x1b[33m"
179
+ ERR_STYLE = "\x1b[31m"
182
180
  CLR_STYLE = "\x1b[0m"
183
181
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pymud
3
- Version: 0.20.2
3
+ Version: 0.20.2a1
4
4
  Summary: a MUD Client written in Python
5
5
  Author-email: "newstart@pkuxkx" <crapex@hotmail.com>
6
6
  Maintainer-email: "newstart@pkuxkx" <crapex@hotmail.com>
@@ -737,23 +737,17 @@ Requires-Dist: prompt-toolkit
737
737
 
738
738
  ## 版本更新信息
739
739
 
740
- ### 0.20.2 (2024-11-26)
741
- + 功能调整: MTTS协商中,将256 Color明确写入协商回复。原先仅包含ANSI 和 TrueColor。推测武庙特殊颜色偶尔不正常与此有关(已测试无关)。
740
+ ## 0.20.2 (2024-11-18)
741
+ + 功能调整: MTTS协商中,将256 Color明确写入协商回复。原先仅包含ANSI 和 TrueColor
742
742
  + 功能调整: 修复了纯文本正则处理,目前理论上支持所有ANSI控制代码的处置,以正确响应纯文本触发器。
743
743
  + 功能调整: 修改了#var和#global的显示实现,提高了变量打印排列的整齐度和辨识度,以适应长值变量和复杂变量。
744
- + 问题修复: 修复了单行颜色代码跨行无法显示问题。现在星宿毒草可以正常辨认颜色了。
745
- + 功能调整: 调整了info/warning/error的显示处理,默认样式进行了修改。
746
- + 功能新增: 新增菜单选项:打开/关闭美化,以便于更好的在触发器时复制出正确的内容(以前计算可能不准确)。
747
- + 功能新增: 状态栏的分隔符可以通过本地设置取消了。在pymud.cfg的client中新增设置,将 status_divider 设置为 false 即可。
748
- + 功能调整: 在pymud.cfg的client中可以支持将buffer_lines设置为0了,表示不清除缓存。
749
- + 功能新增: 为状态栏显示函数增加了异常保护,再有status_maker出错的时候,状态栏会显示出错信息。
750
744
 
751
- ### 0.20.1 (2024-11-16)
745
+ ## 0.20.1 (2024-11-16)
752
746
  + 功能调整: 会话中触发器匹配实现进行部分调整,减少循环次数以提高响应速度
753
747
  + 功能调整: #test / #show 触发器测试功能调整,现在会对使能的和未使能的触发器均进行匹配测试。其中,#show 命令仅测试,而 #test 命令会导致触发器真正响应。
754
748
  + 功能新增: pymud对象新增了一个持续运行的1s的周期定时任务。该任务中会刷新页面显示。可以使用 session.application.addTimerTickCallback 和 session.application.removeTimerTickCallback 来注册和解除定时器回调。
755
749
 
756
- ### 0.20.0 (2024-08-25)
750
+ ## 0.20.0 (2024-08-25)
757
751
  + 功能调整: 将模块主入口函数从__main__.py中移动到main.py中,以使可以在当前目录下,可直接使用pymud,也可使用python -m pymud启动
758
752
  + 功能调整: 使用argsparser标准模块来配置命令行,可以使用 pymud -h 查看命令行具体参数及说明
759
753
  + 功能新增: 命令行参数增加指定启动目录的功能,参数为 -s, --startup_dir。即可以从任意目录通过指定脚本目录方式启动PyMUD了。
@@ -815,21 +809,21 @@ Requires-Dist: prompt-toolkit
815
809
  + 问题修复: 修复 #var 等命令中,若含有中文则等号位置不对齐的问题
816
810
  + 功能调整: 在 #tri 等命令中,当对象的 group 为空时,将不再显示 group 属性,减少无用信息
817
811
 
818
- ### 0.19.4 (2024-04-20)
812
+ ## 0.19.4 (2024-04-20)
819
813
  + 功能调整: info 现在 msg 恢复为可接受任何类型参数,不一定是 str
820
814
  + 功能调整: #var, #global 指令中,现在可以使用参数扩展了,例如 #var max_qi @qi
821
815
  + 功能调整: #var, #global 指令中,现在对字符串会先使用 eval 转换类型,转换失败时使用 str 类型。例如, #var myvar 1 时,myvar类型将为int
822
816
  + 功能调整: 变量替代时,会自动实现类型转化,当被替代变量值为非 str 类型时不会再报错
823
817
  + 问题修复: 修复之前从后向前选择时,无法复制的问题
824
818
 
825
- ### 0.19.3post2 (2024-04-05)
819
+ ## 0.19.3post2 (2024-04-05)
826
820
  + 问题修复: 一次发送多个命令时,发送顺序可能不正确的情况
827
821
  + 功能增加: 新增一个exec_async函数,是exec函数的异步形式。可以在其他会话中异步执行一段代码
828
822
  + 帮助完善: 帮助文档逻辑完善,已完成整个包的内置文档的编写和修改
829
823
  + 注: 由于我没弄太明白 readthedocs.io 网站对于读取github源代码的逻辑,目前只能通过新发布正式版本的形式来使 readthedocs.io 网站的文档中的类参考自动更新。
830
824
  + 问题修复: 修复退出程序时的小bug
831
825
 
832
- ### 0.19.2post2 (2024-03-24)
826
+ ## 0.19.2post2 (2024-03-24)
833
827
  + 错误修复:订正部分错别字、错误帮助、错别格式
834
828
  + 系统完善:完善帮助体系,按reST格式重写所有有关的docstring
835
829
  + 功能调整:session.exec_command / exec_command_async / exec 系列命令调整,现在可以在exec时带变量参数了。例如 session.exec("dazuo @dzpt"),直接调用 dzpt的变量值
@@ -843,14 +837,14 @@ Requires-Dist: prompt-toolkit
843
837
  + 帮助完善: 帮助文档逻辑完善
844
838
  + 实现调整: 改用官方示例的task清除方式,每个任务结束后清除
845
839
 
846
- ### 0.19.1 (2024-03-06)
840
+ ## 0.19.1 (2024-03-06)
847
841
  + 功能新增: 新增鼠标启用禁用功能,以适用于ssh远程情况下的复制功能。F2快捷键可以切换状态。当鼠标禁用时,底部状态栏右侧会显示“鼠标已禁用状态”
848
842
  + 功能新增: 新增快捷键F1会直接通过浏览器打开帮助网址 https://pymud.readthedocs.io/
849
843
  + 功能新增: 新增默认快捷键F3=#ig, F4=#cls, F11=#close, F12=#exit。此几个快捷键通过配置文件进行配置,可以自行定义或修改。F1、F2为写死的系统功能。
850
844
  + 功能调整: 将除#session之外的所有其他#命令实现统一到Session类中实现,这些命令均支持通过Session.exec_command运行
851
845
  + 功能调整: python -m pymud init时,创建的pymud.cfg文件增加了keys字典
852
846
 
853
- ### 0.19.0 (2024-03-01)
847
+ ## 0.19.0 (2024-03-01)
854
848
  + 实现调整: session.info/warning/error处理多行时,会给每一行加上同样颜色
855
849
  + 功能新增: 初次运行时,可以使用python -m pymud init来初始化环境,自动创建目录并在该目录中建立配置文件和样例脚本文件
856
850
  + 实现调整: 将缓冲清除行数的实现调整到SessionBuffer中,减少代码耦合并进一步降低内存占用
@@ -860,7 +854,7 @@ Requires-Dist: prompt-toolkit
860
854
  + 实现调整: 调整COPY-RAW模式复制,即使仅选中行中的部分内容,也自动识别整行(多行模式也是整个多行)
861
855
  + 功能新增: Settings中新增keys字典,用于定义快捷键。可定义快捷键参见prompt_toolkit中Keys的定义。其值为可在session.exec_command运行支持的所有内容。该字典内容可以被pymud.cfg所覆盖。
862
856
 
863
- ### 0.18.4post4 (2024-02-23)
857
+ ## 0.18.4post4 (2024-02-23)
864
858
  + 功能新增:新增Settings.client["buffer_lines"],表示保留的缓冲行数(默认5000)。当Session内容缓冲行数达到该值2倍时(10000行),将截取一半(5000行),后一半内容进行保留,前一半丢弃。此功能是为了减少长时挂机的内存消耗和响应时间。
865
859
  + 功能修复:解决在显示美化(Settings.client["beautify"])打开之后,复制部分文字不能正确判断起始终止的问题。
866
860
  + 功能调整:修改缓冲行数判断逻辑,加快客户端判断响应速度。
@@ -868,21 +862,21 @@ Requires-Dist: prompt-toolkit
868
862
  + 功能调整:将帮助窗口中的链接改到帮助网址: https://pymud.readthedocs.org
869
863
  + 问题修复:修复了随包提供的pkuxkx.py样例脚本中的几处错误
870
864
 
871
- ### 0.18.3 (2024-02-07)
865
+ ## 0.18.3 (2024-02-07)
872
866
  + 功能调整:原#unload时通过调用__del__来实现卸载的时间不可控,现将模块卸载改为调用unload函数。若需卸载时人工清除有关定时器、触发器等,请在Configuration类下新增unload函数(参数仅self),并在其中进行实现
873
867
  + 功能新增:新增会话Variable和全局Global的删除接口。可以通过session.delVariable(name)删除一个变量,可以通过session.delGlobal(name)来删除一个全局Global变量
874
868
 
875
- ### 0.18.2 (2024-02-06)
869
+ ## 0.18.2 (2024-02-06)
876
870
  + 问题修复:修改了定时器实现,以避免出现递归调用超限异常
877
871
  + 问题修复:修改了参数替代时的默认值,从None改为字符串"None",以避免替代时报None异常
878
872
 
879
- ### 0.18.1 (2024-02-05)
873
+ ## 0.18.1 (2024-02-05)
880
874
  + 问题修复:统一处置了task.cancel的参数和create_task的name属性,以适应更低版本的python环境(低至3.7)
881
875
  + 实现调整:为解决同步/异步执行问题,在CodeLine和CodeBlock的实现中,会通过调用命令来判断是否使用同步模式(默认为异步)。#gag、#replace为强制同步,#wa为强制异步。当同时存在时,同步失效,异步执行。
882
876
  + 实现调整:将%line、%raw的访问传递到触发器内部的执行中,避免同步异步问题。
883
877
  + 新增文档:将帮助文档添加到本项目,帮助文档自动同步到 pymud.readthedocs.org (文档内容暂未更新)
884
878
 
885
- ### 0.18.0 (2024-01-24)
879
+ ## 0.18.0 (2024-01-24)
886
880
  + 问题修复:修复了delTrigger/delAlias等等无法删除对象的问题
887
881
  + 功能调整:delTrigger等函数,修改为既可以接受Trigger对象本身,也可以接受其id。其他类似
888
882
  + 功能增加:增加了delTriggers(注意,带s)等函数,可以删除多个指定对象。可接受列表、元组等可迭代对象,并且其内容既可以为对象本身,也可以为id。
@@ -901,13 +895,13 @@ Requires-Dist: prompt-toolkit
901
895
  + 功能调整:从菜单里点击创建会话时,会自动以登录名为本会话创建id变量
902
896
  + 当前已知问题:由于同步/异步执行问题,在SimpleTrigger中,#gag和#replace的执行结果会很奇怪,可能会隐藏和替换掉非触发行。可行的办法为在onSuccess里,调用session.replace进行处理。
903
897
 
904
- ### 0.17.4 (2024-01-08)
898
+ ## 0.17.4 (2024-01-08)
905
899
  + 问题修复:修复了DotDict在dump时出现错误的问题
906
900
  + 问题修复:修改了reconnect的实现方式,修复了断开重连时报错的问题
907
901
  + 功能增加:为Session增加两个事件属性,分别为event_connected和event_disconnected,接受一个带有session参数的函数,在连接和连接断开时触发。
908
902
  + 功能调整:调整了时间显示格式,只显示到秒,不显示毫秒数。
909
903
 
910
- ### 0.17.3 (2024-01-02)
904
+ ## 0.17.3 (2024-01-02)
911
905
  + 问题修复:修复了原有的#repeat功能。命令行#repeat/#rep可以重复输入上一次命令(这个基本没用,主要是我在远程连接时,手机上没有方向键...)
912
906
  + 问题修复:修改定时器的实现方式,真正修复了定时器每reload后会新增一个的bug。
913
907
  + 功能增加:命令行使用#tri, #ali, #cmd, #ti时,除了接受on/off参数外,增加了del参数,可以删除对应的触发器、别名、命令、定时器。例如:#ti tm_test del 可以删除id为“tm_test”的定时器。
@@ -915,7 +909,7 @@ Requires-Dist: prompt-toolkit
915
909
  + 功能调整:调整了Timer和SimpleTimer在#timer时的显示格式。
916
910
  + 实现调整:调整了Session.clean实现中各对象清理的顺序,将任务清除移到了最后。
917
911
 
918
- ### 0.17.2post4 (2023-12-29)
912
+ ## 0.17.2post4 (2023-12-29)
919
913
  + 功能修改:会话菜单 "显示/隐藏命令" 和 "打开/关闭自动重连" 操作后,增加在当前会话中提示状态信息。
920
914
  + 功能修改:Timer实现进行修改,以确保一个定时器仅创建一个任务。
921
915
  + 功能调整:Timer对象在复位Session对象时,也同时复位。目的是确保reload时不重新创建定时器任务。
@@ -924,7 +918,7 @@ Requires-Dist: prompt-toolkit
924
918
  + 问题修复:修复会话特定脚本模块会被其他会话加载的bug。
925
919
  + 问题修复:修复定时器Timer中的bug。
926
920
 
927
- ### 0.17.1post1 (2023-12-27)
921
+ ## 0.17.1post1 (2023-12-27)
928
922
  本版对模块功能进行了整体调整,支持加载/卸载/重载/预加载多个模块,具体内容如下:
929
923
  + 当模块中存在名为Configuration类时,以主模块形式加载,即:自动创建该Configuration类的实例(与原脚本相同)
930
924
  + 当模块中不存在名为Configuration类时,以子模块形式加载,即:仅加载该模块,但不会创建Configuration的实例
@@ -965,7 +959,7 @@ Requires-Dist: prompt-toolkit
965
959
  + 功能修改:auto_reconnect设定目前对正常/异常断开均有效。若设置为True,当连接断开后15s后自动重连
966
960
  + 功能修改:会话菜单下增加“打开/关闭自动重连”子菜单,可以动态切换自动重连是否打开。
967
961
 
968
- ### 0.17.0 (2023-12-24)
962
+ ## 0.17.0 (2023-12-24)
969
963
  + 功能修改:调整修改GMCP数据的wildcards处理方式,恢复为eval,其余不变。(回滚0.16.2版更改)
970
964
  + 功能修改:将本地pymud.cfg文件的读取默认编码调整为utf8,以避免加载出现问题
971
965
  + 问题修复:sessions.py中,修复系统command与会话command重名的问题(这次才发现)
@@ -991,7 +985,7 @@ Requires-Dist: prompt-toolkit
991
985
  + 功能修改:所有匹配类对象的匹配模式patterns支持动态修改,涉及Alias,Trigger,Command。修改方式为直接对其patterns属性赋值。如tri.patterns = aNewPattern
992
986
  + 功能修改:连接/断开连接时刻都会在提示中增加时刻信息,而不论是否异常。
993
987
 
994
- ### 0.16.2 (2023-12-19)
988
+ ## 0.16.2 (2023-12-19)
995
989
  + 功能修改:归一化#命令和非#命令处理,使session.exec_command、exec_command_async、exec_command_after均可以处理#命令,例如session.exec_command("#save")。同时,也可以在命令行使用#all发送#命令,如"#all #save"此类
996
990
  + 功能修改:调整脚本加载与变量自动加载的顺序。当前为连接自动加载时,首先加载变量,然后再加载脚本。目的是使脚本的变化可以覆盖加载的变量内容,而不是反向覆盖。
997
991
  + 功能修改:会话变量保存和加载可以配置是否打开,默认为打开。见Settings.client["var_autosave] 和 Settings.client["var_autoload"]。同理,该配置可以被本地pymud.cfg所覆盖
@@ -1000,7 +994,7 @@ Requires-Dist: prompt-toolkit
1000
994
  + 功能修改:增加GMCP默认处理。当未使用GMCPTrigger对对应的GMCP消息进行处理时,默认使用[GMCP] name: value的形式输出GMCP收到的消息,以便于个人脚本调试。
1001
995
  + 功能修改:修改GMCP数据的处理方式从eval修改为json.load,其余不变。
1002
996
 
1003
- ### 0.16.1.post2 (2023-12-12)
997
+ ## 0.16.1.post2 (2023-12-12)
1004
998
  + 问题修复:修复__init__.py中的__all__变量为字符串
1005
999
  + 功能增加:可以加载自定义Settings。在执行python -m pymud时,会自动从当前目录读取pymud.cfg文件。使用json格式将配置信息写在该文件中即可。支持模块中settings.py里的sessions, client, server, styles, text字段内容。
1006
1000
  + 功能增加:增加全局变量集,可以使用session.setGlobal和session.getGlobal进行访问,以便于跨session通信。也可以使用#global在命令行访问
@@ -1021,5 +1015,5 @@ Requires-Dist: prompt-toolkit
1021
1015
  + 功能修改:CodeLine的执行运行处理修改为不删除中间的多余空白
1022
1016
  + 问题修复:修改github项目地址为原pymud地址
1023
1017
 
1024
- ### 0.15.8 (2023-12-05)
1025
- 首次发布到pip
1018
+ ## 0.15.8 (2023-12-05)
1019
+ 首次发布到pip,增加模块使用
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes