pymud 0.20.0a1__py3-none-any.whl → 0.20.0a2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pymud/__main__.py CHANGED
@@ -1,4 +1,5 @@
1
- import sys, os, json, platform, shutil, logging, argparse
1
+ import os, json, platform, shutil, logging, argparse
2
+ from pathlib import Path
2
3
  from .pymud import main
3
4
  from .settings import Settings
4
5
 
@@ -43,34 +44,26 @@ CFG_TEMPLATE = {
43
44
  def init_pymud_env(args):
44
45
  print(f"欢迎使用PyMUD, 版本{Settings.__version__}. 使用PyMUD时, 建议建立一个新目录(任意位置),并将自己的脚本以及配置文件放到该目录下.")
45
46
  print("即将开始为首次运行初始化环境...")
46
- system = platform.system().lower()
47
-
47
+
48
48
  dir = args.dir
49
49
  if dir:
50
- print(f"你已经指定了创建脚本的目录为 {args.dir}, 将不再检测操作系统")
51
-
50
+ print(f"你已经指定了创建脚本的目录为 {args.dir}")
51
+ dir = Path(dir)
52
52
  else:
53
- if system == "windows":
54
- dir = input("检测到当前系统为Windows, 请指定游戏脚本的目录(若目录不存在会自动创建),直接回车表示使用默认值[d:\pkuxkx]:")
55
- if not dir: dir = "d:\\pkuxkx"
56
-
57
- elif system == "linux":
58
- dir = input("检测到当前系统为Linux, 请指定游戏脚本的目录(若目录不存在会自动创建),直接回车表示使用默认值[~/pkuxkx]:")
59
- if not dir: dir = "~/pkuxkx"
60
-
61
- elif system == "darwin":
62
- dir = input("检测到当前系统为MacOS, 请指定游戏脚本的目录(若目录不存在会自动创建),直接回车表示使用默认值[~/pkuxkx]:")
63
- if not dir: dir = "~/pkuxkx"
64
-
65
- else:
66
- print(f"当前系统不是Windows、Linux或MacOS, 无法通过init来进行配置, 请手动配置. 默认配置即将推出")
67
-
68
-
69
- if not os.path.exists(dir):
70
- print(f'检测到给定目录 {dir} 不存在,正在创建目录...', end = "")
71
- os.mkdir(dir)
72
- os.chdir(dir)
73
- print(f'完成!')
53
+ dir = Path.home().joinpath('pkuxkx')
54
+
55
+ system = platform.system().lower()
56
+ dir_enter = input(f"检测到当前系统为 {system}, 请指定游戏脚本的目录(若目录不存在会自动创建),直接回车表示使用默认值 [{dir}]:")
57
+ if dir_enter:
58
+ dir = Path(dir_enter)
59
+
60
+ if dir.exists() and dir.is_dir():
61
+ print(f'检测到给定目录 {dir} 已存在,切换至此目录...')
62
+ else:
63
+ print(f'检测到给定目录 {dir} 不存在,正在创建并切换至目录...')
64
+ dir.mkdir()
65
+
66
+ os.chdir(dir)
74
67
 
75
68
  if os.path.exists('pymud.cfg'):
76
69
  print(f'检测到脚本目录下已存在pymud.cfg文件,将直接使用此文件进入PyMUD...')
pymud/pymud.py CHANGED
@@ -663,6 +663,7 @@ class PyMudApp:
663
663
  plugin.onSessionDestroy(self.current_session)
664
664
 
665
665
  name = self.current_session.name
666
+ self.current_session.closeLoggers()
666
667
  self.current_session.clean()
667
668
  self.current_session = None
668
669
  self.consoleView.buffer = SessionBuffer()
pymud/session.py CHANGED
@@ -116,9 +116,6 @@ class Session:
116
116
  self._events["connected"] = None
117
117
  self._events["disconnected"] = None
118
118
 
119
- self._loggers = dict()
120
- self.log = self.getLogger(name)
121
-
122
119
  self._auto_script = kwargs.get("scripts", None)
123
120
 
124
121
  self._cmds_handler = dict() # 支持的命令的处理函数字典
@@ -144,6 +141,9 @@ class Session:
144
141
 
145
142
  self.initialize()
146
143
 
144
+ self._loggers = dict()
145
+ self.log = self.getLogger(name)
146
+
147
147
  self.host = host
148
148
  self.port = port
149
149
  self.encoding = encoding or self.encoding
@@ -176,6 +176,10 @@ class Session:
176
176
  if Settings.client["auto_connect"]:
177
177
  self.open()
178
178
 
179
+ def __del__(self):
180
+ self.clean()
181
+ self.closeLoggers()
182
+
179
183
  def initialize(self):
180
184
  "初始化Session有关对象。 **无需脚本调用。**"
181
185
  self._line_buffer = bytearray()
@@ -376,6 +380,15 @@ class Session:
376
380
 
377
381
  return logger
378
382
 
383
+ def closeLoggers(self):
384
+ "移除本会话所有相关Logger"
385
+ for name in self._loggers.keys():
386
+ if isinstance(self._loggers[name], Logger):
387
+ self._loggers[name].enabled = False
388
+
389
+ if name in self.application.loggers.keys():
390
+ self.application.loggers.pop(name)
391
+
379
392
  @property
380
393
  def modules(self) -> OrderedDict:
381
394
  """
@@ -758,6 +771,27 @@ class Session:
758
771
  cmd = line + self.newline
759
772
  self.write(cmd.encode(self.encoding, Settings.server["encoding_errors"]))
760
773
 
774
+ async def waitfor(self, line: str, awaitable, wait_time = 0.05) -> None:
775
+ """
776
+ 调用writline向服务器中写入一行后,等待到可等待对象再返回。
777
+
778
+ :param line: 使用writeline写入的行
779
+ :param awaitable: 等待的可等待对象
780
+ :param wait_time: 写入行前等待的延时,单位为s。默认0.05
781
+
782
+ 由于异步的消息循环机制,如果在写入命令之后再创建可等待对象,则有可能服务器响应在可等待对象的创建之前
783
+ 此时使用await就无法等待到可等待对象的响应,会导致任务出错。
784
+ 一种解决方式是先创建可等待对象,然后写入命令,然后再等待可等待对象,但这种情况下需要写入三行代码,书写麻烦
785
+ 因此该函数是用于简化此类使用时的写法。
786
+
787
+ 示例:
788
+ await session.waitfor('a_cmd', self.create_task(a_tri.triggered()))
789
+ done, pending = await session.waitfor('a_cmd', asyncio.wait([self.create_task(a_tri.triggered()), self.create_task(b_tri.triggered())], return_when = 'FIRST_COMPLETED'))
790
+ """
791
+ await asyncio.sleep(wait_time)
792
+ self.writeline(line)
793
+ return await awaitable
794
+
761
795
  def exec(self, cmd: str, name = None, *args, **kwargs):
762
796
  """
763
797
  在名称为name的会话中使用exec_command执行MUD命令。当不指定name时,在当前会话中执行。
pymud/settings.py CHANGED
@@ -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.0"
14
+ __version__ = "0.20.0a2"
15
15
  "APP 当前版本"
16
- __release__ = "2024-08-14"
16
+ __release__ = "2024-08-19"
17
17
  "APP 当前版本发布日期"
18
18
  __author__ = "本牛(newstart)@北侠"
19
19
  "APP 作者"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pymud
3
- Version: 0.20.0a1
3
+ Version: 0.20.0a2
4
4
  Summary: a MUD Client written in Python
5
5
  Author-email: "newstart@pkuxkx" <crapex@crapex.cc>
6
6
  Maintainer-email: "newstart@pkuxkx" <crapex@crapex.cc>
@@ -684,7 +684,7 @@ Project-URL: Bug Reports, https://github.com/crapex/pymud/issues
684
684
  Project-URL: Source, https://github.com/crapex/pymud/
685
685
  Project-URL: document, https://pymud.readthedocs.io/
686
686
  Keywords: MUD,multi-user dungeon,client
687
- Classifier: Development Status :: 5 - Production/Stable
687
+ Classifier: Development Status :: 3 - Alpha
688
688
  Classifier: Intended Audience :: End Users/Desktop
689
689
  Classifier: Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)
690
690
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
@@ -971,8 +971,14 @@ Requires-Dist: prompt-toolkit
971
971
  + 功能调整: 变量替代时,会自动实现类型转化,当被替代变量值为非 str 类型时不会再报错
972
972
  + 问题修复: 修复之前从后向前选择时,无法复制的问题
973
973
 
974
- ### 0.19.5 (2024-08-XX)
974
+ ### 0.20.0a1 (2024-08-14)
975
+ + 功能调整: 使用argsparser标准模块来配置命令行,可以使用 python -m pymud -h 查看命令行具体参数及说明
975
976
  + 功能调整: 恢复在__init__.py中增加PyMudApp的导出,可以恢复使用from pymud import PyMudApp了
976
977
  + 功能调整: 在没有session的时候,也可以执行#exit命令
977
978
  + 功能调整: 模块加载和重新加载前,会自动调用模块的unload方法(若有)
978
- + 功能新增: 增加log功能(待设计)
979
+ + 功能新增: 增加log功能,详见 #log 命令介绍、类参考中的 Logger 类,以及 Session 类的 handle_log 方法
980
+
981
+ ### 0.20.0a2 (2024-08-19)
982
+ + 问题修复: 关闭会话时未关闭相关记录器,导致后续会话无法启动
983
+ + 问题修复: MacOS下 python -m pymud init 创建目录报错的问题。同时,将所有系统上的默认目录均使用 ~/pkuxkx (影响windows)
984
+ + 功能新增: Session类新增waitfor函数,用于执行一段代码后立即等待某个触发器的情况,简化原三行代码写法
@@ -0,0 +1,17 @@
1
+ pymud/__init__.py,sha256=Ep6JrWv2wwlLV5nI7F6BOA7Ei6yVgnxvhIRwFGPr2Oc,501
2
+ pymud/__main__.py,sha256=vE5mi5WFyiUPGLfq-1sMrEpHoD2Vxiy5XXenmoXFA1c,6230
3
+ pymud/dialogs.py,sha256=D0ZtCeoBchF5eYzXumkOi3p-maCQZu4v9-wJgxQ790o,6500
4
+ pymud/extras.py,sha256=QwWwLavVtuXfg0Qb0f_040va1_kej27P-ZB_19HB6Qk,42422
5
+ pymud/logger.py,sha256=39I_rFBU5MEiOTJyU7GAy9cY_MpYHKiXNgBhpokQrTA,5358
6
+ pymud/objects.py,sha256=0aUc-PZfVSdYPEAamY0eO6k3P9wJcw6PNxfSE8eZZeE,38072
7
+ pymud/pkuxkx.py,sha256=vWXHU6GF0HQ0eWb3LmxFVRP0cKnigffCX7Z-LJvwVtw,11496
8
+ pymud/protocol.py,sha256=QfDXjlg2OcJXmVoXf_3mAemnYotRXDUlEZNQjhkfXdA,49106
9
+ pymud/pymud.py,sha256=yAd6nz_ltM3B0fDwMGvaa-tpMlZycZEGJ5E4rZb9Nx4,48235
10
+ pymud/session.py,sha256=Q1ylk9-5tZGI4maMfDRqzq8Ca6vzG4SivzjxfrpUk84,122932
11
+ pymud/settings.py,sha256=3FDAgW97SEQfWb9HR6n2U-rQYKxclQXnfaRuo2o0ly0,7147
12
+ pymud-0.20.0a2.dist-info/LICENSE.txt,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
13
+ pymud-0.20.0a2.dist-info/METADATA,sha256=eFQxv8YNREut-zvVzsCf7uAfM3DAxFOi_vvX4uQITCA,68829
14
+ pymud-0.20.0a2.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
15
+ pymud-0.20.0a2.dist-info/entry_points.txt,sha256=diPUOtTkhgC1hVny7Cdg4aRhaHSynMQoraE7ZhJxUcw,37
16
+ pymud-0.20.0a2.dist-info/top_level.txt,sha256=8Gp1eXjxixXjqhhti6tLCspV_8s9sNV3z5Em2_KRhD4,6
17
+ pymud-0.20.0a2.dist-info/RECORD,,
@@ -1,17 +0,0 @@
1
- pymud/__init__.py,sha256=Ep6JrWv2wwlLV5nI7F6BOA7Ei6yVgnxvhIRwFGPr2Oc,501
2
- pymud/__main__.py,sha256=ybi8pA0BXCZJ_GWgndllT7f1FBBE2tGNCByN0zkaSu0,6748
3
- pymud/dialogs.py,sha256=D0ZtCeoBchF5eYzXumkOi3p-maCQZu4v9-wJgxQ790o,6500
4
- pymud/extras.py,sha256=QwWwLavVtuXfg0Qb0f_040va1_kej27P-ZB_19HB6Qk,42422
5
- pymud/logger.py,sha256=39I_rFBU5MEiOTJyU7GAy9cY_MpYHKiXNgBhpokQrTA,5358
6
- pymud/objects.py,sha256=0aUc-PZfVSdYPEAamY0eO6k3P9wJcw6PNxfSE8eZZeE,38072
7
- pymud/pkuxkx.py,sha256=vWXHU6GF0HQ0eWb3LmxFVRP0cKnigffCX7Z-LJvwVtw,11496
8
- pymud/protocol.py,sha256=QfDXjlg2OcJXmVoXf_3mAemnYotRXDUlEZNQjhkfXdA,49106
9
- pymud/pymud.py,sha256=2dbgnzlG9476esOfyp9sv-lRSTpMuRaCXnqrOofOu24,48182
10
- pymud/session.py,sha256=uAWt0-AZWpDvVfCjzoxWDpuOwCQ8s1DN_DZ-rVAC5xs,121232
11
- pymud/settings.py,sha256=XkyFWTskPGZljuWCaC8cU18ie8-FkecEtb0h3OfcfjU,7145
12
- pymud-0.20.0a1.dist-info/LICENSE.txt,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
13
- pymud-0.20.0a1.dist-info/METADATA,sha256=N57G7pGHXWfYKJ2YwJjWFMSYxvfkvwIpmsTKTR1hjro,68201
14
- pymud-0.20.0a1.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
15
- pymud-0.20.0a1.dist-info/entry_points.txt,sha256=diPUOtTkhgC1hVny7Cdg4aRhaHSynMQoraE7ZhJxUcw,37
16
- pymud-0.20.0a1.dist-info/top_level.txt,sha256=8Gp1eXjxixXjqhhti6tLCspV_8s9sNV3z5Em2_KRhD4,6
17
- pymud-0.20.0a1.dist-info/RECORD,,