pymud 0.21.5.post1__py3-none-any.whl → 0.21.6__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/extras.py CHANGED
@@ -834,7 +834,7 @@ class PyMudBufferControl(UIControl):
834
834
  def get_line(i: int) -> StyleAndTextTuples:
835
835
  line = buffer.getLine(i)
836
836
  # 颜色校正
837
- SEARCH_LINES = 10
837
+ SEARCH_LINES = 50
838
838
  thislinecolors = len(self.AVAI_COLOR_REGX.findall(line))
839
839
  if thislinecolors == 0:
840
840
  lineno = i - 1
pymud/lang/i18n_eng.py CHANGED
@@ -292,6 +292,8 @@ TRANSLATION = {
292
292
  Usage:
293
293
  - #var: List all variables in this session.
294
294
  - #var {name}: List the value of the variable named {name} in this session.
295
+ - #var prefix*: List the values of the variables which names start with prefix.
296
+ - #var *suffix: List the values of the variables which names end with suffix.
295
297
  - #var {name} {value}: Set the value of the variable named {name} in this session to {value}, create it if it does not exist.
296
298
 
297
299
  Parameters:
pymud/main.py CHANGED
@@ -67,6 +67,15 @@ def detect_system_language():
67
67
  def init_pymud_env(args):
68
68
  system = "unknown"
69
69
  lang = detect_system_language()
70
+ if lang == "chs":
71
+ val = input(f"检测到你的系统语言为中文,是否确认使用中文进行初始化?直接回车确认选择中文,若要选择英文,请键入 eng 后再回车:")
72
+ if val == "eng":
73
+ lang = "eng"
74
+ elif lang == "eng":
75
+ val = input(f"The language of your system ISNOT Chinese, do you want to initialize pymud in English? Press Enter to confirm, or type chs and then press Enter to initialize pymud in Chinese:")
76
+ if val == "chs":
77
+ lang = "chs"
78
+
70
79
  if lang == "chs":
71
80
  print(f"欢迎使用PyMUD, 版本{Settings.__version__}. 使用PyMUD时, 建议建立一个新目录(任意位置),并将自己的脚本以及配置文件放到该目录下.")
72
81
  print("即将开始为首次运行初始化环境...")
@@ -202,7 +211,7 @@ def main():
202
211
  subparsers = parser.add_subparsers(help = 'init用于初始化运行环境')
203
212
 
204
213
  par_init = subparsers.add_parser('init', description = '初始化pymud运行环境, 包括建立脚本目录, 创建默认配置文件, 创建样例脚本等.')
205
- par_init.add_argument('-d', '--dir', dest = 'dir', metavar = 'dir', type = str, default = '.', help = '指定构建脚本目录的名称, 不指定时会根据操作系统选择不同默认值')
214
+ par_init.add_argument('-d', '--dir', dest = 'dir', metavar = 'dir', type = str, help = '指定构建脚本目录的名称, 不指定时会根据操作系统选择不同默认值')
206
215
  par_init.set_defaults(func = init_pymud_env)
207
216
 
208
217
  parser.add_argument('-d', '--debug', dest = 'debug', action = 'store_true', default = False, help = '指定以调试模式进入PyMUD。此时,系统log等级将设置为logging.NOTSET, 所有log数据均会被记录。默认不启用。')
pymud/objects.py CHANGED
@@ -537,6 +537,7 @@ class MatchObject(BaseObject):
537
537
  def reset(self):
538
538
  "复位事件,用于async执行未等待结果时,对事件的复位。仅异步有效。"
539
539
  self.event.clear()
540
+ self.state = BaseObject.State(self.NOTSET, self.id, "", tuple())
540
541
 
541
542
  def set(self):
542
543
  "设置事件标记,可以用于人工强制触发,仅在异步触发器下生效。"
@@ -621,9 +622,11 @@ class MatchObject(BaseObject):
621
622
  self.event.set()
622
623
 
623
624
  self.state = state
624
- return state
625
+ #return state
625
626
  except Exception as e:
626
627
  print_exception(self.session, e)
628
+
629
+ return self.state
627
630
 
628
631
  async def matched(self) -> BaseObject.State:
629
632
  """
@@ -637,9 +640,10 @@ class MatchObject(BaseObject):
637
640
  await self.event.wait()
638
641
  self.reset()
639
642
 
640
- return self.state
641
643
  except Exception as e:
642
644
  print_exception(self.session, e)
645
+
646
+ return self.state
643
647
 
644
648
  def __detailed__(self) -> str:
645
649
  group = f'group = "{self.group}" ' if self.group else ''
pymud/session.py CHANGED
@@ -237,9 +237,9 @@ class Session:
237
237
 
238
238
  self.onConnected()
239
239
 
240
- except Exception as exc:
240
+ except Exception as ex:
241
241
  now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
242
- self.error(Settings.gettext("msg_connection_fail", now, exec))
242
+ self.error(Settings.gettext("msg_connection_fail", now, ex))
243
243
  self._state = "EXCEPTION"
244
244
 
245
245
  if Settings.client["auto_reconnect"]:
@@ -674,7 +674,7 @@ class Session:
674
674
  else:
675
675
  state = tri.match(tri_line, docallback = True)
676
676
 
677
- if state.result == Trigger.SUCCESS:
677
+ if state and state.result == Trigger.SUCCESS:
678
678
  if tri.oneShot: # 仅执行一次的trigger,匹配成功后,删除该Trigger(从触发器列表中移除)
679
679
  self._triggers.pop(tri.id)
680
680
 
@@ -687,13 +687,13 @@ class Session:
687
687
  if len(self.display_line) > 0:
688
688
  self.writetobuffer(self.display_line)
689
689
 
690
- def set_exception(self, exc: Exception):
690
+ def set_exception(self, ex: Exception):
691
691
  """
692
692
  由协议对象调用,处理异常。 **脚本中无需调用。**
693
693
 
694
- :param exc: 异常对象
694
+ :param ex: 异常对象
695
695
  """
696
- self.error(Settings.gettext("msg_connection_fail", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), exc))
696
+ self.error(Settings.gettext("msg_connection_fail", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ex))
697
697
 
698
698
 
699
699
  def create_task(self, coro, *args, name: Optional[str] = None) -> asyncio.Task:
@@ -814,8 +814,10 @@ class Session:
814
814
  else:
815
815
  self.log.log(f"\x1b[32m{line}\x1b[0m\n")
816
816
 
817
- # 当输入任意命令后,本地强制新行
818
- self.buffer.forceNewline()
817
+ # 当输入空行命令后,本地强制新行
818
+ if len(line) == 0:
819
+ self.buffer.forceNewline()
820
+
819
821
  self.record_command(line)
820
822
  cmd = line + self.newline
821
823
  self.write(cmd.encode(self.encoding, Settings.server["encoding_errors"]))
@@ -1024,7 +1026,7 @@ class Session:
1024
1026
 
1025
1027
  for command in self._commands.values():
1026
1028
  state = command.match(cmdtext)
1027
- if state.result == Command.SUCCESS:
1029
+ if state and state.result == Command.SUCCESS:
1028
1030
  notHandle = False
1029
1031
  # 命令的任务名称采用命令id,以便于后续查错
1030
1032
  self.create_task(command.execute(cmdtext), name = "task-{0}".format(command.id))
@@ -1041,7 +1043,7 @@ class Session:
1041
1043
 
1042
1044
  for alias in avai_alis:
1043
1045
  state = alias.match(cmdtext)
1044
- if state.result == Alias.SUCCESS:
1046
+ if state and state.result == Alias.SUCCESS:
1045
1047
  notHandle = False
1046
1048
  if alias.oneShot:
1047
1049
  self.delAlias(alias.id)
@@ -1069,7 +1071,7 @@ class Session:
1069
1071
 
1070
1072
  for command in avai_cmds:
1071
1073
  state = command.match(cmdtext)
1072
- if state.result == Command.SUCCESS:
1074
+ if state and state.result == Command.SUCCESS:
1073
1075
  # 命令的任务名称采用命令id,以便于后续查错
1074
1076
  result = await self.create_task(command.execute(cmdtext), name = "task-{0}".format(command.id))
1075
1077
  notHandle = False
@@ -1086,7 +1088,7 @@ class Session:
1086
1088
 
1087
1089
  for alias in avai_alis:
1088
1090
  state = alias.match(cmdtext)
1089
- if state.result == Alias.SUCCESS:
1091
+ if state and state.result == Alias.SUCCESS:
1090
1092
  notHandle = False
1091
1093
  if alias.oneShot:
1092
1094
  self.delAlias(alias.id)
@@ -2180,6 +2182,8 @@ class Session:
2180
2182
  使用:
2181
2183
  - #var: 列出本会话所有变量
2182
2184
  - #var {name}: 列出本会话中名称为{name}的变量的值
2185
+ - #var prefix*: 列出本会话中名称以prefix开头的所有变量的值
2186
+ - #var *suffix: 列出本会话中名称以suffix结尾的所有变量的值
2183
2187
  - #var {name} {value}: 将本会话中名称为{name}的变量设置值为{value},若不存在则创建
2184
2188
 
2185
2189
  参数:
@@ -2209,7 +2213,28 @@ class Session:
2209
2213
 
2210
2214
  for line in lines:
2211
2215
  self.writetobuffer(line, newline = True)
2212
-
2216
+
2217
+ elif args[0].endswith("*"):
2218
+ filter_vars = DotDict()
2219
+ for key in self._variables.keys():
2220
+ if key.startswith(args[0][:-1]):
2221
+ filter_vars[key] = self._variables[key]
2222
+
2223
+ lines = self.buildDisplayLines(filter_vars, f" VARIABLES START WITH [{args[0][:-1]}] IN SESSION {self.name} ")
2224
+
2225
+ for line in lines:
2226
+ self.writetobuffer(line, newline = True)
2227
+
2228
+ elif args[0].startswith("*"):
2229
+ filter_vars = DotDict()
2230
+ for key in self._variables.keys():
2231
+ if key.endswith(args[0][1:]):
2232
+ filter_vars[key] = self._variables[key]
2233
+
2234
+ lines = self.buildDisplayLines(filter_vars, f" VARIABLES END WITH [{args[0][1:]}] IN SESSION {self.name} ")
2235
+ for line in lines:
2236
+ self.writetobuffer(line, newline = True)
2237
+
2213
2238
  else:
2214
2239
  self.warning(Settings.gettext("msg_no_object", args[0], Settings.gettext("variable")))
2215
2240
 
pymud/settings.py CHANGED
@@ -15,7 +15,7 @@ class Settings:
15
15
  "APP 简要描述"
16
16
  __version__ = importlib.metadata.version("pymud")
17
17
  "APP 当前版本"
18
- __release__ = "2025-06-10"
18
+ __release__ = "2025-06-29"
19
19
  "APP 当前版本发布日期"
20
20
  __author__ = "本牛(newstart)@北侠"
21
21
  "APP 作者"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pymud
3
- Version: 0.21.5.post1
3
+ Version: 0.21.6
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>
@@ -44,7 +44,7 @@ Dynamic: license-file
44
44
 
45
45
  ### 北大侠客行Mud (www.pkuxkx.net),最好的中文Mud游戏!
46
46
  ### PyMUD是我为了更好的玩北大侠客行,特意自行开发的MUD客户端。PyMUD具有以下特点:
47
- + 原生Python开发,除prompt-toolkit及其依赖库 wcwidth, pygment, pyperclip 外,不需要其他第三方库支持
47
+ + 原生Python开发,除 `prompt-toolkit <https://python-prompt-toolkit.readthedocs.io>`_ 及其依赖库 wcwidth, pygment, pyperclip 外,不需要其他第三方库支持
48
48
  + 原生Python的asyncio实现的通信协议处理,支持async/await语法在脚本中直接应用,脚本实现的同步异步两种模式由你自己选择
49
49
  + 基于控制台的全屏UI界面设计,支持鼠标操作(Android上支持触摸屏操作),极低资源需求,在单核1GB内存的Linux VPS上也可流畅运行
50
50
  + 支持分屏显示,在数据快速滚动的时候,上半屏保持不动,以确保不错过信息
@@ -54,8 +54,10 @@ Dynamic: license-file
54
54
  + 支持NWAS、MTTS协商,支持GMCP、MSDP、MSSP协议
55
55
  + 一次脚本开发,多平台运行。只要能在该平台上运行python,就可以运行PyMUD客户端
56
56
  + 脚本所有语法均采用Python原生语法,因此你只要会用Python,就可以自己写脚本,免去了再去学习lua、熟悉各类APP的使用的难处
57
+ + 全开源代码,因此脚本也可以很方便的使用visual studio code等工具进行调试,可以设置断点、查看变量等
57
58
  + Python拥有极为强大的文字处理能力,用于处理文本的MUD最为合适
58
59
  + Python拥有极为丰富的第三方库,能支持的第三方库,就能在PyMUD中支持
60
+ + 多语言支持框架已搭好,目前提供中文、英文支持,可以自己增加翻译后的其他语言版本
59
61
  + 我自己还在玩,所以本客户端会持续进行更新:)
60
62
 
61
63
  ### 哪些人适合使用PyMUD
@@ -66,10 +68,20 @@ Dynamic: license-file
66
68
 
67
69
  ## 版本更新信息
68
70
 
69
- ### 0.21.5post1 (2025-06-10)
71
+ ### 0.21.6 (2025-06-29)
72
+
73
+ + 问题修复: 修复了连接报错时,异常信息不显示的问题。
74
+ + 问题修复: 修复了在脚本中发生同步触发器运行异常时,连接会中断的问题。
75
+ + 问题修复: 修复了在初始化时,默认会指定当前目录为脚本目录而不能接受用户如数的问题。
76
+ + 功能调整: 在初始化时,原先会根据检测到的系统语言进行语言选择,现增加了人工确认环节,可以手动切换。
77
+ + 功能调整: 颜色校正追溯调整为更多行,解决当打印异常追踪行数过多时,红色背景会中断恢复的情况。
78
+ + 功能新增: #var命令现在支持查询仅知道开头或者结尾的变量。例如,使用 #var abc* 会仅打印所有以 abc 开头的变量,使用 #var *abc 会仅打印所有以 abc 结尾的变量。
79
+ + 问题修复: 修复了个别函数中,部分执行路径无返回值的问题。
80
+
81
+ ### 0.21.5post2 (2025-06-10)
70
82
 
71
83
  + 功能完善: 完善了美化功能,已知情况下,基本不会出现断行和不对齐问题了。
72
- + 功能完善: 在向服务器送出命令后,本地显示也强制换行。在出现『未完待续』情况时,回车后不会再跟在后面显示了,而是会强制从下一行开始。
84
+ + 功能完善: 在向服务器送出单个回车命令后,本地显示也强制换行。在出现『未完待续』情况时,回车后不会再跟在后面显示了,而是会强制从下一行开始。
73
85
  + 功能完善: 当对行进行双击选择时,背景增加的选择标记(灰色)会按照实际显示的宽度进行匹配,而不是按照原始数据的宽度进行匹配。
74
86
 
75
87
  ### 0.21.4 (2025-06-08)
@@ -0,0 +1,23 @@
1
+ pymud/__init__.py,sha256=oeHz0NM7_DwChCY8f_vQ_fBq0e_HoTd0cahCFwaavWE,806
2
+ pymud/__main__.py,sha256=lIOBiJmi8X-EWXVIx_OoxSgUZ0FYKlZI8hXVnLUYTJQ,61
3
+ pymud/decorators.py,sha256=rNuDaKk65Cwc9K6t0-BpqNUORs8-8X5Xsv6YaLQ7hc4,9839
4
+ pymud/dialogs.py,sha256=1xo5NJjch-u7RSRcclhvUE4gi8POgiZWK84lNx_HJbs,6891
5
+ pymud/extras.py,sha256=V6wPA0pMLiQNl_2NB37GaR-3T4kfWohjRHHlq2aK0AE,38779
6
+ pymud/i18n.py,sha256=qLgvrmYhVfkTHKpbBR-LfYMOrGgi0skHrelbsj7ItbE,3034
7
+ pymud/logger.py,sha256=F2LBUogdzv2WXHo10CNorDh2VleAX1Wbwmxc3zznHlM,5823
8
+ pymud/main.py,sha256=F8PUXWgWFKJQmy7yitvRJBQ5Mzc-_OC_gGhJwZo_FL0,10751
9
+ pymud/modules.py,sha256=CsOqY1c59CrejltCS4wf7QqdCr5k_ghel8AUqlKVGIw,11873
10
+ pymud/objects.py,sha256=_28Aj2Sgq-VbPtFS8Qq1nMdq3f3FLLQSjiAFRQ4Okvk,38743
11
+ pymud/pkuxkx.py,sha256=qDVry-Vd6MNui0NKWZFT52IpmP1sKS5Dz74EDY4tVGQ,14740
12
+ pymud/protocol.py,sha256=noptJs6K0L9qM8VZIeP65H4k9FPLGJqxvm3qY2iAwvI,48315
13
+ pymud/pymud.py,sha256=9BxK51tzvaOGpSqawlGI57TOtWbaccSlK9mNNHdvyGI,53486
14
+ pymud/session.py,sha256=Hz1rDwBSeE4tXBgOhQABifrDkNMS836pgCJaXHT9L0o,156015
15
+ pymud/settings.py,sha256=Auxc07JWWaQKy6NkFKHD6LAicJ3HxcneORZsrxmqA8M,7697
16
+ pymud/lang/i18n_chs.py,sha256=2cyaHHLwpYEBBwuQXyRTxa1opX53fTv1f8_QDQeGlC0,16836
17
+ pymud/lang/i18n_eng.py,sha256=VHt7xO1tOywd0IQaUpzO4Xn0GcYKXWKA9J11lS5RSAg,46117
18
+ pymud-0.21.6.dist-info/licenses/LICENSE.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
19
+ pymud-0.21.6.dist-info/METADATA,sha256=xIZa9mBgk1BC9rTmwtHFyLLXJr4xi295nmCbrGpzQjQ,48295
20
+ pymud-0.21.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
21
+ pymud-0.21.6.dist-info/entry_points.txt,sha256=diPUOtTkhgC1hVny7Cdg4aRhaHSynMQoraE7ZhJxUcw,37
22
+ pymud-0.21.6.dist-info/top_level.txt,sha256=8Gp1eXjxixXjqhhti6tLCspV_8s9sNV3z5Em2_KRhD4,6
23
+ pymud-0.21.6.dist-info/RECORD,,
@@ -1,23 +0,0 @@
1
- pymud/__init__.py,sha256=oeHz0NM7_DwChCY8f_vQ_fBq0e_HoTd0cahCFwaavWE,806
2
- pymud/__main__.py,sha256=lIOBiJmi8X-EWXVIx_OoxSgUZ0FYKlZI8hXVnLUYTJQ,61
3
- pymud/decorators.py,sha256=rNuDaKk65Cwc9K6t0-BpqNUORs8-8X5Xsv6YaLQ7hc4,9839
4
- pymud/dialogs.py,sha256=1xo5NJjch-u7RSRcclhvUE4gi8POgiZWK84lNx_HJbs,6891
5
- pymud/extras.py,sha256=ehwEe48ObvypUTt6SVbGsI2C-3-Mn0J8mGZOMM-ighk,38779
6
- pymud/i18n.py,sha256=qLgvrmYhVfkTHKpbBR-LfYMOrGgi0skHrelbsj7ItbE,3034
7
- pymud/logger.py,sha256=F2LBUogdzv2WXHo10CNorDh2VleAX1Wbwmxc3zznHlM,5823
8
- pymud/main.py,sha256=zaSjNhpbX3FMulKg-UNFrdiIJO8sOmmrUQrkPOalB-4,10224
9
- pymud/modules.py,sha256=CsOqY1c59CrejltCS4wf7QqdCr5k_ghel8AUqlKVGIw,11873
10
- pymud/objects.py,sha256=NlKAQnV6v9lSkz94zmgb513HPxskY8-tXnOdrYhuktc,38629
11
- pymud/pkuxkx.py,sha256=qDVry-Vd6MNui0NKWZFT52IpmP1sKS5Dz74EDY4tVGQ,14740
12
- pymud/protocol.py,sha256=noptJs6K0L9qM8VZIeP65H4k9FPLGJqxvm3qY2iAwvI,48315
13
- pymud/pymud.py,sha256=9BxK51tzvaOGpSqawlGI57TOtWbaccSlK9mNNHdvyGI,53486
14
- pymud/session.py,sha256=uJI2zm3rT3UxF0Pyt-e_daW4RkqCUR6OnkXneUVZ0tg,154790
15
- pymud/settings.py,sha256=tWNRQAA-QnDUcXk-Vr3B9Bfi-JpSlroHC1UJ_PY2p8A,7697
16
- pymud/lang/i18n_chs.py,sha256=2cyaHHLwpYEBBwuQXyRTxa1opX53fTv1f8_QDQeGlC0,16836
17
- pymud/lang/i18n_eng.py,sha256=jcPz6Y5UuxJBQLY_e8UnEF3GYTlnAD44C14Oj7sK-QI,45935
18
- pymud-0.21.5.post1.dist-info/licenses/LICENSE.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
19
- pymud-0.21.5.post1.dist-info/METADATA,sha256=yq8JnaorcCg5zk3cdQ6wsj04P-xucYWV-bI-rDbaAI8,47057
20
- pymud-0.21.5.post1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
21
- pymud-0.21.5.post1.dist-info/entry_points.txt,sha256=diPUOtTkhgC1hVny7Cdg4aRhaHSynMQoraE7ZhJxUcw,37
22
- pymud-0.21.5.post1.dist-info/top_level.txt,sha256=8Gp1eXjxixXjqhhti6tLCspV_8s9sNV3z5Em2_KRhD4,6
23
- pymud-0.21.5.post1.dist-info/RECORD,,