reywechat 1.0.27__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
@@ -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
@@ -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
@@ -12,7 +12,6 @@
12
12
  from __future__ import annotations
13
13
  from typing import Any, TypedDict, Literal, overload
14
14
  from collections.abc import Callable
15
- from os.path import join as os_join
16
15
  from queue import Queue
17
16
  from json import loads as json_loads
18
17
  from bs4 import BeautifulSoup as BSBeautifulSoup
@@ -1116,68 +1115,43 @@ class WechatReceiver(BaseWeChat):
1116
1115
  """
1117
1116
 
1118
1117
  # Download.
1119
- folder = Folder(self.wechat.dir_cache)
1120
- generate_path = None
1121
1118
  match message.type:
1122
1119
 
1123
1120
  ## Image.
1124
1121
  case 3:
1125
- ### Get attribute.
1126
- file_name = f'{message.id}.jpg'
1127
- pattern = r'length="(\d+)".*?md5="([\da-f]{32})"'
1128
- result: tuple[str, str] = search(pattern, message.data)
1129
- file_size, file_md5 = result
1130
- file_size = int(file_size)
1131
-
1132
- ### Exist.
1133
- pattern = f'^{file_md5}$'
1134
- cache_path = folder.search(pattern)
1135
-
1136
- ### Generate.
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)
1125
+
1126
+ ### Download.
1137
1127
  if cache_path is None:
1138
1128
  self.wechat.client.download_file(message.id)
1139
- generate_path = '%swxhelper/image/%s.dat' % (
1129
+ download_path = '%swxhelper/image/%s.dat' % (
1140
1130
  self.wechat.client.login_info['account_data_path'],
1141
1131
  message.id
1142
1132
  )
1143
1133
 
1144
1134
  ## Voice.
1145
1135
  case 34:
1136
+ cache_path = None
1146
1137
 
1147
- ### Get attribute.
1148
- file_name = f'{message.id}.amr'
1149
- pattern = r'length="(\d+)"'
1150
- file_size = int(search(pattern, message.data))
1151
- file_md5 = None
1152
-
1153
- ### Generate.
1138
+ ### Download.
1154
1139
  self.wechat.client.download_voice(
1155
1140
  message.id,
1156
- self.wechat.dir_cache
1157
- )
1158
- generate_path = '%s/%s.amr' % (
1159
- self.wechat.dir_cache,
1160
- message.id
1141
+ self.wechat.cache.folder.path
1161
1142
  )
1143
+ download_path = self.wechat.cache.folder + f'{message.id}.amr'
1162
1144
 
1163
1145
  ## Video.
1164
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)
1165
1150
 
1166
- ### Get attribute.
1167
- file_name = f'{message.id}.mp4'
1168
- pattern = r'length="(\d+)"'
1169
- file_size = int(search(pattern, message.data))
1170
- pattern = r'md5="([\da-f]{32})"'
1171
- file_md5 = search(pattern, message.data)
1172
-
1173
- ### Exist.
1174
- pattern = f'^{file_md5}$'
1175
- cache_path = folder.search(pattern)
1176
-
1177
- ### Generate.
1151
+ ### Download.
1178
1152
  if cache_path is None:
1179
1153
  self.wechat.client.download_file(message.id)
1180
- generate_path = '%swxhelper/video/%s.mp4' % (
1154
+ download_path = '%swxhelper/video/%s.mp4' % (
1181
1155
  self.wechat.client.login_info['account_data_path'],
1182
1156
  message.id
1183
1157
  )
@@ -1187,26 +1161,21 @@ class WechatReceiver(BaseWeChat):
1187
1161
 
1188
1162
  ### Check.
1189
1163
  pattern = r'^.+? : \[文件\](.+)$'
1190
- file_name = search(pattern, message.display)
1191
- if file_name is None:
1192
- return
1193
- 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
+ ):
1194
1169
  return
1195
1170
 
1196
- ### Get attribute.
1197
- pattern = r'<totallen>(\d+)</totallen>'
1198
- file_size = int(search(pattern, message.data))
1199
1171
  pattern = r'<md5>([\da-f]{32})</md5>'
1200
- file_md5 = search(pattern, message.data)
1201
-
1202
- ### Exist.
1203
- pattern = f'^{file_md5}$'
1204
- cache_path = folder.search(pattern)
1172
+ file_md5: str = search(pattern, message.data)
1173
+ cache_path = self.wechat.cache.index(file_md5, file_name, copy=True)
1205
1174
 
1206
- ### Generate.
1175
+ ### Download.
1207
1176
  if cache_path is None:
1208
1177
  self.wechat.client.download_file(message.id)
1209
- generate_path = '%swxhelper/file/%s_%s' % (
1178
+ download_path = '%swxhelper/file/%s_%s' % (
1210
1179
  self.wechat.client.login_info['account_data_path'],
1211
1180
  message.id,
1212
1181
  file_name
@@ -1216,35 +1185,29 @@ class WechatReceiver(BaseWeChat):
1216
1185
  case _:
1217
1186
  return
1218
1187
 
1219
- if generate_path is not None:
1188
+ if cache_path is None:
1220
1189
 
1221
1190
  ## Wait.
1222
1191
  wait(
1223
1192
  os_exists,
1224
- generate_path,
1193
+ download_path,
1225
1194
  _interval = 0.05,
1226
1195
  _timeout=3600
1227
1196
  )
1228
1197
  sleep(0.2)
1229
1198
 
1230
- ## Move.
1231
- rfile = File(generate_path)
1232
- if file_md5 is None:
1233
- file_md5 = rfile.md5
1234
- pattern = f'^{file_md5}$'
1235
- cache_path = folder.search(pattern)
1236
- if cache_path is None:
1237
- cache_path = os_join(self.wechat.dir_cache, file_md5)
1238
- rfile.move(cache_path)
1199
+ ## Cache.
1200
+ cache_path = self.wechat.cache.store(download_path, file_name, delete=True)
1239
1201
 
1240
1202
  # Set parameter.
1241
- file: MessageParameterFile = {
1203
+ file = File(cache_path)
1204
+ message_file: MessageParameterFile = {
1242
1205
  'path': cache_path,
1243
- 'name': file_name,
1244
- 'md5': file_md5,
1245
- 'size': file_size
1206
+ 'name': file.name,
1207
+ 'md5': file.md5,
1208
+ 'size': file.size
1246
1209
  }
1247
- message.file = file
1210
+ message.file = message_file
1248
1211
 
1249
1212
 
1250
1213
  def start(self) -> None:
reywechat/rsend.py CHANGED
@@ -286,15 +286,6 @@ class WeChatSender(BaseWeChat):
286
286
  sendparam : `WeChatSendParameter` instance.
287
287
  """
288
288
 
289
- # File rename to new.
290
- if (
291
- (file_path := sendparam.params.get('file_path')) is not None
292
- and (file_name := sendparam.params.get('file_name')) is not None
293
- ):
294
- file = File(file_path)
295
- file_old_name = file.name
296
- file_path_rename = file.rename(file_name)
297
-
298
289
  # Send.
299
290
  match sendparam.send_type:
300
291
 
@@ -317,21 +308,21 @@ class WeChatSender(BaseWeChat):
317
308
  case WeChatSendEnum.SEND_FILE:
318
309
  self.wechat.client.send_file(
319
310
  sendparam.receive_id,
320
- file_path_rename
311
+ sendparam.params['file_path']
321
312
  )
322
313
 
323
314
  ## Image.
324
315
  case WeChatSendEnum.SEND_IMAGE:
325
316
  self.wechat.client.send_image(
326
317
  sendparam.receive_id,
327
- file_path_rename
318
+ sendparam.params['file_path']
328
319
  )
329
320
 
330
321
  ## Emotion.
331
322
  case WeChatSendEnum.SEND_EMOTION:
332
323
  self.wechat.client.send_emotion(
333
324
  sendparam.receive_id,
334
- file_path_rename
325
+ sendparam.params['file_path']
335
326
  )
336
327
 
337
328
  ## Pat.
@@ -364,15 +355,6 @@ class WeChatSender(BaseWeChat):
364
355
  case send_type:
365
356
  throw(ValueError, send_type)
366
357
 
367
- # File rename to old.
368
- if (
369
- file_path is not None
370
- and file_name is not None
371
- ):
372
- sleep(1)
373
- file = File(file_path_rename)
374
- file.rename(file_old_name)
375
-
376
358
 
377
359
  def add_handler(
378
360
  self,
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
@@ -117,39 +115,6 @@ class WeChat(BaseWeChat):
117
115
  self.schedule_resume = self.schedule.resume
118
116
 
119
117
 
120
- def __make_subdir(
121
- self,
122
- project_dir: str
123
- ) -> tuple[str, str]:
124
- """
125
- Make project subdirectory, 'project_dir/cache' and 'project_dir/cache'.
126
-
127
- Parameters
128
- ----------
129
- project_dir: Project directory.
130
-
131
- Returns
132
- -------
133
- Subdirectorys path.
134
- """
135
-
136
- # Set parameter.
137
- dir_names = (
138
- 'cache',
139
- 'log'
140
- )
141
- dir_dict = {
142
- dir_name: os_join(project_dir, dir_name)
143
- for dir_name in dir_names
144
- }
145
-
146
- # Create.
147
- paths = dir_dict.values()
148
- reykit_make_dir(*paths)
149
-
150
- return dir_dict['cache'], dir_dict['log']
151
-
152
-
153
118
  def start(self) -> None:
154
119
  """
155
120
  Start all methods.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reywechat
3
- Version: 1.0.27
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=JBrJw-Xev9BNogOg2G31-da80y7edpSjtAzFHZkDs3g,40313
6
- reywechat/rlog.py,sha256=rIl3fy1SFuAAiUnxVnOFJv-gK51AunDljJgsFUx6I50,4745
7
- reywechat/rreceive.py,sha256=pgo--mHTSpCtb_ScIreoiiWAtIVsqe2Tut88W7MrBc8,32403
8
- reywechat/rschedule.py,sha256=fn11rH0HqxbnJYxARCBBiSdzBpYfQFhcjNmkvihVMTc,1854
9
- reywechat/rsend.py,sha256=q1stNggg40WPqI5h8_coAXsbFRM6M6dxsDxq2-L3CJs,14286
10
- reywechat/rtrigger.py,sha256=GHfkhNrS8rV4uXWC3N54UTjak7nKGfqJWX6pe57Hsgg,4953
11
- reywechat/rwechat.py,sha256=Niu2TTyElpzXtb6fn-xzwa1QjkwrvLwFyP3U-2ALrl4,5595
12
- reywechat/data/client_api.dll,sha256=H9uj-x9Ztg0jFZK0yY6NsnyH5_119dQRFfoVVMidxRs,592384
13
- reywechat-1.0.27.dist-info/METADATA,sha256=Y9h0Dr56SY6w5krZ163ufW6FdT3-kgdUkOD5jw6O7JM,1551
14
- reywechat-1.0.27.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
15
- reywechat-1.0.27.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
16
- reywechat-1.0.27.dist-info/RECORD,,