dimples 1.3.4__tar.gz → 1.3.5__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.
- {dimples-1.3.4 → dimples-1.3.5}/PKG-INFO +1 -1
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/checker.py +3 -3
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/terminal.py +14 -5
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/gatekeeper.py +1 -1
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/document.py +4 -34
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/group_history.py +2 -70
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/document.py +11 -11
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_document.py +2 -2
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_group_history.py +11 -11
- {dimples-1.3.4 → dimples-1.3.5}/dimples/edge/start.py +3 -2
- {dimples-1.3.4 → dimples-1.3.5}/dimples.egg-info/PKG-INFO +1 -1
- {dimples-1.3.4 → dimples-1.3.5}/dimples.egg-info/requires.txt +1 -1
- {dimples-1.3.4 → dimples-1.3.5}/setup.py +2 -2
- {dimples-1.3.4 → dimples-1.3.5}/README.md +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/checkpoint.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/commands.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/creator.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/customized.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/group.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/grp_expel.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/grp_invite.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/grp_join.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/grp_query.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/grp_quit.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/grp_reset.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/grp_resign.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/cpu/handshake.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/facebook.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/messenger.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/network/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/network/session.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/network/state.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/network/transition.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/packer.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/client/processor.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/anonymous.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/ans.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/archivist.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/checker.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/compat/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/compat/address.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/compat/compatible.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/compat/entity.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/compat/loader.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/compat/meta.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/compat/network.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/dbi/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/dbi/account.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/dbi/message.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/dbi/session.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/facebook.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/messenger.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/packer.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/processer.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/ans.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/block.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/customized.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/group.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/handshake.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/login.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/mute.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/password.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/report.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/utils.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/protocol/version.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/register.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/common/session.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/flexible.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/gate.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/mars.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/mtp.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/protocol/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/protocol/mars.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/protocol/ws.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/queue.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/seeker.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/session.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/conn/ws.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/account.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/base.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/group.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/group_keys.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/login.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/meta.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/private.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/station.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/dos/user.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/message.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/base.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/group.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/grp_history.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/grp_keys.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/login.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/message.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/meta.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/station.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/redis/user.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/session.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_base.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_cipherkey.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_group.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_group_keys.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_login.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_message.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_meta.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_private.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_station.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/database/t_user.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/edge/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/edge/messenger.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/edge/octopus.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/edge/shared.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/emitter.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/group/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/group/admin.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/group/builder.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/group/delegate.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/group/emitter.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/group/helper.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/group/manager.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/group/packer.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/group/shared.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/register/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/register/base.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/register/ext.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/register/run.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/register/shared.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/checker.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/cpu/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/cpu/ans.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/cpu/creator.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/cpu/document.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/cpu/handshake.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/cpu/login.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/cpu/report.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/deliver.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/dis_roamer.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/dispatcher.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/facebook.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/messenger.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/packer.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/processor.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/push.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/session.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/session_center.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/server/trace.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/station/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/station/handler.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/station/shared.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/station/start.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/utils/__init__.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/utils/cache.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/utils/checker.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/utils/config.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples/utils/log.py +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples.egg-info/SOURCES.txt +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples.egg-info/dependency_links.txt +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples.egg-info/entry_points.txt +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/dimples.egg-info/top_level.txt +0 -0
- {dimples-1.3.4 → dimples-1.3.5}/setup.cfg +0 -0
|
@@ -71,7 +71,7 @@ class ClientChecker(EntityChecker, Logging):
|
|
|
71
71
|
return False
|
|
72
72
|
elif not self.is_meta_query_expired(identifier=identifier):
|
|
73
73
|
# query not expired yet
|
|
74
|
-
self.
|
|
74
|
+
self.debug(msg='meta query not expired yet: %s' % identifier)
|
|
75
75
|
return False
|
|
76
76
|
self.info(msg='querying meta for: %s' % identifier)
|
|
77
77
|
content = MetaCommand.query(identifier=identifier)
|
|
@@ -86,7 +86,7 @@ class ClientChecker(EntityChecker, Logging):
|
|
|
86
86
|
return False
|
|
87
87
|
elif not self.is_document_query_expired(identifier=identifier):
|
|
88
88
|
# query not expired yet
|
|
89
|
-
self.
|
|
89
|
+
self.debug(msg='document query not expired yet: %s' % identifier)
|
|
90
90
|
return False
|
|
91
91
|
last_time = self.get_last_document_time(identifier=identifier, documents=documents)
|
|
92
92
|
self.info(msg='querying document for: %s, last time: %s' % (identifier, last_time))
|
|
@@ -103,7 +103,7 @@ class ClientChecker(EntityChecker, Logging):
|
|
|
103
103
|
return False
|
|
104
104
|
elif not self.is_members_query_expired(identifier=group):
|
|
105
105
|
# query not expired yet
|
|
106
|
-
self.
|
|
106
|
+
self.debug('members query not expired yet: %s' % group)
|
|
107
107
|
return False
|
|
108
108
|
user = await facebook.current_user
|
|
109
109
|
if user is None:
|
|
@@ -240,14 +240,25 @@ class Terminal(Runner, DeviceMixin, Logging, StateDelegate, ABC):
|
|
|
240
240
|
async def enter_state(self, state: SessionState, ctx: StateMachine, now: float):
|
|
241
241
|
# called before state changed
|
|
242
242
|
session = self.session
|
|
243
|
-
|
|
244
|
-
|
|
243
|
+
if session is None:
|
|
244
|
+
sess_id = None
|
|
245
|
+
srv_id = None
|
|
246
|
+
else:
|
|
247
|
+
sess_id = session.identifier
|
|
248
|
+
station = session.station
|
|
249
|
+
if station is None:
|
|
250
|
+
srv_id = None
|
|
251
|
+
else:
|
|
252
|
+
srv_id = station.identifier
|
|
253
|
+
self.info(msg='enter state: %s, %s => %s' % (state, sess_id, srv_id))
|
|
245
254
|
|
|
246
255
|
# Override
|
|
247
256
|
async def exit_state(self, state: SessionState, ctx: StateMachine, now: float):
|
|
248
257
|
# called after state changed
|
|
249
258
|
current = ctx.current_state
|
|
250
|
-
|
|
259
|
+
session = self.session
|
|
260
|
+
remote = None if session is None else session.remote_address
|
|
261
|
+
self.info(msg='server state changed: %s -> %s, %s' % (state, current, remote))
|
|
251
262
|
index = current.index if isinstance(current, SessionState) else -1
|
|
252
263
|
if index == -1 or index == StateOrder.ERROR:
|
|
253
264
|
self.__last_time = 0
|
|
@@ -259,8 +270,6 @@ class Terminal(Runner, DeviceMixin, Logging, StateDelegate, ABC):
|
|
|
259
270
|
self.warning(msg='current user not set')
|
|
260
271
|
return
|
|
261
272
|
self.info(msg='connect for user: %s' % user)
|
|
262
|
-
session = self.session
|
|
263
|
-
remote = None if session is None else session.remote_address
|
|
264
273
|
if remote is None:
|
|
265
274
|
self.warning(msg='failed to get remote address: %s' % session)
|
|
266
275
|
return
|
|
@@ -130,7 +130,7 @@ def reset_send_buffer_size(conn: Connection = None, sock: socket.socket = None)
|
|
|
130
130
|
return False
|
|
131
131
|
channel = conn.channel
|
|
132
132
|
if not isinstance(channel, BaseChannel):
|
|
133
|
-
print('[SOCKET] channel error: %s, %s' % (channel, conn))
|
|
133
|
+
print('[SOCKET] channel error: %s, %s' % (channel, conn.remote_address))
|
|
134
134
|
return False
|
|
135
135
|
sock = channel.sock
|
|
136
136
|
if sock is None:
|
|
@@ -26,15 +26,14 @@
|
|
|
26
26
|
from typing import Optional, List
|
|
27
27
|
|
|
28
28
|
from dimsdk import TransportableData
|
|
29
|
-
from dimsdk import ID, Document
|
|
29
|
+
from dimsdk import ID, Document
|
|
30
30
|
|
|
31
31
|
from ...utils import template_replace
|
|
32
|
-
from ...common import DocumentDBI
|
|
33
32
|
|
|
34
33
|
from .base import Storage
|
|
35
34
|
|
|
36
35
|
|
|
37
|
-
class DocumentStorage(Storage
|
|
36
|
+
class DocumentStorage(Storage):
|
|
38
37
|
"""
|
|
39
38
|
Document for Entities (User/Group)
|
|
40
39
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
@@ -72,40 +71,11 @@ class DocumentStorage(Storage, DocumentDBI):
|
|
|
72
71
|
documents = []
|
|
73
72
|
for info in array:
|
|
74
73
|
doc = parse_document(dictionary=info, identifier=identifier)
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
if doc is not None:
|
|
75
|
+
documents.append(doc)
|
|
77
76
|
self.info(msg='Loaded %d documents from: %s' % (len(documents), path))
|
|
78
77
|
return documents
|
|
79
78
|
|
|
80
|
-
#
|
|
81
|
-
# Document DBI
|
|
82
|
-
#
|
|
83
|
-
|
|
84
|
-
# Override
|
|
85
|
-
async def save_document(self, document: Document) -> bool:
|
|
86
|
-
""" save document into file """
|
|
87
|
-
identifier = document.identifier
|
|
88
|
-
doc_type = document.type
|
|
89
|
-
# check old documents
|
|
90
|
-
all_documents = await self.get_documents(identifier=identifier)
|
|
91
|
-
old = DocumentUtils.last_document(all_documents, doc_type)
|
|
92
|
-
if old is None and doc_type == Document.VISA:
|
|
93
|
-
old = DocumentUtils.last_document(all_documents, 'profile')
|
|
94
|
-
if old is not None:
|
|
95
|
-
if DocumentUtils.is_expired(document, old):
|
|
96
|
-
self.warning(msg='drop expired document: %s' % identifier)
|
|
97
|
-
return False
|
|
98
|
-
all_documents.remove(old)
|
|
99
|
-
# append it
|
|
100
|
-
all_documents.append(document)
|
|
101
|
-
return await self.save_documents(documents=all_documents, identifier=identifier)
|
|
102
|
-
|
|
103
|
-
# Override
|
|
104
|
-
async def get_documents(self, identifier: ID) -> List[Document]:
|
|
105
|
-
""" load documents from file """
|
|
106
|
-
docs = await self.load_documents(identifier=identifier)
|
|
107
|
-
return [] if docs is None else docs
|
|
108
|
-
|
|
109
79
|
|
|
110
80
|
def parse_document(dictionary: dict, identifier: ID = None, doc_type: str = '*') -> Optional[Document]:
|
|
111
81
|
# check document ID
|
|
@@ -23,20 +23,18 @@
|
|
|
23
23
|
# SOFTWARE.
|
|
24
24
|
# ==============================================================================
|
|
25
25
|
|
|
26
|
-
from typing import
|
|
26
|
+
from typing import Tuple, List
|
|
27
27
|
|
|
28
28
|
from dimsdk import ID
|
|
29
29
|
from dimsdk import ReliableMessage
|
|
30
30
|
from dimsdk import Command, GroupCommand
|
|
31
|
-
from dimsdk import ResetCommand, ResignCommand
|
|
32
31
|
|
|
33
32
|
from ...utils import template_replace
|
|
34
|
-
from ...common import GroupHistoryDBI
|
|
35
33
|
|
|
36
34
|
from .base import Storage
|
|
37
35
|
|
|
38
36
|
|
|
39
|
-
class GroupHistoryStorage(Storage
|
|
37
|
+
class GroupHistoryStorage(Storage):
|
|
40
38
|
"""
|
|
41
39
|
Group History Command Storage
|
|
42
40
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
@@ -89,69 +87,3 @@ class GroupHistoryStorage(Storage, GroupHistoryDBI):
|
|
|
89
87
|
path = self.__history_path(group=group)
|
|
90
88
|
self.info(msg='Saving %d group history(ies) into: %s' % (len(histories), path))
|
|
91
89
|
return await self.write_json(container=array, path=path)
|
|
92
|
-
|
|
93
|
-
#
|
|
94
|
-
# Group History DBI
|
|
95
|
-
#
|
|
96
|
-
|
|
97
|
-
# Override
|
|
98
|
-
async def save_group_history(self, group: ID, content: GroupCommand, message: ReliableMessage) -> bool:
|
|
99
|
-
histories = await self.load_group_histories(group=group)
|
|
100
|
-
item = (content, message)
|
|
101
|
-
histories.append(item)
|
|
102
|
-
return await self.save_group_histories(group=group, histories=histories)
|
|
103
|
-
|
|
104
|
-
# Override
|
|
105
|
-
async def get_group_histories(self, group: ID) -> List[Tuple[GroupCommand, ReliableMessage]]:
|
|
106
|
-
return await self.load_group_histories(group=group)
|
|
107
|
-
|
|
108
|
-
# Override
|
|
109
|
-
async def get_reset_command_message(self, group: ID) -> Tuple[Optional[ResetCommand], Optional[ReliableMessage]]:
|
|
110
|
-
histories = await self.load_group_histories(group=group)
|
|
111
|
-
pos = len(histories)
|
|
112
|
-
while pos > 0:
|
|
113
|
-
pos -= 1
|
|
114
|
-
his = histories[pos]
|
|
115
|
-
cmd = his[0]
|
|
116
|
-
msg = his[1]
|
|
117
|
-
if isinstance(cmd, ResetCommand):
|
|
118
|
-
return cmd, msg
|
|
119
|
-
return None, None
|
|
120
|
-
|
|
121
|
-
# Override
|
|
122
|
-
async def clear_group_member_histories(self, group: ID) -> bool:
|
|
123
|
-
histories = await self.load_group_histories(group=group)
|
|
124
|
-
if len(histories) == 0:
|
|
125
|
-
# history empty
|
|
126
|
-
return True
|
|
127
|
-
array = []
|
|
128
|
-
removed = 0
|
|
129
|
-
for his in histories:
|
|
130
|
-
if isinstance(his[0], ResignCommand):
|
|
131
|
-
# keep 'resign' command messages
|
|
132
|
-
array.append(his)
|
|
133
|
-
else:
|
|
134
|
-
# remove other command messages
|
|
135
|
-
removed += 1
|
|
136
|
-
# if nothing changed, return True
|
|
137
|
-
# else, save new histories
|
|
138
|
-
return removed == 0 or await self.save_group_histories(group=group, histories=array)
|
|
139
|
-
|
|
140
|
-
# Override
|
|
141
|
-
async def clear_group_admin_histories(self, group: ID) -> bool:
|
|
142
|
-
histories = await self.load_group_histories(group=group)
|
|
143
|
-
if len(histories) == 0:
|
|
144
|
-
# history empty
|
|
145
|
-
return True
|
|
146
|
-
array = []
|
|
147
|
-
removed = 0
|
|
148
|
-
for his in histories:
|
|
149
|
-
if isinstance(his[0], ResignCommand):
|
|
150
|
-
# remove 'resign' command messages
|
|
151
|
-
removed += 1
|
|
152
|
-
else:
|
|
153
|
-
# keep other command messages
|
|
154
|
-
array.append(his)
|
|
155
|
-
# if nothing changed, return True
|
|
156
|
-
# else, save new histories
|
|
157
|
-
return removed == 0 or await self.save_group_histories(group=group, histories=array)
|
|
@@ -56,7 +56,17 @@ class DocumentCache(Cache):
|
|
|
56
56
|
def __cache_name(self, identifier: ID) -> str:
|
|
57
57
|
return '%s.%s.%s' % (self.db_name, self.tbl_name, identifier)
|
|
58
58
|
|
|
59
|
-
async def
|
|
59
|
+
async def save_documents(self, documents: List[Document], identifier: ID) -> bool:
|
|
60
|
+
array = []
|
|
61
|
+
for doc in documents:
|
|
62
|
+
assert doc.identifier == identifier, 'document ID not matched: %s, %s' % (identifier, doc)
|
|
63
|
+
array.append(doc.dictionary)
|
|
64
|
+
js = json_encode(obj=array)
|
|
65
|
+
value = utf8_encode(string=js)
|
|
66
|
+
name = self.__cache_name(identifier=identifier)
|
|
67
|
+
return await self.set(name=name, value=value, expires=self.EXPIRES)
|
|
68
|
+
|
|
69
|
+
async def load_documents(self, identifier: ID) -> Optional[List[Document]]:
|
|
60
70
|
name = self.__cache_name(identifier=identifier)
|
|
61
71
|
value = await self.get(name=name)
|
|
62
72
|
if value is None:
|
|
@@ -79,13 +89,3 @@ class DocumentCache(Cache):
|
|
|
79
89
|
else:
|
|
80
90
|
assert info is None, 'document error: %s' % value
|
|
81
91
|
return array
|
|
82
|
-
|
|
83
|
-
async def save_documents(self, documents: List[Document], identifier: ID) -> bool:
|
|
84
|
-
array = []
|
|
85
|
-
for doc in documents:
|
|
86
|
-
assert doc.identifier == identifier, 'document ID not matched: %s, %s' % (identifier, doc)
|
|
87
|
-
array.append(doc.dictionary)
|
|
88
|
-
js = json_encode(obj=array)
|
|
89
|
-
value = utf8_encode(string=js)
|
|
90
|
-
name = self.__cache_name(identifier=identifier)
|
|
91
|
-
return await self.set(name=name, value=value, expires=self.EXPIRES)
|
|
@@ -63,7 +63,7 @@ class DocTask(DbTask):
|
|
|
63
63
|
async def _load_redis_cache(self) -> Optional[List[Document]]:
|
|
64
64
|
# 1. the redis server will return None when cache not found
|
|
65
65
|
# 2. when redis server return an empty array, no need to check local storage again
|
|
66
|
-
return await self._redis.
|
|
66
|
+
return await self._redis.load_documents(identifier=self._identifier)
|
|
67
67
|
|
|
68
68
|
# Override
|
|
69
69
|
async def _save_redis_cache(self, value: List[Document]) -> bool:
|
|
@@ -73,7 +73,7 @@ class DocTask(DbTask):
|
|
|
73
73
|
async def _load_local_storage(self) -> Optional[List[Document]]:
|
|
74
74
|
# 1. the local storage will return an empty array, when no document for this id
|
|
75
75
|
# 2. return empty array as a placeholder for the memory cache
|
|
76
|
-
return await self._dos.
|
|
76
|
+
return await self._dos.load_documents(identifier=self._identifier)
|
|
77
77
|
|
|
78
78
|
# Override
|
|
79
79
|
async def _save_local_storage(self, value: List[Document]) -> bool:
|
|
@@ -75,7 +75,7 @@ class HisTask(DbTask):
|
|
|
75
75
|
async def _load_local_storage(self) -> Optional[List[Tuple[GroupCommand, ReliableMessage]]]:
|
|
76
76
|
# 1. the local storage will return an empty array, when no history in this group
|
|
77
77
|
# 2. return empty array as a placeholder for the memory cache
|
|
78
|
-
return await self._dos.
|
|
78
|
+
return await self._dos.load_group_histories(group=self._group)
|
|
79
79
|
|
|
80
80
|
# Override
|
|
81
81
|
async def _save_local_storage(self, value: List[Tuple[GroupCommand, ReliableMessage]]) -> bool:
|
|
@@ -101,14 +101,14 @@ class GroupHistoryTable(GroupHistoryDBI):
|
|
|
101
101
|
cache_pool=self._cache, redis=self._redis, storage=self._dos,
|
|
102
102
|
mutex_lock=self._lock)
|
|
103
103
|
|
|
104
|
-
async def
|
|
104
|
+
async def _load_group_histories(self, group: ID) -> List[Tuple[GroupCommand, ReliableMessage]]:
|
|
105
105
|
task = self._new_task(group=group)
|
|
106
106
|
histories = await task.load()
|
|
107
107
|
if histories is None:
|
|
108
108
|
histories = []
|
|
109
109
|
return histories
|
|
110
110
|
|
|
111
|
-
async def
|
|
111
|
+
async def _save_group_histories(self, group: ID, histories: List[Tuple[GroupCommand, ReliableMessage]]) -> bool:
|
|
112
112
|
task = self._new_task(group=group)
|
|
113
113
|
return await task.save(value=histories)
|
|
114
114
|
|
|
@@ -119,17 +119,17 @@ class GroupHistoryTable(GroupHistoryDBI):
|
|
|
119
119
|
# Override
|
|
120
120
|
async def save_group_history(self, group: ID, content: GroupCommand, message: ReliableMessage) -> bool:
|
|
121
121
|
item = (content, message)
|
|
122
|
-
histories = await self.
|
|
122
|
+
histories = await self._load_group_histories(group=group)
|
|
123
123
|
histories.append(item)
|
|
124
|
-
return await self.
|
|
124
|
+
return await self._save_group_histories(group=group, histories=histories)
|
|
125
125
|
|
|
126
126
|
# Override
|
|
127
127
|
async def get_group_histories(self, group: ID) -> List[Tuple[GroupCommand, ReliableMessage]]:
|
|
128
|
-
return await self.
|
|
128
|
+
return await self._load_group_histories(group=group)
|
|
129
129
|
|
|
130
130
|
# Override
|
|
131
131
|
async def get_reset_command_message(self, group: ID) -> Tuple[Optional[ResetCommand], Optional[ReliableMessage]]:
|
|
132
|
-
histories = await self.
|
|
132
|
+
histories = await self._load_group_histories(group=group)
|
|
133
133
|
pos = len(histories)
|
|
134
134
|
while pos > 0:
|
|
135
135
|
pos -= 1
|
|
@@ -142,7 +142,7 @@ class GroupHistoryTable(GroupHistoryDBI):
|
|
|
142
142
|
|
|
143
143
|
# Override
|
|
144
144
|
async def clear_group_member_histories(self, group: ID) -> bool:
|
|
145
|
-
histories = await self.
|
|
145
|
+
histories = await self._load_group_histories(group=group)
|
|
146
146
|
if len(histories) == 0:
|
|
147
147
|
# history empty
|
|
148
148
|
return True
|
|
@@ -157,11 +157,11 @@ class GroupHistoryTable(GroupHistoryDBI):
|
|
|
157
157
|
removed += 1
|
|
158
158
|
# if nothing changed, return True
|
|
159
159
|
# else, save new histories
|
|
160
|
-
return removed == 0 or await self.
|
|
160
|
+
return removed == 0 or await self._save_group_histories(group=group, histories=array)
|
|
161
161
|
|
|
162
162
|
# Override
|
|
163
163
|
async def clear_group_admin_histories(self, group: ID) -> bool:
|
|
164
|
-
histories = await self.
|
|
164
|
+
histories = await self._load_group_histories(group=group)
|
|
165
165
|
if len(histories) == 0:
|
|
166
166
|
# history empty
|
|
167
167
|
return True
|
|
@@ -176,4 +176,4 @@ class GroupHistoryTable(GroupHistoryDBI):
|
|
|
176
176
|
array.append(his)
|
|
177
177
|
# if nothing changed, return True
|
|
178
178
|
# else, save new histories
|
|
179
|
-
return removed == 0 or await self.
|
|
179
|
+
return removed == 0 or await self._save_group_histories(group=group, histories=array)
|
|
@@ -40,6 +40,7 @@ sys.path.insert(0, path)
|
|
|
40
40
|
from dimples.utils import Log, Runner
|
|
41
41
|
|
|
42
42
|
from dimples.client import ClientFacebook
|
|
43
|
+
from dimples.client import ClientMessenger
|
|
43
44
|
from dimples.client import ClientSession
|
|
44
45
|
from dimples.client import Terminal
|
|
45
46
|
|
|
@@ -52,7 +53,7 @@ from dimples.edge.messenger import InnerMessenger, OuterMessenger
|
|
|
52
53
|
class InnerClient(Terminal):
|
|
53
54
|
|
|
54
55
|
# Override
|
|
55
|
-
def _create_messenger(self, facebook: ClientFacebook, session: ClientSession):
|
|
56
|
+
def _create_messenger(self, facebook: ClientFacebook, session: ClientSession) -> ClientMessenger:
|
|
56
57
|
shared = GlobalVariable()
|
|
57
58
|
messenger = InnerMessenger(session=session, facebook=facebook, database=shared.mdb)
|
|
58
59
|
messenger.terminal = self # Weak Reference
|
|
@@ -63,7 +64,7 @@ class InnerClient(Terminal):
|
|
|
63
64
|
class OuterClient(Terminal):
|
|
64
65
|
|
|
65
66
|
# Override
|
|
66
|
-
def _create_messenger(self, facebook: ClientFacebook, session: ClientSession):
|
|
67
|
+
def _create_messenger(self, facebook: ClientFacebook, session: ClientSession) -> ClientMessenger:
|
|
67
68
|
shared = GlobalVariable()
|
|
68
69
|
messenger = OuterMessenger(session=session, facebook=facebook, database=shared.mdb)
|
|
69
70
|
messenger.terminal = self
|
|
@@ -14,7 +14,7 @@ import io
|
|
|
14
14
|
|
|
15
15
|
from setuptools import setup, find_packages
|
|
16
16
|
|
|
17
|
-
__version__ = '1.3.
|
|
17
|
+
__version__ = '1.3.5'
|
|
18
18
|
__author__ = 'Albert Moky'
|
|
19
19
|
__contact__ = 'albert.moky@gmail.com'
|
|
20
20
|
|
|
@@ -62,6 +62,6 @@ setup(
|
|
|
62
62
|
'tcp>=2.2.2',
|
|
63
63
|
'udp>=2.2.2',
|
|
64
64
|
|
|
65
|
-
'aiou>=0.
|
|
65
|
+
'aiou>=1.0.0',
|
|
66
66
|
]
|
|
67
67
|
)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|