reywechat 1.0.26__py3-none-any.whl → 1.0.28__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.
- reywechat/__init__.py +1 -0
- reywechat/rall.py +1 -0
- reywechat/rcache.py +46 -0
- reywechat/rdb.py +43 -47
- reywechat/rlog.py +28 -2
- reywechat/rreceive.py +42 -81
- reywechat/rsend.py +35 -45
- reywechat/rtrigger.py +7 -7
- reywechat/rwechat.py +10 -42
- {reywechat-1.0.26.dist-info → reywechat-1.0.28.dist-info}/METADATA +1 -1
- reywechat-1.0.28.dist-info/RECORD +17 -0
- reywechat-1.0.26.dist-info/RECORD +0 -16
- {reywechat-1.0.26.dist-info → reywechat-1.0.28.dist-info}/WHEEL +0 -0
- {reywechat-1.0.26.dist-info → reywechat-1.0.28.dist-info}/licenses/LICENSE +0 -0
reywechat/__init__.py
CHANGED
reywechat/rall.py
CHANGED
reywechat/rcache.py
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# !/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
"""
|
5
|
+
@Time : 2025-08-13 22:58:31
|
6
|
+
@Author : Rey
|
7
|
+
@Contact : reyxbo@163.com
|
8
|
+
@Explain : Cache methods.
|
9
|
+
"""
|
10
|
+
|
11
|
+
|
12
|
+
from reykit.ros import FileCache
|
13
|
+
|
14
|
+
from .rbase import BaseWeChat
|
15
|
+
from .rwechat import WeChat
|
16
|
+
|
17
|
+
|
18
|
+
__all__ = (
|
19
|
+
'WeChatCache',
|
20
|
+
)
|
21
|
+
|
22
|
+
|
23
|
+
class WeChatCache(BaseWeChat, FileCache):
|
24
|
+
"""
|
25
|
+
WeChat file cache type.
|
26
|
+
"""
|
27
|
+
|
28
|
+
|
29
|
+
def __init__(
|
30
|
+
self,
|
31
|
+
wechat: WeChat
|
32
|
+
) -> None:
|
33
|
+
"""
|
34
|
+
Build instance attributes.
|
35
|
+
|
36
|
+
Parameters
|
37
|
+
----------
|
38
|
+
wechat : `WeChatClient` instance.
|
39
|
+
"""
|
40
|
+
|
41
|
+
# Set attribute.
|
42
|
+
self.wechat = wechat
|
43
|
+
self.cache = FileCache(self.wechat.project_dir)
|
44
|
+
self.folder = self.cache.folder
|
45
|
+
self.index = self.cache.index
|
46
|
+
self.store = self.cache.store
|
reywechat/rdb.py
CHANGED
@@ -13,7 +13,7 @@ from typing import Any, Literal, overload
|
|
13
13
|
from json import loads as json_loads
|
14
14
|
from reydb.rdb import Database
|
15
15
|
from reykit.rbase import throw
|
16
|
-
from reykit.ros import Folder
|
16
|
+
from reykit.ros import File, Folder
|
17
17
|
from reykit.rtime import to_time, time_to, sleep
|
18
18
|
from reykit.rwrap import wrap_thread
|
19
19
|
|
@@ -56,10 +56,10 @@ class WeChatDatabase(BaseWeChat):
|
|
56
56
|
self.wechat = wechat
|
57
57
|
match rdatabase:
|
58
58
|
case Database():
|
59
|
-
self.rdatabase_wechat = self.rdatabase_file = rdatabase
|
59
|
+
self.rdatabase_wechat: Database = self.rdatabase_file = rdatabase
|
60
60
|
case dict():
|
61
|
-
self.rdatabase_wechat = rdatabase.get('wechat')
|
62
|
-
self.rdatabase_file = rdatabase.get('file')
|
61
|
+
self.rdatabase_wechat: Database = rdatabase.get('wechat')
|
62
|
+
self.rdatabase_file: Database = rdatabase.get('file')
|
63
63
|
if (
|
64
64
|
self.rdatabase_wechat
|
65
65
|
or self.rdatabase_file
|
@@ -77,11 +77,11 @@ class WeChatDatabase(BaseWeChat):
|
|
77
77
|
self.build()
|
78
78
|
|
79
79
|
# Add handler.
|
80
|
-
self.
|
81
|
-
self.
|
82
|
-
self.
|
83
|
-
self.
|
84
|
-
self.
|
80
|
+
self.__add_receiver_handler_to_contact_user()
|
81
|
+
self.__add_receiver_handler_to_contact_room()
|
82
|
+
self.__add_receiver_handler_to_contact_room_user()
|
83
|
+
self.__add_receiver_handler_to_message_receive()
|
84
|
+
self.__add_sender_handler_update_send_status()
|
85
85
|
|
86
86
|
# Loop.
|
87
87
|
self.__start_from_message_send()
|
@@ -714,14 +714,14 @@ class WeChatDatabase(BaseWeChat):
|
|
714
714
|
conn.close()
|
715
715
|
|
716
716
|
|
717
|
-
def
|
717
|
+
def __add_receiver_handler_to_contact_user(self) -> None:
|
718
718
|
"""
|
719
|
-
Add handler, write record to table `contact_user`.
|
719
|
+
Add receiver handler, write record to table `contact_user`.
|
720
720
|
"""
|
721
721
|
|
722
722
|
|
723
723
|
# Define.
|
724
|
-
def
|
724
|
+
def receiver_handler_to_contact_user(message: WeChatMessage) -> None:
|
725
725
|
"""
|
726
726
|
Write record to table `contact_user`.
|
727
727
|
|
@@ -750,17 +750,17 @@ class WeChatDatabase(BaseWeChat):
|
|
750
750
|
|
751
751
|
|
752
752
|
# Add handler.
|
753
|
-
self.wechat.receiver.add_handler(
|
753
|
+
self.wechat.receiver.add_handler(receiver_handler_to_contact_user)
|
754
754
|
|
755
755
|
|
756
|
-
def
|
756
|
+
def __add_receiver_handler_to_contact_room(self) -> None:
|
757
757
|
"""
|
758
|
-
Add handler, write record to table `contact_room`.
|
758
|
+
Add receiver handler, write record to table `contact_room`.
|
759
759
|
"""
|
760
760
|
|
761
761
|
|
762
762
|
# Define.
|
763
|
-
def
|
763
|
+
def receiver_handler_to_contact_room(message: WeChatMessage) -> None:
|
764
764
|
"""
|
765
765
|
Write record to table `contact_room`.
|
766
766
|
|
@@ -834,17 +834,17 @@ class WeChatDatabase(BaseWeChat):
|
|
834
834
|
|
835
835
|
|
836
836
|
# Add handler.
|
837
|
-
self.wechat.receiver.add_handler(
|
837
|
+
self.wechat.receiver.add_handler(receiver_handler_to_contact_room)
|
838
838
|
|
839
839
|
|
840
|
-
def
|
840
|
+
def __add_receiver_handler_to_contact_room_user(self) -> None:
|
841
841
|
"""
|
842
|
-
Add handler, write record to table `contact_room_user`.
|
842
|
+
Add receiver handler, write record to table `contact_room_user`.
|
843
843
|
"""
|
844
844
|
|
845
845
|
|
846
846
|
# Define.
|
847
|
-
def
|
847
|
+
def receiver_handler_to_contact_room_user(message: WeChatMessage) -> None:
|
848
848
|
"""
|
849
849
|
Write record to table `contact_room_user`.
|
850
850
|
|
@@ -864,17 +864,17 @@ class WeChatDatabase(BaseWeChat):
|
|
864
864
|
|
865
865
|
|
866
866
|
# Add handler.
|
867
|
-
self.wechat.receiver.add_handler(
|
867
|
+
self.wechat.receiver.add_handler(receiver_handler_to_contact_room_user)
|
868
868
|
|
869
869
|
|
870
|
-
def
|
870
|
+
def __add_receiver_handler_to_message_receive(self) -> None:
|
871
871
|
"""
|
872
|
-
Add handler, write record to table `message_receive`.
|
872
|
+
Add receiver handler, write record to table `message_receive`.
|
873
873
|
"""
|
874
874
|
|
875
875
|
|
876
876
|
# Define.
|
877
|
-
def
|
877
|
+
def receiver_handler_to_message_receive(message: WeChatMessage) -> None:
|
878
878
|
"""
|
879
879
|
Write record to table `message_receive`.
|
880
880
|
|
@@ -915,17 +915,17 @@ class WeChatDatabase(BaseWeChat):
|
|
915
915
|
|
916
916
|
|
917
917
|
# Add handler.
|
918
|
-
self.wechat.receiver.add_handler(
|
918
|
+
self.wechat.receiver.add_handler(receiver_handler_to_message_receive)
|
919
919
|
|
920
920
|
|
921
|
-
def
|
921
|
+
def __add_sender_handler_update_send_status(self) -> None:
|
922
922
|
"""
|
923
|
-
|
923
|
+
Add sender handler, update field `status` of table `message_send`.
|
924
924
|
"""
|
925
925
|
|
926
926
|
|
927
927
|
# Define.
|
928
|
-
def
|
928
|
+
def sender_handler_update_send_status(sendparam: WeChatSendParameter) -> None:
|
929
929
|
"""
|
930
930
|
Update field `status` of table `message_send`.
|
931
931
|
|
@@ -953,7 +953,7 @@ class WeChatDatabase(BaseWeChat):
|
|
953
953
|
|
954
954
|
|
955
955
|
# Add handler.
|
956
|
-
self.wechat.sender.add_handler(
|
956
|
+
self.wechat.sender.add_handler(sender_handler_update_send_status)
|
957
957
|
|
958
958
|
|
959
959
|
def __download_file(
|
@@ -972,26 +972,18 @@ class WeChatDatabase(BaseWeChat):
|
|
972
972
|
File save path and file name.
|
973
973
|
"""
|
974
974
|
|
975
|
-
#
|
975
|
+
# Information.
|
976
976
|
file_info = self.rdatabase_file.file.query(file_id)
|
977
|
-
file_name = file_info['name']
|
978
977
|
file_md5 = file_info['md5']
|
978
|
+
file_name = file_info['name']
|
979
979
|
|
980
|
-
#
|
981
|
-
|
982
|
-
pattern = f'^{file_md5}$'
|
983
|
-
cache_path = rfolder.search(pattern)
|
980
|
+
# Cache.
|
981
|
+
cache_path = self.wechat.cache.index(file_md5, file_name, True)
|
984
982
|
|
985
|
-
|
983
|
+
## Download.
|
986
984
|
if cache_path is None:
|
987
|
-
|
988
|
-
|
989
|
-
file_md5
|
990
|
-
)
|
991
|
-
self.rdatabase_file.file.download(
|
992
|
-
file_id,
|
993
|
-
cache_path
|
994
|
-
)
|
985
|
+
file_bytes = self.rdatabase_file.file.download(file_id)
|
986
|
+
cache_path = self.wechat.cache.store(file_bytes, file_name)
|
995
987
|
|
996
988
|
return cache_path, file_name
|
997
989
|
|
@@ -1055,7 +1047,7 @@ class WeChatDatabase(BaseWeChat):
|
|
1055
1047
|
send_type = WeChatSendEnum(type_)
|
1056
1048
|
parameter: dict = json_loads(parameter)
|
1057
1049
|
|
1058
|
-
##
|
1050
|
+
## File.
|
1059
1051
|
if file_id is not None:
|
1060
1052
|
file_path, file_name = self.__download_file(file_id)
|
1061
1053
|
parameter['file_path'] = file_path
|
@@ -1068,7 +1060,7 @@ class WeChatDatabase(BaseWeChat):
|
|
1068
1060
|
send_id,
|
1069
1061
|
**parameter
|
1070
1062
|
)
|
1071
|
-
self.wechat.sender.
|
1063
|
+
self.wechat.sender.queue.put(sendparam)
|
1072
1064
|
|
1073
1065
|
# Commit.
|
1074
1066
|
conn.commit()
|
@@ -1243,8 +1235,12 @@ class WeChatDatabase(BaseWeChat):
|
|
1243
1235
|
file_name: str = params.pop('file_name')
|
1244
1236
|
else:
|
1245
1237
|
file_name = None
|
1238
|
+
|
1239
|
+
## Cache.
|
1240
|
+
cache_path = self.wechat.cache.store(file_path, file_name)
|
1241
|
+
|
1246
1242
|
file_id = self.rdatabase_file.file.upload(
|
1247
|
-
|
1243
|
+
cache_path,
|
1248
1244
|
file_name,
|
1249
1245
|
'WeChat'
|
1250
1246
|
)
|
reywechat/rlog.py
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
"""
|
10
10
|
|
11
11
|
|
12
|
-
from os.path import join as os_join
|
13
12
|
from reykit.rlog import Log
|
13
|
+
from reykit.ros import Folder, join_path
|
14
14
|
|
15
15
|
from .rbase import BaseWeChat
|
16
16
|
from .rreceive import WeChatMessage
|
@@ -44,6 +44,9 @@ class WeChatLog(BaseWeChat):
|
|
44
44
|
# Set attribute.
|
45
45
|
self.wechat = wechat
|
46
46
|
|
47
|
+
# Make directory.
|
48
|
+
self.folder = self.__make_dir()
|
49
|
+
|
47
50
|
# Logger.
|
48
51
|
self.rrlog = Log('WeChat')
|
49
52
|
self.rrlog_print = Log('WeChat.WeChatPrint')
|
@@ -53,6 +56,29 @@ class WeChatLog(BaseWeChat):
|
|
53
56
|
self.__add_handler()
|
54
57
|
|
55
58
|
|
59
|
+
def __make_dir(self) -> Folder:
|
60
|
+
"""
|
61
|
+
Make directory 'project_dir/log'.
|
62
|
+
|
63
|
+
Parameters
|
64
|
+
----------
|
65
|
+
project_dir: Project directory.
|
66
|
+
|
67
|
+
Returns
|
68
|
+
-------
|
69
|
+
Folder instance.
|
70
|
+
"""
|
71
|
+
|
72
|
+
# Set parameter.
|
73
|
+
dir_path = join_path(self.wechat.project_dir, 'log')
|
74
|
+
|
75
|
+
# Make.
|
76
|
+
folder = Folder(dir_path)
|
77
|
+
folder.make()
|
78
|
+
|
79
|
+
return folder
|
80
|
+
|
81
|
+
|
56
82
|
def __add_handler(self) -> None:
|
57
83
|
"""
|
58
84
|
Add log handler.
|
@@ -74,7 +100,7 @@ class WeChatLog(BaseWeChat):
|
|
74
100
|
self.rrlog_print.add_print(format_=format_)
|
75
101
|
|
76
102
|
## Add handler file.
|
77
|
-
file_path =
|
103
|
+
file_path = self.wechat.log.folder + 'wechat'
|
78
104
|
self.rrlog_file.add_file(
|
79
105
|
file_path,
|
80
106
|
time='m',
|
reywechat/rreceive.py
CHANGED
@@ -1011,21 +1011,22 @@ class WechatReceiver(BaseWeChat):
|
|
1011
1011
|
|
1012
1012
|
# Set parameter.
|
1013
1013
|
handlers = [
|
1014
|
-
self.
|
1015
|
-
self.
|
1014
|
+
self.__receiver_handler_room,
|
1015
|
+
self.__receiver_handler_file,
|
1016
1016
|
*self.handlers
|
1017
1017
|
]
|
1018
1018
|
|
1019
1019
|
# Handle.
|
1020
1020
|
|
1021
1021
|
## Define.
|
1022
|
-
def handle_handler_exception() -> None:
|
1022
|
+
def handle_handler_exception(exc_report, *_) -> None:
|
1023
1023
|
"""
|
1024
1024
|
Handle Handler exception.
|
1025
|
-
"""
|
1026
1025
|
|
1027
|
-
|
1028
|
-
|
1026
|
+
Parameters
|
1027
|
+
----------
|
1028
|
+
exc_report : Exception report text.
|
1029
|
+
"""
|
1029
1030
|
|
1030
1031
|
# Save.
|
1031
1032
|
message.exc_reports.append(exc_report)
|
@@ -1080,7 +1081,7 @@ class WechatReceiver(BaseWeChat):
|
|
1080
1081
|
self.handlers.append(handler)
|
1081
1082
|
|
1082
1083
|
|
1083
|
-
def
|
1084
|
+
def __receiver_handler_room(
|
1084
1085
|
self,
|
1085
1086
|
message: WeChatMessage
|
1086
1087
|
) -> None:
|
@@ -1105,7 +1106,7 @@ class WechatReceiver(BaseWeChat):
|
|
1105
1106
|
message.user = None
|
1106
1107
|
|
1107
1108
|
|
1108
|
-
def
|
1109
|
+
def __receiver_handler_file(
|
1109
1110
|
self,
|
1110
1111
|
message: WeChatMessage
|
1111
1112
|
) -> None:
|
@@ -1114,69 +1115,43 @@ class WechatReceiver(BaseWeChat):
|
|
1114
1115
|
"""
|
1115
1116
|
|
1116
1117
|
# Download.
|
1117
|
-
folder = Folder(self.wechat.dir_cache)
|
1118
|
-
generate_path = None
|
1119
1118
|
match message.type:
|
1120
1119
|
|
1121
1120
|
## Image.
|
1122
1121
|
case 3:
|
1122
|
+
pattern = r' md5="([\da-f]{32})"'
|
1123
|
+
file_md5: str = search(pattern, message.data)
|
1124
|
+
cache_path = self.wechat.cache.index(file_md5, copy=True)
|
1123
1125
|
|
1124
|
-
###
|
1125
|
-
file_name = f'{message.id}.jpg'
|
1126
|
-
pattern = r'length="(\d+)".*?md5="([\da-f]{32})"'
|
1127
|
-
result: tuple[str, str] = search(pattern, message.data)
|
1128
|
-
file_size, file_md5 = result
|
1129
|
-
file_size = int(file_size)
|
1130
|
-
|
1131
|
-
### Exist.
|
1132
|
-
pattern = f'^{file_md5}$'
|
1133
|
-
cache_path = folder.search(pattern)
|
1134
|
-
|
1135
|
-
### Generate.
|
1126
|
+
### Download.
|
1136
1127
|
if cache_path is None:
|
1137
1128
|
self.wechat.client.download_file(message.id)
|
1138
|
-
|
1129
|
+
download_path = '%swxhelper/image/%s.dat' % (
|
1139
1130
|
self.wechat.client.login_info['account_data_path'],
|
1140
1131
|
message.id
|
1141
1132
|
)
|
1142
1133
|
|
1143
1134
|
## Voice.
|
1144
1135
|
case 34:
|
1136
|
+
cache_path = None
|
1145
1137
|
|
1146
|
-
###
|
1147
|
-
file_name = f'{message.id}.amr'
|
1148
|
-
pattern = r'length="(\d+)"'
|
1149
|
-
file_size = int(search(pattern, message.data))
|
1150
|
-
file_md5 = None
|
1151
|
-
|
1152
|
-
### Generate.
|
1138
|
+
### Download.
|
1153
1139
|
self.wechat.client.download_voice(
|
1154
1140
|
message.id,
|
1155
|
-
self.wechat.
|
1156
|
-
)
|
1157
|
-
generate_path = '%s/%s.amr' % (
|
1158
|
-
self.wechat.dir_cache,
|
1159
|
-
message.id
|
1141
|
+
self.wechat.cache.folder.path
|
1160
1142
|
)
|
1143
|
+
download_path = self.wechat.cache.folder + f'{message.id}.amr'
|
1161
1144
|
|
1162
1145
|
## Video.
|
1163
1146
|
case 43:
|
1147
|
+
pattern = r' md5="([\da-f]{32})"'
|
1148
|
+
file_md5: str = search(pattern, message.data)
|
1149
|
+
cache_path = self.wechat.cache.index(file_md5, copy=True)
|
1164
1150
|
|
1165
|
-
###
|
1166
|
-
file_name = f'{message.id}.mp4'
|
1167
|
-
pattern = r'length="(\d+)"'
|
1168
|
-
file_size = int(search(pattern, message.data))
|
1169
|
-
pattern = r'md5="([\da-f]{32})"'
|
1170
|
-
file_md5 = search(pattern, message.data)
|
1171
|
-
|
1172
|
-
### Exist.
|
1173
|
-
pattern = f'^{file_md5}$'
|
1174
|
-
cache_path = folder.search(pattern)
|
1175
|
-
|
1176
|
-
### Generate.
|
1151
|
+
### Download.
|
1177
1152
|
if cache_path is None:
|
1178
1153
|
self.wechat.client.download_file(message.id)
|
1179
|
-
|
1154
|
+
download_path = '%swxhelper/video/%s.mp4' % (
|
1180
1155
|
self.wechat.client.login_info['account_data_path'],
|
1181
1156
|
message.id
|
1182
1157
|
)
|
@@ -1186,26 +1161,21 @@ class WechatReceiver(BaseWeChat):
|
|
1186
1161
|
|
1187
1162
|
### Check.
|
1188
1163
|
pattern = r'^.+? : \[文件\](.+)$'
|
1189
|
-
file_name = search(pattern, message.display)
|
1190
|
-
if
|
1191
|
-
|
1192
|
-
|
1164
|
+
file_name: str | None = search(pattern, message.display)
|
1165
|
+
if (
|
1166
|
+
file_name is None
|
1167
|
+
or '<type>6</type>' not in message.data
|
1168
|
+
):
|
1193
1169
|
return
|
1194
1170
|
|
1195
|
-
### Get attribute.
|
1196
|
-
pattern = r'<totallen>(\d+)</totallen>'
|
1197
|
-
file_size = int(search(pattern, message.data))
|
1198
1171
|
pattern = r'<md5>([\da-f]{32})</md5>'
|
1199
|
-
file_md5 = search(pattern, message.data)
|
1172
|
+
file_md5: str = search(pattern, message.data)
|
1173
|
+
cache_path = self.wechat.cache.index(file_md5, file_name, copy=True)
|
1200
1174
|
|
1201
|
-
###
|
1202
|
-
pattern = f'^{file_md5}$'
|
1203
|
-
cache_path = folder.search(pattern)
|
1204
|
-
|
1205
|
-
### Generate.
|
1175
|
+
### Download.
|
1206
1176
|
if cache_path is None:
|
1207
1177
|
self.wechat.client.download_file(message.id)
|
1208
|
-
|
1178
|
+
download_path = '%swxhelper/file/%s_%s' % (
|
1209
1179
|
self.wechat.client.login_info['account_data_path'],
|
1210
1180
|
message.id,
|
1211
1181
|
file_name
|
@@ -1215,38 +1185,29 @@ class WechatReceiver(BaseWeChat):
|
|
1215
1185
|
case _:
|
1216
1186
|
return
|
1217
1187
|
|
1218
|
-
if
|
1188
|
+
if cache_path is None:
|
1219
1189
|
|
1220
1190
|
## Wait.
|
1221
1191
|
wait(
|
1222
1192
|
os_exists,
|
1223
|
-
|
1193
|
+
download_path,
|
1224
1194
|
_interval = 0.05,
|
1225
1195
|
_timeout=3600
|
1226
1196
|
)
|
1227
1197
|
sleep(0.2)
|
1228
1198
|
|
1229
|
-
##
|
1230
|
-
|
1231
|
-
cache_path = None
|
1232
|
-
if file_md5 is None:
|
1233
|
-
file_md5 = rfile.md5
|
1234
|
-
|
1235
|
-
### Exist.
|
1236
|
-
pattern = f'^{file_md5}$'
|
1237
|
-
cache_path = folder.search(pattern)
|
1238
|
-
|
1239
|
-
if cache_path is None:
|
1240
|
-
rfile.move(cache_path)
|
1199
|
+
## Cache.
|
1200
|
+
cache_path = self.wechat.cache.store(download_path, file_name, delete=True)
|
1241
1201
|
|
1242
1202
|
# Set parameter.
|
1243
|
-
file
|
1203
|
+
file = File(cache_path)
|
1204
|
+
message_file: MessageParameterFile = {
|
1244
1205
|
'path': cache_path,
|
1245
|
-
'name':
|
1246
|
-
'md5':
|
1247
|
-
'size':
|
1206
|
+
'name': file.name,
|
1207
|
+
'md5': file.md5,
|
1208
|
+
'size': file.size
|
1248
1209
|
}
|
1249
|
-
message.file =
|
1210
|
+
message.file = message_file
|
1250
1211
|
|
1251
1212
|
|
1252
1213
|
def start(self) -> None:
|
reywechat/rsend.py
CHANGED
@@ -73,7 +73,7 @@ class WeChatSendParameter(BaseWeChat):
|
|
73
73
|
sender: WeChatSender,
|
74
74
|
send_type: Literal[WeChatSendEnum.SEND_TEXT],
|
75
75
|
receive_id: str,
|
76
|
-
send_id: int
|
76
|
+
send_id: int,
|
77
77
|
*,
|
78
78
|
text: str
|
79
79
|
) -> None: ...
|
@@ -84,7 +84,7 @@ class WeChatSendParameter(BaseWeChat):
|
|
84
84
|
sender: WeChatSender,
|
85
85
|
send_type: Literal[WeChatSendEnum.SEND_TEXT_AT],
|
86
86
|
receive_id: str,
|
87
|
-
send_id: int
|
87
|
+
send_id: int,
|
88
88
|
*,
|
89
89
|
user_id: str | list[str] | Literal['notify@all'],
|
90
90
|
text: str
|
@@ -96,7 +96,7 @@ class WeChatSendParameter(BaseWeChat):
|
|
96
96
|
sender: WeChatSender,
|
97
97
|
send_type: Literal[WeChatSendEnum.SEND_FILE, WeChatSendEnum.SEND_IMAGE, WeChatSendEnum.SEND_EMOTION],
|
98
98
|
receive_id: str,
|
99
|
-
send_id: int
|
99
|
+
send_id: int,
|
100
100
|
*,
|
101
101
|
file_path: str,
|
102
102
|
file_name: str
|
@@ -108,7 +108,7 @@ class WeChatSendParameter(BaseWeChat):
|
|
108
108
|
sender: WeChatSender,
|
109
109
|
send_type: Literal[WeChatSendEnum.SEND_PAT],
|
110
110
|
receive_id: str,
|
111
|
-
send_id: int
|
111
|
+
send_id: int,
|
112
112
|
*,
|
113
113
|
user_id: str
|
114
114
|
) -> None: ...
|
@@ -119,7 +119,7 @@ class WeChatSendParameter(BaseWeChat):
|
|
119
119
|
sender: WeChatSender,
|
120
120
|
send_type: Literal[WeChatSendEnum.SEND_PUBLIC],
|
121
121
|
receive_id: str,
|
122
|
-
send_id: int
|
122
|
+
send_id: int,
|
123
123
|
*,
|
124
124
|
page_url: str,
|
125
125
|
title: str,
|
@@ -135,7 +135,7 @@ class WeChatSendParameter(BaseWeChat):
|
|
135
135
|
sender: WeChatSender,
|
136
136
|
send_type: Literal[WeChatSendEnum.SEND_FORWARD],
|
137
137
|
receive_id: str,
|
138
|
-
send_id: int
|
138
|
+
send_id: int,
|
139
139
|
*,
|
140
140
|
message_id: str
|
141
141
|
) -> None: ...
|
@@ -145,7 +145,7 @@ class WeChatSendParameter(BaseWeChat):
|
|
145
145
|
sender: WeChatSender,
|
146
146
|
send_type: WeChatSendEnum,
|
147
147
|
receive_id: str,
|
148
|
-
send_id: int
|
148
|
+
send_id: int,
|
149
149
|
**params: Any
|
150
150
|
) -> None:
|
151
151
|
"""
|
@@ -175,6 +175,7 @@ class WeChatSendParameter(BaseWeChat):
|
|
175
175
|
self.send_id = send_id
|
176
176
|
self.params = params
|
177
177
|
self.exc_reports: list[str] = []
|
178
|
+
self.sent: bool = False
|
178
179
|
|
179
180
|
|
180
181
|
class WeChatSender(BaseWeChat):
|
@@ -200,7 +201,6 @@ class WeChatSender(BaseWeChat):
|
|
200
201
|
|
201
202
|
# Set attribute.
|
202
203
|
self.wechat = wechat
|
203
|
-
self.send = self.__call__ = self.wechat.database.send
|
204
204
|
self.queue: Queue[WeChatSendParameter] = Queue()
|
205
205
|
self.handlers: list[Callable[[WeChatSendParameter], Any]] = []
|
206
206
|
self.started: bool | None = False
|
@@ -215,6 +215,21 @@ class WeChatSender(BaseWeChat):
|
|
215
215
|
Start sender, that will sequentially send message in the send queue.
|
216
216
|
"""
|
217
217
|
|
218
|
+
|
219
|
+
# Define.
|
220
|
+
def handle_handler_exception(exc_report, *_) -> None:
|
221
|
+
"""
|
222
|
+
Handle Handler exception.
|
223
|
+
|
224
|
+
Parameters
|
225
|
+
----------
|
226
|
+
exc_report : Exception report text.
|
227
|
+
"""
|
228
|
+
|
229
|
+
# Save.
|
230
|
+
sendparam.exc_reports.append(exc_report)
|
231
|
+
|
232
|
+
|
218
233
|
# Loop.
|
219
234
|
while True:
|
220
235
|
match self.started:
|
@@ -228,8 +243,14 @@ class WeChatSender(BaseWeChat):
|
|
228
243
|
case None:
|
229
244
|
break
|
230
245
|
|
231
|
-
## Send.
|
232
246
|
sendparam = self.queue.get()
|
247
|
+
|
248
|
+
## Handler.
|
249
|
+
for handler in self.handlers:
|
250
|
+
handler = wrap_exc(handler, handler=handle_handler_exception)
|
251
|
+
handler(sendparam)
|
252
|
+
|
253
|
+
## Send.
|
233
254
|
try:
|
234
255
|
self.__send(sendparam)
|
235
256
|
|
@@ -242,23 +263,9 @@ class WeChatSender(BaseWeChat):
|
|
242
263
|
# Save.
|
243
264
|
sendparam.exc_reports.append(exc_report)
|
244
265
|
|
266
|
+
sendparam.sent = True
|
245
267
|
|
246
|
-
##
|
247
|
-
|
248
|
-
### Define.
|
249
|
-
def handle_handler_exception() -> None:
|
250
|
-
"""
|
251
|
-
Handle Handler exception.
|
252
|
-
"""
|
253
|
-
|
254
|
-
# Catch exception.
|
255
|
-
exc_report, *_ = catch_exc()
|
256
|
-
|
257
|
-
# Save.
|
258
|
-
sendparam.exc_reports.append(exc_report)
|
259
|
-
|
260
|
-
|
261
|
-
### Loop.
|
268
|
+
## Handler.
|
262
269
|
for handler in self.handlers:
|
263
270
|
handler = wrap_exc(handler, handler=handle_handler_exception)
|
264
271
|
handler(sendparam)
|
@@ -279,15 +286,6 @@ class WeChatSender(BaseWeChat):
|
|
279
286
|
sendparam : `WeChatSendParameter` instance.
|
280
287
|
"""
|
281
288
|
|
282
|
-
# File rename to new.
|
283
|
-
if (
|
284
|
-
(file_path := sendparam.params.get('file_path')) is not None
|
285
|
-
and (file_name := sendparam.params.get('file_name')) is not None
|
286
|
-
):
|
287
|
-
file = File(file_path)
|
288
|
-
file_old_name = file.name
|
289
|
-
file_path_rename = file.rename(file_name)
|
290
|
-
|
291
289
|
# Send.
|
292
290
|
match sendparam.send_type:
|
293
291
|
|
@@ -310,21 +308,21 @@ class WeChatSender(BaseWeChat):
|
|
310
308
|
case WeChatSendEnum.SEND_FILE:
|
311
309
|
self.wechat.client.send_file(
|
312
310
|
sendparam.receive_id,
|
313
|
-
|
311
|
+
sendparam.params['file_path']
|
314
312
|
)
|
315
313
|
|
316
314
|
## Image.
|
317
315
|
case WeChatSendEnum.SEND_IMAGE:
|
318
316
|
self.wechat.client.send_image(
|
319
317
|
sendparam.receive_id,
|
320
|
-
|
318
|
+
sendparam.params['file_path']
|
321
319
|
)
|
322
320
|
|
323
321
|
## Emotion.
|
324
322
|
case WeChatSendEnum.SEND_EMOTION:
|
325
323
|
self.wechat.client.send_emotion(
|
326
324
|
sendparam.receive_id,
|
327
|
-
|
325
|
+
sendparam.params['file_path']
|
328
326
|
)
|
329
327
|
|
330
328
|
## Pat.
|
@@ -357,14 +355,6 @@ class WeChatSender(BaseWeChat):
|
|
357
355
|
case send_type:
|
358
356
|
throw(ValueError, send_type)
|
359
357
|
|
360
|
-
# File rename to old.
|
361
|
-
if (
|
362
|
-
file_path is not None
|
363
|
-
and file_name is not None
|
364
|
-
):
|
365
|
-
file = File(file_path_rename)
|
366
|
-
file.rename(file_old_name)
|
367
|
-
|
368
358
|
|
369
359
|
def add_handler(
|
370
360
|
self,
|
reywechat/rtrigger.py
CHANGED
@@ -48,15 +48,15 @@ class WeChatTrigger(BaseWeChat):
|
|
48
48
|
self.rules: list[TriggerRule] = []
|
49
49
|
|
50
50
|
# Add handler.
|
51
|
-
self.handler = self.
|
51
|
+
self.handler = self.__add_receiver_handler_trigger_by_rule()
|
52
52
|
|
53
53
|
# Add trigger.
|
54
54
|
self.__add_trigger_valid()
|
55
55
|
|
56
56
|
|
57
|
-
def
|
57
|
+
def __add_receiver_handler_trigger_by_rule(self) -> Callable[[WeChatMessage], None]:
|
58
58
|
"""
|
59
|
-
Add handler, trigger message by rules.
|
59
|
+
Add receiver handler, trigger message by rules.
|
60
60
|
|
61
61
|
Returns
|
62
62
|
-------
|
@@ -65,7 +65,7 @@ class WeChatTrigger(BaseWeChat):
|
|
65
65
|
|
66
66
|
|
67
67
|
# Define.
|
68
|
-
def
|
68
|
+
def receiver_handler_trigger_by_rule(message: WeChatMessage) -> None:
|
69
69
|
"""
|
70
70
|
Trigger message by rules.
|
71
71
|
|
@@ -111,9 +111,9 @@ class WeChatTrigger(BaseWeChat):
|
|
111
111
|
|
112
112
|
|
113
113
|
# Add handler.
|
114
|
-
self.receiver.add_handler(
|
114
|
+
self.receiver.add_handler(receiver_handler_trigger_by_rule)
|
115
115
|
|
116
|
-
return
|
116
|
+
return receiver_handler_trigger_by_rule
|
117
117
|
|
118
118
|
|
119
119
|
def add_rule(
|
@@ -199,4 +199,4 @@ class WeChatTrigger(BaseWeChat):
|
|
199
199
|
|
200
200
|
|
201
201
|
# Add.
|
202
|
-
self.add_rule(trigger_valid, float('inf'))
|
202
|
+
self.add_rule(trigger_valid, float('inf'), False)
|
reywechat/rwechat.py
CHANGED
@@ -11,10 +11,9 @@
|
|
11
11
|
|
12
12
|
from typing import Literal
|
13
13
|
from os import getcwd as os_getcwd
|
14
|
-
from os.path import join as os_join
|
15
14
|
from reydb.rdb import Database
|
16
15
|
from reykit.rbase import block
|
17
|
-
from reykit.ros import
|
16
|
+
from reykit.ros import Folder, join_path
|
18
17
|
|
19
18
|
from .rbase import BaseWeChat
|
20
19
|
|
@@ -63,6 +62,7 @@ class WeChat(BaseWeChat):
|
|
63
62
|
"""
|
64
63
|
|
65
64
|
# Import.
|
65
|
+
from .rcache import WeChatCache
|
66
66
|
from .rclient import WeChatClient
|
67
67
|
from .rdb import WeChatDatabase
|
68
68
|
from .rlog import WeChatLog
|
@@ -70,14 +70,12 @@ class WeChat(BaseWeChat):
|
|
70
70
|
from .rschedule import WeChatSchedule
|
71
71
|
from .rsend import WeChatSender
|
72
72
|
|
73
|
-
# Make directory.
|
74
|
-
project_dir = project_dir or os_getcwd()
|
75
|
-
self.dir_cache, self.dir_log = self.__make_subdir(project_dir)
|
76
|
-
|
77
73
|
# Set attribute.
|
74
|
+
self.project_dir = project_dir or os_getcwd()
|
78
75
|
|
79
76
|
## Instance.
|
80
77
|
self.client = WeChatClient(self)
|
78
|
+
self.cache = WeChatCache(self)
|
81
79
|
self.log = WeChatLog(self)
|
82
80
|
self.receiver = WechatReceiver(self, max_receiver)
|
83
81
|
self.trigger = self.receiver.trigger
|
@@ -98,15 +96,18 @@ class WeChat(BaseWeChat):
|
|
98
96
|
self.receive_start = self.receiver.start
|
99
97
|
self.receive_stop = self.receiver.stop
|
100
98
|
|
99
|
+
## Trigger.
|
100
|
+
self.trigger_add_rule = self.trigger.add_rule
|
101
|
+
|
101
102
|
## Send.
|
102
103
|
self.send_add_handler = self.sender.add_handler
|
103
|
-
self.send = self.
|
104
|
+
self.send = self.database.send
|
104
105
|
self.send_start = self.sender.start
|
105
106
|
self.send_stop = self.sender.stop
|
106
107
|
self.wrap_try_send = self.sender.wrap_try_send
|
107
108
|
|
108
|
-
##
|
109
|
-
self.
|
109
|
+
## Database.
|
110
|
+
self.send = self.database.send
|
110
111
|
|
111
112
|
## Schedule.
|
112
113
|
self.schedule_add_task = self.schedule.add_task
|
@@ -114,39 +115,6 @@ class WeChat(BaseWeChat):
|
|
114
115
|
self.schedule_resume = self.schedule.resume
|
115
116
|
|
116
117
|
|
117
|
-
def __make_subdir(
|
118
|
-
self,
|
119
|
-
project_dir: str
|
120
|
-
) -> tuple[str, str]:
|
121
|
-
"""
|
122
|
-
Make project subdirectory, 'project_dir/cache' and 'project_dir/cache'.
|
123
|
-
|
124
|
-
Parameters
|
125
|
-
----------
|
126
|
-
project_dir: Project directory.
|
127
|
-
|
128
|
-
Returns
|
129
|
-
-------
|
130
|
-
Subdirectorys path.
|
131
|
-
"""
|
132
|
-
|
133
|
-
# Set parameter.
|
134
|
-
dir_names = (
|
135
|
-
'cache',
|
136
|
-
'log'
|
137
|
-
)
|
138
|
-
dir_dict = {
|
139
|
-
dir_name: os_join(project_dir, dir_name)
|
140
|
-
for dir_name in dir_names
|
141
|
-
}
|
142
|
-
|
143
|
-
# Create.
|
144
|
-
paths = dir_dict.values()
|
145
|
-
reykit_make_dir(*paths)
|
146
|
-
|
147
|
-
return dir_dict['cache'], dir_dict['log']
|
148
|
-
|
149
|
-
|
150
118
|
def start(self) -> None:
|
151
119
|
"""
|
152
120
|
Start all methods.
|
@@ -0,0 +1,17 @@
|
|
1
|
+
reywechat/__init__.py,sha256=BL4PUpTguszJ612qsZf4-sOXxRIsiYRQ_m__FGMd1RQ,513
|
2
|
+
reywechat/rall.py,sha256=zEW-mLL2uP8aT2_foCMFGmMi_3RCrGl8qutnSVkmY1E,397
|
3
|
+
reywechat/rbase.py,sha256=0NunIUIXra2ML2N6odwMk5oENTE0r6VSBHWXUvgI-lc,1124
|
4
|
+
reywechat/rcache.py,sha256=yPGOaotZJ-Ps_6hKXm0jtQXAkdIEHLqr2nR-42syzmQ,856
|
5
|
+
reywechat/rclient.py,sha256=gtTYaoqhgh9kRFslETKjBJiAAdzJfeOxIJbdCkGAFhM,22577
|
6
|
+
reywechat/rdb.py,sha256=WOIdaDp6KENu5Pq9Nbd4uZlSh_SV8SSWcGbL-mu3WZI,40299
|
7
|
+
reywechat/rlog.py,sha256=zbdhPAL5fkJ0HKQuz9DBonJ1dxJ1N8GKROHvBmA6UaE,5262
|
8
|
+
reywechat/rreceive.py,sha256=byrT8MeIKELDRd9CLakk1WfOvxvpMeMiv2SIdcfkLAE,31158
|
9
|
+
reywechat/rschedule.py,sha256=fn11rH0HqxbnJYxARCBBiSdzBpYfQFhcjNmkvihVMTc,1854
|
10
|
+
reywechat/rsend.py,sha256=ShQLsKF6YXXD8SjixMFgqY1VGtIKt4f3odkXvP2dVDk,13746
|
11
|
+
reywechat/rtrigger.py,sha256=GHfkhNrS8rV4uXWC3N54UTjak7nKGfqJWX6pe57Hsgg,4953
|
12
|
+
reywechat/rwechat.py,sha256=tsCwtZN7YVmgrHti0qVoifjC2XcIkjBYYWDK-ZP-YfM,4811
|
13
|
+
reywechat/data/client_api.dll,sha256=H9uj-x9Ztg0jFZK0yY6NsnyH5_119dQRFfoVVMidxRs,592384
|
14
|
+
reywechat-1.0.28.dist-info/METADATA,sha256=Brbyp2S4e_9JJg1mYEeioYkTvDCaOvSYWAV_ZkQv75Y,1551
|
15
|
+
reywechat-1.0.28.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
16
|
+
reywechat-1.0.28.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
|
17
|
+
reywechat-1.0.28.dist-info/RECORD,,
|
@@ -1,16 +0,0 @@
|
|
1
|
-
reywechat/__init__.py,sha256=CBcaezJsuYnBzunuzRoRwz-q_HDQq7XsGKtNxCWAQoY,488
|
2
|
-
reywechat/rall.py,sha256=KAHdmzvrmDel_ttvZKR0tkfg21Amm3sKMvGJDkNA14U,374
|
3
|
-
reywechat/rbase.py,sha256=0NunIUIXra2ML2N6odwMk5oENTE0r6VSBHWXUvgI-lc,1124
|
4
|
-
reywechat/rclient.py,sha256=gtTYaoqhgh9kRFslETKjBJiAAdzJfeOxIJbdCkGAFhM,22577
|
5
|
-
reywechat/rdb.py,sha256=R1IFo5qeMAm2YYMpmp_HmChv6sNWyBhYco6aLpb2KJQ,40110
|
6
|
-
reywechat/rlog.py,sha256=rIl3fy1SFuAAiUnxVnOFJv-gK51AunDljJgsFUx6I50,4745
|
7
|
-
reywechat/rreceive.py,sha256=fOepHDQ0TSIGUE1LojOk8zvXEnDMtn-Tqx1v0nPxPvE,32279
|
8
|
-
reywechat/rschedule.py,sha256=fn11rH0HqxbnJYxARCBBiSdzBpYfQFhcjNmkvihVMTc,1854
|
9
|
-
reywechat/rsend.py,sha256=rzxFWTtivhLW-rejgJNJ-xxswLHiliEKpG10vXXJ5Rs,14193
|
10
|
-
reywechat/rtrigger.py,sha256=dgoj0YLW9-jOpwC70L6-sNopqw_f0mNcKfgsBU9h2E0,4892
|
11
|
-
reywechat/rwechat.py,sha256=btTwfVP0Ovo18D6XJGXKIKEOrdcIZiq8umWvgfqvr0s,5529
|
12
|
-
reywechat/data/client_api.dll,sha256=H9uj-x9Ztg0jFZK0yY6NsnyH5_119dQRFfoVVMidxRs,592384
|
13
|
-
reywechat-1.0.26.dist-info/METADATA,sha256=ijvubTWYfoiTkNDKNGw6Ttixn82pOn-DMc8ovJ-a1fI,1551
|
14
|
-
reywechat-1.0.26.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
15
|
-
reywechat-1.0.26.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
|
16
|
-
reywechat-1.0.26.dist-info/RECORD,,
|
File without changes
|
File without changes
|