dimples 1.4.1__tar.gz → 1.4.2__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.4.1 → dimples-1.4.2}/PKG-INFO +1 -1
- {dimples-1.4.1 → dimples-1.4.2}/dimples/__init__.py +1 -1
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/__init__.py +2 -2
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_base.py +10 -10
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_group.py +3 -3
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_group_history.py +1 -1
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_group_keys.py +1 -1
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_meta.py +1 -1
- {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/config.py +47 -14
- {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/http.py +4 -6
- {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/log.py +20 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/PKG-INFO +1 -1
- {dimples-1.4.1 → dimples-1.4.2}/setup.py +1 -1
- {dimples-1.4.1 → dimples-1.4.2}/LICENSE +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/README.md +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/checker.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/checkpoint.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/commands.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/creator.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/customized.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/group.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_expel.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_invite.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_join.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_query.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_quit.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_reset.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/grp_resign.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/cpu/handshake.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/facebook.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/messenger.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/network/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/network/session.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/network/state.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/network/transition.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/packer.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/processor.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/client/terminal.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/anonymous.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/ans.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/archivist.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/checker.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/address.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/compatible.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/entity.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/loader.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/meta.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/compat/network.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/dbi/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/dbi/account.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/dbi/message.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/dbi/session.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/facebook.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/messenger.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/packer.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/processer.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/ans.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/block.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/customized.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/group.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/handshake.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/login.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/mute.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/password.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/report.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/utils.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/protocol/version.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/queue.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/register.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/common/session.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/flexible.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/gate.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/gatekeeper.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/mars.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/mtp.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/protocol/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/protocol/mars.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/protocol/ws.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/queue.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/seeker.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/session.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/conn/ws.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/account.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/base.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/document.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/group.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/group_history.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/group_keys.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/login.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/meta.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/private.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/station.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/dos/user.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/message.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/base.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/document.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/group.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/grp_history.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/grp_keys.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/login.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/message.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/meta.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/station.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/redis/user.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/session.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_cipherkey.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_document.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_login.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_message.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_private.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_station.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/database/t_user.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/messenger.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/octopus.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/shared.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/edge/start.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/emitter.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/group/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/group/admin.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/group/builder.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/group/delegate.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/group/emitter.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/group/helper.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/group/manager.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/group/packer.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/group/shared.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/register/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/register/base.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/register/ext.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/register/run.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/register/shared.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/checker.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/ans.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/creator.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/document.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/handshake.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/login.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/cpu/report.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/deliver.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/dis_roamer.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/dispatcher.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/facebook.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/messenger.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/packer.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/processor.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/push.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/session.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/session_center.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/server/trace.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/station/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/station/handler.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/station/shared.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/station/start.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/__init__.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/cache.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples/utils/checker.py +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/SOURCES.txt +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/dependency_links.txt +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/entry_points.txt +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/requires.txt +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/dimples.egg-info/top_level.txt +0 -0
- {dimples-1.4.1 → dimples-1.4.2}/setup.cfg +0 -0
|
@@ -34,7 +34,7 @@ from ..common.dbi import *
|
|
|
34
34
|
from .dos import *
|
|
35
35
|
from .redis import *
|
|
36
36
|
|
|
37
|
-
from .t_base import DbTask
|
|
37
|
+
from .t_base import DbTask, DataCache
|
|
38
38
|
|
|
39
39
|
from .t_private import PrivateKeyTable
|
|
40
40
|
from .t_meta import MetaTable
|
|
@@ -100,7 +100,7 @@ __all__ = [
|
|
|
100
100
|
# Table
|
|
101
101
|
#
|
|
102
102
|
|
|
103
|
-
'DbTask',
|
|
103
|
+
'DbTask', 'DataCache',
|
|
104
104
|
|
|
105
105
|
'PrivateKeyTable', 'MetaTable', 'DocumentTable',
|
|
106
106
|
'UserTable', 'GroupTable', 'GroupHistoryTable',
|
|
@@ -61,37 +61,37 @@ class DbTask(Logging, Generic[K, V], ABC):
|
|
|
61
61
|
def __init__(self, mutex_lock: threading.Lock, cache_pool: CachePool,
|
|
62
62
|
cache_expires: float = None, cache_refresh: float = None):
|
|
63
63
|
super().__init__()
|
|
64
|
-
self.
|
|
64
|
+
self._lock = mutex_lock
|
|
65
65
|
# memory cache
|
|
66
|
-
self.
|
|
66
|
+
self._cache_pool = cache_pool
|
|
67
67
|
# memory expires
|
|
68
68
|
if cache_expires is None:
|
|
69
|
-
self.
|
|
69
|
+
self._cache_expires = self.MEM_CACHE_EXPIRES
|
|
70
70
|
else:
|
|
71
71
|
assert cache_expires > 0, 'cache expires durations error: %s' % cache_expires
|
|
72
|
-
self.
|
|
72
|
+
self._cache_expires = cache_expires
|
|
73
73
|
# memory refresh
|
|
74
74
|
if cache_refresh is None:
|
|
75
|
-
self.
|
|
75
|
+
self._cache_refresh = self.MEM_CACHE_REFRESH
|
|
76
76
|
else:
|
|
77
77
|
assert cache_refresh > 0, 'cache refresh durations error: %s' % cache_refresh
|
|
78
|
-
self.
|
|
78
|
+
self._cache_refresh = cache_refresh
|
|
79
79
|
|
|
80
80
|
@property # protected
|
|
81
81
|
def lock(self) -> threading.Lock:
|
|
82
|
-
return self.
|
|
82
|
+
return self._lock
|
|
83
83
|
|
|
84
84
|
@property # protected
|
|
85
85
|
def cache_pool(self) -> CachePool[K, V]:
|
|
86
|
-
return self.
|
|
86
|
+
return self._cache_pool
|
|
87
87
|
|
|
88
88
|
@property # protected
|
|
89
89
|
def cache_expires(self) -> float:
|
|
90
|
-
return self.
|
|
90
|
+
return self._cache_expires
|
|
91
91
|
|
|
92
92
|
@property # protected
|
|
93
93
|
def cache_refresh(self) -> float:
|
|
94
|
-
return self.
|
|
94
|
+
return self._cache_refresh
|
|
95
95
|
|
|
96
96
|
@property # protected
|
|
97
97
|
@abstractmethod
|
|
@@ -72,7 +72,7 @@ class MemberTask(GrpTask):
|
|
|
72
72
|
# 4. return empty array as a placeholder for the memory cache
|
|
73
73
|
members = []
|
|
74
74
|
# 5. update redis server
|
|
75
|
-
await self.
|
|
75
|
+
await self._redis.save_members(members=members, group=self._group)
|
|
76
76
|
return members
|
|
77
77
|
|
|
78
78
|
# Override
|
|
@@ -99,7 +99,7 @@ class BotTask(GrpTask):
|
|
|
99
99
|
# 4. return empty array as a placeholder for the memory cache
|
|
100
100
|
bots = []
|
|
101
101
|
# 5. update redis server
|
|
102
|
-
await self.
|
|
102
|
+
await self._redis.save_assistants(assistants=bots, group=self._group)
|
|
103
103
|
return bots
|
|
104
104
|
|
|
105
105
|
# Override
|
|
@@ -126,7 +126,7 @@ class AdminTask(GrpTask):
|
|
|
126
126
|
# 4. return empty array as a placeholder for the memory cache
|
|
127
127
|
admins = []
|
|
128
128
|
# 5. update redis server
|
|
129
|
-
await self.
|
|
129
|
+
await self._redis.save_administrators(administrators=admins, group=self._group)
|
|
130
130
|
return admins
|
|
131
131
|
|
|
132
132
|
# Override
|
|
@@ -68,7 +68,7 @@ class HisTask(DbTask[ID, List[Tuple[GroupCommand, ReliableMessage]]]):
|
|
|
68
68
|
# 4. return empty array as a placeholder for the memory cache
|
|
69
69
|
array = []
|
|
70
70
|
# 5. update redis server
|
|
71
|
-
await self.
|
|
71
|
+
await self._redis.save_group_histories(group=self._group, histories=array)
|
|
72
72
|
return array
|
|
73
73
|
|
|
74
74
|
# Override
|
|
@@ -67,7 +67,7 @@ class PwdTask(DbTask[Tuple[ID, ID], Dict[str, str]]):
|
|
|
67
67
|
# 4. return empty dictionary as a placeholder for the memory cache
|
|
68
68
|
keys = {}
|
|
69
69
|
# 5. update redis server
|
|
70
|
-
await self.
|
|
70
|
+
await self._redis.save_group_keys(group=self._group, sender=self._sender, keys=keys)
|
|
71
71
|
return keys
|
|
72
72
|
|
|
73
73
|
# Override
|
|
@@ -68,7 +68,7 @@ class TaiTask(DbTask[ID, Meta]):
|
|
|
68
68
|
meta = await self._dos.get_meta(identifier=self._identifier)
|
|
69
69
|
if meta is not None:
|
|
70
70
|
# 3. update redis server
|
|
71
|
-
await self.
|
|
71
|
+
await self._redis.save_meta(meta=meta, identifier=self._identifier)
|
|
72
72
|
return meta
|
|
73
73
|
|
|
74
74
|
# Override
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
# ==============================================================================
|
|
25
25
|
|
|
26
26
|
from configparser import ConfigParser
|
|
27
|
-
from typing import Optional, Any,
|
|
27
|
+
from typing import Optional, Any, List, Dict
|
|
28
28
|
from typing import Iterable
|
|
29
29
|
|
|
30
30
|
from aiou import JSONFile
|
|
@@ -33,6 +33,7 @@ from aiou import RedisConnector
|
|
|
33
33
|
from dimsdk import JSON
|
|
34
34
|
from dimsdk import Dictionary
|
|
35
35
|
from dimsdk import ID
|
|
36
|
+
from dimsdk import Facebook
|
|
36
37
|
|
|
37
38
|
from .log import Log, Logging
|
|
38
39
|
from .http import HttpClient
|
|
@@ -104,7 +105,8 @@ class Config(Logging):
|
|
|
104
105
|
def __init__(self):
|
|
105
106
|
super().__init__()
|
|
106
107
|
self.__parser: Optional[ConfigParser] = None
|
|
107
|
-
self.
|
|
108
|
+
self.__ready = False
|
|
109
|
+
self.__info = {}
|
|
108
110
|
self.__path: Optional[str] = None
|
|
109
111
|
self.__redis: Optional[RedisConnector] = None
|
|
110
112
|
self.__stations: List[MessageTransferAgent] = []
|
|
@@ -120,7 +122,7 @@ class Config(Logging):
|
|
|
120
122
|
parser = ConfigParser()
|
|
121
123
|
parser.read(path)
|
|
122
124
|
self.__parser = parser
|
|
123
|
-
self.
|
|
125
|
+
self.__ready = False
|
|
124
126
|
self.__stations = None
|
|
125
127
|
# load neighbor stations
|
|
126
128
|
try:
|
|
@@ -132,13 +134,12 @@ class Config(Logging):
|
|
|
132
134
|
|
|
133
135
|
@property
|
|
134
136
|
def dictionary(self) -> Optional[Dict]:
|
|
135
|
-
|
|
136
|
-
if
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
return info
|
|
137
|
+
parser = self.__parser
|
|
138
|
+
if parser is None or self.__ready:
|
|
139
|
+
return self.__info
|
|
140
|
+
else:
|
|
141
|
+
self.__ready = True
|
|
142
|
+
return _update_sections(info=self.__info, parser=parser)
|
|
142
143
|
|
|
143
144
|
# Override
|
|
144
145
|
def __str__(self) -> str:
|
|
@@ -198,6 +199,37 @@ class Config(Logging):
|
|
|
198
199
|
result.append(string)
|
|
199
200
|
return result
|
|
200
201
|
|
|
202
|
+
#
|
|
203
|
+
# ID list
|
|
204
|
+
#
|
|
205
|
+
|
|
206
|
+
def get_identifiers(self, section: str, option: str) -> List[ID]:
|
|
207
|
+
array = self.get_list(section=section, option=option)
|
|
208
|
+
return ID.convert(array=array)
|
|
209
|
+
|
|
210
|
+
async def get_users(self, section: str, option: str, facebook: Facebook) -> List[ID]:
|
|
211
|
+
users = []
|
|
212
|
+
array = self.get_identifiers(section=section, option=option)
|
|
213
|
+
for item in array:
|
|
214
|
+
if item.is_user:
|
|
215
|
+
if item not in users:
|
|
216
|
+
users.append(item)
|
|
217
|
+
continue
|
|
218
|
+
# extract group members
|
|
219
|
+
members = await facebook.get_members(identifier=item)
|
|
220
|
+
for usr in members:
|
|
221
|
+
if usr not in users:
|
|
222
|
+
users.append(usr)
|
|
223
|
+
return users
|
|
224
|
+
|
|
225
|
+
async def get_supervisors(self, section: str = 'admin', option: str = 'supervisors',
|
|
226
|
+
facebook: Facebook = None) -> List[ID]:
|
|
227
|
+
""" extract group members when facebook available """
|
|
228
|
+
if facebook is None:
|
|
229
|
+
return self.get_identifiers(section=section, option=option)
|
|
230
|
+
else:
|
|
231
|
+
return await self.get_users(section=section, option=option, facebook=facebook)
|
|
232
|
+
|
|
201
233
|
#
|
|
202
234
|
# database
|
|
203
235
|
#
|
|
@@ -335,10 +367,12 @@ class NeighborLoader(Logging):
|
|
|
335
367
|
self.info(msg='downloading stations: %s' % url)
|
|
336
368
|
http = self.__http
|
|
337
369
|
try:
|
|
338
|
-
|
|
339
|
-
if
|
|
370
|
+
response = http.cache_get(url=url)
|
|
371
|
+
if response is None or response.status_code != 200:
|
|
372
|
+
self.error(msg='failed to get URL: %s response: %s' % (url, response))
|
|
340
373
|
return None
|
|
341
374
|
else:
|
|
375
|
+
text = response.text
|
|
342
376
|
stations = JSON.decode(string=text)
|
|
343
377
|
except Exception as error:
|
|
344
378
|
self.error(msg='failed to download stations: %s, %s' % (error, url))
|
|
@@ -369,8 +403,7 @@ class NeighborLoader(Logging):
|
|
|
369
403
|
self.error(msg='failed to save stations: %s, %s' % (error, path))
|
|
370
404
|
|
|
371
405
|
|
|
372
|
-
def
|
|
373
|
-
info = {}
|
|
406
|
+
def _update_sections(info: Dict, parser: ConfigParser) -> Dict:
|
|
374
407
|
sections = parser.sections()
|
|
375
408
|
for name in sections:
|
|
376
409
|
options = _section_options(parser=parser, section=name)
|
|
@@ -158,7 +158,7 @@ class HttpClient(Logging):
|
|
|
158
158
|
def remove_cache(self, url: str):
|
|
159
159
|
self.__web_cache.erase(key=url)
|
|
160
160
|
|
|
161
|
-
def cache_get(self, url: str, headers: Dict = None):
|
|
161
|
+
def cache_get(self, url: str, headers: Dict = None) -> Optional[Response]:
|
|
162
162
|
now = DateTime.now()
|
|
163
163
|
# 1. check memory cache
|
|
164
164
|
value, holder = self.__web_cache.fetch(key=url, now=now)
|
|
@@ -174,11 +174,9 @@ class HttpClient(Logging):
|
|
|
174
174
|
# cache expired, wait to reload
|
|
175
175
|
holder.renewal(duration=self.CACHE_REFRESHING, now=now)
|
|
176
176
|
# 2. query remote server
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
# 3. update memory cache
|
|
181
|
-
self.__web_cache.update(key=url, value=value, life_span=self.CACHE_EXPIRES, now=now)
|
|
177
|
+
value = self.http_get(url=url, headers=headers)
|
|
178
|
+
# 3. update memory cache
|
|
179
|
+
self.__web_cache.update(key=url, value=value, life_span=self.CACHE_EXPIRES, now=now)
|
|
182
180
|
# OK, return cached value
|
|
183
181
|
return value
|
|
184
182
|
|
|
@@ -35,6 +35,16 @@ def current_time() -> str:
|
|
|
35
35
|
return str(DateTime.now())
|
|
36
36
|
|
|
37
37
|
|
|
38
|
+
def shorten(text: str, max_len: int = 1024) -> str:
|
|
39
|
+
# assert max_len > 128, 'too short: %s' % max_len
|
|
40
|
+
size = 0 if text is None else len(text)
|
|
41
|
+
if size <= max_len:
|
|
42
|
+
return text
|
|
43
|
+
desc = 'total %d chars' % size
|
|
44
|
+
pos = (max_len - len(desc) - 10) >> 1
|
|
45
|
+
return '%s ... %s ... %s' % (text[:pos], desc, text[-pos:])
|
|
46
|
+
|
|
47
|
+
|
|
38
48
|
DEBUG_FLAG = 0x01
|
|
39
49
|
INFO_FLAG = 0x02
|
|
40
50
|
WARNING_FLAG = 0x04
|
|
@@ -49,28 +59,38 @@ class Log:
|
|
|
49
59
|
|
|
50
60
|
LEVEL = RELEASE
|
|
51
61
|
|
|
62
|
+
MAX_LEN = 1024
|
|
63
|
+
|
|
52
64
|
@classmethod
|
|
53
65
|
def debug(cls, msg: str):
|
|
54
66
|
if cls.LEVEL & DEBUG_FLAG == 0:
|
|
55
67
|
return None
|
|
68
|
+
# elif cls.MAX_LEN > 0:
|
|
69
|
+
# msg = shorten(text=msg, max_len=cls.MAX_LEN)
|
|
56
70
|
print('[%s] DEBUG | %s' % (current_time(), msg))
|
|
57
71
|
|
|
58
72
|
@classmethod
|
|
59
73
|
def info(cls, msg: str):
|
|
60
74
|
if cls.LEVEL & INFO_FLAG == 0:
|
|
61
75
|
return None
|
|
76
|
+
elif cls.MAX_LEN > 0:
|
|
77
|
+
msg = shorten(text=msg, max_len=cls.MAX_LEN)
|
|
62
78
|
print('[%s] | %s' % (current_time(), msg))
|
|
63
79
|
|
|
64
80
|
@classmethod
|
|
65
81
|
def warning(cls, msg: str):
|
|
66
82
|
if cls.LEVEL & WARNING_FLAG == 0:
|
|
67
83
|
return None
|
|
84
|
+
elif cls.MAX_LEN > 0:
|
|
85
|
+
msg = shorten(text=msg, max_len=cls.MAX_LEN)
|
|
68
86
|
print('[%s] WARNING | %s' % (current_time(), msg))
|
|
69
87
|
|
|
70
88
|
@classmethod
|
|
71
89
|
def error(cls, msg: str):
|
|
72
90
|
if cls.LEVEL & ERROR_FLAG == 0:
|
|
73
91
|
return None
|
|
92
|
+
elif cls.MAX_LEN > 0:
|
|
93
|
+
msg = shorten(text=msg, max_len=cls.MAX_LEN)
|
|
74
94
|
print('[%s] ERROR | %s' % (current_time(), msg))
|
|
75
95
|
|
|
76
96
|
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|