forked from danog/MadelineProto
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRPCErrorException.php
841 lines (828 loc) · 88.5 KB
/
RPCErrorException.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
<?php
declare(strict_types=1);
/**
* RPCErrorException module.
*
* This file is part of MadelineProto.
* MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* MadelineProto is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
* You should have received a copy of the GNU General Public License along with MadelineProto.
* If not, see <http://www.gnu.org/licenses/>.
*
* @author Daniil Gentili <[email protected]>
* @copyright 2016-2023 Daniil Gentili <[email protected]>
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
* @link https://docs.madelineproto.xyz MadelineProto documentation
*/
namespace danog\MadelineProto;
use Amp\Http\Client\HttpClientBuilder;
use Amp\Http\Client\Request;
use Throwable;
use const PHP_EOL;
use const PHP_SAPI;
/**
* Indicates an error returned by Telegram's API.
*/
class RPCErrorException extends \Exception
{
use TL\PrettyException;
/** @internal */
public static array $descriptions = ['RPC_MCGET_FAIL' => 'Telegram is having internal issues, please try again later.', 'RPC_CALL_FAIL' => 'Telegram is having internal issues, please try again later.', 'USER_PRIVACY_RESTRICTED' => "The user's privacy settings do not allow you to do this", 'CHANNEL_PRIVATE' => "You haven't joined this channel/supergroup", 'USER_IS_BOT' => "Bots can't send messages to other bots", 'BOT_METHOD_INVALID' => 'This method cannot be run by a bot', 'PHONE_CODE_EXPIRED' => 'The phone code you provided has expired, this may happen if it was sent to any chat on telegram (if the code is sent through a telegram chat (not the official account) to avoid it append or prepend to the code some chars)', 'USERNAME_INVALID' => 'The provided username is not valid', 'ACCESS_TOKEN_INVALID' => 'The provided token is not valid', 'ACTIVE_USER_REQUIRED' => 'The method is only available to already activated users', 'FIRSTNAME_INVALID' => 'The first name is invalid', 'LASTNAME_INVALID' => 'The last name is invalid', 'PHONE_NUMBER_INVALID' => 'The phone number is invalid', 'PHONE_CODE_HASH_EMPTY' => 'phone_code_hash is missing', 'PHONE_CODE_EMPTY' => 'phone_code is missing', 'API_ID_INVALID' => 'The api_id/api_hash combination is invalid', 'PHONE_NUMBER_OCCUPIED' => 'The phone number is already in use', 'PHONE_NUMBER_UNOCCUPIED' => 'The phone number is not yet being used', 'USERS_TOO_FEW' => 'Not enough users (to create a chat, for example)', 'USERS_TOO_MUCH' => 'The maximum number of users has been exceeded (to create a chat, for example)', 'TYPE_CONSTRUCTOR_INVALID' => 'The type constructor is invalid', 'FILE_PART_INVALID' => 'The file part number is invalid', 'FILE_PARTS_INVALID' => 'The number of file parts is invalid', 'MD5_CHECKSUM_INVALID' => 'The MD5 checksums do not match', 'PHOTO_INVALID_DIMENSIONS' => 'The photo dimensions are invalid', 'FIELD_NAME_INVALID' => 'The field with the name FIELD_NAME is invalid', 'FIELD_NAME_EMPTY' => 'The field with the name FIELD_NAME is missing', 'MSG_WAIT_FAILED' => 'A waiting call returned an error', 'USERNAME_NOT_OCCUPIED' => 'The provided username is not occupied', 'PHONE_NUMBER_BANNED' => 'The provided phone number is banned from telegram', 'AUTH_KEY_UNREGISTERED' => 'The authorization key has expired', 'INVITE_HASH_EXPIRED' => 'The invite link has expired', 'USER_DEACTIVATED' => 'The user was deactivated', 'USER_ALREADY_PARTICIPANT' => 'The user is already in the group', 'MESSAGE_ID_INVALID' => 'The provided message id is invalid', 'PEER_ID_INVALID' => 'The provided peer id is invalid', 'CHAT_ID_INVALID' => 'The provided chat id is invalid', 'MESSAGE_DELETE_FORBIDDEN' => "You can't delete one of the messages you tried to delete, most likely because it is a service message.", 'CHAT_ADMIN_REQUIRED' => 'You must be an admin in this chat to do this', -429 => 'Too many requests', 'PEER_FLOOD' => "You are spamreported, you can't do this"];
/** @internal */
public static array $errorMethodMap = [];
private static array $fetchedError = [];
private const BAD = [
'CDN_SALTS_EMPTY' => true,
'BOT_POLLS_DISABLED' => true,
'PHOTO_THUMB_URL_INVALID' => true,
'ACTIVE_USER_REQUIRED' => true,
'PEER_FLOOD' => true,
'USER_DEACTIVATED_BAN' => true,
'INPUT_METHOD_INVALID' => true,
'INPUT_FETCH_ERROR' => true,
'AUTH_KEY_UNREGISTERED' => true,
'SESSION_REVOKED' => true,
'USER_DEACTIVATED' => true,
'RPC_SEND_FAIL' => true,
'RPC_CALL_FAIL' => true,
'RPC_MCGET_FAIL' => true,
'INTERDC_5_CALL_ERROR' => true,
'INTERDC_4_CALL_ERROR' => true,
'INTERDC_3_CALL_ERROR' => true,
'INTERDC_2_CALL_ERROR' => true,
'INTERDC_1_CALL_ERROR' => true,
'INTERDC_5_CALL_RICH_ERROR' => true,
'INTERDC_4_CALL_RICH_ERROR' => true,
'INTERDC_3_CALL_RICH_ERROR' => true,
'INTERDC_2_CALL_RICH_ERROR' => true,
'INTERDC_1_CALL_RICH_ERROR' => true,
'AUTH_KEY_DUPLICATED' => true,
'CONNECTION_NOT_INITED' => true,
'LOCATION_NOT_AVAILABLE' => true,
'AUTH_KEY_INVALID' => true,
'LANG_CODE_EMPTY' => true,
'memory limit exit' => true,
'memory limit(?)' => true,
'INPUT_REQUEST_TOO_LONG' => true,
'SESSION_PASSWORD_NEEDED' => true,
'INPUT_FETCH_FAIL' => true,
'CONNECTION_SYSTEM_EMPTY' => true,
'FILE_WRITE_FAILED' => true,
'STORAGE_CHOOSE_VOLUME_FAILED' => true,
'xxx' => true,
'AES_DECRYPT_FAILED' => true,
'Timedout' => true,
'SEND_REACTION_RESULT1_INVALID' => true,
'TEMPNAM_FAILED' => true,
'MSG_WAIT_TIMEOUT' => true,
'MEMBER_CHAT_ADD_FAILED' => true,
'CHAT_FROM_CALL_CHANGED' => true,
'MTPROTO_CLUSTER_INVALID' => true,
'CONNECTION_DEVICE_MODEL_EMPTY' => true,
'AUTH_KEY_PERM_EMPTY' => true,
'UNKNOWN_METHOD' => true,
'ENCRYPTION_OCCUPY_FAILED' => true,
'ENCRYPTION_OCCUPY_ADMIN_FAILED' => true,
'CHAT_OCCUPY_USERNAME_FAILED' => true,
'REG_ID_GENERATE_FAILED' => true,
'CONNECTION_LANG_PACK_INVALID' => true,
'MSGID_DECREASE_RETRY' => true,
'API_CALL_ERROR' => true,
'STORAGE_CHECK_FAILED' => true,
'INPUT_LAYER_INVALID' => true,
'NEED_MEMBER_INVALID' => true,
'NEED_CHAT_INVALID' => true,
'HISTORY_GET_FAILED' => true,
'CHP_CALL_FAIL' => true,
'IMAGE_ENGINE_DOWN' => true,
'MSG_RANGE_UNSYNC' => true,
'PTS_CHANGE_EMPTY' => true,
'CONNECTION_SYSTEM_LANG_CODE_EMPTY' => true,
'WORKER_BUSY_TOO_LONG_RETRY' => true,
'WP_ID_GENERATE_FAILED' => true,
'ARR_CAS_FAILED' => true,
'CHANNEL_ADD_INVALID' => true,
'CHANNEL_ADMINS_INVALID' => true,
'CHAT_OCCUPY_LOC_FAILED' => true,
'GROUPED_ID_OCCUPY_FAILED' => true,
'GROUPED_ID_OCCUPY_FAULED' => true,
'LOG_WRAP_FAIL' => true,
'MEMBER_FETCH_FAILED' => true,
'MEMBER_OCCUPY_PRIMARY_LOC_FAILED' => true,
'MEMBER_NO_LOCATION' => true,
'MEMBER_OCCUPY_USERNAME_FAILED' => true,
'MT_SEND_QUEUE_TOO_LONG' => true,
'POSTPONED_TIMEOUT' => true,
'RPC_CONNECT_FAILED' => true,
'SHORTNAME_OCCUPY_FAILED' => true,
'STORE_INVALID_OBJECT_TYPE' => true,
'STORE_INVALID_SCALAR_TYPE' => true,
'TMSG_ADD_FAILED' => true,
'UNKNOWN_ERROR' => true,
'UPLOAD_NO_VOLUME' => true,
'USER_NOT_AVAILABLE' => true,
'VOLUME_LOC_NOT_FOUND' => true,
'FILE_WRITE_EMPTY' => true,
'Internal_Server_Error' => true,
'INVITE_HASH_UNSYNC' => true,
'CHANNEL_ID_GENERATE_FAILED' => true,
'Invalid msgs_state_req query' => true,
];
/** @internal */
public static function isBad(string $error, int $code, string $method): bool
{
return isset(self::BAD[$error])
|| str_contains($error, 'Received bad_msg_notification')
|| str_contains($error, 'FLOOD_WAIT_')
|| str_contains($error, '_MIGRATE_')
|| str_contains($error, 'INPUT_METHOD_INVALID')
|| str_contains($error, 'INPUT_CONSTRUCTOR_INVALID')
|| str_contains($error, 'INPUT_FETCH_ERROR_')
|| str_contains($error, 'https://telegram.org/dl')
|| str_starts_with($error, 'Received bad_msg_notification')
|| str_starts_with($error, 'No workers running')
|| str_starts_with($error, 'FLOOD_TEST_PHONE_WAIT_')
|| str_starts_with($error, 'All workers are busy. Active_queries ')
|| preg_match('/FILE_PART_\d*_MISSING/', $error)
|| !preg_match('/^[a-zA-Z0-9\._]+$/', $method)
|| ($error === 'Timeout' && !\in_array(strtolower($method), ['messages.getbotcallbackanswer', 'messages.getinlinebotresults'], true))
|| ($error === 'BOT_MISSING' && \in_array($method, ['stickers.changeStickerPosition', 'stickers.createStickerSet', 'messages.uploadMedia'], true))
|| is_numeric($method);
}
/**
* @internal
*/
private static function report(string $error, int $code, string $method): string
{
if (!$method || !$code || !$error) {
return $error;
}
$error = preg_replace('/\\d+$/', 'X', $error);
$description = self::$descriptions[$error] ?? '';
if ((!isset(self::$errorMethodMap[$code][$method][$error]) || !isset(self::$descriptions[$error]))
&& !self::isBad($error, $code, $method)
) {
try {
$res = json_decode(
(
HttpClientBuilder::buildDefault()
->request(new Request('https://report-rpc-error.madelineproto.xyz/?method='.$method.'&code='.$code.'&error='.$error))
)->getBody()->buffer(),
true,
);
if (isset($res['ok']) && $res['ok'] && isset($res['result']) && \is_string($res['result'])) {
$description = $res['result'];
self::$descriptions[$error] = $description;
self::$errorMethodMap[$code][$method][$error] = $error;
}
self::$fetchedError[$error] = true;
} catch (Throwable) {
}
}
if (!$description) {
return $error;
}
return $description;
}
/**
* Get string representation of exception.
*/
public function __toString(): string
{
Magic::start(light: true);
$result = sprintf(Lang::$current_lang['rpc_tg_error'], $this->description." ({$this->code})", $this->rpc, $this->file, $this->line.PHP_EOL, Magic::$revision.PHP_EOL.PHP_EOL).PHP_EOL.$this->getTLTrace().PHP_EOL;
if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg') {
$result = str_replace(PHP_EOL, '<br>'.PHP_EOL, $result);
}
return $result;
}
/**
* Get localized error name.
*/
public function getLocalization(): string
{
return $this->description;
}
/**
* @internal
*/
public static function make(
string $rpc,
int $code,
string $caller,
?\Exception $previous = null
): self {
$msg = self::report($rpc, $code, $caller);
// Start match
return match ($rpc) {
'ADDRESS_INVALID' => new self($rpc, 'The specified geopoint address is invalid.', $code, $caller, $previous),
'ABOUT_TOO_LONG' => new self($rpc, 'About string too long.', $code, $caller, $previous),
'ACCESS_TOKEN_EXPIRED' => new self($rpc, 'Access token expired.', $code, $caller, $previous),
'ACCESS_TOKEN_INVALID' => new self($rpc, 'Access token invalid.', $code, $caller, $previous),
'AD_EXPIRED' => new self($rpc, 'The ad has expired (too old or not found).', $code, $caller, $previous),
'ADMIN_ID_INVALID' => new self($rpc, 'The specified admin ID is invalid.', $code, $caller, $previous),
'ADMIN_RANK_EMOJI_NOT_ALLOWED' => new self($rpc, 'An admin rank cannot contain emojis.', $code, $caller, $previous),
'ADMIN_RANK_INVALID' => new self($rpc, 'The specified admin rank is invalid.', $code, $caller, $previous),
'ADMIN_RIGHTS_EMPTY' => new self($rpc, 'The chatAdminRights constructor passed in keyboardButtonRequestPeer.peer_type.user_admin_rights has no rights set (i.e. flags is 0).', $code, $caller, $previous),
'ADMINS_TOO_MUCH' => new self($rpc, 'There are too many admins.', $code, $caller, $previous),
'ALBUM_PHOTOS_TOO_MANY' => new self($rpc, 'You have uploaded too many profile photos, delete some before retrying.', $code, $caller, $previous),
'API_ID_INVALID' => new self($rpc, 'API ID invalid.', $code, $caller, $previous),
'API_ID_PUBLISHED_FLOOD' => new self($rpc, 'This API id was published somewhere, you can\'t use it now.', $code, $caller, $previous),
'ARTICLE_TITLE_EMPTY' => new self($rpc, 'The title of the article is empty.', $code, $caller, $previous),
'AUDIO_CONTENT_URL_EMPTY' => new self($rpc, 'The remote URL specified in the content field is empty.', $code, $caller, $previous),
'AUDIO_TITLE_EMPTY' => new self($rpc, 'An empty audio title was provided.', $code, $caller, $previous),
'AUTH_BYTES_INVALID' => new self($rpc, 'The provided authorization is invalid.', $code, $caller, $previous),
'AUTH_TOKEN_ALREADY_ACCEPTED' => new self($rpc, 'The specified auth token was already accepted.', $code, $caller, $previous),
'AUTH_TOKEN_EXCEPTION' => new self($rpc, 'An error occurred while importing the auth token.', $code, $caller, $previous),
'AUTH_TOKEN_EXPIRED' => new self($rpc, 'The authorization token has expired.', $code, $caller, $previous),
'AUTH_TOKEN_INVALID' => new self($rpc, 'The specified auth token is invalid.', $code, $caller, $previous),
'AUTH_TOKEN_INVALIDX' => new self($rpc, 'The specified auth token is invalid.', $code, $caller, $previous),
'AUTOARCHIVE_NOT_AVAILABLE' => new self($rpc, 'The autoarchive setting is not available at this time: please check the value of the [autoarchive_setting_available field in client config »](https://core.telegram.org/api/config#client-configuration) before calling this method.', $code, $caller, $previous),
'BALANCE_TOO_LOW' => new self($rpc, 'The transaction cannot be completed because the current [Telegram Stars balance](https://core.telegram.org/api/stars) is too low.', $code, $caller, $previous),
'BANK_CARD_NUMBER_INVALID' => new self($rpc, 'The specified card number is invalid.', $code, $caller, $previous),
'BANNED_RIGHTS_INVALID' => new self($rpc, 'You provided some invalid flags in the banned rights.', $code, $caller, $previous),
'BIRTHDAY_INVALID' => new self($rpc, 'An invalid age was specified, must be between 0 and 150 years.', $code, $caller, $previous),
'BOOST_NOT_MODIFIED' => new self($rpc, 'You\'re already [boosting](https://core.telegram.org/api/boost) the specified channel.', $code, $caller, $previous),
'BOOST_PEER_INVALID' => new self($rpc, 'The specified `boost_peer` is invalid.', $code, $caller, $previous),
'BOOSTS_EMPTY' => new self($rpc, 'No boost slots were specified.', $code, $caller, $previous),
'BOOSTS_REQUIRED' => new self($rpc, 'The specified channel must first be [boosted by its users](https://core.telegram.org/api/boost) in order to perform this action.', $code, $caller, $previous),
'BOT_ALREADY_DISABLED' => new self($rpc, 'The connected business bot was already disabled for the specified peer.', $code, $caller, $previous),
'BOT_APP_BOT_INVALID' => new self($rpc, 'The bot_id passed in the inputBotAppShortName constructor is invalid.', $code, $caller, $previous),
'BOT_APP_INVALID' => new self($rpc, 'The specified bot app is invalid.', $code, $caller, $previous),
'BOT_APP_SHORTNAME_INVALID' => new self($rpc, 'The specified bot app short name is invalid.', $code, $caller, $previous),
'BOT_BUSINESS_MISSING' => new self($rpc, 'The specified bot is not a business bot (the [user](https://core.telegram.org/constructor/user).`bot_business` flag is not set).', $code, $caller, $previous),
'BOT_CHANNELS_NA' => new self($rpc, 'Bots can\'t edit admin privileges.', $code, $caller, $previous),
'BOT_COMMAND_DESCRIPTION_INVALID' => new self($rpc, 'The specified command description is invalid.', $code, $caller, $previous),
'BOT_COMMAND_INVALID' => new self($rpc, 'The specified command is invalid.', $code, $caller, $previous),
'BOT_DOMAIN_INVALID' => new self($rpc, 'Bot domain invalid.', $code, $caller, $previous),
'BOT_GAMES_DISABLED' => new \danog\MadelineProto\RPCError\BotGamesDisabledError($code, $caller, $previous),
'BOT_GROUPS_BLOCKED' => new self($rpc, 'This bot can\'t be added to groups.', $code, $caller, $previous),
'BOT_INLINE_DISABLED' => new self($rpc, 'This bot can\'t be used in inline mode.', $code, $caller, $previous),
'BOT_INVALID' => new self($rpc, 'This is not a valid bot.', $code, $caller, $previous),
'BOT_NOT_CONNECTED_YET' => new self($rpc, 'No [business bot](https://core.telegram.org/api/business#connected-bots) is connected to the currently logged in user.', $code, $caller, $previous),
'BOT_ONESIDE_NOT_AVAIL' => new self($rpc, 'Bots can\'t pin messages in PM just for themselves.', $code, $caller, $previous),
'BOT_PAYMENTS_DISABLED' => new \danog\MadelineProto\RPCError\BotPaymentsDisabledError($code, $caller, $previous),
'BOT_RESPONSE_TIMEOUT' => new self($rpc, 'A timeout occurred while fetching data from the bot.', $code, $caller, $previous),
'BOT_SCORE_NOT_MODIFIED' => new self($rpc, 'The score wasn\'t modified.', $code, $caller, $previous),
'BOT_WEBVIEW_DISABLED' => new self($rpc, 'A webview cannot be opened in the specified conditions: emitted for example if `from_bot_menu` or `url` are set and `peer` is not the chat with the bot.', $code, $caller, $previous),
'BOTS_TOO_MUCH' => new self($rpc, 'There are too many bots in this chat/channel.', $code, $caller, $previous),
'BROADCAST_ID_INVALID' => new self($rpc, 'Broadcast ID invalid.', $code, $caller, $previous),
'BROADCAST_PUBLIC_VOTERS_FORBIDDEN' => new \danog\MadelineProto\RPCError\BroadcastPublicVotersForbiddenError($code, $caller, $previous),
'BROADCAST_REQUIRED' => new self($rpc, 'This method can only be called on a channel, please use stats.getMegagroupStats for supergroups.', $code, $caller, $previous),
'BUSINESS_PEER_INVALID' => new self($rpc, 'Messages can\'t be set to the specified peer through the current [business connection](https://core.telegram.org/api/business#connected-bots).', $code, $caller, $previous),
'BUSINESS_RECIPIENTS_EMPTY' => new self($rpc, 'You didn\'t set any flag in inputBusinessBotRecipients, thus the bot cannot work with *any* peer.', $code, $caller, $previous),
'BUSINESS_WORK_HOURS_EMPTY' => new self($rpc, 'No work hours were specified.', $code, $caller, $previous),
'BUSINESS_WORK_HOURS_PERIOD_INVALID' => new self($rpc, 'The specified work hours are invalid, see [here »](https://core.telegram.org/api/business#opening-hours) for the exact requirements.', $code, $caller, $previous),
'BUTTON_DATA_INVALID' => new self($rpc, 'The data of one or more of the buttons you provided is invalid.', $code, $caller, $previous),
'BUTTON_POS_INVALID' => new self($rpc, 'The position of one of the keyboard buttons is invalid (i.e. a Game or Pay button not in the first position, and so on...).', $code, $caller, $previous),
'BUTTON_TEXT_INVALID' => new self($rpc, 'The specified button text is invalid.', $code, $caller, $previous),
'BUTTON_TYPE_INVALID' => new self($rpc, 'The type of one or more of the buttons you provided is invalid.', $code, $caller, $previous),
'BUTTON_URL_INVALID' => new self($rpc, 'Button URL invalid.', $code, $caller, $previous),
'BUTTON_USER_INVALID' => new self($rpc, 'The `user_id` passed to inputKeyboardButtonUserProfile is invalid!', $code, $caller, $previous),
'BUTTON_USER_PRIVACY_RESTRICTED' => new \danog\MadelineProto\RPCError\ButtonUserPrivacyRestrictedError($code, $caller, $previous),
'CALL_ALREADY_ACCEPTED' => new \danog\MadelineProto\RPCError\CallAlreadyAcceptedError($code, $caller, $previous),
'CALL_ALREADY_DECLINED' => new \danog\MadelineProto\RPCError\CallAlreadyDeclinedError($code, $caller, $previous),
'CALL_OCCUPY_FAILED' => new self($rpc, 'The call failed because the user is already making another call.', $code, $caller, $previous),
'CALL_PEER_INVALID' => new self($rpc, 'The provided call peer object is invalid.', $code, $caller, $previous),
'CALL_PROTOCOL_FLAGS_INVALID' => new self($rpc, 'Call protocol flags invalid.', $code, $caller, $previous),
'CDN_METHOD_INVALID' => new self($rpc, 'You can\'t call this method in a CDN DC.', $code, $caller, $previous),
'CHANNEL_FORUM_MISSING' => new self($rpc, 'This supergroup is not a forum.', $code, $caller, $previous),
'CHANNEL_ID_INVALID' => new self($rpc, 'The specified supergroup ID is invalid.', $code, $caller, $previous),
'CHANNEL_INVALID' => new \danog\MadelineProto\RPCError\ChannelInvalidError($code, $caller, $previous),
'CHANNEL_PARICIPANT_MISSING' => new self($rpc, 'The current user is not in the channel.', $code, $caller, $previous),
'CHANNEL_PRIVATE' => new \danog\MadelineProto\RPCError\ChannelPrivateError($code, $caller, $previous),
'CHANNEL_TOO_BIG' => new self($rpc, 'This channel has too many participants (>1000) to be deleted.', $code, $caller, $previous),
'CHANNEL_TOO_LARGE' => new self($rpc, 'Channel is too large to be deleted; this error is issued when trying to delete channels with more than 1000 members (subject to change).', $code, $caller, $previous),
'CHANNELS_ADMIN_LOCATED_TOO_MUCH' => new self($rpc, 'The user has reached the limit of public geogroups.', $code, $caller, $previous),
'CHANNELS_ADMIN_PUBLIC_TOO_MUCH' => new self($rpc, 'You\'re admin of too many public channels, make some channels private to change the username of this channel.', $code, $caller, $previous),
'CHANNELS_TOO_MUCH' => new self($rpc, 'You have joined too many channels/supergroups.', $code, $caller, $previous),
'CHARGE_ALREADY_REFUNDED' => new self($rpc, 'The transaction was already refunded.', $code, $caller, $previous),
'CHAT_ABOUT_NOT_MODIFIED' => new self($rpc, 'About text has not changed.', $code, $caller, $previous),
'CHAT_ABOUT_TOO_LONG' => new self($rpc, 'Chat about too long.', $code, $caller, $previous),
'CHAT_ADMIN_REQUIRED' => new \danog\MadelineProto\RPCError\ChatAdminRequiredError($code, $caller, $previous),
'CHAT_DISCUSSION_UNALLOWED' => new self($rpc, 'You can\'t enable forum topics in a discussion group linked to a channel.', $code, $caller, $previous),
'CHAT_FORWARDS_RESTRICTED' => new \danog\MadelineProto\RPCError\ChatForwardsRestrictedError($code, $caller, $previous),
'CHAT_ID_EMPTY' => new self($rpc, 'The provided chat ID is empty.', $code, $caller, $previous),
'CHAT_ID_INVALID' => new self($rpc, 'The provided chat id is invalid.', $code, $caller, $previous),
'CHAT_INVALID' => new self($rpc, 'Invalid chat.', $code, $caller, $previous),
'CHAT_INVITE_PERMANENT' => new self($rpc, 'You can\'t set an expiration date on permanent invite links.', $code, $caller, $previous),
'CHAT_LINK_EXISTS' => new self($rpc, 'The chat is public, you can\'t hide the history to new users.', $code, $caller, $previous),
'CHAT_NOT_MODIFIED' => new self($rpc, 'No changes were made to chat information because the new information you passed is identical to the current information.', $code, $caller, $previous),
'CHAT_PUBLIC_REQUIRED' => new self($rpc, 'You can only enable join requests in public groups.', $code, $caller, $previous),
'CHAT_RESTRICTED' => new \danog\MadelineProto\RPCError\ChatRestrictedError($code, $caller, $previous),
'CHAT_REVOKE_DATE_UNSUPPORTED' => new self($rpc, '`min_date` and `max_date` are not available for using with non-user peers.', $code, $caller, $previous),
'CHAT_SEND_INLINE_FORBIDDEN' => new self($rpc, 'You can\'t send inline messages in this group.', $code, $caller, $previous),
'CHAT_TITLE_EMPTY' => new self($rpc, 'No chat title provided.', $code, $caller, $previous),
'CHAT_TOO_BIG' => new self($rpc, 'This method is not available for groups with more than `chat_read_mark_size_threshold` members, [see client configuration »](https://core.telegram.org/api/config#client-configuration).', $code, $caller, $previous),
'CHATLINK_SLUG_EMPTY' => new self($rpc, 'The specified slug is empty.', $code, $caller, $previous),
'CHATLINK_SLUG_EXPIRED' => new self($rpc, 'The specified [business chat link](https://core.telegram.org/api/business#business-chat-links) has expired.', $code, $caller, $previous),
'CHATLINKS_TOO_MUCH' => new self($rpc, 'Too many [business chat links](https://core.telegram.org/api/business#business-chat-links) were created, please delete some older links.', $code, $caller, $previous),
'CHATLIST_EXCLUDE_INVALID' => new self($rpc, 'The specified `exclude_peers` are invalid.', $code, $caller, $previous),
'CODE_EMPTY' => new self($rpc, 'The provided code is empty.', $code, $caller, $previous),
'CODE_HASH_INVALID' => new self($rpc, 'Code hash invalid.', $code, $caller, $previous),
'CODE_INVALID' => new self($rpc, 'Code invalid.', $code, $caller, $previous),
'COLLECTIBLE_INVALID' => new self($rpc, 'The specified collectible is invalid.', $code, $caller, $previous),
'COLLECTIBLE_NOT_FOUND' => new self($rpc, 'The specified collectible could not be found.', $code, $caller, $previous),
'COLOR_INVALID' => new self($rpc, 'The specified color palette ID was invalid.', $code, $caller, $previous),
'CONNECTION_API_ID_INVALID' => new self($rpc, 'The provided API id is invalid.', $code, $caller, $previous),
'CONNECTION_APP_VERSION_EMPTY' => new self($rpc, 'App version is empty.', $code, $caller, $previous),
'CONNECTION_ID_INVALID' => new self($rpc, 'The specified connection ID is invalid.', $code, $caller, $previous),
'CONNECTION_LAYER_INVALID' => new self($rpc, 'Layer invalid.', $code, $caller, $previous),
'CONTACT_ADD_MISSING' => new self($rpc, 'Contact to add is missing.', $code, $caller, $previous),
'CONTACT_ID_INVALID' => new self($rpc, 'The provided contact ID is invalid.', $code, $caller, $previous),
'CONTACT_MISSING' => new self($rpc, 'The specified user is not a contact.', $code, $caller, $previous),
'CONTACT_NAME_EMPTY' => new self($rpc, 'Contact name empty.', $code, $caller, $previous),
'CONTACT_REQ_MISSING' => new self($rpc, 'Missing contact request.', $code, $caller, $previous),
'CREATE_CALL_FAILED' => new self($rpc, 'An error occurred while creating the call.', $code, $caller, $previous),
'CURRENCY_TOTAL_AMOUNT_INVALID' => new self($rpc, 'The total amount of all prices is invalid.', $code, $caller, $previous),
'CUSTOM_REACTIONS_TOO_MANY' => new self($rpc, 'Too many custom reactions were specified.', $code, $caller, $previous),
'DATA_INVALID' => new self($rpc, 'Encrypted data invalid.', $code, $caller, $previous),
'DATA_JSON_INVALID' => new self($rpc, 'The provided JSON data is invalid.', $code, $caller, $previous),
'DATA_TOO_LONG' => new self($rpc, 'Data too long.', $code, $caller, $previous),
'DATE_EMPTY' => new self($rpc, 'Date empty.', $code, $caller, $previous),
'DC_ID_INVALID' => new \danog\MadelineProto\RPCError\DcIdInvalidError($code, $caller, $previous),
'DH_G_A_INVALID' => new self($rpc, 'g_a invalid.', $code, $caller, $previous),
'DOCUMENT_INVALID' => new self($rpc, 'The specified document is invalid.', $code, $caller, $previous),
'EMAIL_HASH_EXPIRED' => new self($rpc, 'Email hash expired.', $code, $caller, $previous),
'EMAIL_INVALID' => new self($rpc, 'The specified email is invalid.', $code, $caller, $previous),
'EMAIL_NOT_ALLOWED' => new self($rpc, 'The specified email cannot be used to complete the operation.', $code, $caller, $previous),
'EMAIL_NOT_SETUP' => new self($rpc, 'In order to change the login email with emailVerifyPurposeLoginChange, an existing login email must already be set using emailVerifyPurposeLoginSetup.', $code, $caller, $previous),
'EMAIL_UNCONFIRMED' => new self($rpc, 'Email unconfirmed.', $code, $caller, $previous),
'EMAIL_VERIFY_EXPIRED' => new self($rpc, 'The verification email has expired.', $code, $caller, $previous),
'EMOJI_INVALID' => new self($rpc, 'The specified theme emoji is valid.', $code, $caller, $previous),
'EMOJI_MARKUP_INVALID' => new self($rpc, 'The specified `video_emoji_markup` was invalid.', $code, $caller, $previous),
'EMOJI_NOT_MODIFIED' => new self($rpc, 'The theme wasn\'t changed.', $code, $caller, $previous),
'EMOTICON_EMPTY' => new self($rpc, 'The emoji is empty.', $code, $caller, $previous),
'EMOTICON_INVALID' => new self($rpc, 'The specified emoji is invalid.', $code, $caller, $previous),
'EMOTICON_STICKERPACK_MISSING' => new self($rpc, 'inputStickerSetDice.emoji cannot be empty.', $code, $caller, $previous),
'ENCRYPTED_MESSAGE_INVALID' => new self($rpc, 'Encrypted message invalid.', $code, $caller, $previous),
'ENCRYPTION_ALREADY_ACCEPTED' => new \danog\MadelineProto\RPCError\EncryptionAlreadyAcceptedError($code, $caller, $previous),
'ENCRYPTION_ALREADY_DECLINED' => new \danog\MadelineProto\RPCError\EncryptionAlreadyDeclinedError($code, $caller, $previous),
'ENCRYPTION_DECLINED' => new \danog\MadelineProto\RPCError\EncryptionDeclinedError($code, $caller, $previous),
'ENCRYPTION_ID_INVALID' => new self($rpc, 'The provided secret chat ID is invalid.', $code, $caller, $previous),
'ENTITIES_TOO_LONG' => new self($rpc, 'You provided too many styled message entities.', $code, $caller, $previous),
'ENTITY_BOUNDS_INVALID' => new self($rpc, 'A specified [entity offset or length](https://core.telegram.org/api/entities#entity-length) is invalid, see [here »](https://core.telegram.org/api/entities#entity-length) for info on how to properly compute the entity offset/length.', $code, $caller, $previous),
'ENTITY_MENTION_USER_INVALID' => new self($rpc, 'You mentioned an invalid user.', $code, $caller, $previous),
'ERROR_TEXT_EMPTY' => new self($rpc, 'The provided error message is empty.', $code, $caller, $previous),
'EXPIRE_DATE_INVALID' => new self($rpc, 'The specified expiration date is invalid.', $code, $caller, $previous),
'EXPORT_CARD_INVALID' => new self($rpc, 'Provided card is invalid.', $code, $caller, $previous),
'EXTERNAL_URL_INVALID' => new self($rpc, 'External URL invalid.', $code, $caller, $previous),
'FILE_CONTENT_TYPE_INVALID' => new self($rpc, 'File content-type is invalid.', $code, $caller, $previous),
'FILE_EMTPY' => new self($rpc, 'An empty file was provided.', $code, $caller, $previous),
'FILE_ID_INVALID' => new self($rpc, 'The provided file id is invalid.', $code, $caller, $previous),
'FILE_PART_EMPTY' => new self($rpc, 'The provided file part is empty.', $code, $caller, $previous),
'FILE_PART_INVALID' => new self($rpc, 'The file part number is invalid.', $code, $caller, $previous),
'FILE_PART_LENGTH_INVALID' => new self($rpc, 'The length of a file part is invalid.', $code, $caller, $previous),
'FILE_PART_SIZE_CHANGED' => new self($rpc, 'Provided file part size has changed.', $code, $caller, $previous),
'FILE_PART_SIZE_INVALID' => new self($rpc, 'The provided file part size is invalid.', $code, $caller, $previous),
'FILE_PART_TOO_BIG' => new self($rpc, 'The uploaded file part is too big.', $code, $caller, $previous),
'FILE_PARTS_INVALID' => new self($rpc, 'The number of file parts is invalid.', $code, $caller, $previous),
'FILE_REFERENCE_EMPTY' => new self($rpc, 'An empty [file reference](https://core.telegram.org/api/file_reference) was specified.', $code, $caller, $previous),
'FILE_REFERENCE_EXPIRED' => new \danog\MadelineProto\RPCError\FileReferenceExpiredError($code, $caller, $previous),
'FILE_REFERENCE_INVALID' => new self($rpc, 'The specified [file reference](https://core.telegram.org/api/file_reference) is invalid.', $code, $caller, $previous),
'FILE_TITLE_EMPTY' => new self($rpc, 'An empty file title was specified.', $code, $caller, $previous),
'FILE_TOKEN_INVALID' => new \danog\MadelineProto\RPCError\FileTokenInvalidError($code, $caller, $previous),
'FILTER_ID_INVALID' => new self($rpc, 'The specified filter ID is invalid.', $code, $caller, $previous),
'FILTER_INCLUDE_EMPTY' => new self($rpc, 'The include_peers vector of the filter is empty.', $code, $caller, $previous),
'FILTER_NOT_SUPPORTED' => new self($rpc, 'The specified filter cannot be used in this context.', $code, $caller, $previous),
'FILTER_TITLE_EMPTY' => new self($rpc, 'The title field of the filter is empty.', $code, $caller, $previous),
'FIRSTNAME_INVALID' => new self($rpc, 'The first name is invalid.', $code, $caller, $previous),
'FOLDER_ID_EMPTY' => new self($rpc, 'An empty folder ID was specified.', $code, $caller, $previous),
'FOLDER_ID_INVALID' => new self($rpc, 'Invalid folder ID.', $code, $caller, $previous),
'FORM_EXPIRED' => new self($rpc, 'The form was generated more than 10 minutes ago and has expired, please re-generate it using [payments.getPaymentForm](https://core.telegram.org/method/payments.getPaymentForm) and pass the new `form_id`.', $code, $caller, $previous),
'FORUM_ENABLED' => new self($rpc, 'You can\'t execute the specified action because the group is a [forum](https://core.telegram.org/api/forum), disable forum functionality to continue.', $code, $caller, $previous),
'FRESH_CHANGE_ADMINS_FORBIDDEN' => new self($rpc, 'You were just elected admin, you can\'t add or modify other admins yet.', $code, $caller, $previous),
'FROM_MESSAGE_BOT_DISABLED' => new \danog\MadelineProto\RPCError\FromMessageBotDisabledError($code, $caller, $previous),
'FROM_PEER_INVALID' => new self($rpc, 'The specified from_id is invalid.', $code, $caller, $previous),
'GAME_BOT_INVALID' => new self($rpc, 'Bots can\'t send another bot\'s game.', $code, $caller, $previous),
'GENERAL_MODIFY_ICON_FORBIDDEN' => new self($rpc, 'You can\'t modify the icon of the "General" topic.', $code, $caller, $previous),
'GEO_POINT_INVALID' => new self($rpc, 'Invalid geoposition provided.', $code, $caller, $previous),
'GIF_CONTENT_TYPE_INVALID' => new self($rpc, 'GIF content-type invalid.', $code, $caller, $previous),
'GIF_ID_INVALID' => new self($rpc, 'The provided GIF ID is invalid.', $code, $caller, $previous),
'GIFT_SLUG_EXPIRED' => new self($rpc, 'The specified gift slug has expired.', $code, $caller, $previous),
'GIFT_SLUG_INVALID' => new self($rpc, 'The specified slug is invalid.', $code, $caller, $previous),
'GRAPH_EXPIRED_RELOAD' => new self($rpc, 'This graph has expired, please obtain a new graph token.', $code, $caller, $previous),
'GRAPH_INVALID_RELOAD' => new self($rpc, 'Invalid graph token provided, please reload the stats and provide the updated token.', $code, $caller, $previous),
'GRAPH_OUTDATED_RELOAD' => new self($rpc, 'The graph is outdated, please get a new async token using stats.getBroadcastStats.', $code, $caller, $previous),
'GROUPCALL_ALREADY_DISCARDED' => new self($rpc, 'The group call was already discarded.', $code, $caller, $previous),
'GROUPCALL_FORBIDDEN' => new self($rpc, 'The group call has already ended.', $code, $caller, $previous),
'GROUPCALL_INVALID' => new self($rpc, 'The specified group call is invalid.', $code, $caller, $previous),
'GROUPCALL_JOIN_MISSING' => new self($rpc, 'You haven\'t joined this group call.', $code, $caller, $previous),
'GROUPCALL_NOT_MODIFIED' => new self($rpc, 'Group call settings weren\'t modified.', $code, $caller, $previous),
'GROUPCALL_SSRC_DUPLICATE_MUCH' => new self($rpc, 'The app needs to retry joining the group call with a new SSRC value.', $code, $caller, $previous),
'GROUPED_MEDIA_INVALID' => new self($rpc, 'Invalid grouped media.', $code, $caller, $previous),
'HASH_INVALID' => new self($rpc, 'The provided hash is invalid.', $code, $caller, $previous),
'HASHTAG_INVALID' => new self($rpc, 'The specified hashtag is invalid.', $code, $caller, $previous),
'HIDE_REQUESTER_MISSING' => new self($rpc, 'The join request was missing or was already handled.', $code, $caller, $previous),
'IMAGE_PROCESS_FAILED' => new \danog\MadelineProto\RPCError\ImageProcessFailedError($code, $caller, $previous),
'IMPORT_FILE_INVALID' => new self($rpc, 'The specified chat export file is invalid.', $code, $caller, $previous),
'IMPORT_FORMAT_DATE_INVALID' => new self($rpc, 'The date specified in the import file is invalid.', $code, $caller, $previous),
'IMPORT_FORMAT_UNRECOGNIZED' => new self($rpc, 'The specified chat export file was exported from an unsupported chat app.', $code, $caller, $previous),
'IMPORT_ID_INVALID' => new self($rpc, 'The specified import ID is invalid.', $code, $caller, $previous),
'IMPORT_TOKEN_INVALID' => new self($rpc, 'The specified token is invalid.', $code, $caller, $previous),
'INLINE_RESULT_EXPIRED' => new self($rpc, 'The inline query expired.', $code, $caller, $previous),
'INPUT_CHATLIST_INVALID' => new self($rpc, 'The specified folder is invalid.', $code, $caller, $previous),
'INPUT_FILE_INVALID' => new self($rpc, 'The specified [InputFile](https://core.telegram.org/type/InputFile) is invalid.', $code, $caller, $previous),
'INPUT_FILTER_INVALID' => new self($rpc, 'The specified filter is invalid.', $code, $caller, $previous),
'INPUT_TEXT_EMPTY' => new self($rpc, 'The specified text is empty.', $code, $caller, $previous),
'INPUT_TEXT_TOO_LONG' => new self($rpc, 'The specified text is too long.', $code, $caller, $previous),
'INPUT_USER_DEACTIVATED' => new \danog\MadelineProto\RPCError\InputUserDeactivatedError($code, $caller, $previous),
'INVITE_FORBIDDEN_WITH_JOINAS' => new self($rpc, 'If the user has anonymously joined a group call as a channel, they can\'t invite other users to the group call because that would cause deanonymization, because the invite would be sent using the original user ID, not the anonymized channel ID.', $code, $caller, $previous),
'INVITE_HASH_EMPTY' => new self($rpc, 'The invite hash is empty.', $code, $caller, $previous),
'INVITE_HASH_EXPIRED' => new self($rpc, 'The invite link has expired.', $code, $caller, $previous),
'INVITE_HASH_INVALID' => new self($rpc, 'The invite hash is invalid.', $code, $caller, $previous),
'INVITE_REQUEST_SENT' => new self($rpc, 'You have successfully requested to join this chat or channel.', $code, $caller, $previous),
'INVITE_REVOKED_MISSING' => new self($rpc, 'The specified invite link was already revoked or is invalid.', $code, $caller, $previous),
'INVITE_SLUG_EMPTY' => new self($rpc, 'The specified invite slug is empty.', $code, $caller, $previous),
'INVITE_SLUG_EXPIRED' => new self($rpc, 'The specified chat folder link has expired.', $code, $caller, $previous),
'INVITES_TOO_MUCH' => new self($rpc, 'The maximum number of per-folder invites specified by the `chatlist_invites_limit_default`/`chatlist_invites_limit_premium` [client configuration parameters »](https://core.telegram.org/api/config#chatlist-invites-limit-default) was reached.', $code, $caller, $previous),
'INVOICE_PAYLOAD_INVALID' => new self($rpc, 'The specified invoice payload is invalid.', $code, $caller, $previous),
'JOIN_AS_PEER_INVALID' => new self($rpc, 'The specified peer cannot be used to join a group call.', $code, $caller, $previous),
'LANG_CODE_INVALID' => new self($rpc, 'The specified language code is invalid.', $code, $caller, $previous),
'LANG_CODE_NOT_SUPPORTED' => new self($rpc, 'The specified language code is not supported.', $code, $caller, $previous),
'LANG_PACK_INVALID' => new self($rpc, 'The provided language pack is invalid.', $code, $caller, $previous),
'LANGUAGE_INVALID' => new self($rpc, 'The specified lang_code is invalid.', $code, $caller, $previous),
'LASTNAME_INVALID' => new self($rpc, 'The last name is invalid.', $code, $caller, $previous),
'LIMIT_INVALID' => new self($rpc, 'The provided limit is invalid.', $code, $caller, $previous),
'LINK_NOT_MODIFIED' => new self($rpc, 'Discussion link not modified.', $code, $caller, $previous),
'LOCATION_INVALID' => new self($rpc, 'The provided location is invalid.', $code, $caller, $previous),
'MAX_DATE_INVALID' => new self($rpc, 'The specified maximum date is invalid.', $code, $caller, $previous),
'MAX_ID_INVALID' => new self($rpc, 'The provided max ID is invalid.', $code, $caller, $previous),
'MAX_QTS_INVALID' => new self($rpc, 'The specified max_qts is invalid.', $code, $caller, $previous),
'MD5_CHECKSUM_INVALID' => new self($rpc, 'The MD5 checksums do not match.', $code, $caller, $previous),
'MEDIA_CAPTION_TOO_LONG' => new self($rpc, 'The caption is too long.', $code, $caller, $previous),
'MEDIA_EMPTY' => new self($rpc, 'The provided media object is invalid.', $code, $caller, $previous),
'MEDIA_FILE_INVALID' => new self($rpc, 'The specified media file is invalid.', $code, $caller, $previous),
'MEDIA_GROUPED_INVALID' => new self($rpc, 'You tried to send media of different types in an album.', $code, $caller, $previous),
'MEDIA_INVALID' => new self($rpc, 'Media invalid.', $code, $caller, $previous),
'MEDIA_NEW_INVALID' => new self($rpc, 'The new media is invalid.', $code, $caller, $previous),
'MEDIA_PREV_INVALID' => new self($rpc, 'Previous media invalid.', $code, $caller, $previous),
'MEDIA_TTL_INVALID' => new self($rpc, 'The specified media TTL is invalid.', $code, $caller, $previous),
'MEDIA_TYPE_INVALID' => new self($rpc, 'The specified media type cannot be used in stories.', $code, $caller, $previous),
'MEDIA_VIDEO_STORY_MISSING' => new self($rpc, 'A non-story video cannot be repubblished as a story (emitted when trying to resend a non-story video as a story using inputDocument).', $code, $caller, $previous),
'MEGAGROUP_GEO_REQUIRED' => new self($rpc, 'This method can only be invoked on a geogroup.', $code, $caller, $previous),
'MEGAGROUP_ID_INVALID' => new self($rpc, 'Invalid supergroup ID.', $code, $caller, $previous),
'MEGAGROUP_PREHISTORY_HIDDEN' => new self($rpc, 'Group with hidden history for new members can\'t be set as discussion groups.', $code, $caller, $previous),
'MEGAGROUP_REQUIRED' => new self($rpc, 'You can only use this method on a supergroup.', $code, $caller, $previous),
'MESSAGE_EDIT_TIME_EXPIRED' => new self($rpc, 'You can\'t edit this message anymore, too much time has passed since its creation.', $code, $caller, $previous),
'MESSAGE_EMPTY' => new self($rpc, 'The provided message is empty.', $code, $caller, $previous),
'MESSAGE_ID_INVALID' => new self($rpc, 'The provided message id is invalid.', $code, $caller, $previous),
'MESSAGE_IDS_EMPTY' => new self($rpc, 'No message ids were provided.', $code, $caller, $previous),
'MESSAGE_NOT_MODIFIED' => new self($rpc, 'The provided message data is identical to the previous message data, the message wasn\'t modified.', $code, $caller, $previous),
'MESSAGE_NOT_READ_YET' => new self($rpc, 'The specified message wasn\'t read yet.', $code, $caller, $previous),
'MESSAGE_POLL_CLOSED' => new self($rpc, 'Poll closed.', $code, $caller, $previous),
'MESSAGE_TOO_LONG' => new self($rpc, 'The provided message is too long.', $code, $caller, $previous),
'MESSAGE_TOO_OLD' => new self($rpc, 'The message is too old, the requested information is not available.', $code, $caller, $previous),
'METHOD_INVALID' => new self($rpc, 'The specified method is invalid.', $code, $caller, $previous),
'MIN_DATE_INVALID' => new self($rpc, 'The specified minimum date is invalid.', $code, $caller, $previous),
'MSG_ID_INVALID' => new \danog\MadelineProto\RPCError\MsgIdInvalidError($code, $caller, $previous),
'MSG_TOO_OLD' => new self($rpc, '[`chat_read_mark_expire_period` seconds](https://core.telegram.org/api/config#chat-read-mark-expire-period) have passed since the message was sent, read receipts were deleted.', $code, $caller, $previous),
'MSG_WAIT_FAILED' => new self($rpc, 'A waiting call returned an error.', $code, $caller, $previous),
'MULTI_MEDIA_TOO_LONG' => new self($rpc, 'Too many media files for album.', $code, $caller, $previous),
'NEW_SALT_INVALID' => new self($rpc, 'The new salt is invalid.', $code, $caller, $previous),
'NEW_SETTINGS_EMPTY' => new self($rpc, 'No password is set on the current account, and no new password was specified in `new_settings`.', $code, $caller, $previous),
'NEW_SETTINGS_INVALID' => new self($rpc, 'The new password settings are invalid.', $code, $caller, $previous),
'NEXT_OFFSET_INVALID' => new self($rpc, 'The specified offset is longer than 64 bytes.', $code, $caller, $previous),
'NOT_ELIGIBLE' => new self($rpc, 'The current user is not eligible to join the Peer-to-Peer Login Program.', $code, $caller, $previous),
'NOT_JOINED' => new self($rpc, 'The current user hasn\'t joined the Peer-to-Peer Login Program.', $code, $caller, $previous),
'OFFSET_INVALID' => new self($rpc, 'The provided offset is invalid.', $code, $caller, $previous),
'OFFSET_PEER_ID_INVALID' => new self($rpc, 'The provided offset peer is invalid.', $code, $caller, $previous),
'OPTION_INVALID' => new self($rpc, 'Invalid option selected.', $code, $caller, $previous),
'OPTIONS_TOO_MUCH' => new self($rpc, 'Too many options provided.', $code, $caller, $previous),
'ORDER_INVALID' => new self($rpc, 'The specified username order is invalid.', $code, $caller, $previous),
'PACK_SHORT_NAME_INVALID' => new self($rpc, 'Short pack name invalid.', $code, $caller, $previous),
'PACK_SHORT_NAME_OCCUPIED' => new self($rpc, 'A stickerpack with this name already exists.', $code, $caller, $previous),
'PACK_TITLE_INVALID' => new self($rpc, 'The stickerpack title is invalid.', $code, $caller, $previous),
'PARTICIPANT_ID_INVALID' => new self($rpc, 'The specified participant ID is invalid.', $code, $caller, $previous),
'PARTICIPANT_JOIN_MISSING' => new self($rpc, 'Trying to enable a presentation, when the user hasn\'t joined the Video Chat with [phone.joinGroupCall](https://core.telegram.org/method/phone.joinGroupCall).', $code, $caller, $previous),
'PARTICIPANT_VERSION_OUTDATED' => new self($rpc, 'The other participant does not use an up to date telegram client with support for calls.', $code, $caller, $previous),
'PARTICIPANTS_TOO_FEW' => new self($rpc, 'Not enough participants.', $code, $caller, $previous),
'PASSWORD_EMPTY' => new self($rpc, 'The provided password is empty.', $code, $caller, $previous),
'PASSWORD_HASH_INVALID' => new \danog\MadelineProto\RPCError\PasswordHashInvalidError($code, $caller, $previous),
'PASSWORD_MISSING' => new self($rpc, 'You must [enable 2FA](https://core.telegram.org/api/srp) before executing this operation.', $code, $caller, $previous),
'PASSWORD_RECOVERY_EXPIRED' => new self($rpc, 'The recovery code has expired.', $code, $caller, $previous),
'PASSWORD_RECOVERY_NA' => new self($rpc, 'No email was set, can\'t recover password via email.', $code, $caller, $previous),
'PASSWORD_REQUIRED' => new self($rpc, 'A [2FA password](https://core.telegram.org/api/srp) must be configured to use Telegram Passport.', $code, $caller, $previous),
'PAYMENT_PROVIDER_INVALID' => new self($rpc, 'The specified payment provider is invalid.', $code, $caller, $previous),
'PEER_HISTORY_EMPTY' => new self($rpc, 'You can\'t pin an empty chat with a user.', $code, $caller, $previous),
'PEER_ID_INVALID' => new \danog\MadelineProto\RPCError\PeerIdInvalidError($code, $caller, $previous),
'PEER_ID_NOT_SUPPORTED' => new self($rpc, 'The provided peer ID is not supported.', $code, $caller, $previous),
'PEERS_LIST_EMPTY' => new self($rpc, 'The specified list of peers is empty.', $code, $caller, $previous),
'PERSISTENT_TIMESTAMP_EMPTY' => new self($rpc, 'Persistent timestamp empty.', $code, $caller, $previous),
'PERSISTENT_TIMESTAMP_INVALID' => new self($rpc, 'Persistent timestamp invalid.', $code, $caller, $previous),
'PHONE_CODE_EMPTY' => new self($rpc, 'phone_code is missing.', $code, $caller, $previous),
'PHONE_CODE_EXPIRED' => new self($rpc, 'The phone code you provided has expired.', $code, $caller, $previous),
'PHONE_CODE_HASH_EMPTY' => new self($rpc, 'phone_code_hash is missing.', $code, $caller, $previous),
'PHONE_CODE_INVALID' => new self($rpc, 'The provided phone code is invalid.', $code, $caller, $previous),
'PHONE_HASH_EXPIRED' => new self($rpc, 'An invalid or expired `phone_code_hash` was provided.', $code, $caller, $previous),
'PHONE_NOT_OCCUPIED' => new self($rpc, 'No user is associated to the specified phone number.', $code, $caller, $previous),
'PHONE_NUMBER_APP_SIGNUP_FORBIDDEN' => new self($rpc, 'You can\'t sign up using this app.', $code, $caller, $previous),
'PHONE_NUMBER_BANNED' => new self($rpc, 'The provided phone number is banned from telegram.', $code, $caller, $previous),
'PHONE_NUMBER_FLOOD' => new self($rpc, 'You asked for the code too many times.', $code, $caller, $previous),
'PHONE_NUMBER_INVALID' => new self($rpc, 'The phone number is invalid.', $code, $caller, $previous),
'PHONE_NUMBER_OCCUPIED' => new self($rpc, 'The phone number is already in use.', $code, $caller, $previous),
'PHONE_NUMBER_UNOCCUPIED' => new self($rpc, 'The phone number is not yet being used.', $code, $caller, $previous),
'PHONE_PASSWORD_PROTECTED' => new self($rpc, 'This phone is password protected.', $code, $caller, $previous),
'PHOTO_CONTENT_TYPE_INVALID' => new self($rpc, 'Photo mime-type invalid.', $code, $caller, $previous),
'PHOTO_CONTENT_URL_EMPTY' => new self($rpc, 'Photo URL invalid.', $code, $caller, $previous),
'PHOTO_CROP_FILE_MISSING' => new self($rpc, 'Photo crop file missing.', $code, $caller, $previous),
'PHOTO_CROP_SIZE_SMALL' => new self($rpc, 'Photo is too small.', $code, $caller, $previous),
'PHOTO_EXT_INVALID' => new self($rpc, 'The extension of the photo is invalid.', $code, $caller, $previous),
'PHOTO_FILE_MISSING' => new self($rpc, 'Profile photo file missing.', $code, $caller, $previous),
'PHOTO_ID_INVALID' => new self($rpc, 'Photo ID invalid.', $code, $caller, $previous),
'PHOTO_INVALID' => new self($rpc, 'Photo invalid.', $code, $caller, $previous),
'PHOTO_INVALID_DIMENSIONS' => new self($rpc, 'The photo dimensions are invalid.', $code, $caller, $previous),
'PHOTO_SAVE_FILE_INVALID' => new self($rpc, 'Internal issues, try again later.', $code, $caller, $previous),
'PHOTO_THUMB_URL_EMPTY' => new self($rpc, 'Photo thumbnail URL is empty.', $code, $caller, $previous),
'PIN_RESTRICTED' => new self($rpc, 'You can\'t pin messages.', $code, $caller, $previous),
'PINNED_DIALOGS_TOO_MUCH' => new \danog\MadelineProto\RPCError\PinnedDialogsTooMuchError($code, $caller, $previous),
'POLL_ANSWER_INVALID' => new self($rpc, 'One of the poll answers is not acceptable.', $code, $caller, $previous),
'POLL_ANSWERS_INVALID' => new self($rpc, 'Invalid poll answers were provided.', $code, $caller, $previous),
'POLL_OPTION_DUPLICATE' => new \danog\MadelineProto\RPCError\PollOptionDuplicateError($code, $caller, $previous),
'POLL_OPTION_INVALID' => new self($rpc, 'Invalid poll option provided.', $code, $caller, $previous),
'POLL_QUESTION_INVALID' => new self($rpc, 'One of the poll questions is not acceptable.', $code, $caller, $previous),
'PREMIUM_ACCOUNT_REQUIRED' => new \danog\MadelineProto\RPCError\PremiumAccountRequiredError($code, $caller, $previous),
'PRIVACY_KEY_INVALID' => new self($rpc, 'The privacy key is invalid.', $code, $caller, $previous),
'PRIVACY_TOO_LONG' => new self($rpc, 'Too many privacy rules were specified, the current limit is 1000.', $code, $caller, $previous),
'PRIVACY_VALUE_INVALID' => new self($rpc, 'The specified privacy rule combination is invalid.', $code, $caller, $previous),
'PUBLIC_KEY_REQUIRED' => new self($rpc, 'A public key is required.', $code, $caller, $previous),
'QUERY_ID_EMPTY' => new self($rpc, 'The query ID is empty.', $code, $caller, $previous),
'QUERY_ID_INVALID' => new self($rpc, 'The query ID is invalid.', $code, $caller, $previous),
'QUERY_TOO_SHORT' => new self($rpc, 'The query string is too short.', $code, $caller, $previous),
'QUICK_REPLIES_TOO_MUCH' => new \danog\MadelineProto\RPCError\QuickRepliesTooMuchError($code, $caller, $previous),
'QUIZ_ANSWER_MISSING' => new self($rpc, 'You can forward a quiz while hiding the original author only after choosing an option in the quiz.', $code, $caller, $previous),
'QUIZ_CORRECT_ANSWER_INVALID' => new self($rpc, 'An invalid value was provided to the correct_answers field.', $code, $caller, $previous),
'QUIZ_CORRECT_ANSWERS_EMPTY' => new self($rpc, 'No correct quiz answer was specified.', $code, $caller, $previous),
'QUIZ_CORRECT_ANSWERS_TOO_MUCH' => new \danog\MadelineProto\RPCError\QuizCorrectAnswersTooMuchError($code, $caller, $previous),
'QUIZ_MULTIPLE_INVALID' => new self($rpc, 'Quizzes can\'t have the multiple_choice flag set!', $code, $caller, $previous),
'QUOTE_TEXT_INVALID' => new self($rpc, 'The specified `reply_to`.`quote_text` field is invalid.', $code, $caller, $previous),
'RAISE_HAND_FORBIDDEN' => new self($rpc, 'You cannot raise your hand.', $code, $caller, $previous),
'RANDOM_ID_EMPTY' => new self($rpc, 'Random ID empty.', $code, $caller, $previous),
'RANDOM_ID_INVALID' => new self($rpc, 'A provided random ID is invalid.', $code, $caller, $previous),
'RANDOM_LENGTH_INVALID' => new self($rpc, 'Random length invalid.', $code, $caller, $previous),
'RANGES_INVALID' => new self($rpc, 'Invalid range provided.', $code, $caller, $previous),
'REACTION_EMPTY' => new self($rpc, 'Empty reaction provided.', $code, $caller, $previous),
'REACTION_INVALID' => new self($rpc, 'The specified reaction is invalid.', $code, $caller, $previous),
'REACTIONS_TOO_MANY' => new self($rpc, 'The message already has exactly `reactions_uniq_max` reaction emojis, you can\'t react with a new emoji, see [the docs for more info »](https://core.telegram.org/api/config#client-configuration).', $code, $caller, $previous),
'RECEIPT_EMPTY' => new self($rpc, 'The specified receipt is empty.', $code, $caller, $previous),
'REPLY_MARKUP_BUY_EMPTY' => new self($rpc, 'Reply markup for buy button empty.', $code, $caller, $previous),
'REPLY_MARKUP_GAME_EMPTY' => new self($rpc, 'A game message is being edited, but the newly provided keyboard doesn\'t have a keyboardButtonGame button.', $code, $caller, $previous),
'REPLY_MARKUP_INVALID' => new self($rpc, 'The provided reply markup is invalid.', $code, $caller, $previous),
'REPLY_MARKUP_TOO_LONG' => new self($rpc, 'The specified reply_markup is too long.', $code, $caller, $previous),
'REPLY_MESSAGE_ID_INVALID' => new self($rpc, 'The specified reply-to message ID is invalid.', $code, $caller, $previous),
'REPLY_MESSAGES_TOO_MUCH' => new \danog\MadelineProto\RPCError\ReplyMessagesTooMuchError($code, $caller, $previous),
'REPLY_TO_INVALID' => new self($rpc, 'The specified `reply_to` field is invalid.', $code, $caller, $previous),
'REPLY_TO_USER_INVALID' => new self($rpc, 'The replied-to user is invalid.', $code, $caller, $previous),
'REQUEST_TOKEN_INVALID' => new \danog\MadelineProto\RPCError\RequestTokenInvalidError($code, $caller, $previous),
'RESET_REQUEST_MISSING' => new self($rpc, 'No password reset is in progress.', $code, $caller, $previous),
'RESULT_ID_DUPLICATE' => new self($rpc, 'You provided a duplicate result ID.', $code, $caller, $previous),
'RESULT_ID_EMPTY' => new self($rpc, 'Result ID empty.', $code, $caller, $previous),
'RESULT_ID_INVALID' => new self($rpc, 'One of the specified result IDs is invalid.', $code, $caller, $previous),
'RESULT_TYPE_INVALID' => new self($rpc, 'Result type invalid.', $code, $caller, $previous),
'RESULTS_TOO_MUCH' => new self($rpc, 'Too many results were provided.', $code, $caller, $previous),
'REVOTE_NOT_ALLOWED' => new self($rpc, 'You cannot change your vote.', $code, $caller, $previous),
'RIGHTS_NOT_MODIFIED' => new self($rpc, 'The new admin rights are equal to the old rights, no change was made.', $code, $caller, $previous),
'RINGTONE_INVALID' => new self($rpc, 'The specified ringtone is invalid.', $code, $caller, $previous),
'RINGTONE_MIME_INVALID' => new self($rpc, 'The MIME type for the ringtone is invalid.', $code, $caller, $previous),
'RSA_DECRYPT_FAILED' => new self($rpc, 'Internal RSA decryption failed.', $code, $caller, $previous),
'SCHEDULE_BOT_NOT_ALLOWED' => new \danog\MadelineProto\RPCError\ScheduleBotNotAllowedError($code, $caller, $previous),
'SCHEDULE_DATE_INVALID' => new self($rpc, 'Invalid schedule date provided.', $code, $caller, $previous),
'SCHEDULE_DATE_TOO_LATE' => new \danog\MadelineProto\RPCError\ScheduleDateTooLateError($code, $caller, $previous),
'SCHEDULE_STATUS_PRIVATE' => new \danog\MadelineProto\RPCError\ScheduleStatusPrivateError($code, $caller, $previous),
'SCHEDULE_TOO_MUCH' => new \danog\MadelineProto\RPCError\ScheduleTooMuchError($code, $caller, $previous),
'SCORE_INVALID' => new self($rpc, 'The specified game score is invalid.', $code, $caller, $previous),
'SEARCH_QUERY_EMPTY' => new self($rpc, 'The search query is empty.', $code, $caller, $previous),
'SEARCH_WITH_LINK_NOT_SUPPORTED' => new self($rpc, 'You cannot provide a search query and an invite link at the same time.', $code, $caller, $previous),
'SECONDS_INVALID' => new self($rpc, 'Invalid duration provided.', $code, $caller, $previous),
'SECURE_SECRET_REQUIRED' => new self($rpc, 'A secure secret is required.', $code, $caller, $previous),
'SEND_AS_PEER_INVALID' => new self($rpc, 'You can\'t send messages as the specified peer.', $code, $caller, $previous),
'SEND_MESSAGE_MEDIA_INVALID' => new self($rpc, 'Invalid media provided.', $code, $caller, $previous),
'SEND_MESSAGE_TYPE_INVALID' => new self($rpc, 'The message type is invalid.', $code, $caller, $previous),
'SETTINGS_INVALID' => new self($rpc, 'Invalid settings were provided.', $code, $caller, $previous),
'SHA256_HASH_INVALID' => new self($rpc, 'The provided SHA256 hash is invalid.', $code, $caller, $previous),
'SHORT_NAME_INVALID' => new self($rpc, 'The specified short name is invalid.', $code, $caller, $previous),
'SHORT_NAME_OCCUPIED' => new self($rpc, 'The specified short name is already in use.', $code, $caller, $previous),
'SHORTCUT_INVALID' => new self($rpc, 'The specified shortcut is invalid.', $code, $caller, $previous),
'SLOTS_EMPTY' => new self($rpc, 'The specified slot list is empty.', $code, $caller, $previous),
'SLOWMODE_MULTI_MSGS_DISABLED' => new self($rpc, 'Slowmode is enabled, you cannot forward multiple messages to this group.', $code, $caller, $previous),
'SLUG_INVALID' => new self($rpc, 'The specified invoice slug is invalid.', $code, $caller, $previous),
'SMS_CODE_CREATE_FAILED' => new self($rpc, 'An error occurred while creating the SMS code.', $code, $caller, $previous),
'SMSJOB_ID_INVALID' => new self($rpc, 'The specified job ID is invalid.', $code, $caller, $previous),
'SRP_ID_INVALID' => new self($rpc, 'Invalid SRP ID provided.', $code, $caller, $previous),
'SRP_PASSWORD_CHANGED' => new self($rpc, 'Password has changed.', $code, $caller, $previous),
'START_PARAM_EMPTY' => new self($rpc, 'The start parameter is empty.', $code, $caller, $previous),
'START_PARAM_INVALID' => new self($rpc, 'Start parameter invalid.', $code, $caller, $previous),
'START_PARAM_TOO_LONG' => new self($rpc, 'Start parameter is too long.', $code, $caller, $previous),
'STICKER_DOCUMENT_INVALID' => new self($rpc, 'The specified sticker document is invalid.', $code, $caller, $previous),
'STICKER_EMOJI_INVALID' => new self($rpc, 'Sticker emoji invalid.', $code, $caller, $previous),
'STICKER_FILE_INVALID' => new self($rpc, 'Sticker file invalid.', $code, $caller, $previous),
'STICKER_GIF_DIMENSIONS' => new self($rpc, 'The specified video sticker has invalid dimensions.', $code, $caller, $previous),
'STICKER_ID_INVALID' => new self($rpc, 'The provided sticker ID is invalid.', $code, $caller, $previous),
'STICKER_INVALID' => new self($rpc, 'The provided sticker is invalid.', $code, $caller, $previous),
'STICKER_MIME_INVALID' => new self($rpc, 'The specified sticker MIME type is invalid.', $code, $caller, $previous),
'STICKER_PNG_DIMENSIONS' => new self($rpc, 'Sticker png dimensions invalid.', $code, $caller, $previous),
'STICKER_PNG_NOPNG' => new self($rpc, 'One of the specified stickers is not a valid PNG file.', $code, $caller, $previous),
'STICKER_TGS_NODOC' => new self($rpc, 'You must send the animated sticker as a document.', $code, $caller, $previous),
'STICKER_TGS_NOTGS' => new self($rpc, 'Invalid TGS sticker provided.', $code, $caller, $previous),
'STICKER_THUMB_PNG_NOPNG' => new self($rpc, 'Incorrect stickerset thumb file provided, PNG / WEBP expected.', $code, $caller, $previous),
'STICKER_THUMB_TGS_NOTGS' => new self($rpc, 'Incorrect stickerset TGS thumb file provided.', $code, $caller, $previous),
'STICKER_VIDEO_BIG' => new self($rpc, 'The specified video sticker is too big.', $code, $caller, $previous),
'STICKER_VIDEO_NODOC' => new self($rpc, 'You must send the video sticker as a document.', $code, $caller, $previous),
'STICKER_VIDEO_NOWEBM' => new self($rpc, 'The specified video sticker is not in webm format.', $code, $caller, $previous),
'STICKERPACK_STICKERS_TOO_MUCH' => new self($rpc, 'There are too many stickers in this stickerpack, you can\'t add any more.', $code, $caller, $previous),
'STICKERS_EMPTY' => new self($rpc, 'No sticker provided.', $code, $caller, $previous),
'STICKERS_TOO_MUCH' => new self($rpc, 'There are too many stickers in this stickerpack, you can\'t add any more.', $code, $caller, $previous),
'STICKERSET_INVALID' => new self($rpc, 'The provided sticker set is invalid.', $code, $caller, $previous),
'STORIES_NEVER_CREATED' => new self($rpc, 'This peer hasn\'t ever posted any stories.', $code, $caller, $previous),
'STORIES_TOO_MUCH' => new self($rpc, 'You have hit the maximum active stories limit as specified by the [`story_expiring_limit_*` client configuration parameters](https://core.telegram.org/api/config#story-expiring-limit-default): you should buy a [Premium](https://core.telegram.org/api/premium) subscription, delete an active story, or wait for the oldest story to expire.', $code, $caller, $previous),
'STORY_ID_EMPTY' => new self($rpc, 'You specified no story IDs.', $code, $caller, $previous),
'STORY_ID_INVALID' => new self($rpc, 'The specified story ID is invalid.', $code, $caller, $previous),
'STORY_NOT_MODIFIED' => new self($rpc, 'The new story information you passed is equal to the previous story information, thus it wasn\'t modified.', $code, $caller, $previous),
'STORY_PERIOD_INVALID' => new self($rpc, 'The specified story period is invalid for this account.', $code, $caller, $previous),
'SWITCH_PM_TEXT_EMPTY' => new self($rpc, 'The switch_pm.text field was empty.', $code, $caller, $previous),
'SWITCH_WEBVIEW_URL_INVALID' => new self($rpc, 'The URL specified in switch_webview.url is invalid!', $code, $caller, $previous),
'TAKEOUT_INVALID' => new self($rpc, 'The specified takeout ID is invalid.', $code, $caller, $previous),
'TAKEOUT_REQUIRED' => new self($rpc, 'A [takeout](https://core.telegram.org/api/takeout) session needs to be initialized first, [see here » for more info](https://core.telegram.org/api/takeout).', $code, $caller, $previous),
'TASK_ALREADY_EXISTS' => new self($rpc, 'An email reset was already requested.', $code, $caller, $previous),
'TEMP_AUTH_KEY_ALREADY_BOUND' => new self($rpc, 'The passed temporary key is already bound to another **perm_auth_key_id**.', $code, $caller, $previous),
'TEMP_AUTH_KEY_EMPTY' => new self($rpc, 'No temporary auth key provided.', $code, $caller, $previous),
'THEME_FILE_INVALID' => new self($rpc, 'Invalid theme file provided.', $code, $caller, $previous),
'THEME_FORMAT_INVALID' => new self($rpc, 'Invalid theme format provided.', $code, $caller, $previous),
'THEME_INVALID' => new self($rpc, 'Invalid theme provided.', $code, $caller, $previous),
'THEME_MIME_INVALID' => new self($rpc, 'The theme\'s MIME type is invalid.', $code, $caller, $previous),
'THEME_TITLE_INVALID' => new self($rpc, 'The specified theme title is invalid.', $code, $caller, $previous),
'TIMEZONE_INVALID' => new self($rpc, 'The specified timezone does not exist.', $code, $caller, $previous),
'TITLE_INVALID' => new self($rpc, 'The specified stickerpack title is invalid.', $code, $caller, $previous),
'TMP_PASSWORD_DISABLED' => new self($rpc, 'The temporary password is disabled.', $code, $caller, $previous),
'TO_LANG_INVALID' => new self($rpc, 'The specified destination language is invalid.', $code, $caller, $previous),
'TOKEN_EMPTY' => new self($rpc, 'The specified token is empty.', $code, $caller, $previous),
'TOKEN_INVALID' => new self($rpc, 'The provided token is invalid.', $code, $caller, $previous),
'TOKEN_TYPE_INVALID' => new self($rpc, 'The specified token type is invalid.', $code, $caller, $previous),
'TOPIC_CLOSE_SEPARATELY' => new self($rpc, 'The `close` flag cannot be provided together with any of the other flags.', $code, $caller, $previous),
'TOPIC_CLOSED' => new \danog\MadelineProto\RPCError\TopicClosedError($code, $caller, $previous),
'TOPIC_DELETED' => new \danog\MadelineProto\RPCError\TopicDeletedError($code, $caller, $previous),
'TOPIC_HIDE_SEPARATELY' => new self($rpc, 'The `hide` flag cannot be provided together with any of the other flags.', $code, $caller, $previous),
'TOPIC_ID_INVALID' => new self($rpc, 'The specified topic ID is invalid.', $code, $caller, $previous),
'TOPIC_NOT_MODIFIED' => new self($rpc, 'The updated topic info is equal to the current topic info, nothing was changed.', $code, $caller, $previous),
'TOPIC_TITLE_EMPTY' => new self($rpc, 'The specified topic title is empty.', $code, $caller, $previous),
'TOPICS_EMPTY' => new self($rpc, 'You specified no topic IDs.', $code, $caller, $previous),
'TRANSCRIPTION_FAILED' => new self($rpc, 'Audio transcription failed.', $code, $caller, $previous),
'TRANSLATE_REQ_QUOTA_EXCEEDED' => new self($rpc, 'Translation is currently unavailable due to a temporary server-side lack of resources.', $code, $caller, $previous),
'TTL_DAYS_INVALID' => new self($rpc, 'The provided TTL is invalid.', $code, $caller, $previous),
'TTL_MEDIA_INVALID' => new self($rpc, 'Invalid media Time To Live was provided.', $code, $caller, $previous),
'TTL_PERIOD_INVALID' => new self($rpc, 'The specified TTL period is invalid.', $code, $caller, $previous),
'TYPES_EMPTY' => new self($rpc, 'No top peer type was provided.', $code, $caller, $previous),
'UNTIL_DATE_INVALID' => new self($rpc, 'Invalid until date provided.', $code, $caller, $previous),
'URL_INVALID' => new self($rpc, 'Invalid URL provided.', $code, $caller, $previous),
'USAGE_LIMIT_INVALID' => new self($rpc, 'The specified usage limit is invalid.', $code, $caller, $previous),
'USER_ADMIN_INVALID' => new self($rpc, 'You\'re not an admin.', $code, $caller, $previous),
'USER_ALREADY_INVITED' => new self($rpc, 'You have already invited this user.', $code, $caller, $previous),
'USER_ALREADY_PARTICIPANT' => new self($rpc, 'The user is already in the group.', $code, $caller, $previous),
'USER_BANNED_IN_CHANNEL' => new \danog\MadelineProto\RPCError\UserBannedInChannelError($code, $caller, $previous),
'USER_BLOCKED' => new self($rpc, 'User blocked.', $code, $caller, $previous),
'USER_BOT' => new self($rpc, 'Bots can only be admins in channels.', $code, $caller, $previous),
'USER_BOT_INVALID' => new self($rpc, 'User accounts must provide the `bot` method parameter when calling this method. If there is no such method parameter, this method can only be invoked by bot accounts.', $code, $caller, $previous),
'USER_BOT_REQUIRED' => new self($rpc, 'This method can only be called by a bot.', $code, $caller, $previous),
'USER_CHANNELS_TOO_MUCH' => new self($rpc, 'One of the users you tried to add is already in too many channels/supergroups.', $code, $caller, $previous),
'USER_CREATOR' => new self($rpc, 'For channels.editAdmin: you\'ve tried to edit the admin rights of the owner, but you\'re not the owner; for channels.leaveChannel: you can\'t leave this channel, because you\'re its creator.', $code, $caller, $previous),
'USER_ID_INVALID' => new self($rpc, 'The provided user ID is invalid.', $code, $caller, $previous),
'USER_INVALID' => new self($rpc, 'Invalid user provided.', $code, $caller, $previous),
'USER_IS_BLOCKED' => new \danog\MadelineProto\RPCError\UserIsBlockedError($code, $caller, $previous),
'USER_IS_BOT' => new \danog\MadelineProto\RPCError\UserIsBotError($code, $caller, $previous),
'USER_KICKED' => new self($rpc, 'This user was kicked from this supergroup/channel.', $code, $caller, $previous),
'USER_NOT_MUTUAL_CONTACT' => new self($rpc, 'The provided user is not a mutual contact.', $code, $caller, $previous),
'USER_NOT_PARTICIPANT' => new self($rpc, 'You\'re not a member of this supergroup/channel.', $code, $caller, $previous),
'USER_PUBLIC_MISSING' => new self($rpc, 'Cannot generate a link to stories posted by a peer without a username.', $code, $caller, $previous),
'USER_VOLUME_INVALID' => new self($rpc, 'The specified user volume is invalid.', $code, $caller, $previous),
'USERNAME_INVALID' => new \danog\MadelineProto\RPCError\UsernameInvalidError($code, $caller, $previous),
'USERNAME_NOT_MODIFIED' => new self($rpc, 'The username was not modified.', $code, $caller, $previous),
'USERNAME_NOT_OCCUPIED' => new \danog\MadelineProto\RPCError\UsernameNotOccupiedError($code, $caller, $previous),
'USERNAME_OCCUPIED' => new self($rpc, 'The provided username is already occupied.', $code, $caller, $previous),
'USERNAME_PURCHASE_AVAILABLE' => new self($rpc, 'The specified username can be purchased on https://fragment.com.', $code, $caller, $previous),
'USERNAMES_ACTIVE_TOO_MUCH' => new self($rpc, 'The maximum number of active usernames was reached.', $code, $caller, $previous),
'USERPIC_UPLOAD_REQUIRED' => new self($rpc, 'You must have a profile picture to publish your geolocation.', $code, $caller, $previous),
'USERS_TOO_FEW' => new self($rpc, 'Not enough users (to create a chat, for example).', $code, $caller, $previous),
'USERS_TOO_MUCH' => new self($rpc, 'The maximum number of users has been exceeded (to create a chat, for example).', $code, $caller, $previous),
'VENUE_ID_INVALID' => new self($rpc, 'The specified venue ID is invalid.', $code, $caller, $previous),
'VIDEO_CONTENT_TYPE_INVALID' => new self($rpc, 'The video\'s content type is invalid.', $code, $caller, $previous),
'VIDEO_FILE_INVALID' => new self($rpc, 'The specified video file is invalid.', $code, $caller, $previous),
'VIDEO_PAUSE_FORBIDDEN' => new self($rpc, 'You cannot pause the video stream.', $code, $caller, $previous),
'VIDEO_STOP_FORBIDDEN' => new self($rpc, 'You cannot stop the video stream.', $code, $caller, $previous),
'VIDEO_TITLE_EMPTY' => new self($rpc, 'The specified video title is empty.', $code, $caller, $previous),
'VOICE_MESSAGES_FORBIDDEN' => new \danog\MadelineProto\RPCError\VoiceMessagesForbiddenError($code, $caller, $previous),
'WALLPAPER_FILE_INVALID' => new self($rpc, 'The specified wallpaper file is invalid.', $code, $caller, $previous),
'WALLPAPER_INVALID' => new self($rpc, 'The specified wallpaper is invalid.', $code, $caller, $previous),
'WALLPAPER_MIME_INVALID' => new self($rpc, 'The specified wallpaper MIME type is invalid.', $code, $caller, $previous),
'WALLPAPER_NOT_FOUND' => new self($rpc, 'The specified wallpaper could not be found.', $code, $caller, $previous),
'WC_CONVERT_URL_INVALID' => new self($rpc, 'WC convert URL invalid.', $code, $caller, $previous),
'WEBDOCUMENT_INVALID' => new self($rpc, 'Invalid webdocument URL provided.', $code, $caller, $previous),
'WEBDOCUMENT_MIME_INVALID' => new self($rpc, 'Invalid webdocument mime type provided.', $code, $caller, $previous),
'WEBDOCUMENT_SIZE_TOO_BIG' => new self($rpc, 'Webdocument is too big!', $code, $caller, $previous),
'WEBDOCUMENT_URL_INVALID' => new self($rpc, 'The specified webdocument URL is invalid.', $code, $caller, $previous),
'WEBPAGE_CURL_FAILED' => new \danog\MadelineProto\RPCError\WebpageCurlFailedError($code, $caller, $previous),
'WEBPAGE_MEDIA_EMPTY' => new self($rpc, 'Webpage media empty.', $code, $caller, $previous),
'WEBPAGE_NOT_FOUND' => new \danog\MadelineProto\RPCError\WebpageNotFoundError($code, $caller, $previous),
'WEBPAGE_URL_INVALID' => new self($rpc, 'The specified webpage `url` is invalid.', $code, $caller, $previous),
'WEBPUSH_AUTH_INVALID' => new self($rpc, 'The specified web push authentication secret is invalid.', $code, $caller, $previous),
'WEBPUSH_KEY_INVALID' => new self($rpc, 'The specified web push elliptic curve Diffie-Hellman public key is invalid.', $code, $caller, $previous),
'WEBPUSH_TOKEN_INVALID' => new self($rpc, 'The specified web push token is invalid.', $code, $caller, $previous),
'YOU_BLOCKED_USER' => new \danog\MadelineProto\RPCError\YouBlockedUserError($code, $caller, $previous),
'BOT_METHOD_INVALID' => new self($rpc, 'The specified method cannot be used by bots.', $code, $caller, $previous),
'CONNECTION_DEVICE_MODEL_EMPTY' => new self($rpc, 'The specified device model is empty.', $code, $caller, $previous),
'CONNECTION_LANG_PACK_INVALID' => new self($rpc, 'The specified language pack is empty.', $code, $caller, $previous),
'CONNECTION_NOT_INITED' => new self($rpc, 'Please initialize the connection using initConnection before making queries.', $code, $caller, $previous),
'CONNECTION_SYSTEM_EMPTY' => new self($rpc, 'The specified system version is empty.', $code, $caller, $previous),
'CONNECTION_SYSTEM_LANG_CODE_EMPTY' => new self($rpc, 'The specified system language code is empty.', $code, $caller, $previous),
'INPUT_CONSTRUCTOR_INVALID' => new self($rpc, 'The specified TL constructor is invalid.', $code, $caller, $previous),
'INPUT_FETCH_ERROR' => new self($rpc, 'An error occurred while parsing the provided TL constructor.', $code, $caller, $previous),
'INPUT_FETCH_FAIL' => new self($rpc, 'An error occurred while parsing the provided TL constructor.', $code, $caller, $previous),
'INPUT_LAYER_INVALID' => new self($rpc, 'The specified layer is invalid.', $code, $caller, $previous),
'INPUT_METHOD_INVALID' => new self($rpc, 'The specified method is invalid.', $code, $caller, $previous),
'INPUT_REQUEST_TOO_LONG' => new self($rpc, 'The request payload is too long.', $code, $caller, $previous),
'PEER_FLOOD' => new self($rpc, 'The current account is spamreported, you cannot execute this action, check @spambot for more info.', $code, $caller, $previous),
'STICKERSET_NOT_MODIFIED' => new self($rpc, 'The passed stickerset information is equal to the current information.', $code, $caller, $previous),
'TMP_PASSWORD_INVALID' => new self($rpc, 'The passed tmp_password is invalid.', $code, $caller, $previous),
'WEBDOCUMENT_URL_EMPTY' => new self($rpc, 'The passed web document URL is empty.', $code, $caller, $previous),
'ANONYMOUS_REACTIONS_DISABLED' => new self($rpc, 'Sorry, anonymous administrators cannot leave reactions or participate in polls.', $code, $caller, $previous),
'BROADCAST_FORBIDDEN' => new self($rpc, 'Channel poll voters and reactions cannot be fetched to prevent deanonymization.', $code, $caller, $previous),
'CHANNEL_PUBLIC_GROUP_NA' => new self($rpc, 'channel/supergroup not available.', $code, $caller, $previous),
'CHAT_ACTION_FORBIDDEN' => new self($rpc, 'You cannot execute this action.', $code, $caller, $previous),
'CHAT_ADMIN_INVITE_REQUIRED' => new self($rpc, 'You do not have the rights to do this.', $code, $caller, $previous),
'CHAT_GUEST_SEND_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatGuestSendForbiddenError($code, $caller, $previous),
'CHAT_SEND_AUDIOS_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendAudiosForbiddenError($code, $caller, $previous),
'CHAT_SEND_DOCS_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendDocsForbiddenError($code, $caller, $previous),
'CHAT_SEND_GAME_FORBIDDEN' => new self($rpc, 'You can\'t send a game to this chat.', $code, $caller, $previous),
'CHAT_SEND_GIFS_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendGifsForbiddenError($code, $caller, $previous),
'CHAT_SEND_MEDIA_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendMediaForbiddenError($code, $caller, $previous),
'CHAT_SEND_PHOTOS_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendPhotosForbiddenError($code, $caller, $previous),
'CHAT_SEND_PLAIN_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendPlainForbiddenError($code, $caller, $previous),
'CHAT_SEND_POLL_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendPollForbiddenError($code, $caller, $previous),
'CHAT_SEND_ROUNDVIDEOS_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendRoundvideosForbiddenError($code, $caller, $previous),
'CHAT_SEND_STICKERS_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendStickersForbiddenError($code, $caller, $previous),
'CHAT_SEND_VIDEOS_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendVideosForbiddenError($code, $caller, $previous),
'CHAT_SEND_VOICES_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatSendVoicesForbiddenError($code, $caller, $previous),
'CHAT_WRITE_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatWriteForbiddenError($code, $caller, $previous),
'EDIT_BOT_INVITE_FORBIDDEN' => new self($rpc, 'Normal users can\'t edit invites that were created by bots.', $code, $caller, $previous),
'GROUPCALL_ALREADY_STARTED' => new self($rpc, 'The groupcall has already started, you can join directly using [phone.joinGroupCall](https://core.telegram.org/method/phone.joinGroupCall).', $code, $caller, $previous),
'INLINE_BOT_REQUIRED' => new self($rpc, 'Only the inline bot can edit message.', $code, $caller, $previous),
'MESSAGE_AUTHOR_REQUIRED' => new self($rpc, 'Message author required.', $code, $caller, $previous),
'MESSAGE_DELETE_FORBIDDEN' => new self($rpc, 'You can\'t delete one of the messages you tried to delete, most likely because it is a service message.', $code, $caller, $previous),
'POLL_VOTE_REQUIRED' => new self($rpc, 'Cast a vote in the poll before calling this method.', $code, $caller, $previous),
'PRIVACY_PREMIUM_REQUIRED' => new \danog\MadelineProto\RPCError\PrivacyPremiumRequiredError($code, $caller, $previous),
'PUBLIC_CHANNEL_MISSING' => new self($rpc, 'You can only export group call invite links for public chats or channels.', $code, $caller, $previous),
'RIGHT_FORBIDDEN' => new self($rpc, 'Your admin rights do not allow you to do this.', $code, $caller, $previous),
'SENSITIVE_CHANGE_FORBIDDEN' => new self($rpc, 'You can\'t change your sensitive content settings.', $code, $caller, $previous),
'USER_DELETED' => new self($rpc, 'You can\'t send this secret message because the other participant deleted their account.', $code, $caller, $previous),
'USER_PRIVACY_RESTRICTED' => new self($rpc, 'The user\'s privacy settings do not allow you to do this.', $code, $caller, $previous),
'USER_RESTRICTED' => new self($rpc, 'You\'re spamreported, you can\'t create channels or chats.', $code, $caller, $previous),
'YOUR_PRIVACY_RESTRICTED' => new self($rpc, 'You cannot fetch the read date of this message because you have disallowed other users to do so for *your* messages; to fix, allow other users to see *your* exact last online date OR purchase a [Telegram Premium](https://core.telegram.org/api/premium) subscription.', $code, $caller, $previous),
'CHAT_FORBIDDEN' => new \danog\MadelineProto\RPCError\ChatForbiddenError($code, $caller, $previous),
'BUSINESS_ADDRESS_ACTIVE' => new self($rpc, 'The user is currently advertising a [Business Location](https://core.telegram.org/api/business#location), the location may only be changed (or removed) using [account.updateBusinessLocation »](https://core.telegram.org/method/account.updateBusinessLocation). .', $code, $caller, $previous),
'CALL_PROTOCOL_COMPAT_LAYER_INVALID' => new self($rpc, 'The other side of the call does not support any of the VoIP protocols supported by the local client, as specified by the `protocol.layer` and `protocol.library_versions` fields.', $code, $caller, $previous),
'FILEREF_UPGRADE_NEEDED' => new self($rpc, 'The client has to be updated in order to support [file references](https://core.telegram.org/api/file_reference).', $code, $caller, $previous),
'FRESH_CHANGE_PHONE_FORBIDDEN' => new self($rpc, 'You can\'t change phone number right after logging in, please wait at least 24 hours.', $code, $caller, $previous),
'FRESH_RESET_AUTHORISATION_FORBIDDEN' => new self($rpc, 'You can\'t logout other sessions if less than 24 hours have passed since you logged on the current session.', $code, $caller, $previous),
'PAYMENT_UNSUPPORTED' => new \danog\MadelineProto\RPCError\PaymentUnsupportedError($code, $caller, $previous),
'PHONE_PASSWORD_FLOOD' => new self($rpc, 'You have tried logging in too many times.', $code, $caller, $previous),
'PREMIUM_CURRENTLY_UNAVAILABLE' => new self($rpc, 'You cannot currently purchase a Premium subscription.', $code, $caller, $previous),
'SEND_CODE_UNAVAILABLE' => new self($rpc, 'Returned when all available options for this type of number were already used (e.g. flash-call, then SMS, then this error might be returned to trigger a second resend).', $code, $caller, $previous),
'STICKERSET_OWNER_ANONYMOUS' => new self($rpc, 'Provided stickerset can\'t be installed as group stickerset to prevent admin deanonymization.', $code, $caller, $previous),
'UPDATE_APP_TO_LOGIN' => new self($rpc, 'Please update to the latest version of MadelineProto to login.', $code, $caller, $previous),
'USERPIC_PRIVACY_REQUIRED' => new self($rpc, 'You need to disable privacy settings for your profile picture in order to make your geolocation public.', $code, $caller, $previous),
'AUTH_KEY_DUPLICATED' => new self($rpc, 'Concurrent usage of the current session from multiple connections was detected, the current session was invalidated by the server for security reasons!', $code, $caller, $previous),
'AUTH_KEY_INVALID' => new self($rpc, 'The specified auth key is invalid.', $code, $caller, $previous),
'AUTH_KEY_PERM_EMPTY' => new self($rpc, 'The method is unavailable for temporary authorization keys, not bound to a permanent authorization key.', $code, $caller, $previous),
'AUTH_KEY_UNREGISTERED' => new self($rpc, 'The specified authorization key is not registered in the system (for example, a PFS temporary key has expired).', $code, $caller, $previous),
'SESSION_EXPIRED' => new self($rpc, 'The session has expired.', $code, $caller, $previous),
'SESSION_PASSWORD_NEEDED' => new \danog\MadelineProto\RPCError\SessionPasswordNeededError($code, $caller, $previous),
'SESSION_REVOKED' => new self($rpc, 'The session was revoked by the user.', $code, $caller, $previous),
'USER_DEACTIVATED' => new self($rpc, 'The current account was deleted by the user.', $code, $caller, $previous),
'USER_DEACTIVATED_BAN' => new self($rpc, 'The current account was deleted and banned by Telegram\'s antispam system.', $code, $caller, $previous),
default => new self($rpc, $msg, $code, $caller, $previous)
};
// End match
}
protected function __construct(
/**
* @var string RPC error.
*/
public readonly string $rpc,
/**
* @var string Human-readable description of RPC error.
*/
public readonly string $description,
int $code,
private readonly string $caller,
?\Exception $previous = null
) {
parent::__construct($rpc, $code, $previous);
$this->prettifyTL($caller);
foreach ($this->getTrace() as $level) {
if (isset($level['function']) && $level['function'] === 'methodCall') {
$this->line = $level['line'];
$this->file = $level['file'];
}
}
}
}