pymud 0.21.0a1__py3-none-any.whl → 0.21.0a3__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/__init__.py +16 -15
- pymud/__main__.py +3 -3
- pymud/dialogs.py +160 -160
- pymud/extras.py +942 -942
- pymud/i18n.py +41 -41
- pymud/lang/i18n_chs.py +204 -204
- pymud/lang/i18n_eng.py +42 -42
- pymud/logger.py +162 -162
- pymud/main.py +206 -206
- pymud/modules.py +431 -371
- pymud/objects.py +1030 -1028
- pymud/pkuxkx.py +263 -67
- pymud/protocol.py +1008 -1008
- pymud/pymud.py +1292 -1292
- pymud/session.py +3392 -3361
- pymud/settings.py +193 -191
- {pymud-0.21.0a1.dist-info → pymud-0.21.0a3.dist-info}/METADATA +369 -370
- pymud-0.21.0a3.dist-info/RECORD +22 -0
- {pymud-0.21.0a1.dist-info → pymud-0.21.0a3.dist-info}/licenses/LICENSE.txt +674 -674
- pymud-0.21.0a1.dist-info/RECORD +0 -22
- {pymud-0.21.0a1.dist-info → pymud-0.21.0a3.dist-info}/WHEEL +0 -0
- {pymud-0.21.0a1.dist-info → pymud-0.21.0a3.dist-info}/entry_points.txt +0 -0
- {pymud-0.21.0a1.dist-info → pymud-0.21.0a3.dist-info}/top_level.txt +0 -0
pymud/logger.py
CHANGED
@@ -1,162 +1,162 @@
|
|
1
|
-
import os, re, datetime, threading, pathlib
|
2
|
-
from queue import SimpleQueue, Empty
|
3
|
-
from pathlib import Path
|
4
|
-
|
5
|
-
class Logger:
|
6
|
-
"""
|
7
|
-
PyMUD 的记录器类型,可用于会话中向文件记录数据。记录文件保存在当前目录下的 log 子目录中
|
8
|
-
|
9
|
-
:param name: 记录器名称,各记录器名称应保持唯一。记录器名称会作为记录文件名称的主要参数
|
10
|
-
:param mode: 记录模式。可选模式包括 a, w, n 三种。
|
11
|
-
- a为添加模式,当新开始记录时,会添加在原有记录文件(name.log)之后。
|
12
|
-
- w为覆写模式,当新开始记录时,会覆写原记录文件(name.log)。
|
13
|
-
- n为新建模式,当新开始记录时,会以name和当前时间为参数新建一个文件(name.now.log)用于记录。
|
14
|
-
:param encoding: 记录文件的编码格式,默认为 "utf-8"
|
15
|
-
:param errors: 当编码模式失败时的处理方式,默认为 "ignore"
|
16
|
-
:param raw: 记录带ANSI标记的原始内容,还是记录纯文本内容,默认为True,即记录带ANSI标记的原始内容。
|
17
|
-
"""
|
18
|
-
|
19
|
-
# _esc_regx = re.compile(r"\x1b\[[\d;]+[abcdmz]", flags = re.IGNORECASE)
|
20
|
-
|
21
|
-
def __init__(self, name, mode = 'a', encoding = "utf-8", errors = "ignore", raw = False):
|
22
|
-
self._name = name
|
23
|
-
self._enabled = False
|
24
|
-
self._raw = raw
|
25
|
-
self.mode = mode
|
26
|
-
self._encoding = encoding
|
27
|
-
self._errors = errors
|
28
|
-
self._lock = threading.RLock()
|
29
|
-
self._stream = None
|
30
|
-
|
31
|
-
self._queue = SimpleQueue()
|
32
|
-
|
33
|
-
@property
|
34
|
-
def name(self):
|
35
|
-
"记录器名称,仅在创建时设置,过程中只读"
|
36
|
-
return self._name
|
37
|
-
|
38
|
-
@property
|
39
|
-
def enabled(self):
|
40
|
-
"""
|
41
|
-
使能属性。
|
42
|
-
从false切换到true时,会打开文件,创建后台线程进行记录。
|
43
|
-
从true切换到false时,会终止后台记录线程,并关闭记录文件。
|
44
|
-
"""
|
45
|
-
return self._enabled
|
46
|
-
|
47
|
-
@enabled.setter
|
48
|
-
def enabled(self, enabled):
|
49
|
-
if self._enabled != enabled:
|
50
|
-
if enabled:
|
51
|
-
mode = "a"
|
52
|
-
|
53
|
-
if self._mode in ("a", "w"):
|
54
|
-
filename = f"{self.name}.log"
|
55
|
-
mode = self._mode
|
56
|
-
elif self._mode == "n":
|
57
|
-
now = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
|
58
|
-
filename = f"{self.name}.{now}.log"
|
59
|
-
|
60
|
-
logdir = Path.cwd().joinpath('log')
|
61
|
-
if not logdir.exists() or not logdir.is_dir():
|
62
|
-
logdir.mkdir()
|
63
|
-
|
64
|
-
filename = logdir.joinpath(filename)
|
65
|
-
#filename = os.path.abspath(filename)
|
66
|
-
self._stream = open(filename, mode = mode, encoding = self._encoding, errors = self._errors)
|
67
|
-
self._thread = t = threading.Thread(target=self._monitor)
|
68
|
-
t.daemon = True
|
69
|
-
t.start()
|
70
|
-
|
71
|
-
else:
|
72
|
-
self._queue.put_nowait(None)
|
73
|
-
self._thread.join()
|
74
|
-
self._thread = None
|
75
|
-
self._closeFile()
|
76
|
-
|
77
|
-
self._enabled = enabled
|
78
|
-
|
79
|
-
@property
|
80
|
-
def raw(self):
|
81
|
-
"属性,设置和获取是否记录带有ANSI标记的原始记录"
|
82
|
-
return self._raw
|
83
|
-
|
84
|
-
@raw.setter
|
85
|
-
def raw(self, val: bool):
|
86
|
-
self._raw = val
|
87
|
-
|
88
|
-
@property
|
89
|
-
def mode(self):
|
90
|
-
"属性,记录器模式,可为 a, w, n"
|
91
|
-
return self._mode
|
92
|
-
|
93
|
-
@mode.setter
|
94
|
-
def mode(self, value):
|
95
|
-
if value in ("a", "w", "n"):
|
96
|
-
self._mode = value
|
97
|
-
|
98
|
-
def _closeFile(self):
|
99
|
-
"""
|
100
|
-
Closes the stream.
|
101
|
-
"""
|
102
|
-
self._lock.acquire()
|
103
|
-
try:
|
104
|
-
if self._stream:
|
105
|
-
try:
|
106
|
-
self._stream.flush()
|
107
|
-
finally:
|
108
|
-
stream = self._stream
|
109
|
-
self._stream = None
|
110
|
-
stream.close()
|
111
|
-
finally:
|
112
|
-
self._lock.release()
|
113
|
-
|
114
|
-
def log(self, msg):
|
115
|
-
"""
|
116
|
-
向记录器记录信息。记录的信息会通过队列发送到独立的记录线程。
|
117
|
-
当记录器未使能时,使用该函数调用也不会记录。
|
118
|
-
|
119
|
-
:param msg: 要记录的信息
|
120
|
-
"""
|
121
|
-
if self._enabled:
|
122
|
-
self._queue.put_nowait(msg)
|
123
|
-
|
124
|
-
def _monitor(self):
|
125
|
-
"""
|
126
|
-
Monitor the queue for records, and ask the handler
|
127
|
-
to deal with them.
|
128
|
-
|
129
|
-
This method runs on a separate, internal thread.
|
130
|
-
The thread will terminate if it sees a sentinel object in the queue.
|
131
|
-
"""
|
132
|
-
newline = True
|
133
|
-
while True:
|
134
|
-
try:
|
135
|
-
data = self._queue.get(block = True)
|
136
|
-
if data:
|
137
|
-
self._lock.acquire()
|
138
|
-
|
139
|
-
if newline:
|
140
|
-
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
141
|
-
header = f"{now} {self._name}: "
|
142
|
-
self._stream.write(header)
|
143
|
-
newline = False
|
144
|
-
|
145
|
-
if data.endswith("\n"):
|
146
|
-
data = data.rstrip("\n").rstrip("\r") + "\n"
|
147
|
-
newline = True
|
148
|
-
|
149
|
-
if not self._raw:
|
150
|
-
from .session import Session
|
151
|
-
data = Session.PLAIN_TEXT_REGX.sub("", data)
|
152
|
-
#data = self._esc_regx.sub("", data)
|
153
|
-
|
154
|
-
self._stream.write(data)
|
155
|
-
|
156
|
-
self._stream.flush()
|
157
|
-
self._lock.release()
|
158
|
-
|
159
|
-
else:
|
160
|
-
break
|
161
|
-
except Empty:
|
162
|
-
break
|
1
|
+
import os, re, datetime, threading, pathlib
|
2
|
+
from queue import SimpleQueue, Empty
|
3
|
+
from pathlib import Path
|
4
|
+
|
5
|
+
class Logger:
|
6
|
+
"""
|
7
|
+
PyMUD 的记录器类型,可用于会话中向文件记录数据。记录文件保存在当前目录下的 log 子目录中
|
8
|
+
|
9
|
+
:param name: 记录器名称,各记录器名称应保持唯一。记录器名称会作为记录文件名称的主要参数
|
10
|
+
:param mode: 记录模式。可选模式包括 a, w, n 三种。
|
11
|
+
- a为添加模式,当新开始记录时,会添加在原有记录文件(name.log)之后。
|
12
|
+
- w为覆写模式,当新开始记录时,会覆写原记录文件(name.log)。
|
13
|
+
- n为新建模式,当新开始记录时,会以name和当前时间为参数新建一个文件(name.now.log)用于记录。
|
14
|
+
:param encoding: 记录文件的编码格式,默认为 "utf-8"
|
15
|
+
:param errors: 当编码模式失败时的处理方式,默认为 "ignore"
|
16
|
+
:param raw: 记录带ANSI标记的原始内容,还是记录纯文本内容,默认为True,即记录带ANSI标记的原始内容。
|
17
|
+
"""
|
18
|
+
|
19
|
+
# _esc_regx = re.compile(r"\x1b\[[\d;]+[abcdmz]", flags = re.IGNORECASE)
|
20
|
+
|
21
|
+
def __init__(self, name, mode = 'a', encoding = "utf-8", errors = "ignore", raw = False):
|
22
|
+
self._name = name
|
23
|
+
self._enabled = False
|
24
|
+
self._raw = raw
|
25
|
+
self.mode = mode
|
26
|
+
self._encoding = encoding
|
27
|
+
self._errors = errors
|
28
|
+
self._lock = threading.RLock()
|
29
|
+
self._stream = None
|
30
|
+
|
31
|
+
self._queue = SimpleQueue()
|
32
|
+
|
33
|
+
@property
|
34
|
+
def name(self):
|
35
|
+
"记录器名称,仅在创建时设置,过程中只读"
|
36
|
+
return self._name
|
37
|
+
|
38
|
+
@property
|
39
|
+
def enabled(self):
|
40
|
+
"""
|
41
|
+
使能属性。
|
42
|
+
从false切换到true时,会打开文件,创建后台线程进行记录。
|
43
|
+
从true切换到false时,会终止后台记录线程,并关闭记录文件。
|
44
|
+
"""
|
45
|
+
return self._enabled
|
46
|
+
|
47
|
+
@enabled.setter
|
48
|
+
def enabled(self, enabled):
|
49
|
+
if self._enabled != enabled:
|
50
|
+
if enabled:
|
51
|
+
mode = "a"
|
52
|
+
|
53
|
+
if self._mode in ("a", "w"):
|
54
|
+
filename = f"{self.name}.log"
|
55
|
+
mode = self._mode
|
56
|
+
elif self._mode == "n":
|
57
|
+
now = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
|
58
|
+
filename = f"{self.name}.{now}.log"
|
59
|
+
|
60
|
+
logdir = Path.cwd().joinpath('log')
|
61
|
+
if not logdir.exists() or not logdir.is_dir():
|
62
|
+
logdir.mkdir()
|
63
|
+
|
64
|
+
filename = logdir.joinpath(filename)
|
65
|
+
#filename = os.path.abspath(filename)
|
66
|
+
self._stream = open(filename, mode = mode, encoding = self._encoding, errors = self._errors)
|
67
|
+
self._thread = t = threading.Thread(target=self._monitor)
|
68
|
+
t.daemon = True
|
69
|
+
t.start()
|
70
|
+
|
71
|
+
else:
|
72
|
+
self._queue.put_nowait(None)
|
73
|
+
self._thread.join()
|
74
|
+
self._thread = None
|
75
|
+
self._closeFile()
|
76
|
+
|
77
|
+
self._enabled = enabled
|
78
|
+
|
79
|
+
@property
|
80
|
+
def raw(self):
|
81
|
+
"属性,设置和获取是否记录带有ANSI标记的原始记录"
|
82
|
+
return self._raw
|
83
|
+
|
84
|
+
@raw.setter
|
85
|
+
def raw(self, val: bool):
|
86
|
+
self._raw = val
|
87
|
+
|
88
|
+
@property
|
89
|
+
def mode(self):
|
90
|
+
"属性,记录器模式,可为 a, w, n"
|
91
|
+
return self._mode
|
92
|
+
|
93
|
+
@mode.setter
|
94
|
+
def mode(self, value):
|
95
|
+
if value in ("a", "w", "n"):
|
96
|
+
self._mode = value
|
97
|
+
|
98
|
+
def _closeFile(self):
|
99
|
+
"""
|
100
|
+
Closes the stream.
|
101
|
+
"""
|
102
|
+
self._lock.acquire()
|
103
|
+
try:
|
104
|
+
if self._stream:
|
105
|
+
try:
|
106
|
+
self._stream.flush()
|
107
|
+
finally:
|
108
|
+
stream = self._stream
|
109
|
+
self._stream = None
|
110
|
+
stream.close()
|
111
|
+
finally:
|
112
|
+
self._lock.release()
|
113
|
+
|
114
|
+
def log(self, msg):
|
115
|
+
"""
|
116
|
+
向记录器记录信息。记录的信息会通过队列发送到独立的记录线程。
|
117
|
+
当记录器未使能时,使用该函数调用也不会记录。
|
118
|
+
|
119
|
+
:param msg: 要记录的信息
|
120
|
+
"""
|
121
|
+
if self._enabled:
|
122
|
+
self._queue.put_nowait(msg)
|
123
|
+
|
124
|
+
def _monitor(self):
|
125
|
+
"""
|
126
|
+
Monitor the queue for records, and ask the handler
|
127
|
+
to deal with them.
|
128
|
+
|
129
|
+
This method runs on a separate, internal thread.
|
130
|
+
The thread will terminate if it sees a sentinel object in the queue.
|
131
|
+
"""
|
132
|
+
newline = True
|
133
|
+
while True:
|
134
|
+
try:
|
135
|
+
data = self._queue.get(block = True)
|
136
|
+
if data:
|
137
|
+
self._lock.acquire()
|
138
|
+
|
139
|
+
if newline:
|
140
|
+
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
141
|
+
header = f"{now} {self._name}: "
|
142
|
+
self._stream.write(header)
|
143
|
+
newline = False
|
144
|
+
|
145
|
+
if data.endswith("\n"):
|
146
|
+
data = data.rstrip("\n").rstrip("\r") + "\n"
|
147
|
+
newline = True
|
148
|
+
|
149
|
+
if not self._raw:
|
150
|
+
from .session import Session
|
151
|
+
data = Session.PLAIN_TEXT_REGX.sub("", data)
|
152
|
+
#data = self._esc_regx.sub("", data)
|
153
|
+
|
154
|
+
self._stream.write(data)
|
155
|
+
|
156
|
+
self._stream.flush()
|
157
|
+
self._lock.release()
|
158
|
+
|
159
|
+
else:
|
160
|
+
break
|
161
|
+
except Empty:
|
162
|
+
break
|