pymud 0.20.0__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 DELETED
@@ -1,142 +0,0 @@
1
- import os, sys, json, platform, shutil, logging, argparse
2
- from pathlib import Path
3
- from .pymud import PyMudApp
4
- from .settings import Settings
5
-
6
- CFG_TEMPLATE = {
7
- "client": {
8
- "buffer_lines" : 5000, # 保留缓冲行数
9
-
10
- "interval" : 10, # 在自动执行中,两次命令输入中的间隔时间(ms)
11
- "auto_connect" : True, # 创建会话后,是否自动连接
12
- "auto_reconnect" : False, # 在会话异常断开之后,是否自动重连
13
- "var_autosave" : True, # 断开时自动保存会话变量
14
- "var_autoload" : True, # 初始化时自动加载会话变量
15
-
16
- "echo_input" : False,
17
- "beautify" : True, # 专门为解决控制台下PKUXKX字符画对不齐的问题
18
-
19
- "status_display" : 1, # 状态窗口显示情况设置,0-不显示,1-显示在下方,2-显示在右侧
20
- "status_height" : 4, # 下侧状态栏的高度
21
- "status_width" : 30, # 右侧状态栏的宽度
22
-
23
- },
24
- "sessions" : {
25
- "pkuxkx" : {
26
- "host" : "mud.pkuxkx.net",
27
- "port" : "8081",
28
- "encoding" : "utf8",
29
- "autologin" : "{0};{1}",
30
- "default_script": "examples",
31
- "chars" : {
32
- "display_title" : ["yourid", "yourpassword", ""],
33
- }
34
- }
35
- },
36
- "keys" : {
37
- "f3" : "#ig",
38
- "f4" : "#clear",
39
- "f11" : "#close",
40
- "f12" : "#exit",
41
- }
42
- }
43
-
44
- def init_pymud_env(args):
45
- print(f"欢迎使用PyMUD, 版本{Settings.__version__}. 使用PyMUD时, 建议建立一个新目录(任意位置),并将自己的脚本以及配置文件放到该目录下.")
46
- print("即将开始为首次运行初始化环境...")
47
-
48
- dir = args.dir
49
- if dir:
50
- print(f"你已经指定了创建脚本的目录为 {args.dir}")
51
- dir = Path(dir)
52
- else:
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)
67
-
68
- if os.path.exists('pymud.cfg'):
69
- print(f'检测到脚本目录下已存在pymud.cfg文件,将直接使用此文件进入PyMUD...')
70
- else:
71
- print(f'检测到脚本目录下不存在pymud.cfg文件,将使用默认内容创建该配置文件...')
72
- with open('pymud.cfg', mode = 'x') as fp:
73
- fp.writelines(json.dumps(CFG_TEMPLATE, indent = 4))
74
-
75
- if not os.path.exists('examples.py'):
76
- from pymud import pkuxkx
77
- module_dir = pkuxkx.__file__
78
- shutil.copyfile(module_dir, 'examples.py')
79
- print(f'已将样例脚本拷贝至脚本目录,并加入默认配置文件')
80
-
81
- print(f"后续可自行修改 {dir} 目录下的 pymud.cfg 文件以进行配置。")
82
- if system == "windows":
83
- print(f"后续运行PyMUD, 请在 {dir} 目录下键入命令: python -m pymud")
84
- else:
85
- print(f"后续运行PyMUD, 请在 {dir} 目录下键入命令: python3 -m pymud")
86
-
87
- input('所有内容已初始化完毕, 请按回车进入PyMUD.')
88
-
89
- startApp(args)
90
-
91
- def startApp(args):
92
- startup_path = Path(args.startup_dir).resolve()
93
- sys.path.append(f"{startup_path}")
94
- os.chdir(startup_path)
95
-
96
- if args.debug:
97
- logging.basicConfig(level = logging.NOTSET,
98
- format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
99
- datefmt = '%m-%d %H:%M',
100
- filename = args.logfile,
101
- filemode = 'a' if args.filemode else 'w',
102
- encoding = "utf-8"
103
- )
104
-
105
- else:
106
- logging.basicConfig(level = logging.NOTSET,
107
- format = '%(asctime)s %(name)-12s: %(message)s',
108
- datefmt = '%m-%d %H:%M',
109
- handlers = [logging.NullHandler()],
110
- )
111
-
112
- cfg = startup_path.joinpath("pymud.cfg")
113
- cfg_data = None
114
- if os.path.exists(cfg):
115
- with open(cfg, "r", encoding="utf8", errors="ignore") as fp:
116
- cfg_data = json.load(fp)
117
-
118
- app = PyMudApp(cfg_data)
119
- app.run()
120
-
121
- def main():
122
- parser = argparse.ArgumentParser(prog = "pymud", description = "PyMUD命令行参数帮助")
123
- subparsers = parser.add_subparsers(help = 'init用于初始化运行环境')
124
-
125
- par_init = subparsers.add_parser('init', description = '初始化pymud运行环境, 包括建立脚本目录, 创建默认配置文件, 创建样例脚本等.')
126
- par_init.add_argument('-d', '--dir', dest = 'dir', metavar = 'dir', type = str, default = '', help = '指定构建脚本目录的名称, 不指定时会根据操作系统选择不同默认值')
127
- par_init.set_defaults(func = init_pymud_env)
128
-
129
- parser.add_argument('-d', '--debug', dest = 'debug', action = 'store_true', default = False, help = '指定以调试模式进入PyMUD。此时,系统log等级将设置为logging.NOTSET, 所有log数据均会被记录。默认不启用。')
130
- parser.add_argument('-l', '--logfile', dest = 'logfile', metavar = 'logfile', default = 'pymud.log', help = '指定调试模式下记录文件名,不指定时,默认为当前目录下的pymud.log')
131
- parser.add_argument('-a', '--appendmode', dest = 'filemode', action = 'store_true', default = True, help = '指定log文件的访问模式是否为append尾部添加模式,默认为True。当为False时,使用w模式,即每次运行清空之前记录')
132
- parser.add_argument('-s', '--startup_dir', dest = 'startup_dir', metavar = 'startup_dir', default = '.', help = '指定启动目录,默认为当前目录。使用该参数可以在任何目录下,通过指定脚本目录来启动')
133
-
134
- args=parser.parse_args()
135
-
136
- if hasattr(args, 'func'):
137
- args.func(args)
138
- else:
139
- startApp(args)
140
-
141
- if __name__ == "__main__":
142
- main()
pymud/modules.py DELETED
@@ -1,188 +0,0 @@
1
-
2
- import importlib, importlib.util
3
- from abc import ABC, ABCMeta
4
- from typing import Any
5
- from .objects import BaseObject, Command
6
-
7
- class ModuleInfo:
8
- """
9
- 模块管理类。对加载的模块文件进行管理。该类型由Session类进行管理,无需人工创建和干预。
10
-
11
- 有关模块的分类和使用的详细信息,请参见 `脚本 <scripts.html>`_
12
-
13
- :param module_name: 模块的名称, 应与 import xxx 语法中的 xxx 保持一致
14
- :param session: 加载/创建本模块的会话
15
-
16
- """
17
- def __init__(self, module_name: str, session):
18
- self.session = session
19
- self._name = module_name
20
- self._ismainmodule = False
21
- self.load()
22
-
23
- def _load(self, reload = False):
24
- result = True
25
- if reload:
26
- self._module = importlib.reload(self._module)
27
- else:
28
- self._module = importlib.import_module(self.name)
29
- self._config = {}
30
- for attr_name in dir(self._module):
31
- attr = getattr(self._module, attr_name)
32
- if isinstance(attr, type) and attr.__module__ == self._module.__name__:
33
- if (attr_name == "Configuration") or issubclass(attr, IConfig):
34
- try:
35
- self._config[f"{self.name}.{attr_name}"] = attr(self.session, reload = reload)
36
- self.session.info(f"配置对象 {self.name}.{attr_name} {'重新' if reload else ''}创建成功.")
37
- except Exception as e:
38
- result = False
39
- self.session.error(f"配置对象 {self.name}.{attr_name} 创建失败. 错误信息为: {e}")
40
- self._ismainmodule = (self._config != {})
41
- return result
42
-
43
- def _unload(self):
44
- for key, config in self._config.items():
45
- if isinstance(config, Command):
46
- # Command 对象在从会话中移除时,自动调用其 unload 系列方法,因此不能产生递归
47
- self.session.delObject(config)
48
-
49
- else:
50
-
51
- if hasattr(config, "__unload__"):
52
- unload = getattr(config, "__unload__", None)
53
- if callable(unload): unload()
54
-
55
- if hasattr(config, "unload"):
56
- unload = getattr(config, "unload", None)
57
- if callable(unload): unload()
58
-
59
- if isinstance(config, BaseObject):
60
- self.session.delObject(config)
61
-
62
- del config
63
- self._config.clear()
64
-
65
- def load(self):
66
- "加载模块内容"
67
- if self._load():
68
- self.session.info(f"{'主' if self.ismainmodule else '从'}配置模块 {self.name} 加载完成.")
69
- else:
70
- self.session.error(f"{'主' if self.ismainmodule else '从'}配置模块 {self.name} 加载失败.")
71
-
72
- def unload(self):
73
- "卸载模块内容"
74
- self._unload()
75
- self._loaded = False
76
- self.session.info(f"{'主' if self.ismainmodule else '从'}配置模块 {self.name} 卸载完成.")
77
-
78
- def reload(self):
79
- "模块文件更新后调用,重新加载已加载的模块内容"
80
- self._unload()
81
- self._load(reload = True)
82
- self.session.info(f"{'主' if self.ismainmodule else '从'}配置模块 {self.name} 重新加载完成.")
83
-
84
- @property
85
- def name(self):
86
- "只读属性,模块名称"
87
- return self._name
88
-
89
- @property
90
- def module(self):
91
- "只读属性,模块文件的 ModuleType 对象"
92
- return self._module
93
-
94
- @property
95
- def config(self):
96
- "只读字典属性,根据模块文件 ModuleType 对象创建的其中名为 Configuration 的类型或继承自 IConfig 的子类型实例(若有)"
97
- return self._config
98
-
99
- @property
100
- def ismainmodule(self):
101
- "只读属性,区分是否主模块(即包含具体config的模块)"
102
- return self._ismainmodule
103
-
104
- class IConfig(metaclass = ABCMeta):
105
- """
106
- 用于提示PyMUD应用是否自动创建该配置类型的基础类(模拟接口)。
107
-
108
- 继承 IConfig 类型让应用自动管理该类型,唯一需要的是,构造函数中,仅存在一个必须指定的参数 Session。
109
-
110
- 在应用自动创建 IConfig 实例时,除 session 参数外,还会传递一个 reload 参数 (bool类型),表示是首次加载还是重新加载特性。
111
- 可以从kwargs 中获取该参数,并针对性的设计相应代码。例如,重新加载相关联的其他模块等。
112
- """
113
- def __init__(self, session, *args, **kwargs):
114
- self.session = session
115
-
116
- def __unload__(self):
117
- if self.session:
118
- self.session.delObject(self)
119
-
120
- class Plugin:
121
- """
122
- 插件管理类。对加载的插件文件进行管理。该类型由PyMudApp进行管理,无需人工创建。
123
-
124
- 有关插件的详细信息,请参见 `插件 <plugins.html>`_
125
-
126
- :param name: 插件的文件名, 如'myplugin.py'
127
- :param location: 插件所在的目录。自动加载的插件包括PyMUD包目录下的plugins目录以及当前目录下的plugins目录
128
-
129
- """
130
- def __init__(self, name, location):
131
- self._plugin_file = name
132
- self._plugin_loc = location
133
-
134
- self.reload()
135
-
136
- def reload(self):
137
- "加载/重新加载插件对象"
138
- #del self.modspec, self.mod
139
- self.modspec = importlib.util.spec_from_file_location(self._plugin_file[:-3], self._plugin_loc)
140
- self.mod = importlib.util.module_from_spec(self.modspec)
141
- self.modspec.loader.exec_module(self.mod)
142
-
143
- self._app_init = self.mod.__dict__["PLUGIN_PYMUD_START"]
144
- self._session_create = self.mod.__dict__["PLUGIN_SESSION_CREATE"]
145
- self._session_destroy = self.mod.__dict__["PLUGIN_SESSION_DESTROY"]
146
-
147
- @property
148
- def name(self):
149
- "插件名称,由插件文件中的 PLUGIN_NAME 常量定义"
150
- return self.mod.__dict__["PLUGIN_NAME"]
151
-
152
- @property
153
- def desc(self):
154
- "插件描述,由插件文件中的 PLUGIN_DESC 常量定义"
155
- return self.mod.__dict__["PLUGIN_DESC"]
156
-
157
- @property
158
- def help(self):
159
- "插件帮助,由插件文件中的文档字符串定义"
160
- return self.mod.__doc__
161
-
162
- def onAppInit(self, app):
163
- """
164
- PyMUD应用启动时对插件执行的操作,由插件文件中的 PLUGIN_PYMUD_START 函数定义
165
-
166
- :param app: 启动的 PyMudApp 对象实例
167
- """
168
- self._app_init(app)
169
-
170
- def onSessionCreate(self, session):
171
- """
172
- 新会话创建时对插件执行的操作,由插件文件中的 PLUGIN_SESSION_CREATE 函数定义
173
-
174
- :param session: 新创建的会话对象实例
175
- """
176
- self._session_create(session)
177
-
178
- def onSessionDestroy(self, session):
179
- """
180
- 会话关闭时(注意不是断开)对插件执行的操作,由插件文件中的 PLUGIN_SESSION_DESTROY 函数定义
181
-
182
- :param session: 所关闭的会话对象实例
183
- """
184
- self._session_destroy(session)
185
-
186
- def __getattr__(self, __name: str) -> Any:
187
- if hasattr(self.mod, __name):
188
- return self.mod.__getattribute__(__name)
@@ -1,19 +0,0 @@
1
- pymud/__init__.py,sha256=AP4Edhx90gMKrNfD1O_KVciA3SOnyX5Qt9fZY_JhsTY,574
2
- pymud/__main__.py,sha256=hFzZjadLlcOuoLM7D8wFiFVO8mqF7vMuo9y-9xfIhRc,64
3
- pymud/dialogs.py,sha256=p-LidObSuDyOeMif5CsqhF5qq3rizZ1lmThWHrxDyRg,6726
4
- pymud/extras.py,sha256=NGCCEevCUTD9HfZGv7SDB3GDst-51_xzGQdiDQj-lUA,39777
5
- pymud/logger.py,sha256=gtGm8y9RY_CpRpJ0udgKknRxyjsEPrrRyWecUDgBgZM,5662
6
- pymud/main.py,sha256=b_Ui_cN4W8IfhYNyc1duwr3Bp7pYYZQusKTSafCWZIA,6534
7
- pymud/modules.py,sha256=XoqTeYfZCgqDsV3SYxeehzsbkTzs0swelAUIxyWuL9g,7423
8
- pymud/objects.py,sha256=HAgH8zfBGJR_BJDmna4-daA3JQGA2jg_7Y_rIZYL2-k,39197
9
- pymud/pkuxkx.py,sha256=jRQRUs2xtw7GzYHtLYZXOASnqMumKh0iCoOeKZs8NnU,11467
10
- pymud/protocol.py,sha256=QfDXjlg2OcJXmVoXf_3mAemnYotRXDUlEZNQjhkfXdA,49106
11
- pymud/pymud.py,sha256=2N1fTTaMljPc2Y4FYOtVnVZSgVpH3g75wofo1JhKw1E,50452
12
- pymud/session.py,sha256=6mCbzoZEehH9TFV5utQwbWin1Qa4nFcBjdrMY9zL7DU,131305
13
- pymud/settings.py,sha256=XqTiHZRr6otc30PfiC4PIbAT-Y6uKMR_D0Tflqz6nNU,7145
14
- pymud-0.20.0.dist-info/LICENSE.txt,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
15
- pymud-0.20.0.dist-info/METADATA,sha256=5I7qQ2wwFo4FQ2bkcacHcHLFGTFXrHwzX-aLEdpVhBk,73733
16
- pymud-0.20.0.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
17
- pymud-0.20.0.dist-info/entry_points.txt,sha256=diPUOtTkhgC1hVny7Cdg4aRhaHSynMQoraE7ZhJxUcw,37
18
- pymud-0.20.0.dist-info/top_level.txt,sha256=8Gp1eXjxixXjqhhti6tLCspV_8s9sNV3z5Em2_KRhD4,6
19
- pymud-0.20.0.dist-info/RECORD,,