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 CHANGED
@@ -17,6 +17,7 @@ rall : All methods.
17
17
  rbase : Base methods.
18
18
  rclient : Client methods.
19
19
  rdb : WeChatDatabase methods.
20
+ rcache : Cache methods.
20
21
  rlog : Log methods.
21
22
  rreceive : Receive methods.
22
23
  rschedule : Schedule methods.
reywechat/rall.py CHANGED
@@ -10,6 +10,7 @@
10
10
 
11
11
 
12
12
  from .rbase import *
13
+ from .rcache import *
13
14
  from .rclient import *
14
15
  from .rdb import *
15
16
  from .rlog import *
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.__add_handler_to_contact_user()
81
- self.__add_handler_to_contact_room()
82
- self.__add_handler_to_contact_room_user()
83
- self.__add_handler_to_message_receive()
84
- self.__add_handler_update_send_status()
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 __add_handler_to_contact_user(self) -> None:
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 handler_to_contact_user(message: WeChatMessage) -> None:
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(handler_to_contact_user)
753
+ self.wechat.receiver.add_handler(receiver_handler_to_contact_user)
754
754
 
755
755
 
756
- def __add_handler_to_contact_room(self) -> None:
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 handler_to_contact_room(message: WeChatMessage) -> None:
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(handler_to_contact_room)
837
+ self.wechat.receiver.add_handler(receiver_handler_to_contact_room)
838
838
 
839
839
 
840
- def __add_handler_to_contact_room_user(self) -> None:
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 handler_to_contact_room_user(message: WeChatMessage) -> None:
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(handler_to_contact_room_user)
867
+ self.wechat.receiver.add_handler(receiver_handler_to_contact_room_user)
868
868
 
869
869
 
870
- def __add_handler_to_message_receive(self) -> None:
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 handler_to_message_receive(message: WeChatMessage) -> None:
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(handler_to_message_receive)
918
+ self.wechat.receiver.add_handler(receiver_handler_to_message_receive)
919
919
 
920
920
 
921
- def __add_handler_update_send_status(self) -> None:
921
+ def __add_sender_handler_update_send_status(self) -> None:
922
922
  """
923
- In the thread, loop read record from table `message_send`, put send queue.
923
+ Add sender handler, update field `status` of table `message_send`.
924
924
  """
925
925
 
926
926
 
927
927
  # Define.
928
- def handler_update_send_status(sendparam: WeChatSendParameter) -> None:
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(handler_update_send_status)
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
- # Select.
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
- # Check.
981
- rfolder = Folder(self.wechat.dir_cache)
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
- # Download.
983
+ ## Download.
986
984
  if cache_path is None:
987
- cache_path = '%s/%s' % (
988
- self.wechat.dir_cache,
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
- ## Save file.
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.__send(sendparam)
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
- file_path,
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 = os_join(self.wechat.dir_log, 'WeChat')
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.__handler_room,
1015
- self.__handler_file,
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
- # Catch exception.
1028
- exc_report, *_ = catch_exc()
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 __handler_room(
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 __handler_file(
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
- ### Get attribute.
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
- generate_path = '%swxhelper/image/%s.dat' % (
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
- ### Get attribute.
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.dir_cache
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
- ### Get attribute.
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
- generate_path = '%swxhelper/video/%s.mp4' % (
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 file_name is None:
1191
- return
1192
- if '<type>6</type>' not in message.data:
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
- ### Exist.
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
- generate_path = '%swxhelper/file/%s_%s' % (
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 generate_path is not None:
1188
+ if cache_path is None:
1219
1189
 
1220
1190
  ## Wait.
1221
1191
  wait(
1222
1192
  os_exists,
1223
- generate_path,
1193
+ download_path,
1224
1194
  _interval = 0.05,
1225
1195
  _timeout=3600
1226
1196
  )
1227
1197
  sleep(0.2)
1228
1198
 
1229
- ## Move.
1230
- rfile = File(generate_path)
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: MessageParameter = {
1203
+ file = File(cache_path)
1204
+ message_file: MessageParameterFile = {
1244
1205
  'path': cache_path,
1245
- 'name': file_name,
1246
- 'md5': file_md5,
1247
- 'size': file_size
1206
+ 'name': file.name,
1207
+ 'md5': file.md5,
1208
+ 'size': file.size
1248
1209
  }
1249
- message.file = 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 | None = None,
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 | None = None,
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 | None = None,
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 | None = None,
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 | None = None,
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 | None = None,
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 | None = None,
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
- ## Handle.
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
- file_path_rename
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
- file_path_rename
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
- file_path_rename
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.__add_handler_trigger_by_rule()
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 __add_handler_trigger_by_rule(self) -> Callable[[WeChatMessage], None]:
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 handler_trigger_by_rule(message: WeChatMessage) -> None:
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(handler_trigger_by_rule)
114
+ self.receiver.add_handler(receiver_handler_trigger_by_rule)
115
115
 
116
- return handler_trigger_by_rule
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 make_dir as reykit_make_dir
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.sender.send
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
- ## Trigger.
109
- self.trigger_add_rule = self.trigger.add_rule
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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reywechat
3
- Version: 1.0.26
3
+ Version: 1.0.28
4
4
  Summary: WeChat method set.
5
5
  Project-URL: homepage, https://github.com/reyxbo/reywechat/
6
6
  Author-email: Rey <reyxbo@163.com>
@@ -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,,