RubigramClient 1.6.5__py3-none-any.whl → 1.6.7__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.

Potentially problematic release.


This version of RubigramClient might be problematic. Click here for more details.

rubigram/types.py CHANGED
@@ -1,82 +1,24 @@
1
- from dataclasses import dataclass, is_dataclass, fields
2
- from typing import Type, TypeVar, Union, Optional, get_origin, get_args
3
- from json import dumps
4
- from enum import Enum
5
- from . import enums
6
- import rubigram
7
-
8
-
9
- T = TypeVar("T", bound="DataManager")
10
-
11
-
12
- @dataclass
13
- class DataManager:
14
- def to_dict(self) -> dict:
15
- data = {}
16
- for field in fields(self):
17
- value = getattr(self, field.name)
18
- if isinstance(value, Enum):
19
- data[field.name] = value.value
20
- elif is_dataclass(value):
21
- data[field.name] = value.to_dict()
22
- elif isinstance(value, list):
23
- data[field.name] = [i.to_dict() if is_dataclass(i) else i for i in value]
24
- else:
25
- data[field.name] = value
26
- return data
1
+ from typing import Optional, Union, Any
2
+ from pydantic import BaseModel
3
+ from rubigram import enums
27
4
 
28
5
 
6
+ class DataManager(BaseModel):
7
+ class Config:
8
+ use_enum_values = True
9
+ arbitrary_types_allowed = True
10
+
29
11
  @classmethod
30
- def from_dict(Class: Type[T], data: dict) -> T:
31
- data = data or {}
32
- init_data = {}
33
-
34
- for field in fields(Class):
35
- value = data.get(field.name)
36
- field_type = field.type
37
- origin = get_origin(field_type)
38
-
39
- if isinstance(value, dict) and isinstance(field_type, type) and issubclass(field_type, DataManager):
40
- init_data[field.name] = field_type.from_dict(value)
41
-
42
- elif origin == list:
43
- inner_type = get_args(field_type)[0]
44
- if isinstance(inner_type, type) and issubclass(inner_type, DataManager):
45
- init_data[field.name] = [inner_type.from_dict(
46
- v) if isinstance(v, dict) else v for v in (value or [])]
47
- else:
48
- init_data[field.name] = value or []
49
-
50
- elif origin == Union:
51
- args = get_args(field_type)
52
- dict_type = next((a for a in args if isinstance(
53
- a, type) and issubclass(a, DataManager)), None)
54
- if dict_type and isinstance(value, dict):
55
- init_data[field.name] = dict_type.from_dict(value)
56
- else:
57
- init_data[field.name] = value
58
-
59
- else:
60
- init_data[field.name] = value
61
-
62
- return Class(**init_data)
63
-
64
- def json(self):
65
- def clear(object):
66
- if isinstance(object, dict):
67
- return {key: clear(value) for key, value in object.items() if value is not None}
68
- elif isinstance(object, list):
69
- return [clear(i) for i in object if i is not None]
70
- else:
71
- return object
72
-
73
- data = self.to_dict()
74
- data.pop("client", None)
75
- clean_data = clear(data)
76
- return dumps(clean_data, ensure_ascii=False, indent=4)
77
-
78
-
79
- @dataclass
12
+ def from_dict(cls, data: dict):
13
+ return cls.model_validate(data or {})
14
+
15
+ def asdict(self, exclude_none: bool = True) -> dict:
16
+ return self.model_dump(exclude_none=exclude_none, exclude={"client"})
17
+
18
+ def asjson(self, exclude_none: bool = True) -> str:
19
+ return self.model_dump_json(indent=4, exclude_none=exclude_none, exclude={"client"})
20
+
21
+
80
22
  class Chat(DataManager):
81
23
  chat_id: Optional[str] = None
82
24
  chat_type: Optional[enums.ChatType] = None
@@ -86,50 +28,106 @@ class Chat(DataManager):
86
28
  title: Optional[str] = None
87
29
  username: Optional[str] = None
88
30
 
89
- def __repr__(self):
90
- return self.json()
31
+ def __init__(
32
+ self,
33
+ chat_id: Optional[str] = None,
34
+ chat_type: Optional[enums.ChatType] = None,
35
+ user_id: Optional[str] = None,
36
+ first_name: Optional[str] = None,
37
+ last_name: Optional[str] = None,
38
+ title: Optional[str] = None,
39
+ username: Optional[str] = None,
40
+ **kwargs
41
+ ):
42
+ super().__init__(
43
+ chat_id=chat_id,
44
+ chat_type=chat_type,
45
+ user_id=user_id,
46
+ first_name=first_name,
47
+ last_name=last_name,
48
+ title=title,
49
+ username=username,
50
+ **kwargs
51
+ )
91
52
 
92
53
 
93
- @dataclass
94
54
  class File(DataManager):
95
55
  file_id: Optional[str] = None
96
56
  file_name: Optional[str] = None
97
57
  size: Optional[str] = None
98
58
 
99
- def __repr__(self):
100
- return self.json()
59
+ def __init__(
60
+ self,
61
+ file_id: Optional[str] = None,
62
+ file_name: Optional[str] = None,
63
+ size: Optional[str] = None,
64
+ **kwargs
65
+ ):
66
+ super().__init__(
67
+ file_id=file_id,
68
+ file_name=file_name,
69
+ size=size,
70
+ **kwargs
71
+ )
101
72
 
102
73
 
103
- @dataclass
104
74
  class ForwardedFrom(DataManager):
105
75
  type_from: Optional[enums.ForwardedFrom] = None
106
76
  message_id: Optional[str] = None
107
77
  from_chat_id: Optional[str] = None
108
78
  from_sender_id: Optional[str] = None
109
79
 
110
- def __repr__(self):
111
- return self.json()
80
+ def __init__(
81
+ self,
82
+ type_from: Optional[enums.ForwardedFrom] = None,
83
+ message_id: Optional[str] = None,
84
+ from_chat_id: Optional[str] = None,
85
+ from_sender_id: Optional[str] = None,
86
+ **kwargs
87
+ ):
88
+ super().__init__(
89
+ type_from=type_from,
90
+ message_id=message_id,
91
+ from_chat_id=from_chat_id,
92
+ from_sender_id=from_sender_id,
93
+ **kwargs
94
+ )
112
95
 
113
96
 
114
- @dataclass
115
97
  class PaymentStatus(DataManager):
116
98
  payment_id: Optional[str] = None
117
99
  status: Optional[enums.PaymentStatus] = None
118
100
 
119
- def __repr__(self):
120
- return self.json()
101
+ def __init__(
102
+ self,
103
+ payment_id: Optional[str] = None,
104
+ status: Optional[enums.PaymentStatus] = None,
105
+ **kwargs
106
+ ):
107
+ super().__init__(
108
+ payment_id=payment_id,
109
+ status=status,
110
+ **kwargs
111
+ )
121
112
 
122
113
 
123
- @dataclass
124
114
  class MessageTextUpdate(DataManager):
125
115
  message_id: Optional[str] = None
126
116
  text: Optional[str] = None
127
117
 
128
- def __repr__(self):
129
- return self.json()
118
+ def __init__(
119
+ self,
120
+ message_id: Optional[str] = None,
121
+ text: Optional[str] = None,
122
+ **kwargs
123
+ ):
124
+ super().__init__(
125
+ message_id=message_id,
126
+ text=text,
127
+ **kwargs
128
+ )
130
129
 
131
130
 
132
- @dataclass
133
131
  class Bot(DataManager):
134
132
  bot_id: Optional[str] = None
135
133
  bot_title: Optional[str] = None
@@ -139,40 +137,86 @@ class Bot(DataManager):
139
137
  start_message: Optional[str] = None
140
138
  share_url: Optional[str] = None
141
139
 
142
- def __repr__(self):
143
- return self.json()
140
+ def __init__(
141
+ self,
142
+ bot_id: Optional[str] = None,
143
+ bot_title: Optional[str] = None,
144
+ avatar: Optional[File] = None,
145
+ description: Optional[str] = None,
146
+ username: Optional[str] = None,
147
+ start_message: Optional[str] = None,
148
+ share_url: Optional[str] = None,
149
+ **kwargs
150
+ ):
151
+ super().__init__(
152
+ bot_id=bot_id,
153
+ bot_title=bot_title,
154
+ avatar=avatar,
155
+ description=description,
156
+ username=username,
157
+ start_message=start_message,
158
+ share_url=share_url,
159
+ **kwargs
160
+ )
144
161
 
145
162
 
146
- @dataclass
147
163
  class BotCommand(DataManager):
148
164
  command: Optional[str] = None
149
165
  description: Optional[str] = None
150
166
 
151
- def __repr__(self):
152
- return self.json()
167
+ def __init__(
168
+ self,
169
+ command: Optional[str] = None,
170
+ description: Optional[str] = None,
171
+ **kwargs
172
+ ):
173
+ super().__init__(
174
+ command=command,
175
+ description=description,
176
+ **kwargs
177
+ )
153
178
 
154
179
 
155
- @dataclass
156
180
  class Sticker(DataManager):
157
181
  sticker_id: Optional[str] = None
158
182
  file: Optional[File] = None
159
183
  emoji_character: Optional[str] = None
160
184
 
161
- def __repr__(self):
162
- return self.json()
185
+ def __init__(
186
+ self,
187
+ sticker_id: Optional[str] = None,
188
+ file: Optional[File] = None,
189
+ emoji_character: Optional[str] = None,
190
+ **kwargs
191
+ ):
192
+ super().__init__(
193
+ sticker_id=sticker_id,
194
+ file=file,
195
+ emoji_character=emoji_character,
196
+ **kwargs
197
+ )
163
198
 
164
199
 
165
- @dataclass
166
200
  class ContactMessage(DataManager):
167
201
  phone_number: Optional[str] = None
168
202
  first_name: Optional[str] = None
169
203
  last_name: Optional[str] = None
170
204
 
171
- def __repr__(self):
172
- return self.json()
205
+ def __init__(
206
+ self,
207
+ phone_number: Optional[str] = None,
208
+ first_name: Optional[str] = None,
209
+ last_name: Optional[str] = None,
210
+ **kwargs
211
+ ):
212
+ super().__init__(
213
+ phone_number=phone_number,
214
+ first_name=first_name,
215
+ last_name=last_name,
216
+ **kwargs
217
+ )
173
218
 
174
219
 
175
- @dataclass
176
220
  class PollStatus(DataManager):
177
221
  state: Optional[enums.PollStatus] = None
178
222
  selection_index: Optional[int] = None
@@ -180,30 +224,62 @@ class PollStatus(DataManager):
180
224
  total_vote: Optional[int] = None
181
225
  show_total_votes: Optional[bool] = None
182
226
 
183
- def __repr__(self):
184
- return self.json()
227
+ def __init__(
228
+ self,
229
+ state: Optional[enums.PollStatus] = None,
230
+ selection_index: Optional[int] = None,
231
+ percent_vote_options: Optional[list[int]] = None,
232
+ total_vote: Optional[int] = None,
233
+ show_total_votes: Optional[bool] = None,
234
+ **kwargs
235
+ ):
236
+ super().__init__(
237
+ state=state,
238
+ selection_index=selection_index,
239
+ percent_vote_options=percent_vote_options,
240
+ total_vote=total_vote,
241
+ show_total_votes=show_total_votes,
242
+ **kwargs
243
+ )
185
244
 
186
245
 
187
- @dataclass
188
246
  class Poll(DataManager):
189
247
  question: Optional[str] = None
190
248
  options: Optional[list[str]] = None
191
249
  poll_status: Optional[PollStatus] = None
192
250
 
193
- def __repr__(self):
194
- return self.json()
251
+ def __init__(
252
+ self,
253
+ question: Optional[str] = None,
254
+ options: Optional[list[str]] = None,
255
+ poll_status: Optional[PollStatus] = None,
256
+ **kwargs
257
+ ):
258
+ super().__init__(
259
+ question=question,
260
+ options=options,
261
+ poll_status=poll_status,
262
+ **kwargs
263
+ )
195
264
 
196
265
 
197
- @dataclass
198
266
  class Location(DataManager):
199
267
  longitude: Optional[str] = None
200
268
  latitude: Optional[str] = None
201
269
 
202
- def __repr__(self):
203
- return self.json()
270
+ def __init__(
271
+ self,
272
+ longitude: Optional[str] = None,
273
+ latitude: Optional[str] = None,
274
+ **kwargs
275
+ ):
276
+ super().__init__(
277
+ longitude=longitude,
278
+ latitude=latitude,
279
+ **kwargs
280
+ )
204
281
 
205
282
 
206
- @dataclass
207
283
  class LiveLocation(DataManager):
208
284
  start_time: Optional[str] = None
209
285
  live_period: Optional[int] = None
@@ -212,21 +288,47 @@ class LiveLocation(DataManager):
212
288
  status: Optional[enums.LiveLocationStatus] = None
213
289
  last_update_time: Optional[str] = None
214
290
 
215
- def __repr__(self):
216
- return self.json()
291
+ def __init__(
292
+ self,
293
+ start_time: Optional[str] = None,
294
+ live_period: Optional[int] = None,
295
+ current_location: Optional[Location] = None,
296
+ user_id: Optional[str] = None,
297
+ status: Optional[enums.LiveLocationStatus] = None,
298
+ last_update_time: Optional[str] = None,
299
+ **kwargs
300
+ ):
301
+ super().__init__(
302
+ start_time=start_time,
303
+ live_period=live_period,
304
+ current_location=current_location,
305
+ user_id=user_id,
306
+ status=status,
307
+ last_update_time=last_update_time,
308
+ **kwargs
309
+ )
217
310
 
218
311
 
219
- @dataclass
220
312
  class ButtonSelectionItem(DataManager):
221
313
  text: Optional[str] = None
222
314
  image_url: Optional[str] = None
223
315
  type: Optional[enums.ButtonSelectionType] = None
224
316
 
225
- def __repr__(self):
226
- return self.json()
317
+ def __init__(
318
+ self,
319
+ text: Optional[str] = None,
320
+ image_url: Optional[str] = None,
321
+ type: Optional[enums.ButtonSelectionType] = None,
322
+ **kwargs
323
+ ):
324
+ super().__init__(
325
+ text=text,
326
+ image_url=image_url,
327
+ type=type,
328
+ **kwargs
329
+ )
227
330
 
228
331
 
229
- @dataclass
230
332
  class ButtonSelection(DataManager):
231
333
  selection_id: Optional[str] = None
232
334
  search_type: Optional[str] = None
@@ -236,11 +338,29 @@ class ButtonSelection(DataManager):
236
338
  columns_count: Optional[str] = None
237
339
  title: Optional[str] = None
238
340
 
239
- def __repr__(self):
240
- return self.json()
341
+ def __init__(
342
+ self,
343
+ selection_id: Optional[str] = None,
344
+ search_type: Optional[str] = None,
345
+ get_type: Optional[str] = None,
346
+ items: Optional[list[ButtonSelectionItem]] = None,
347
+ is_multi_selection: Optional[bool] = None,
348
+ columns_count: Optional[str] = None,
349
+ title: Optional[str] = None,
350
+ **kwargs
351
+ ):
352
+ super().__init__(
353
+ selection_id=selection_id,
354
+ search_type=search_type,
355
+ get_type=get_type,
356
+ items=items,
357
+ is_multi_selection=is_multi_selection,
358
+ columns_count=columns_count,
359
+ title=title,
360
+ **kwargs
361
+ )
241
362
 
242
363
 
243
- @dataclass
244
364
  class ButtonCalendar(DataManager):
245
365
  default_value: Optional[str] = None
246
366
  type: Optional[enums.ButtonCalendarType] = None
@@ -248,32 +368,68 @@ class ButtonCalendar(DataManager):
248
368
  max_year: Optional[str] = None
249
369
  title: Optional[str] = None
250
370
 
251
- def __repr__(self):
252
- return self.json()
371
+ def __init__(
372
+ self,
373
+ default_value: Optional[str] = None,
374
+ type: Optional[enums.ButtonCalendarType] = None,
375
+ min_year: Optional[str] = None,
376
+ max_year: Optional[str] = None,
377
+ title: Optional[str] = None,
378
+ **kwargs
379
+ ):
380
+ super().__init__(
381
+ default_value=default_value,
382
+ type=type,
383
+ min_year=min_year,
384
+ max_year=max_year,
385
+ title=title,
386
+ **kwargs
387
+ )
253
388
 
254
389
 
255
- @dataclass
256
390
  class ButtonNumberPicker(DataManager):
257
391
  min_value: Optional[str] = None
258
392
  max_value: Optional[str] = None
259
393
  default_value: Optional[str] = None
260
394
  title: Optional[str] = None
261
395
 
262
- def __repr__(self):
263
- return self.json()
396
+ def __init__(
397
+ self,
398
+ min_value: Optional[str] = None,
399
+ max_value: Optional[str] = None,
400
+ default_value: Optional[str] = None,
401
+ title: Optional[str] = None,
402
+ **kwargs
403
+ ):
404
+ super().__init__(
405
+ min_value=min_value,
406
+ max_value=max_value,
407
+ default_value=default_value,
408
+ title=title,
409
+ **kwargs
410
+ )
264
411
 
265
412
 
266
- @dataclass
267
413
  class ButtonStringPicker(DataManager):
268
414
  items: Optional[list[str]] = None
269
415
  default_value: Optional[str] = None
270
416
  title: Optional[str] = None
271
417
 
272
- def __repr__(self):
273
- return self.json()
418
+ def __init__(
419
+ self,
420
+ items: Optional[list[str]] = None,
421
+ default_value: Optional[str] = None,
422
+ title: Optional[str] = None,
423
+ **kwargs
424
+ ):
425
+ super().__init__(
426
+ items=items,
427
+ default_value=default_value,
428
+ title=title,
429
+ **kwargs
430
+ )
274
431
 
275
432
 
276
- @dataclass
277
433
  class ButtonTextbox(DataManager):
278
434
  type_line: Optional[enums.ButtonTextboxTypeLine] = None
279
435
  type_keypad: Optional[enums.ButtonTextboxTypeKeypad] = None
@@ -281,11 +437,25 @@ class ButtonTextbox(DataManager):
281
437
  title: Optional[str] = None
282
438
  default_value: Optional[str] = None
283
439
 
284
- def __repr__(self):
285
- return self.json()
440
+ def __init__(
441
+ self,
442
+ type_line: Optional[enums.ButtonTextboxTypeLine] = None,
443
+ type_keypad: Optional[enums.ButtonTextboxTypeKeypad] = None,
444
+ place_holder: Optional[str] = None,
445
+ title: Optional[str] = None,
446
+ default_value: Optional[str] = None,
447
+ **kwargs
448
+ ):
449
+ super().__init__(
450
+ type_line=type_line,
451
+ type_keypad=type_keypad,
452
+ place_holder=place_holder,
453
+ title=title,
454
+ default_value=default_value,
455
+ **kwargs
456
+ )
286
457
 
287
458
 
288
- @dataclass
289
459
  class ButtonLocation(DataManager):
290
460
  default_pointer_location: Optional[Location] = None
291
461
  default_map_location: Optional[Location] = None
@@ -293,49 +463,99 @@ class ButtonLocation(DataManager):
293
463
  title: Optional[str] = None
294
464
  location_image_url: Optional[str] = None
295
465
 
296
- def __repr__(self):
297
- return self.json()
466
+ def __init__(
467
+ self,
468
+ default_pointer_location: Optional[Location] = None,
469
+ default_map_location: Optional[Location] = None,
470
+ type: Optional[enums.ButtonLocationType] = None,
471
+ title: Optional[str] = None,
472
+ location_image_url: Optional[str] = None,
473
+ **kwargs
474
+ ):
475
+ super().__init__(
476
+ default_pointer_location=default_pointer_location,
477
+ default_map_location=default_map_location,
478
+ type=type,
479
+ title=title,
480
+ location_image_url=location_image_url,
481
+ **kwargs
482
+ )
298
483
 
299
484
 
300
- @dataclass
301
485
  class OpenChatData(DataManager):
302
486
  object_guid: Optional[str] = None
303
487
  object_type: Optional[enums.ChatType] = None
304
488
 
305
- def __repr__(self):
306
- return self.json()
489
+ def __init__(
490
+ self,
491
+ object_guid: Optional[str] = None,
492
+ object_type: Optional[enums.ChatType] = None,
493
+ **kwargs
494
+ ):
495
+ super().__init__(
496
+ object_guid=object_guid,
497
+ object_type=object_type,
498
+ **kwargs
499
+ )
307
500
 
308
501
 
309
- @dataclass
310
502
  class JoinChannelData(DataManager):
311
503
  username: Optional[str] = None
312
504
  ask_join: bool = False
313
505
 
314
- def __repr__(self):
315
- return self.json()
506
+ def __init__(
507
+ self,
508
+ username: Optional[str] = None,
509
+ ask_join: bool = False,
510
+ **kwargs
511
+ ):
512
+ super().__init__(
513
+ username=username,
514
+ ask_join=ask_join,
515
+ **kwargs
516
+ )
316
517
 
317
518
 
318
- @dataclass
319
519
  class ButtonLink(DataManager):
320
520
  type: Optional[enums.ButtonLinkType] = None
321
521
  link_url: Optional[str] = None
322
522
  joinchannel_data: Optional[JoinChannelData] = None
323
523
  open_chat_data: Optional[OpenChatData] = None
324
524
 
325
- def __repr__(self):
326
- return self.json()
525
+ def __init__(
526
+ self,
527
+ type: Optional[enums.ButtonLinkType] = None,
528
+ link_url: Optional[str] = None,
529
+ joinchannel_data: Optional[JoinChannelData] = None,
530
+ open_chat_data: Optional[OpenChatData] = None,
531
+ **kwargs
532
+ ):
533
+ super().__init__(
534
+ type=type,
535
+ link_url=link_url,
536
+ joinchannel_data=joinchannel_data,
537
+ open_chat_data=open_chat_data,
538
+ **kwargs
539
+ )
327
540
 
328
541
 
329
- @dataclass
330
542
  class AuxData(DataManager):
331
543
  start_id: Optional[str] = None
332
544
  button_id: Optional[str] = None
333
545
 
334
- def __repr__(self):
335
- return self.json()
546
+ def __init__(
547
+ self,
548
+ start_id: Optional[str] = None,
549
+ button_id: Optional[str] = None,
550
+ **kwargs
551
+ ):
552
+ super().__init__(
553
+ start_id=start_id,
554
+ button_id=button_id,
555
+ **kwargs
556
+ )
336
557
 
337
558
 
338
- @dataclass
339
559
  class Button(DataManager):
340
560
  id: Optional[str] = None
341
561
  button_text: Optional[str] = None
@@ -348,35 +568,86 @@ class Button(DataManager):
348
568
  button_textbox: Optional[ButtonTextbox] = None
349
569
  button_link: Optional[ButtonLink] = None
350
570
 
571
+ def __init__(
572
+ self,
573
+ id: Optional[str] = None,
574
+ button_text: Optional[str] = None,
575
+ type: enums.ButtonType = enums.ButtonType.Simple,
576
+ button_selection: Optional[ButtonSelection] = None,
577
+ button_calendar: Optional[ButtonCalendar] = None,
578
+ button_number_picker: Optional[ButtonNumberPicker] = None,
579
+ button_string_picker: Optional[ButtonStringPicker] = None,
580
+ button_location: Optional[ButtonLocation] = None,
581
+ button_textbox: Optional[ButtonTextbox] = None,
582
+ button_link: Optional[ButtonLink] = None,
583
+ **kwargs
584
+ ):
585
+ super().__init__(
586
+ id=id,
587
+ button_text=button_text,
588
+ type=type,
589
+ button_selection=button_selection,
590
+ button_calendar=button_calendar,
591
+ button_number_picker=button_number_picker,
592
+ button_string_picker=button_string_picker,
593
+ button_location=button_location,
594
+ button_textbox=button_textbox,
595
+ button_link=button_link,
596
+ **kwargs
597
+ )
598
+
351
599
 
352
- @dataclass
353
600
  class KeypadRow(DataManager):
354
601
  buttons: list[Button]
355
602
 
356
- def __repr__(self):
357
- return self.json()
603
+ def __init__(
604
+ self,
605
+ buttons: list[Button],
606
+ **kwargs
607
+ ):
608
+ super().__init__(
609
+ buttons=buttons,
610
+ **kwargs
611
+ )
358
612
 
359
613
 
360
- @dataclass
361
614
  class Keypad(DataManager):
362
615
  rows: list[KeypadRow]
363
616
  resize_keyboard: bool = True
364
617
  on_time_keyboard: bool = False
365
618
 
366
- def __repr__(self):
367
- return self.json()
619
+ def __init__(
620
+ self,
621
+ rows: list[KeypadRow],
622
+ resize_keyboard: bool = True,
623
+ on_time_keyboard: bool = False,
624
+ **kwargs
625
+ ):
626
+ super().__init__(
627
+ rows=rows,
628
+ resize_keyboard=resize_keyboard,
629
+ on_time_keyboard=on_time_keyboard,
630
+ **kwargs
631
+ )
368
632
 
369
633
 
370
- @dataclass
371
634
  class MessageKeypadUpdate(DataManager):
372
635
  message_id: Optional[str] = None
373
636
  inline_keypad: Optional[Keypad] = None
374
637
 
375
- def __repr__(self):
376
- return self.json()
638
+ def __init__(
639
+ self,
640
+ message_id: Optional[str] = None,
641
+ inline_keypad: Optional[Keypad] = None,
642
+ **kwargs
643
+ ):
644
+ super().__init__(
645
+ message_id=message_id,
646
+ inline_keypad=inline_keypad,
647
+ **kwargs
648
+ )
377
649
 
378
650
 
379
- @dataclass
380
651
  class Message(DataManager):
381
652
  message_id: Optional[str] = None
382
653
  text: Optional[str] = None
@@ -395,19 +666,68 @@ class Message(DataManager):
395
666
  poll: Optional[Poll] = None
396
667
  live_location: Optional[LiveLocation] = None
397
668
 
398
- def __repr__(self):
399
- return self.json()
669
+ def __init__(
670
+ self,
671
+ message_id: Optional[str] = None,
672
+ text: Optional[str] = None,
673
+ time: Optional[str] = None,
674
+ is_edited: Optional[bool] = None,
675
+ sender_type: Optional[enums.MessageSender] = None,
676
+ sender_id: Optional[str] = None,
677
+ aux_data: Optional[AuxData] = None,
678
+ file: Optional[File] = None,
679
+ reply_to_message_id: Optional[str] = None,
680
+ forwarded_from: Optional[ForwardedFrom] = None,
681
+ forwarded_no_link: Optional[str] = None,
682
+ location: Optional[Location] = None,
683
+ sticker: Optional[Sticker] = None,
684
+ contact_message: Optional[ContactMessage] = None,
685
+ poll: Optional[Poll] = None,
686
+ live_location: Optional[LiveLocation] = None,
687
+ **kwargs
688
+ ):
689
+ super().__init__(
690
+ message_id=message_id,
691
+ text=text,
692
+ time=time,
693
+ is_edited=is_edited,
694
+ sender_type=sender_type,
695
+ sender_id=sender_id,
696
+ aux_data=aux_data,
697
+ file=file,
698
+ reply_to_message_id=reply_to_message_id,
699
+ forwarded_from=forwarded_from,
700
+ forwarded_no_link=forwarded_no_link,
701
+ location=location,
702
+ sticker=sticker,
703
+ contact_message=contact_message,
704
+ poll=poll,
705
+ live_location=live_location,
706
+ **kwargs
707
+ )
400
708
 
401
709
 
402
- @dataclass
403
710
  class MessageId(DataManager):
404
711
  message_id: Optional[str] = None
405
712
  file_id: Optional[str] = None
406
713
  chat_id: Optional[str] = None
407
- client: Optional["rubigram.Client"] = None
714
+ client: Optional[Any] = None
408
715
 
409
- def __repr__(self):
410
- return self.json()
716
+ def __init__(
717
+ self,
718
+ message_id: Optional[str] = None,
719
+ file_id: Optional[str] = None,
720
+ chat_id: Optional[str] = None,
721
+ client: Optional[Any] = None,
722
+ **kwargs
723
+ ):
724
+ super().__init__(
725
+ message_id=message_id,
726
+ file_id=file_id,
727
+ chat_id=chat_id,
728
+ client=client,
729
+ **kwargs
730
+ )
411
731
 
412
732
  async def delete(self):
413
733
  return await self.client.delete_message(self.chat_id, self.message_id)
@@ -422,9 +742,8 @@ class MessageId(DataManager):
422
742
  return await self.client.forward_message(self.chat_id, self.message_id, chat_id)
423
743
 
424
744
 
425
- @dataclass
426
745
  class Update(DataManager):
427
- client: Optional["rubigram.Client"] = None
746
+ client: Optional[Any] = None
428
747
  type: Optional[enums.UpdateType] = None
429
748
  chat_id: Optional[str] = None
430
749
  removed_message_id: Optional[str] = None
@@ -432,12 +751,32 @@ class Update(DataManager):
432
751
  updated_message: Optional[Message] = None
433
752
  updated_payment: Optional[PaymentStatus] = None
434
753
 
435
- def __repr__(self):
436
- return self.json()
754
+ def __init__(
755
+ self,
756
+ type: Optional[enums.UpdateType] = None,
757
+ chat_id: Optional[str] = None,
758
+ removed_message_id: Optional[str] = None,
759
+ new_message: Optional[Message] = None,
760
+ updated_message: Optional[Message] = None,
761
+ updated_payment: Optional[PaymentStatus] = None,
762
+ **kwargs
763
+ ):
764
+ super().__init__(
765
+ type=type,
766
+ chat_id=chat_id,
767
+ removed_message_id=removed_message_id,
768
+ new_message=new_message,
769
+ updated_message=updated_message,
770
+ updated_payment=updated_payment,
771
+ **kwargs
772
+ )
437
773
 
438
774
  async def download(self, file_name: str):
439
775
  return await self.client.download_file(self.new_message.file.file_id, file_name)
440
776
 
777
+ async def forward(self, chat_id: str):
778
+ return await self.client.forward_message(self.chat_id, self.new_message.message_id, chat_id)
779
+
441
780
  async def reply(
442
781
  self,
443
782
  text: str,
@@ -446,8 +785,16 @@ class Update(DataManager):
446
785
  chat_keypad_type: Optional[enums.ChatKeypadType] = None,
447
786
  disable_notification: bool = None,
448
787
  ) -> "MessageId":
449
- return await self.client.send_message(self.chat_id, text, chat_keypad, inline_keypad, chat_keypad_type, disable_notification, self.new_message.message_id)
450
-
788
+ return await self.client.send_message(
789
+ self.chat_id,
790
+ text,
791
+ chat_keypad,
792
+ inline_keypad,
793
+ chat_keypad_type,
794
+ disable_notification,
795
+ self.new_message.message_id,
796
+ )
797
+
451
798
  async def reply_poll(
452
799
  self,
453
800
  question: str,
@@ -455,10 +802,19 @@ class Update(DataManager):
455
802
  chat_keypad: Keypad = None,
456
803
  inline_keypad: Keypad = None,
457
804
  chat_keypad_type: Optional[enums.ChatKeypadType] = None,
458
- disable_notification: bool = False
805
+ disable_notification: bool = False,
459
806
  ) -> "MessageId":
460
- return await self.client.send_poll(self.chat_id, question, options, chat_keypad, inline_keypad, chat_keypad_type, disable_notification, self.new_message.message_id)
461
-
807
+ return await self.client.send_poll(
808
+ self.chat_id,
809
+ question,
810
+ options,
811
+ chat_keypad,
812
+ inline_keypad,
813
+ chat_keypad_type,
814
+ disable_notification,
815
+ self.new_message.message_id,
816
+ )
817
+
462
818
  async def reply_location(
463
819
  self,
464
820
  latitude: str,
@@ -468,8 +824,17 @@ class Update(DataManager):
468
824
  chat_keypad_type: Optional[enums.ChatKeypadType] = None,
469
825
  disable_notification: bool = False,
470
826
  ) -> "MessageId":
471
- return await self.client.send_location(self.chat_id, latitude, longitude, chat_keypad, inline_keypad, chat_keypad_type, disable_notification, self.new_message.message_id)
472
-
827
+ return await self.client.send_location(
828
+ self.chat_id,
829
+ latitude,
830
+ longitude,
831
+ chat_keypad,
832
+ inline_keypad,
833
+ chat_keypad_type,
834
+ disable_notification,
835
+ self.new_message.message_id,
836
+ )
837
+
473
838
  async def reply_contact(
474
839
  self,
475
840
  first_name: str,
@@ -480,8 +845,18 @@ class Update(DataManager):
480
845
  chat_keypad_type: Optional[enums.ChatKeypadType] = None,
481
846
  disable_notification: bool = False,
482
847
  ) -> "MessageId":
483
- return await self.client.send_location(self.chat_id, first_name, last_name, phone_number, chat_keypad, inline_keypad, chat_keypad_type, disable_notification, self.new_message.message_id)
484
-
848
+ return await self.client.send_location(
849
+ self.chat_id,
850
+ first_name,
851
+ last_name,
852
+ phone_number,
853
+ chat_keypad,
854
+ inline_keypad,
855
+ chat_keypad_type,
856
+ disable_notification,
857
+ self.new_message.message_id,
858
+ )
859
+
485
860
  async def reply_sticker(
486
861
  self,
487
862
  sticker_id: str,
@@ -490,52 +865,61 @@ class Update(DataManager):
490
865
  chat_keypad_type: Optional[enums.ChatKeypadType] = None,
491
866
  disable_notification: bool = False,
492
867
  ) -> "MessageId":
493
- return await self.client.send_message(self.chat_id, sticker_id, chat_keypad, inline_keypad, chat_keypad_type, disable_notification, self.new_message.message_id)
868
+ return await self.client.send_message(
869
+ self.chat_id,
870
+ sticker_id,
871
+ chat_keypad,
872
+ inline_keypad,
873
+ chat_keypad_type,
874
+ disable_notification,
875
+ self.new_message.message_id,
876
+ )
494
877
 
495
878
  async def reply_file(
496
879
  self,
497
- file: str,
498
- file_name: str,
499
- caption: str = None,
880
+ file: Union[str, bytes],
881
+ caption: Optional[str] = None,
882
+ file_name: Optional[str] = None,
500
883
  type: enums.FileType = enums.FileType.File,
501
884
  chat_keypad: Keypad = None,
502
885
  inline_keypad: Keypad = None,
503
886
  chat_keypad_type: Optional[enums.ChatKeypadType] = None,
504
887
  disable_notification: bool = False,
505
888
  ) -> "MessageId":
506
- return await self.client.send_file(self.chat_id, file, file_name, caption, type, chat_keypad, inline_keypad, chat_keypad_type, disable_notification, self.new_message.message_id)
507
-
508
- async def reply_document(self, document: str, name: str, caption: Optional[str] = None, **kwargs) -> "MessageId":
509
- return await self.reply_file(document, name, caption, "File", **kwargs)
510
-
511
- async def reply_photo(self, photo: str, name: str, caption: Optional[str] = None, **kwargs) -> "MessageId":
512
- return await self.reply_file(photo, name, caption, "Image", **kwargs)
889
+ return await self.client.send_file(
890
+ self.chat_id,
891
+ file,
892
+ caption,
893
+ file_name,
894
+ type,
895
+ chat_keypad,
896
+ inline_keypad,
897
+ chat_keypad_type,
898
+ disable_notification,
899
+ self.new_message.message_id,
900
+ )
513
901
 
514
- async def reply_video(self, video: str, name: str, caption: Optional[str] = None, **kwargs) -> "MessageId":
515
- return await self.reply_file(video, name, caption, "Video", **kwargs)
902
+ async def reply_document(self, document: Union[str, bytes], caption: Optional[str] = None, file_name: Optional[str] = None, **kwargs) -> "MessageId":
903
+ return await self.reply_file(document, caption, file_name, "File", **kwargs)
516
904
 
517
- async def reply_gif(self, gif: str, name: str, caption: Optional[str] = None, **kwargs) -> "MessageId":
518
- return await self.reply_file(gif, name, caption, "Gif", **kwargs)
905
+ async def reply_photo(self, photo: Union[str, bytes], caption: Optional[str] = None, file_name: Optional[str] = None, **kwargs) -> "MessageId":
906
+ return await self.reply_file(photo, caption, file_name, "Image", **kwargs)
519
907
 
520
- async def reply_music(self, music: str, name: str, caption: Optional[str] = None, **kwargs) -> "MessageId":
521
- return await self.reply_file(music, name, caption, "Music", **kwargs)
908
+ async def reply_video(self, video: Union[str, bytes], caption: Optional[str] = None, file_name: Optional[str] = None, **kwargs) -> "MessageId":
909
+ return await self.reply_file(video, caption, file_name, "Video", **kwargs)
522
910
 
523
- async def reply_voice(self, voice: str, name: str, caption: Optional[str] = None, **kwargs) -> "MessageId":
524
- return await self.reply_file(voice, name, caption, "Voice", **kwargs)
911
+ async def reply_gif(self, gif: Union[str, bytes], caption: Optional[str] = None, file_name: Optional[str] = None, **kwargs) -> "MessageId":
912
+ return await self.reply_file(gif, caption, file_name, "Gif", **kwargs)
525
913
 
914
+ async def reply_music(self, music: Union[str, bytes], caption: Optional[str] = None, file_name: Optional[str] = None, **kwargs) -> "MessageId":
915
+ return await self.reply_file(music, caption, file_name, "Music", **kwargs)
526
916
 
527
- @dataclass
528
- class Updates(DataManager):
529
- updates: list[Update] = None
530
- next_offset_id: Optional[str] = None
531
-
532
- def __repr__(self):
533
- return self.json()
917
+ async def reply_voice(self, voice: Union[str, bytes], caption: Optional[str] = None, file_name: Optional[str] = None, **kwargs) -> "MessageId":
918
+ return await self.reply_file(voice, caption, file_name, "Voice", **kwargs)
534
919
 
535
920
 
536
- @dataclass
537
921
  class InlineMessage(DataManager):
538
- client: Optional["rubigram.Client"] = None
922
+ client: Optional[Any] = None
539
923
  sender_id: Optional[str] = None
540
924
  text: Optional[str] = None
541
925
  message_id: Optional[str] = None
@@ -544,5 +928,41 @@ class InlineMessage(DataManager):
544
928
  location: Optional[Location] = None
545
929
  aux_data: Optional[AuxData] = None
546
930
 
547
- def __repr__(self):
548
- return self.json()
931
+ def __init__(
932
+ self,
933
+ sender_id: Optional[str] = None,
934
+ text: Optional[str] = None,
935
+ message_id: Optional[str] = None,
936
+ chat_id: Optional[str] = None,
937
+ file: Optional[File] = None,
938
+ location: Optional[Location] = None,
939
+ aux_data: Optional[AuxData] = None,
940
+ **kwargs
941
+ ):
942
+ super().__init__(
943
+ sender_id=sender_id,
944
+ text=text,
945
+ message_id=message_id,
946
+ chat_id=chat_id,
947
+ file=file,
948
+ location=location,
949
+ aux_data=aux_data,
950
+ **kwargs
951
+ )
952
+
953
+
954
+ class Updates(DataManager):
955
+ updates: Optional[list[Update]] = None
956
+ next_offset_id: Optional[str] = None
957
+
958
+ def __init__(
959
+ self,
960
+ updates: Optional[list[Update]] = None,
961
+ next_offset_id: Optional[str] = None,
962
+ **kwargs
963
+ ):
964
+ super().__init__(
965
+ updates=updates,
966
+ next_offset_id=next_offset_id,
967
+ **kwargs
968
+ )