reywechat 1.0.23__py3-none-any.whl → 1.0.25__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/rlog.py CHANGED
@@ -31,18 +31,18 @@ class WeChatLog(BaseWeChat):
31
31
 
32
32
  def __init__(
33
33
  self,
34
- rwechat: WeChat
34
+ wechat: WeChat
35
35
  ) -> None:
36
36
  """
37
37
  Build instance attributes.
38
38
 
39
39
  Parameters
40
40
  ----------
41
- rwechat : `WeChatClient` instance.
41
+ wechat : `WeChatClient` instance.
42
42
  """
43
43
 
44
44
  # Set attribute.
45
- self.rwechat = rwechat
45
+ self.wechat = wechat
46
46
 
47
47
  # Logger.
48
48
  self.rrlog = Log('WeChat')
@@ -74,7 +74,7 @@ class WeChatLog(BaseWeChat):
74
74
  self.rrlog_print.add_print(format_=format_)
75
75
 
76
76
  ## Add handler file.
77
- file_path = os_join(self.rwechat.dir_log, 'WeChat')
77
+ file_path = os_join(self.wechat.dir_log, 'WeChat')
78
78
  self.rrlog_file.add_file(
79
79
  file_path,
80
80
  time='m',
reywechat/rreceive.py CHANGED
@@ -20,7 +20,7 @@ from reykit.rbase import throw, catch_exc
20
20
  from reykit.rimage import decode_qrcode
21
21
  from reykit.rnet import compute_stream_time, listen_socket
22
22
  from reykit.ros import File, Folder, os_exists
23
- from reykit.rre import search
23
+ from reykit.rre import search, findall
24
24
  from reykit.rtask import ThreadPool
25
25
  from reykit.rtime import sleep, wait
26
26
  from reykit.rwrap import wrap_thread, wrap_exc
@@ -36,8 +36,17 @@ __all__ = (
36
36
  )
37
37
 
38
38
 
39
- MessageParameters = TypedDict(
40
- 'MessageParameters',
39
+ MessageParameterFile = TypedDict(
40
+ 'MessageParameterFile',
41
+ {
42
+ 'path': str,
43
+ 'name': str,
44
+ 'md5': str,
45
+ 'size': int
46
+ }
47
+ )
48
+ MessageParameter = TypedDict(
49
+ 'MessageParameter',
41
50
  {
42
51
  'time': int,
43
52
  'id': int,
@@ -47,7 +56,7 @@ MessageParameters = TypedDict(
47
56
  'type': int,
48
57
  'display': str,
49
58
  'data': str,
50
- 'file': dict[Literal['path', 'name', 'md5', 'size'], str]
59
+ 'file': MessageParameterFile
51
60
  }
52
61
  )
53
62
 
@@ -57,6 +66,8 @@ class WeChatMessage(BaseWeChat):
57
66
  WeChat message type.
58
67
  """
59
68
 
69
+ SendEnum = WeChatSendEnum
70
+
60
71
 
61
72
  def __init__(
62
73
  self,
@@ -69,7 +80,7 @@ class WeChatMessage(BaseWeChat):
69
80
  data: str,
70
81
  user: str | None = None,
71
82
  room: str | None = None,
72
- file: dict[Literal['path', 'name', 'md5', 'size'], str] | None = None
83
+ file: MessageParameterFile | None = None
73
84
  ) -> None:
74
85
  """
75
86
  Build instance attributes.
@@ -112,11 +123,14 @@ class WeChatMessage(BaseWeChat):
112
123
  self.user = user
113
124
  self.room = room
114
125
  self.file = file
126
+ self._window: str | None = None
115
127
  self._user_name: str | None = None
116
128
  self._room_name: str | None = None
129
+ self._window_name: str | None = None
117
130
  self._is_quote: bool | None = None
118
131
  self._is_quote_self: bool | None = None
119
132
  self._quote_params: dict[Literal['text', 'quote_id', 'quote_type', 'quote_user', 'quote_user_name', 'quote_data'], str] | None = None
133
+ self._at_names: list[str] = None
120
134
  self._is_at: bool | None = None
121
135
  self._is_at_self: bool | None = None
122
136
  self._is_new_user: bool | None = None
@@ -141,7 +155,7 @@ class WeChatMessage(BaseWeChat):
141
155
 
142
156
 
143
157
  @property
144
- def params(self) -> MessageParameters:
158
+ def params(self) -> MessageParameter:
145
159
  """
146
160
  Return parameters dictionary.
147
161
 
@@ -151,7 +165,7 @@ class WeChatMessage(BaseWeChat):
151
165
  """
152
166
 
153
167
  # Get parameter.
154
- params = {
168
+ params: MessageParameter = {
155
169
  'time': self.time,
156
170
  'id': self.id,
157
171
  'number': self.number,
@@ -181,6 +195,29 @@ class WeChatMessage(BaseWeChat):
181
195
  return params_str
182
196
 
183
197
 
198
+ @property
199
+ def window(self) -> str:
200
+ """
201
+ Message sender window ID.
202
+
203
+ Returns
204
+ -------
205
+ Window ID.
206
+ """
207
+
208
+ # Cache.
209
+ if self._window is not None:
210
+ return self._window
211
+
212
+ # Set.
213
+ if self.room is None:
214
+ self._window = self.user
215
+ else:
216
+ self._window = self.room
217
+
218
+ return self._window
219
+
220
+
184
221
  @property
185
222
  def user_name(self) -> str:
186
223
  """
@@ -191,12 +228,12 @@ class WeChatMessage(BaseWeChat):
191
228
  User name.
192
229
  """
193
230
 
194
- # Judged.
231
+ # Cache.
195
232
  if self._user_name is not None:
196
233
  return self._user_name
197
234
 
198
235
  # Set.
199
- self._user_name = self.receiver.rwechat.client.get_contact_name(
236
+ self._user_name = self.receiver.wechat.client.get_contact_name(
200
237
  self.user
201
238
  )
202
239
 
@@ -204,7 +241,7 @@ class WeChatMessage(BaseWeChat):
204
241
 
205
242
 
206
243
  @property
207
- def room_name(self) -> str:
244
+ def room_name(self) -> str | None:
208
245
  """
209
246
  Message sender chat room name.
210
247
 
@@ -217,18 +254,41 @@ class WeChatMessage(BaseWeChat):
217
254
  if self.room is None:
218
255
  return
219
256
 
220
- # Judged.
257
+ # Cache.
221
258
  if self._room_name is not None:
222
259
  return self._room_name
223
260
 
224
261
  # Set.
225
- self._room_name = self.receiver.rwechat.client.get_contact_name(
262
+ self._room_name = self.receiver.wechat.client.get_contact_name(
226
263
  self.room
227
264
  )
228
265
 
229
266
  return self._room_name
230
267
 
231
268
 
269
+ @property
270
+ def window_name(self) -> str:
271
+ """
272
+ Message sender window name.
273
+
274
+ Returns
275
+ -------
276
+ Window name.
277
+ """
278
+
279
+ # Cache.
280
+ if self._window_name is not None:
281
+ return self._window_name
282
+
283
+ # Set.
284
+ if self.room is None:
285
+ self._window_name = self.user_name
286
+ else:
287
+ self._window_name = self.room_name
288
+
289
+ return self._window_name
290
+
291
+
232
292
  @property
233
293
  def is_quote(self) -> bool:
234
294
  """
@@ -239,7 +299,7 @@ class WeChatMessage(BaseWeChat):
239
299
  Judge result.
240
300
  """
241
301
 
242
- # Judged.
302
+ # Cache.
243
303
  if self._is_quote is not None:
244
304
  return self._is_quote
245
305
 
@@ -262,14 +322,14 @@ class WeChatMessage(BaseWeChat):
262
322
  Judge result.
263
323
  """
264
324
 
265
- # Judged.
325
+ # Cache.
266
326
  if self._is_quote_self is not None:
267
327
  return self._is_quote_self
268
328
 
269
329
  # Judge.
270
330
  self._is_quote_self = (
271
331
  self.is_quote
272
- and '<chatusr>%s</chatusr>' % self.receiver.rwechat.client.login_info['id'] in self.data
332
+ and '<chatusr>%s</chatusr>' % self.receiver.wechat.client.login_info['id'] in self.data
273
333
  )
274
334
 
275
335
  return self._is_quote_self
@@ -277,7 +337,7 @@ class WeChatMessage(BaseWeChat):
277
337
 
278
338
  @property
279
339
  def quote_params(self) -> dict[
280
- Literal['text', 'quote_id', 'quote_type', 'quote_user', 'quote_user_name', 'quote_data'],
340
+ Literal['text', 'quote_id', 'quote_time', 'quote_type', 'quote_user', 'quote_user_name', 'quote_data'],
281
341
  str | None
282
342
  ]:
283
343
  """
@@ -288,6 +348,7 @@ class WeChatMessage(BaseWeChat):
288
348
  Quote parameters of message.
289
349
  - `Key 'text'`: Message text.
290
350
  - `Key 'quote_id'`: Quote message ID.
351
+ - `Key 'quote_time'`: Quote message timestamp, unit is seconds.
291
352
  - `Key 'quote_type'`: Quote message type.
292
353
  - `Key 'quote_user'`: Quote message user ID.
293
354
  - `Key 'quote_user_name'`: Quote message user name.
@@ -304,20 +365,26 @@ class WeChatMessage(BaseWeChat):
304
365
 
305
366
  # Extract.
306
367
  pattern = '<title>(.+?)</title>'
307
- text = search(pattern, self.data)
368
+ text: str = search(pattern, self.data)
308
369
  pattern = r'<svrid>(\w+?)</svrid>'
309
370
  quote_id = search(pattern, self.data)
371
+ quote_id = int(quote_id)
372
+ pattern = r'<createtime>(\d{10})</createtime>'
373
+ quote_time = search(pattern, self.data)
374
+ quote_time = int(quote_time)
310
375
  pattern = r'<refermsg>\s*<type>(\d+?)</type>'
311
- quote_type = int(search(pattern, self.data))
376
+ quote_type = search(pattern, self.data)
377
+ quote_type = int(quote_type)
312
378
  pattern = r'<chatusr>(\w+?)</chatusr>'
313
- quote_user = search(pattern, self.data)
379
+ quote_user: str = search(pattern, self.data)
314
380
  pattern = '<displayname>(.+?)</displayname>'
315
- quote_user_name = search(pattern, self.data)
381
+ quote_user_name: str = search(pattern, self.data)
316
382
  pattern = '<content>(.+?)</content>'
317
- quote_data = search(pattern, self.data)
383
+ quote_data: str = search(pattern, self.data)
318
384
  self._quote_params = {
319
385
  'text': text,
320
386
  'quote_id': quote_id,
387
+ 'quote_time': quote_time,
321
388
  'quote_type': quote_type,
322
389
  'quote_user': quote_user,
323
390
  'quote_user_name': quote_user_name,
@@ -327,6 +394,29 @@ class WeChatMessage(BaseWeChat):
327
394
  return self._quote_params
328
395
 
329
396
 
397
+ @property
398
+ def at_names(self) -> list[str]:
399
+ """
400
+ Return `@` names.
401
+
402
+ Returns
403
+ -------
404
+ `@` names.
405
+ """
406
+
407
+ # Cache.
408
+ if self._at_names is not None:
409
+ return self._at_names
410
+
411
+ # Get.
412
+ if self.type == 1:
413
+ text = self.data
414
+ elif self.is_quote:
415
+ text = self.quote_params['text']
416
+ pattern = r'@\w+\u2005'
417
+ self._at_names = findall(pattern, text)
418
+
419
+
330
420
  @property
331
421
  def is_at(self) -> bool:
332
422
  """
@@ -337,18 +427,12 @@ class WeChatMessage(BaseWeChat):
337
427
  Judge result.
338
428
  """
339
429
 
340
- # Judged.
430
+ # Cache.
341
431
  if self._is_at is not None:
342
432
  return self._is_at
343
433
 
344
434
  # Judge.
345
- if self.type == 1:
346
- text = self.data
347
- elif self.is_quote:
348
- text = self.quote_params['text']
349
- pattern = r'@\w+ '
350
- result = search(pattern, text)
351
- self._is_at = result is not None
435
+ self._is_at = self.at_names != []
352
436
 
353
437
  return self._is_at
354
438
 
@@ -363,18 +447,13 @@ class WeChatMessage(BaseWeChat):
363
447
  Judge result.
364
448
  """
365
449
 
366
- # Judged.
450
+ # Cache.
367
451
  if self._is_at_self is not None:
368
452
  return self._is_at_self
369
453
 
370
454
  # Judge.
371
- if self.type == 1:
372
- text = self.data
373
- elif self.is_quote:
374
- text = self.quote_params['text']
375
- pattern = '@%s ' % self.receiver.rwechat.client.login_info['name']
376
- result = search(pattern, text)
377
- self._is_at_self = result is not None
455
+ pattern = '@%s\u2005' % self.receiver.wechat.client.login_info['name']
456
+ self._is_at_self = pattern in self.at_names
378
457
 
379
458
  return self._is_at_self
380
459
 
@@ -389,7 +468,7 @@ class WeChatMessage(BaseWeChat):
389
468
  Judge result.
390
469
  """
391
470
 
392
- # Judged.
471
+ # Cache.
393
472
  if self._is_new_user is not None:
394
473
  return self._is_new_user
395
474
 
@@ -415,7 +494,7 @@ class WeChatMessage(BaseWeChat):
415
494
  Judge result.
416
495
  """
417
496
 
418
- # Judged.
497
+ # Cache.
419
498
  if self._is_new_room is not None:
420
499
  return self._is_new_room
421
500
 
@@ -441,7 +520,7 @@ class WeChatMessage(BaseWeChat):
441
520
  Judge result.
442
521
  """
443
522
 
444
- # Judged.
523
+ # Cache.
445
524
  if self._is_new_room_user is not None:
446
525
  return self._is_new_room_user
447
526
 
@@ -487,7 +566,7 @@ class WeChatMessage(BaseWeChat):
487
566
  Judge result.
488
567
  """
489
568
 
490
- # Judged.
569
+ # Cache.
491
570
  if self._is_change_room_name is not None:
492
571
  return self._is_change_room_name
493
572
 
@@ -532,7 +611,7 @@ class WeChatMessage(BaseWeChat):
532
611
  Judge result.
533
612
  """
534
613
 
535
- # Judged.
614
+ # Cache.
536
615
  if self._is_kick_out_room is not None:
537
616
  return self._is_kick_out_room
538
617
 
@@ -556,7 +635,7 @@ class WeChatMessage(BaseWeChat):
556
635
  Judge result.
557
636
  """
558
637
 
559
- # Judged.
638
+ # Cache.
560
639
  if self._is_dissolve_room is not None:
561
640
  return self._is_dissolve_room
562
641
 
@@ -580,7 +659,7 @@ class WeChatMessage(BaseWeChat):
580
659
  Judge result.
581
660
  """
582
661
 
583
- # Judged.
662
+ # Cache.
584
663
  if self._is_image is not None:
585
664
  return self._is_image
586
665
 
@@ -624,7 +703,7 @@ class WeChatMessage(BaseWeChat):
624
703
  Judge result.
625
704
  """
626
705
 
627
- # Judged.
706
+ # Cache.
628
707
  if self._is_xml is not None:
629
708
  return self._is_xml
630
709
 
@@ -647,7 +726,7 @@ class WeChatMessage(BaseWeChat):
647
726
  Judge result.
648
727
  """
649
728
 
650
- # Judged.
729
+ # Cache.
651
730
  if self._is_app is not None:
652
731
  return self._is_app
653
732
 
@@ -711,7 +790,7 @@ class WeChatMessage(BaseWeChat):
711
790
  return self._valid
712
791
 
713
792
  # Judge.
714
- self._valid = self.receiver.rwechat.database.is_valid(self)
793
+ self._valid = self.receiver.wechat.database.is_valid(self)
715
794
 
716
795
  return self._valid
717
796
 
@@ -773,7 +852,7 @@ class WeChatMessage(BaseWeChat):
773
852
 
774
853
  def reply(
775
854
  self,
776
- send_type: WeChatSendEnum | None = None,
855
+ send_type: WeChatSendEnum,
777
856
  **params: Any
778
857
  ) -> None:
779
858
  """
@@ -804,19 +883,13 @@ class WeChatMessage(BaseWeChat):
804
883
  text = 'can only be used by reply trigger'
805
884
  throw(WeChatTriggerError, self.trigger_rule, text=text)
806
885
 
807
- # Get parameter.
808
- if self.room is None:
809
- receive_id = self.user
810
- else:
811
- receive_id = self.room
812
-
813
886
  # Status.
814
887
  self.replied = True
815
888
 
816
- # Send.
817
- self.receiver.rwechat.sender.send(
889
+ # Swend.
890
+ self.receiver.wechat.sender.send(
818
891
  send_type,
819
- receive_id=receive_id,
892
+ receive_id=self.window,
820
893
  **params
821
894
  )
822
895
 
@@ -826,30 +899,29 @@ class WechatReceiver(BaseWeChat):
826
899
  WeChat receiver type.
827
900
  """
828
901
 
902
+ SendEnum = WeChatSendEnum
903
+
829
904
 
830
905
  def __init__(
831
906
  self,
832
- rwechat: WeChat,
833
- max_receiver: int,
834
- bandwidth_downstream: float
907
+ wechat: WeChat,
908
+ max_receiver: int
835
909
  ) -> None:
836
910
  """
837
911
  Build instance attributes.
838
912
 
839
913
  Parameters
840
914
  ----------
841
- rwechat : `WeChatClient` instance.
915
+ wechat : `WeChatClient` instance.
842
916
  max_receiver : Maximum number of receivers.
843
- bandwidth_downstream : Download bandwidth, impact receive timeout, unit Mpbs.
844
917
  """
845
918
 
846
919
  # Import.
847
920
  from .rtrigger import WeChatTrigger
848
921
 
849
922
  # Set attribute.
850
- self.rwechat = rwechat
923
+ self.wechat = wechat
851
924
  self.max_receiver = max_receiver
852
- self.bandwidth_downstream = bandwidth_downstream
853
925
  self.queue: Queue[WeChatMessage] = Queue()
854
926
  self.handlers: list[Callable[[WeChatMessage], Any]] = []
855
927
  self.started: bool | None = False
@@ -858,9 +930,9 @@ class WechatReceiver(BaseWeChat):
858
930
  # Start.
859
931
  self.__start_callback()
860
932
  self.__start_receiver(self.max_receiver)
861
- self.rwechat.client.hook_message(
933
+ self.wechat.client.hook_message(
862
934
  '127.0.0.1',
863
- self.rwechat.client.message_callback_port,
935
+ self.wechat.client.message_callback_port,
864
936
  60
865
937
  )
866
938
 
@@ -908,7 +980,7 @@ class WechatReceiver(BaseWeChat):
908
980
  # Listen socket.
909
981
  listen_socket(
910
982
  '127.0.0.1',
911
- self.rwechat.client.message_callback_port,
983
+ self.wechat.client.message_callback_port,
912
984
  put_queue
913
985
  )
914
986
 
@@ -965,7 +1037,7 @@ class WechatReceiver(BaseWeChat):
965
1037
  handler(message)
966
1038
 
967
1039
  # Log.
968
- self.rwechat.log.log_receive(message)
1040
+ self.wechat.log.log_receive(message)
969
1041
 
970
1042
 
971
1043
  # Thread pool.
@@ -1041,8 +1113,8 @@ class WechatReceiver(BaseWeChat):
1041
1113
  Handle file message.
1042
1114
  """
1043
1115
 
1044
- # Save.
1045
- rfolder = Folder(self.rwechat.dir_file)
1116
+ # Download.
1117
+ folder = Folder(self.wechat.dir_cache)
1046
1118
  generate_path = None
1047
1119
  match message.type:
1048
1120
 
@@ -1052,18 +1124,19 @@ class WechatReceiver(BaseWeChat):
1052
1124
  ### Get attribute.
1053
1125
  file_name = f'{message.id}.jpg'
1054
1126
  pattern = r'length="(\d+)".*?md5="([\da-f]{32})"'
1055
- file_size, file_md5 = search(pattern, message.data)
1127
+ result: tuple[str, str] = search(pattern, message.data)
1128
+ file_size, file_md5 = result
1056
1129
  file_size = int(file_size)
1057
1130
 
1058
1131
  ### Exist.
1059
1132
  pattern = f'^{file_md5}$'
1060
- search_path = rfolder.search(pattern)
1133
+ cache_path = folder.search(pattern)
1061
1134
 
1062
1135
  ### Generate.
1063
- if search_path is None:
1064
- self.rwechat.client.download_file(message.id)
1136
+ if cache_path is None:
1137
+ self.wechat.client.download_file(message.id)
1065
1138
  generate_path = '%swxhelper/image/%s.dat' % (
1066
- self.rwechat.client.login_info['account_data_path'],
1139
+ self.wechat.client.login_info['account_data_path'],
1067
1140
  message.id
1068
1141
  )
1069
1142
 
@@ -1077,12 +1150,12 @@ class WechatReceiver(BaseWeChat):
1077
1150
  file_md5 = None
1078
1151
 
1079
1152
  ### Generate.
1080
- self.rwechat.client.download_voice(
1153
+ self.wechat.client.download_voice(
1081
1154
  message.id,
1082
- self.rwechat.dir_file
1155
+ self.wechat.dir_cache
1083
1156
  )
1084
1157
  generate_path = '%s/%s.amr' % (
1085
- self.rwechat.dir_file,
1158
+ self.wechat.dir_cache,
1086
1159
  message.id
1087
1160
  )
1088
1161
 
@@ -1098,13 +1171,13 @@ class WechatReceiver(BaseWeChat):
1098
1171
 
1099
1172
  ### Exist.
1100
1173
  pattern = f'^{file_md5}$'
1101
- search_path = rfolder.search(pattern)
1174
+ cache_path = folder.search(pattern)
1102
1175
 
1103
1176
  ### Generate.
1104
- if search_path is None:
1105
- self.rwechat.client.download_file(message.id)
1177
+ if cache_path is None:
1178
+ self.wechat.client.download_file(message.id)
1106
1179
  generate_path = '%swxhelper/video/%s.mp4' % (
1107
- self.rwechat.client.login_info['account_data_path'],
1180
+ self.wechat.client.login_info['account_data_path'],
1108
1181
  message.id
1109
1182
  )
1110
1183
 
@@ -1127,13 +1200,13 @@ class WechatReceiver(BaseWeChat):
1127
1200
 
1128
1201
  ### Exist.
1129
1202
  pattern = f'^{file_md5}$'
1130
- search_path = rfolder.search(pattern)
1203
+ cache_path = folder.search(pattern)
1131
1204
 
1132
1205
  ### Generate.
1133
- if search_path is None:
1134
- self.rwechat.client.download_file(message.id)
1206
+ if cache_path is None:
1207
+ self.wechat.client.download_file(message.id)
1135
1208
  generate_path = '%swxhelper/file/%s_%s' % (
1136
- self.rwechat.client.login_info['account_data_path'],
1209
+ self.wechat.client.login_info['account_data_path'],
1137
1210
  message.id,
1138
1211
  file_name
1139
1212
  )
@@ -1142,44 +1215,33 @@ class WechatReceiver(BaseWeChat):
1142
1215
  case _:
1143
1216
  return
1144
1217
 
1145
- # Wait.
1146
1218
  if generate_path is not None:
1147
- stream_time = compute_stream_time(file_size, self.bandwidth_downstream)
1148
- timeout = 10 + stream_time * (self.max_receiver + 1)
1219
+
1220
+ ## Wait.
1149
1221
  wait(
1150
1222
  os_exists,
1151
1223
  generate_path,
1152
1224
  _interval = 0.05,
1153
- _timeout=timeout
1225
+ _timeout=3600
1154
1226
  )
1155
1227
  sleep(0.2)
1156
1228
 
1157
- # Move.
1158
- if generate_path is None:
1159
- save_path = '%s/%s' % (
1160
- self.rwechat.dir_file,
1161
- file_md5
1162
- )
1163
- else:
1229
+ ## Move.
1164
1230
  rfile = File(generate_path)
1165
- search_path = None
1231
+ cache_path = None
1166
1232
  if file_md5 is None:
1167
1233
  file_md5 = rfile.md5
1168
1234
 
1169
1235
  ### Exist.
1170
1236
  pattern = f'^{file_md5}$'
1171
- search_path = rfolder.search(pattern)
1237
+ cache_path = folder.search(pattern)
1172
1238
 
1173
- if search_path is None:
1174
- save_path = '%s/%s' % (
1175
- self.rwechat.dir_file,
1176
- file_md5
1177
- )
1178
- rfile.move(save_path)
1239
+ if cache_path is None:
1240
+ rfile.move(cache_path)
1179
1241
 
1180
1242
  # Set parameter.
1181
- file = {
1182
- 'path': save_path,
1243
+ file: MessageParameter = {
1244
+ 'path': cache_path,
1183
1245
  'name': file_name,
1184
1246
  'md5': file_md5,
1185
1247
  'size': file_size