Completed
Push — master ( bd2ebe...3262ec )
by Irfaq
10:31 queued 08:07
created

Api::markUpdateAsRead()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Telegram\Bot;
4
5
use Illuminate\Contracts\Container\Container;
6
use Telegram\Bot\Commands\CommandBus;
7
use Telegram\Bot\Events\EmitsEvents;
8
use Telegram\Bot\Events\UpdateWasReceived;
9
use Telegram\Bot\Exceptions\TelegramSDKException;
10
use Telegram\Bot\FileUpload\InputFile;
11
use Telegram\Bot\HttpClients\HttpClientInterface;
12
use Telegram\Bot\Objects\Chat;
13
use Telegram\Bot\Objects\ChatMember;
14
use Telegram\Bot\Objects\File;
15
use Telegram\Bot\Objects\Message;
16
use Telegram\Bot\Objects\UnknownObject;
17
use Telegram\Bot\Objects\Update;
18
use Telegram\Bot\Objects\User;
19
use Telegram\Bot\Objects\UserProfilePhotos;
20
use Telegram\Bot\Keyboard\Keyboard;
21
22
/**
23
 * Class Api.
24
 *
25
 * @mixin Commands\CommandBus
26
 */
27
class Api
28
{
29
    use EmitsEvents;
30
31
    /**
32
     * @var string Version number of the Telegram Bot PHP SDK.
33
     */
34
    const VERSION = '3.0.0';
35
36
    /**
37
     * @var string The name of the environment variable that contains the Telegram Bot API Access Token.
38
     */
39
    const BOT_TOKEN_ENV_NAME = 'TELEGRAM_BOT_TOKEN';
40
41
    /**
42
     * @var TelegramClient The Telegram client service.
43
     */
44
    protected $client;
45
46
    /**
47
     * @var string Telegram Bot API Access Token.
48
     */
49
    protected $accessToken = null;
50
51
    /**
52
     * @var TelegramResponse|null Stores the last request made to Telegram Bot API.
53
     */
54
    protected $lastResponse;
55
56
    /**
57
     * @var bool Indicates if the request to Telegram will be asynchronous (non-blocking).
58
     */
59
    protected $isAsyncRequest = false;
60
61
    /**
62
     * @var CommandBus|null Telegram Command Bus.
63
     */
64
    protected $commandBus = null;
65
66
    /**
67
     * @var Container IoC Container
68
     */
69
    protected static $container = null;
70
71
    /**
72
     * Timeout of the request in seconds.
73
     *
74
     * @var int
75
     */
76
    protected $timeOut = 60;
77
78
    /**
79
     * Connection timeout of the request in seconds.
80
     *
81
     * @var int
82
     */
83
    protected $connectTimeOut = 10;
84
85
    /**
86
     * Instantiates a new Telegram super-class object.
87
     *
88
     *
89
     * @param string              $token                      The Telegram Bot API Access Token.
90
     * @param bool                $async                      (Optional) Indicates if the request to Telegram
91
     *                                                        will be asynchronous (non-blocking).
92
     * @param HttpClientInterface $httpClientHandler          (Optional) Custom HTTP Client Handler.
93
     *
94
     * @throws TelegramSDKException
95
     */
96 66
    public function __construct($token = null, $async = false, $httpClientHandler = null)
97
    {
98 66
        $this->accessToken = isset($token) ? $token : getenv(static::BOT_TOKEN_ENV_NAME);
99 66
        if (!$this->accessToken) {
100 2
            throw new TelegramSDKException('Required "token" not supplied in config and could not find fallback environment variable "'.static::BOT_TOKEN_ENV_NAME.'"');
101
        }
102
103 66
        if (isset($async)) {
104 66
            $this->setAsyncRequest($async);
105 66
        }
106
107 66
        $this->client = new TelegramClient($httpClientHandler);
108 66
        $this->commandBus = new CommandBus($this);
109 66
    }
110
111
    /**
112
     * Invoke Bots Manager.
113
     *
114
     * @param $config
115
     *
116
     * @return BotsManager
117
     */
118
    public static function manager($config)
119
    {
120
        return new BotsManager($config);
121
    }
122
123
    /**
124
     * Returns the TelegramClient service.
125
     *
126
     * @return TelegramClient
127
     */
128 6
    public function getClient()
129
    {
130 6
        return $this->client;
131
    }
132
133
    /**
134
     * Returns Telegram Bot API Access Token.
135
     *
136
     * @return string
137
     */
138 42
    public function getAccessToken()
139
    {
140 42
        return $this->accessToken;
141
    }
142
143
    /**
144
     * Returns the last response returned from API request.
145
     *
146
     * @return TelegramResponse
147
     */
148 2
    public function getLastResponse()
149
    {
150 2
        return $this->lastResponse;
151
    }
152
153
    /**
154
     * Sets the bot access token to use with API requests.
155
     *
156
     * @param string $accessToken The bot access token to save.
157
     *
158
     * @throws \InvalidArgumentException
159
     *
160
     * @return Api
161
     */
162 8
    public function setAccessToken($accessToken)
163
    {
164 8
        if (is_string($accessToken)) {
165 2
            $this->accessToken = $accessToken;
166
167 2
            return $this;
168
        }
169
170 6
        throw new \InvalidArgumentException('The Telegram bot access token must be of type "string"');
171
    }
172
173
    /**
174
     * Make this request asynchronous (non-blocking).
175
     *
176
     * @param bool $isAsyncRequest
177
     *
178
     * @return Api
179
     */
180 66
    public function setAsyncRequest($isAsyncRequest)
181
    {
182 66
        $this->isAsyncRequest = $isAsyncRequest;
183
184 66
        return $this;
185
    }
186
187
    /**
188
     * Check if this is an asynchronous request (non-blocking).
189
     *
190
     * @return bool
191
     */
192 42
    public function isAsyncRequest()
193
    {
194 42
        return $this->isAsyncRequest;
195
    }
196
197
    /**
198
     * Returns SDK's Command Bus.
199
     *
200
     * @return CommandBus
201
     */
202 8
    public function getCommandBus()
203
    {
204 8
        return $this->commandBus;
205
    }
206
207
    /**
208
     * A simple method for testing your bot's auth token.
209
     * Returns basic information about the bot in form of a User object.
210
     *
211
     * @link https://core.telegram.org/bots/api#getme
212
     *
213
     * @throws TelegramSDKException
214
     *
215
     * @return User
216
     */
217 4
    public function getMe()
218
    {
219 4
        $response = $this->post('getMe');
220
221 2
        return new User($response->getDecodedBody());
222
    }
223
224
    /**
225
     * Send text messages.
226
     *
227
     * <code>
228
     * $params = [
229
     *   'chat_id'                  => '',
230
     *   'text'                     => '',
231
     *   'parse_mode'               => '',
232
     *   'disable_web_page_preview' => '',
233
     *   'disable_notification'     => '',
234
     *   'reply_to_message_id'      => '',
235
     *   'reply_markup'             => '',
236
     * ];
237
     * </code>
238
     *
239
     * @link https://core.telegram.org/bots/api#sendmessage
240
     *
241
     * @param array    $params
242
     *
243
     * @var int|string $params ['chat_id']
244
     * @var string     $params ['text']
245
     * @var string     $params ['parse_mode']
246
     * @var bool       $params ['disable_web_page_preview']
247
     * @var bool       $params ['disable_notification']
248
     * @var int        $params ['reply_to_message_id']
249
     * @var string     $params ['reply_markup']
250
     *
251
     * @throws TelegramSDKException
252
     *
253
     * @return Message
254
     */
255 4
    public function sendMessage(array $params)
256
    {
257 4
        $response = $this->post('sendMessage', $params);
258
259 4
        return new Message($response->getDecodedBody());
260
    }
261
262
    /**
263
     * Forward messages of any kind.
264
     *
265
     * <code>
266
     * $params = [
267
     *   'chat_id'              => '',
268
     *   'from_chat_id'         => '',
269
     *   'disable_notification' => '',
270
     *   'message_id'           => '',
271
     * ];
272
     * </code>
273
     *
274
     * @link https://core.telegram.org/bots/api#forwardmessage
275
     *
276
     * @param array    $params
277
     *
278
     * @var int|string $params ['chat_id']
279
     * @var int        $params ['from_chat_id']
280
     * @var bool       $params ['disable_notification']
281
     * @var int        $params ['message_id']
282
     *
283
     * @throws TelegramSDKException
284
     *
285
     * @return Message
286
     */
287 2
    public function forwardMessage(array $params)
288
    {
289 2
        $response = $this->post('forwardMessage', $params);
290
291 2
        return new Message($response->getDecodedBody());
292
    }
293
294
    /**
295
     * Send Photos.
296
     *
297
     * <code>
298
     * $params = [
299
     *   'chat_id'              => '',
300
     *   'photo'                => '',
301
     *   'caption'              => '',
302
     *   'disable_notification' => '',
303
     *   'reply_to_message_id'  => '',
304
     *   'reply_markup'         => '',
305
     * ];
306
     * </code>
307
     *
308
     * @link https://core.telegram.org/bots/api#sendphoto
309
     *
310
     * @param array    $params
311
     *
312
     * @var int|string $params ['chat_id']
313
     * @var string     $params ['photo']
314
     * @var string     $params ['caption']
315
     * @var bool       $params ['disable_notification']
316
     * @var int        $params ['reply_to_message_id']
317
     * @var string     $params ['reply_markup']
318
     *
319
     * @throws TelegramSDKException
320
     *
321
     * @return Message
322
     */
323 4
    public function sendPhoto(array $params)
324
    {
325 4
        $response = $this->uploadFile('sendPhoto', $params);
326
327 4
        return new Message($response->getDecodedBody());
328
    }
329
330
    /**
331
     * Send regular audio files.
332
     *
333
     * <code>
334
     * $params = [
335
     *   'chat_id'              => '',
336
     *   'audio'                => '',
337
     *   'duration'             => '',
338
     *   'performer'            => '',
339
     *   'title'                => '',
340
     *   'disable_notification' => '',
341
     *   'reply_to_message_id'  => '',
342
     *   'reply_markup'         => '',
343
     * ];
344
     * </code>
345
     *
346
     * @link https://core.telegram.org/bots/api#sendaudio
347
     *
348
     * @param array    $params
349
     *
350
     * @var int|string $params ['chat_id']
351
     * @var string     $params ['audio']
352
     * @var int        $params ['duration']
353
     * @var string     $params ['performer']
354
     * @var string     $params ['title']
355
     * @var bool       $params ['disable_notification']
356
     * @var int        $params ['reply_to_message_id']
357
     * @var string     $params ['reply_markup']
358
     *
359
     * @throws TelegramSDKException
360
     *
361
     * @return Message
362
     */
363 2
    public function sendAudio(array $params)
364
    {
365 2
        $response = $this->uploadFile('sendAudio', $params);
366
367 2
        return new Message($response->getDecodedBody());
368
    }
369
370
    /**
371
     * Send general files.
372
     *
373
     * <code>
374
     * $params = [
375
     *   'chat_id'              => '',
376
     *   'document'             => '',
377
     *   'caption'              => '',
378
     *   'disable_notification' => '',
379
     *   'reply_to_message_id'  => '',
380
     *   'reply_markup'         => '',
381
     * ];
382
     * </code>
383
     *
384
     * @link https://core.telegram.org/bots/api#senddocument
385
     *
386
     * @param array    $params
387
     *
388
     * @var int|string $params ['chat_id']
389
     * @var string     $params ['document']
390
     * @var string     $params ['caption']
391
     * @var bool       $params ['disable_notification']
392
     * @var int        $params ['reply_to_message_id']
393
     * @var string     $params ['reply_markup']
394
     *
395
     * @throws TelegramSDKException
396
     *
397
     * @return Message
398
     */
399 2
    public function sendDocument(array $params)
400
    {
401 2
        $response = $this->uploadFile('sendDocument', $params);
402
403 2
        return new Message($response->getDecodedBody());
404
    }
405
406
    /**
407
     * Send .webp stickers.
408
     *
409
     * <code>
410
     * $params = [
411
     *   'chat_id'              => '',
412
     *   'sticker'              => '',
413
     *   'disable_notification' => '',
414
     *   'reply_to_message_id'  => '',
415
     *   'reply_markup'         => '',
416
     * ];
417
     * </code>
418
     *
419
     * @link https://core.telegram.org/bots/api#sendsticker
420
     *
421
     * @param array    $params
422
     *
423
     * @var int|string $params ['chat_id']
424
     * @var string     $params ['sticker']
425
     * @var bool       $params ['disable_notification']
426
     * @var int        $params ['reply_to_message_id']
427
     * @var string     $params ['reply_markup']
428
     *
429
     * @throws TelegramSDKException
430
     *
431
     * @return Message
432
     */
433 2
    public function sendSticker(array $params)
434
    {
435 2
        if (is_file($params['sticker']) && (pathinfo($params['sticker'], PATHINFO_EXTENSION) !== 'webp')) {
436
            throw new TelegramSDKException('Invalid Sticker Provided. Supported Format: Webp');
437
        }
438
439 2
        $response = $this->uploadFile('sendSticker', $params);
440
441 2
        return new Message($response->getDecodedBody());
442
    }
443
444
    /**
445
     * Send Video File, Telegram clients support mp4 videos (other formats may be sent as Document).
446
     *
447
     * <code>
448
     * $params = [
449
     *   'chat_id'              => '',
450
     *   'video'                => '',
451
     *   'duration'             => '',
452
     *   'width'                => '',
453
     *   'height'               => '',
454
     *   'caption'              => '',
455
     *   'disable_notification' => '',
456
     *   'reply_to_message_id'  => '',
457
     *   'reply_markup'         => '',
458
     * ];
459
     * </code>
460
     *
461
     * @see  sendDocument
462
     * @link https://core.telegram.org/bots/api#sendvideo
463
     *
464
     * @param array    $params
465
     *
466
     * @var int|string $params ['chat_id']
467
     * @var string     $params ['video']
468
     * @var int        $params ['duration']
469
     * @var int        $params ['width']
470
     * @var int        $params ['height']
471
     * @var string     $params ['caption']
472
     * @var bool       $params ['disable_notification']
473
     * @var int        $params ['reply_to_message_id']
474
     * @var string     $params ['reply_markup']
475
     *
476
     * @throws TelegramSDKException
477
     *
478
     * @return Message
479
     */
480 2
    public function sendVideo(array $params)
481
    {
482 2
        $response = $this->uploadFile('sendVideo', $params);
483
484 2
        return new Message($response->getDecodedBody());
485
    }
486
487
    /**
488
     * Send voice audio files.
489
     *
490
     * <code>
491
     * $params = [
492
     *   'chat_id'              => '',
493
     *   'voice'                => '',
494
     *   'duration'             => '',
495
     *   'disable_notification' => '',
496
     *   'reply_to_message_id'  => '',
497
     *   'reply_markup'         => '',
498
     * ];
499
     * </code>
500
     *
501
     * @link https://core.telegram.org/bots/api#sendaudio
502
     *
503
     * @param array    $params
504
     *
505
     * @var int|string $params ['chat_id']
506
     * @var string     $params ['voice']
507
     * @var int        $params ['duration']
508
     * @var bool       $params ['disable_notification']
509
     * @var int        $params ['reply_to_message_id']
510
     * @var string     $params ['reply_markup']
511
     *
512
     * @throws TelegramSDKException
513
     *
514
     * @return Message
515
     */
516 2
    public function sendVoice(array $params)
517
    {
518 2
        $response = $this->uploadFile('sendVoice', $params);
519
520 2
        return new Message($response->getDecodedBody());
521
    }
522
523
    /**
524
     * Send point on the map.
525
     *
526
     * <code>
527
     * $params = [
528
     *   'chat_id'              => '',
529
     *   'latitude'             => '',
530
     *   'longitude'            => '',
531
     *   'disable_notification' => '',
532
     *   'reply_to_message_id'  => '',
533
     *   'reply_markup'         => '',
534
     * ];
535
     * </code>
536
     *
537
     * @link https://core.telegram.org/bots/api#sendlocation
538
     *
539
     * @param array    $params
540
     *
541
     * @var int|string $params ['chat_id']
542
     * @var float      $params ['latitude']
543
     * @var float      $params ['longitude']
544
     * @var bool       $params ['disable_notification']
545
     * @var int        $params ['reply_to_message_id']
546
     * @var string     $params ['reply_markup']
547
     *
548
     * @throws TelegramSDKException
549
     *
550
     * @return Message
551
     */
552 2
    public function sendLocation(array $params)
553
    {
554 2
        $response = $this->post('sendLocation', $params);
555
556 2
        return new Message($response->getDecodedBody());
557
    }
558
559
    /**
560
     * Send information about a venue.
561
     *
562
     * <code>
563
     * $params = [
564
     *   'chat_id'              => '',
565
     *   'latitude'             => '',
566
     *   'longitude'            => '',
567
     *   'title'                => '',
568
     *   'address'              => '',
569
     *   'foursquare_id'        => '',
570
     *   'disable_notification' => '',
571
     *   'reply_to_message_id'  => '',
572
     *   'reply_markup'         => '',
573
     * ];
574
     * </code>
575
     *
576
     * @link https://core.telegram.org/bots/api#sendvenue
577
     *
578
     * @param array    $params
579
     *
580
     * @var int|string $params ['chat_id']
581
     * @var float      $params ['latitude']
582
     * @var float      $params ['longitude']
583
     * @var string     $params ['title']
584
     * @var string     $params ['address']
585
     * @var string     $params ['foursquare_id']
586
     * @var bool       $params ['disable_notification']
587
     * @var int        $params ['reply_to_message_id']
588
     * @var string     $params ['reply_markup']
589
     *
590
     * @throws TelegramSDKException
591
     *
592
     * @return Message
593
     */
594
    public function sendVenue(array $params)
595
    {
596
        $response = $this->post('sendVenue', $params);
597
598
        return new Message($response->getDecodedBody());
599
    }
600
601
    /**
602
     * Send phone contacts.
603
     *
604
     * <code>
605
     * $params = [
606
     *   'chat_id'              => '',
607
     *   'phone_number'         => '',
608
     *   'first_name'           => '',
609
     *   'last_name'            => '',
610
     *   'disable_notification' => '',
611
     *   'reply_to_message_id'  => '',
612
     *   'reply_markup'         => '',
613
     * ];
614
     * </code>
615
     *
616
     * @link https://core.telegram.org/bots/api#sendcontact
617
     *
618
     * @param array    $params
619
     *
620
     * @var int|string $params ['chat_id']
621
     * @var string     $params ['phone_number']
622
     * @var string     $params ['first_name']
623
     * @var string     $params ['last_name']
624
     * @var bool       $params ['disable_notification']
625
     * @var int        $params ['reply_to_message_id']
626
     * @var string     $params ['reply_markup']
627
     *
628
     * @throws TelegramSDKException
629
     *
630
     * @return Message
631
     */
632
    public function sendContact(array $params)
633
    {
634
        $response = $this->post('sendContact', $params);
635
636
        return new Message($response->getDecodedBody());
637
    }
638
639
    /**
640
     * Broadcast a Chat Action.
641
     *
642
     * <code>
643
     * $params = [
644
     *   'chat_id' => '',
645
     *   'action'  => '',
646
     * ];
647
     * </code>
648
     *
649
     * @link https://core.telegram.org/bots/api#sendchataction
650
     *
651
     * @param array    $params
652
     *
653
     * @var int|string $params ['chat_id']
654
     * @var string     $params ['action']
655
     *
656
     * @throws TelegramSDKException
657
     *
658
     * @return bool
659
     */
660 4
    public function sendChatAction(array $params)
661
    {
662
        $validActions = [
663 4
            'typing',
664 4
            'upload_photo',
665 4
            'record_video',
666 4
            'upload_video',
667 4
            'record_audio',
668 4
            'upload_audio',
669 4
            'upload_document',
670 4
            'find_location',
671 4
        ];
672
673 4
        if (isset($params['action']) && in_array($params['action'], $validActions)) {
674 2
            $this->post('sendChatAction', $params);
675
676 2
            return true;
677
        }
678
679 2
        throw new TelegramSDKException('Invalid Action! Accepted value: '.implode(', ', $validActions));
680
    }
681
682
    /**
683
     * Returns a list of profile pictures for a user.
684
     *
685
     * <code>
686
     * $params = [
687
     *   'user_id' => '',
688
     *   'offset'  => '',
689
     *   'limit'   => '',
690
     * ];
691
     * </code>
692
     *
693
     * @link https://core.telegram.org/bots/api#getuserprofilephotos
694
     *
695
     * @param array $params
696
     *
697
     * @var int     $params ['user_id']
698
     * @var int     $params ['offset']
699
     * @var int     $params ['limit']
700
     *
701
     * @throws TelegramSDKException
702
     *
703
     * @return UserProfilePhotos
704
     */
705
    public function getUserProfilePhotos(array $params)
706
    {
707
        $response = $this->post('getUserProfilePhotos', $params);
708
709
        return new UserProfilePhotos($response->getDecodedBody());
710
    }
711
712
    /**
713
     * Returns basic info about a file and prepare it for downloading.
714
     *
715
     * <code>
716
     * $params = [
717
     *   'file_id' => '',
718
     * ];
719
     * </code>
720
     *
721
     * The file can then be downloaded via the link
722
     * https://api.telegram.org/file/bot<token>/<file_path>,
723
     * where <file_path> is taken from the response.
724
     *
725
     * @link https://core.telegram.org/bots/api#getFile
726
     *
727
     * @param array $params
728
     *
729
     * @var string  $params ['file_id']
730
     *
731
     * @throws TelegramSDKException
732
     *
733
     * @return File
734
     */
735 2
    public function getFile(array $params)
736
    {
737 2
        $response = $this->post('getFile', $params);
738
739 2
        return new File($response->getDecodedBody());
740
    }
741
742
    /**
743
     * Kick a user from a group or a supergroup.
744
     *
745
     * In the case of supergroups, the user will not be able to return to the group on their own using
746
     * invite links etc., unless unbanned first.
747
     *
748
     * The bot must be an administrator in the group for this to work.
749
     *
750
     * <code>
751
     * $params = [
752
     *   'chat_id'              => '',
753
     *   'user_id'              => '',
754
     * ];
755
     * </code>
756
     *
757
     * @link https://core.telegram.org/bots/api#kickchatmember
758
     *
759
     * @param array    $params
760
     *
761
     * @var int|string $params ['chat_id']
762
     * @var int        $params ['user_id']
763
     *
764
     * @throws TelegramSDKException
765
     *
766
     * @return bool
767
     */
768
    public function kickChatMember(array $params)
769
    {
770
        $this->post('kickChatMember', $params);
771
772
        return true;
773
    }
774
775
    /**
776
     * Unban a previously kicked user in a supergroup.
777
     *
778
     * The user will not return to the group automatically, but will be able to join via link, etc.
779
     *
780
     * The bot must be an administrator in the group for this to work.
781
     *
782
     * <code>
783
     * $params = [
784
     *   'chat_id'              => '',
785
     *   'user_id'              => '',
786
     * ];
787
     * </code>
788
     *
789
     * @link https://core.telegram.org/bots/api#unbanchatmember
790
     *
791
     * @param array    $params
792
     *
793
     * @var int|string $params ['chat_id']
794
     * @var int        $params ['user_id']
795
     *
796
     * @throws TelegramSDKException
797
     *
798
     * @return bool
799
     */
800
    public function unbanChatMember(array $params)
801
    {
802
        $this->post('unbanChatMember', $params);
803
804
        return true;
805
    }
806
807
    /**
808
     * Get up to date information about the chat (current name of the user for one-on-one conversations,
809
     * current username of a user, group or channel,
810
     *
811
     * <code>
812
     * $params = [
813
     *   'chat_id'  => '',
814
     * ];
815
     * </code>
816
     *
817
     * @link https://core.telegram.org/bots/api#getchat
818
     *
819
     * @param array $params
820
     *
821
     * @var string|int  $params ['chat_id'] Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername)
822
     *
823
     * @throws TelegramSDKException
824
     *
825
     * @return Chat
826
     */
827
    public function getChat(array $params)
828
    {
829
        $response = $this->post('getChat', $params);
830
831
        return new Chat($response->getDecodedBody());
832
    }
833
834
    /**
835
     * Get a list of administrators in a chat.
836
     *
837
     * <code>
838
     * $params = [
839
     *   'chat_id'  => '',
840
     * ];
841
     * </code>
842
     *
843
     * @link https://core.telegram.org/bots/api#getchatadministrators
844
     *
845
     * @param array $params
846
     *
847
     * @var string|int  $params ['chat_id'] Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername);
848
     *
849
     * @throws TelegramSDKException
850
     *
851
     * @return ChatMember[]
852
     */
853
    public function getChatAdministrators(array $params)
854
    {
855
        $response = $this->post('getChatAdministrators', $params);
856
857
        return collect($response->getResult())
858
            ->map(function ($admin) {
859
                return new ChatMember($admin);
860
            })
861
            ->all();
862
    }
863
864
    /**
865
     * Get the number of members in a chat
866
     *
867
     * <code>
868
     * $params = [
869
     *   'chat_id'  => '',
870
     * ];
871
     * </code>
872
     *
873
     * @link https://core.telegram.org/bots/api#getchatmemberscount
874
     *
875
     * @param array $params
876
     *
877
     * @var string|int  $params ['chat_id'] Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername)
878
     *
879
     * @throws TelegramSDKException
880
     *
881
     * @return int
882
     */
883
    public function getChatMembersCount(array $params)
884
    {
885
        $response = $this->post('getChatMembersCount', $params);
886
887
        return $response->getResult();
888
    }
889
890
    /**
891
     * Get information about a member of a chat.
892
     *
893
     * <code>
894
     * $params = [
895
     *   'chat_id'  => '',
896
     *   'user_id'  => '',
897
     * ];
898
     * </code>
899
     *
900
     * @link https://core.telegram.org/bots/api#getchatmember
901
     *
902
     * @param array $params
903
     *
904
     * @var string|int  $params ['chat_id'] Unique identifier for the target chat or username of the target supergroup or channel (in the format @channelusername)
905
     * @var int         $params ['user_id'] Unique identifier of the target user.
906
     *
907
     * @throws TelegramSDKException
908
     *
909
     * @return ChatMember
910
     */
911
    public function getChatMember(array $params)
912
    {
913
        $response = $this->post('getChatMember', $params);
914
915
        return new ChatMember($response->getDecodedBody());
916
    }
917
918
    /**
919
     * Send answers to callback queries sent from inline keyboards.
920
     *
921
     * he answer will be displayed to the user as a notification at the top of the chat screen or as an alert.
922
     *
923
     * <code>
924
     * $params = [
925
     *   'callback_query_id'  => '',
926
     *   'text'               => '',
927
     *   'show_alert'         => '',
928
     * ];
929
     * </code>
930
     *
931
     * @link https://core.telegram.org/bots/api#answerCallbackQuery
932
     *
933
     * @param array $params
934
     *
935
     * @var string  $params ['callback_query_id']
936
     * @var string  $params ['text']
937
     * @var bool    $params ['show_alert']
938
     *
939
     * @throws TelegramSDKException
940
     *
941
     * @return bool
942
     */
943
    public function answerCallbackQuery(array $params)
944
    {
945
        $this->post('answerCallbackQuery', $params);
946
947
        return true;
948
    }
949
950
951
    /**
952
     * Edit text messages sent by the bot or via the bot (for inline bots).
953
     *
954
     * <code>
955
     * $params = [
956
     *   'chat_id'                  => '',
957
     *   'message_id'               => '',
958
     *   'inline_message_id'        => '',
959
     *   'text'                     => '',
960
     *   'parse_mode'               => '',
961
     *   'disable_web_page_preview' => '',
962
     *   'reply_markup'             => '',
963
     * ];
964
     * </code>
965
     *
966
     * @link https://core.telegram.org/bots/api#editMessageText
967
     *
968
     * @param array    $params
969
     *
970
     * @var int|string $params ['chat_id']
971
     * @var int        $params ['message_id']
972
     * @var string     $params ['inline_message_id']
973
     * @var string     $params ['text']
974
     * @var string     $params ['parse_mode']
975
     * @var bool       $params ['disable_web_page_preview']
976
     * @var string     $params ['reply_markup']
977
     *
978
     * @throws TelegramSDKException
979
     *
980
     * @return Message|bool
981
     */
982
    public function editMessageText(array $params)
983
    {
984
        $response = $this->post('editMessageText', $params);
985
986
        return new Message($response->getDecodedBody());
987
    }
988
989
    /**
990
     * Edit captions of messages sent by the bot or via the bot (for inline bots).
991
     *
992
     * <code>
993
     * $params = [
994
     *   'chat_id'                  => '',
995
     *   'message_id'               => '',
996
     *   'inline_message_id'        => '',
997
     *   'caption'                  => '',
998
     *   'reply_markup'             => '',
999
     * ];
1000
     * </code>
1001
     *
1002
     * @link https://core.telegram.org/bots/api#editMessageCaption
1003
     *
1004
     * @param array    $params
1005
     *
1006
     * @var int|string $params ['chat_id']
1007
     * @var int        $params ['message_id']
1008
     * @var string     $params ['inline_message_id']
1009
     * @var string     $params ['caption']
1010
     * @var string     $params ['reply_markup']
1011
     *
1012
     * @throws TelegramSDKException
1013
     *
1014
     * @return Message|bool
1015
     */
1016
    public function editMessageCaption(array $params)
1017
    {
1018
        $response = $this->post('editMessageCaption', $params);
1019
1020
        return new Message($response->getDecodedBody());
1021
    }
1022
1023
    /**
1024
     * Edit only the reply markup of messages sent by the bot or via the bot (for inline bots).
1025
     *
1026
     * <code>
1027
     * $params = [
1028
     *   'chat_id'                  => '',
1029
     *   'message_id'               => '',
1030
     *   'inline_message_id'        => '',
1031
     *   'reply_markup'             => '',
1032
     * ];
1033
     * </code>
1034
     *
1035
     * @link https://core.telegram.org/bots/api#editMessageReplyMarkup
1036
     *
1037
     * @param array    $params
1038
     *
1039
     * @var int|string $params ['chat_id']
1040
     * @var int        $params ['message_id']
1041
     * @var string     $params ['inline_message_id']
1042
     * @var string     $params ['reply_markup']
1043
     *
1044
     * @throws TelegramSDKException
1045
     *
1046
     * @return Message|bool
1047
     */
1048
    public function editMessageReplyMarkup(array $params)
1049
    {
1050
        $response = $this->post('editMessageReplyMarkup', $params);
1051
1052
        return new Message($response->getDecodedBody());
1053
    }
1054
1055
    /**
1056
     * Use this method to send answers to an inline query.
1057
     *
1058
     * <code>
1059
     * $params = [
1060
     *   'inline_query_id'      => '',
1061
     *   'results'              => [],
1062
     *   'cache_time'           => 0,
1063
     *   'is_personal'          => false,
1064
     *   'next_offset'          => '',
1065
     *   'switch_pm_text'       => '',
1066
     *   'switch_pm_parameter'  => '',
1067
     * ];
1068
     * </code>
1069
     *
1070
     * @link https://core.telegram.org/bots/api#answerinlinequery
1071
     *
1072
     * @param array     $params
1073
     *
1074
     * @var string      $params ['inline_query_id']
1075
     * @var array       $params ['results']
1076
     * @var int|null    $params ['cache_time']
1077
     * @var bool|null   $params ['is_personal']
1078
     * @var string|null $params ['next_offset']
1079
     * @var string|null $params ['switch_pm_text']
1080
     * @var string|null $params ['switch_pm_parameter']
1081
     *
1082
     * @throws TelegramSDKException
1083
     *
1084
     * @return bool
1085
     */
1086
    public function answerInlineQuery(array $params = [])
1087
    {
1088
        if (is_array($params['results'])) {
1089
            $params['results'] = json_encode($params['results']);
1090
        }
1091
1092
        $this->post('answerInlineQuery', $params);
1093
1094
        return true;
1095
    }
1096
1097
    /**
1098
     * Set a Webhook to receive incoming updates via an outgoing webhook.
1099
     *
1100
     * <code>
1101
     * $params = [
1102
     *   'url'         => '',
1103
     *   'certificate' => '',
1104
     * ];
1105
     * </code>
1106
     *
1107
     * @link https://core.telegram.org/bots/api#setwebhook
1108
     *
1109
     * @param array $params
1110
     *
1111
     * @var string  $params ['url']         HTTPS url to send updates to.
1112
     * @var string  $params ['certificate'] Upload your public key certificate so that the root certificate in
1113
     *                                      use can be checked.
1114
     *
1115
     * @throws TelegramSDKException
1116
     *
1117
     * @return TelegramResponse
1118
     */
1119 6
    public function setWebhook(array $params)
1120
    {
1121 6
        if (filter_var($params['url'], FILTER_VALIDATE_URL) === false) {
1122 2
            throw new TelegramSDKException('Invalid URL Provided');
1123
        }
1124
1125 4
        if (parse_url($params['url'], PHP_URL_SCHEME) !== 'https') {
1126 2
            throw new TelegramSDKException('Invalid URL, should be a HTTPS url.');
1127
        }
1128
1129 2
        return $this->uploadFile('setWebhook', $params);
1130
    }
1131
1132
    /**
1133
     * Returns webhook updates sent by Telegram.
1134
     * Works only if you set a webhook.
1135
     *
1136
     * @see setWebhook
1137
     *
1138
     * @return Update
1139
     */
1140
    public function getWebhookUpdates($emitUpdateWasReceivedEvent = true)
1141
    {
1142
        $body = json_decode(file_get_contents('php://input'), true);
1143
1144
        $update = new Update($body);
1145
1146
        if ($emitUpdateWasReceivedEvent) {
1147
            $this->emitEvent(new UpdateWasReceived($update, $this));
1148
        }
1149
1150
        return $update;
1151
    }
1152
1153
    /**
1154
     * Removes the outgoing webhook (if any).
1155
     *
1156
     * @throws TelegramSDKException
1157
     *
1158
     * @return TelegramResponse
1159
     */
1160 2
    public function removeWebhook()
1161
    {
1162 2
        $url = '';
1163
1164 2
        return $this->post('setWebhook', compact('url'));
1165
    }
1166
1167
    /**
1168
     * Use this method to receive incoming updates using long polling.
1169
     *
1170
     * <code>
1171
     * $params = [
1172
     *   'offset'  => '',
1173
     *   'limit'   => '',
1174
     *   'timeout' => '',
1175
     * ];
1176
     * </code>
1177
     *
1178
     * @link https://core.telegram.org/bots/api#getupdates
1179
     *
1180
     * @param array  $params
1181
     * @param bool  $emitUpdateWasReceivedEvents
0 ignored issues
show
Bug introduced by
There is no parameter named $emitUpdateWasReceivedEvents. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
1182
     * @var int|null $params ['offset']
1183
     * @var int|null $params ['limit']
1184
     * @var int|null $params ['timeout']
1185
     *
1186
     * @throws TelegramSDKException
1187
     *
1188
     * @return Update[]
1189
     */
1190 6
    public function getUpdates(array $params = [], $shouldEmitEvents = true)
1191
    {
1192 6
        $response = $this->post('getUpdates', $params);
1193
1194 6
        return collect($response->getResult())
1195
            ->map(function ($data) use ($shouldEmitEvents) {
1196
1197 6
                $update = new Update($data);
1198
1199 6
                if ($shouldEmitEvents) {
1200 6
                    $this->emitEvent(new UpdateWasReceived($update, $this));
1201 6
                }
1202
1203 6
                return $update;
1204 6
            })
1205 6
            ->all();
1206
    }
1207
1208
1209
    /**
1210
     * Builds a custom keyboard markup.
1211
     *
1212
     * <code>
1213
     * $params = [
1214
     *   'keyboard'          => '',
1215
     *   'resize_keyboard'   => '',
1216
     *   'one_time_keyboard' => '',
1217
     *   'selective'         => '',
1218
     * ];
1219
     * </code>
1220
     *
1221
     * @deprecated Use Telegram\Bot\Keyboard\Keyboard::make(array $params = []) instead.
1222
     *             To be removed in next major version.
1223
     *
1224
     * @link       https://core.telegram.org/bots/api#replykeyboardmarkup
1225
     *
1226
     * @param array $params
1227
     *
1228
     * @var array   $params ['keyboard']
1229
     * @var bool    $params ['resize_keyboard']
1230
     * @var bool    $params ['one_time_keyboard']
1231
     * @var bool    $params ['selective']
1232
     *
1233
     * @return string
1234
     */
1235
    public function replyKeyboardMarkup(array $params)
1236
    {
1237
        return Keyboard::make($params);
1238
    }
1239
1240
    /**
1241
     * Hide the current custom keyboard and display the default letter-keyboard.
1242
     *
1243
     * <code>
1244
     * $params = [
1245
     *   'hide_keyboard' => true,
1246
     *   'selective'     => false,
1247
     * ];
1248
     * </code>
1249
     *
1250
     * @deprecated Use Telegram\Bot\Keyboard\Keyboard::hide(array $params = []) instead.
1251
     *             To be removed in next major version.
1252
     *
1253
     * @link       https://core.telegram.org/bots/api#replykeyboardhide
1254
     *
1255
     * @param array $params
1256
     *
1257
     * @var bool    $params ['hide_keyboard']
1258
     * @var bool    $params ['selective']
1259
     *
1260
     * @return string
1261
     */
1262
    public static function replyKeyboardHide(array $params = [])
1263
    {
1264
        return Keyboard::hide($params);
1265
    }
1266
1267
    /**
1268
     * Display a reply interface to the user (act as if the user has selected the bot‘s message and tapped ’Reply').
1269
     *
1270
     * <code>
1271
     * $params = [
1272
     *   'force_reply' => true,
1273
     *   'selective'   => false,
1274
     * ];
1275
     * </code>
1276
     *
1277
     * @deprecated Use Telegram\Bot\Keyboard\Keyboard::forceReply(array $params = []) instead.
1278
     *             To be removed in next major version.
1279
     *
1280
     * @link       https://core.telegram.org/bots/api#forcereply
1281
     *
1282
     * @param array $params
1283
     *
1284
     * @var bool    $params ['force_reply']
1285
     * @var bool    $params ['selective']
1286
     *
1287
     * @return string
1288
     */
1289
    public static function forceReply(array $params = [])
1290
    {
1291
        return Keyboard::forceReply($params);
1292
    }
1293
1294
    /**
1295
     * Processes Inbound Commands.
1296
     *
1297
     * @param bool $webhook
1298
     *
1299
     * @return Update|Update[]
1300
     */
1301 6
    public function commandsHandler($webhook = false)
1302
    {
1303 6
        if ($webhook) {
1304
            $update = $this->getWebhookUpdates();
1305
            $this->processCommand($update);
1306
1307
            return $update;
1308
        }
1309
1310 6
        $updates = $this->getUpdates();
1311 6
        $highestId = -1;
1312
1313 6
        foreach ($updates as $update) {
1314 6
            $highestId = $update->getUpdateId();
1315 6
            $this->processCommand($update);
1316 6
        }
1317
1318
        //An update is considered confirmed as soon as getUpdates is called with an offset higher than its update_id.
1319 6
        if ($highestId != -1) {
1320 6
            $params = [];
1321 6
            $params['offset'] = $highestId + 1;
1322 6
            $params['limit'] = 1;
1323 6
            $this->markUpdateAsRead($params);
1324 6
        }
1325
1326 6
        return $updates;
1327
    }
1328
1329
    /**
1330
     * Check update object for a command and process.
1331
     *
1332
     * @param Update $update
1333
     */
1334 6
    public function processCommand(Update $update)
1335
    {
1336 6
        $message = $update->getMessage();
1337
1338 6
        if ($message !== null && $message->has('text')) {
1339 6
            $this->getCommandBus()->handler($message->getText(), $update);
1340 6
        }
1341 6
    }
1342
1343
    /**
1344
     * Helper to Trigger Commands.
1345
     *
1346
     * @param string $name   Command Name
1347
     * @param Update $update Update Object
1348
     *
1349
     * @return mixed
1350
     */
1351
    public function triggerCommand($name, Update $update)
1352
    {
1353
        return $this->getCommandBus()->execute($name, $update->getMessage()->getText(), $update);
1354
    }
1355
1356
    /**
1357
     * Determine if a given type is the message.
1358
     *
1359
     * @deprecated Call method isType directly on Message object
1360
     *             To be removed in next major version.
1361
     *
1362
     * @param string         $type
1363
     * @param Update|Message $object
1364
     *
1365
     * @throws \ErrorException
1366
     *
1367
     * @return bool
1368
     */
1369
    public function isMessageType($type, $object)
0 ignored issues
show
Unused Code introduced by
The parameter $type is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $object is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1370
    {
1371
        trigger_error('This method has been deprecated. Use isType() on the Message object instead.', E_USER_DEPRECATED);
1372
    }
1373
1374
    /**
1375
     * Detect Message Type Based on Update or Message Object.
1376
     *
1377
     * @deprecated Call method detectType directly on Message object
1378
     *             To be removed in next major version.
1379
     *
1380
     * @param Update|Message $object
1381
     *
1382
     * @throws \ErrorException
1383
     *
1384
     * @return string|null
1385
     */
1386
    public function detectMessageType($object)
0 ignored issues
show
Unused Code introduced by
The parameter $object is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1387
    {
1388
        trigger_error('This method has been deprecated. Use detectType() on the Message object instead.', E_USER_DEPRECATED);
1389
    }
1390
1391
    /**
1392
     * Sends a GET request to Telegram Bot API and returns the result.
1393
     *
1394
     * @param string $endpoint
1395
     * @param array  $params
1396
     *
1397
     * @throws TelegramSDKException
1398
     *
1399
     * @return TelegramResponse
1400
     */
1401
    protected function get($endpoint, $params = [])
1402
    {
1403
        if (array_key_exists('reply_markup', $params)) {
1404
            $params['reply_markup'] = (string)$params['reply_markup'];
1405
        }
1406
1407
        return $this->sendRequest(
1408
            'GET',
1409
            $endpoint,
1410
            $params
1411
        );
1412
    }
1413
1414
    /**
1415
     * Sends a POST request to Telegram Bot API and returns the result.
1416
     *
1417
     * @param string $endpoint
1418
     * @param array  $params
1419
     * @param bool   $fileUpload Set true if a file is being uploaded.
1420
     *
1421
     * @return TelegramResponse
1422
     */
1423 40
    protected function post($endpoint, array $params = [], $fileUpload = false)
1424
    {
1425 40
        if ($fileUpload) {
1426 16
            $params = ['multipart' => $params];
1427 16
        } else {
1428
1429 24
            if (array_key_exists('reply_markup', $params)) {
1430
                $params['reply_markup'] = (string)$params['reply_markup'];
1431
            }
1432
1433 24
            $params = ['form_params' => $params];
1434
        }
1435
1436 40
        return $this->sendRequest(
1437 40
            'POST',
1438 40
            $endpoint,
1439
            $params
1440 40
        );
1441
    }
1442
1443
    /**
1444
     * Sends a multipart/form-data request to Telegram Bot API and returns the result.
1445
     * Used primarily for file uploads.
1446
     *
1447
     * @param string $endpoint
1448
     * @param array  $params
1449
     *
1450
     * @throws TelegramSDKException
1451
     *
1452
     * @return TelegramResponse
1453
     */
1454 16
    protected function uploadFile($endpoint, array $params = [])
1455
    {
1456 16
        $multipart_params = collect($params)
1457
            ->reject(function ($value) {
1458 16
                return is_null($value);
1459 16
            })
1460 16
            ->map(function ($contents, $name) {
1461
1462 16
                if (!is_resource($contents) && $name !== 'url') {
1463 14
                    $validUrl = filter_var($contents, FILTER_VALIDATE_URL);
1464 14
                    $contents = (is_file($contents) || $validUrl) ? (new InputFile($contents))->open() : (string)$contents;
1465 14
                }
1466
1467
                return [
1468 16
                    'name'     => $name,
1469 16
                    'contents' => $contents,
1470 16
                ];
1471 16
            })
1472
            //Reset the keys on the collection
1473 16
            ->values()
1474 16
            ->all();
1475
1476 16
        return $this->post($endpoint, $multipart_params, true);
1477
    }
1478
1479
    /**
1480
     * Sends a request to Telegram Bot API and returns the result.
1481
     *
1482
     * @param string $method
1483
     * @param string $endpoint
1484
     * @param array  $params
1485
     *
1486
     * @throws TelegramSDKException
1487
     *
1488
     * @return TelegramResponse
1489
     */
1490 40
    protected function sendRequest(
1491
        $method,
1492
        $endpoint,
1493
        array $params = []
1494
    ) {
1495 40
        $request = $this->request($method, $endpoint, $params);
1496
1497 40
        return $this->lastResponse = $this->client->sendRequest($request);
1498
    }
1499
1500
    /**
1501
     * Instantiates a new TelegramRequest entity.
1502
     *
1503
     * @param string $method
1504
     * @param string $endpoint
1505
     * @param array  $params
1506
     *
1507
     * @return TelegramRequest
1508
     */
1509 40
    protected function request(
1510
        $method,
1511
        $endpoint,
1512
        array $params = []
1513
    ) {
1514 40
        return new TelegramRequest(
1515 40
            $this->getAccessToken(),
1516 40
            $method,
1517 40
            $endpoint,
1518 40
            $params,
1519 40
            $this->isAsyncRequest(),
1520 40
            $this->getTimeOut(),
1521 40
            $this->getConnectTimeOut()
1522 40
        );
1523
    }
1524
1525
    /**
1526
     * Magic method to process any "get" requests.
1527
     *
1528
     * @param $method
1529
     * @param $arguments
1530
     *
1531
     * @throws TelegramSDKException
1532
     *
1533
     * @return bool|TelegramResponse|UnknownObject
1534
     */
1535 2
    public function __call($method, $arguments)
1536
    {
1537 2
        if (preg_match('/^\w+Commands?/', $method, $matches)) {
1538 2
            return call_user_func_array([$this->getCommandBus(), $matches[0]], $arguments);
1539
        }
1540
1541
        $action = substr($method, 0, 3);
1542
        if ($action === 'get') {
1543
            /* @noinspection PhpUndefinedFunctionInspection */
1544
            $class_name = studly_case(substr($method, 3));
1545
            $class = 'Telegram\Bot\Objects\\'.$class_name;
1546
            $response = $this->post($method, $arguments[0] ?: []);
1547
1548
            if (class_exists($class)) {
1549
                return new $class($response->getDecodedBody());
1550
            }
1551
1552
            return $response;
1553
        }
1554
        $response = $this->post($method, $arguments[0]);
1555
1556
        return new UnknownObject($response->getDecodedBody());
1557
    }
1558
1559
    /**
1560
     * Set the IoC Container.
1561
     *
1562
     * @param $container Container instance
1563
     *
1564
     * @return void
1565
     */
1566 2
    public static function setContainer(Container $container)
1567
    {
1568 2
        self::$container = $container;
1569 2
    }
1570
1571
    /**
1572
     * Get the IoC Container.
1573
     *
1574
     * @return Container
1575
     */
1576 2
    public function getContainer()
1577
    {
1578 2
        return self::$container;
1579
    }
1580
1581
    /**
1582
     * Check if IoC Container has been set.
1583
     *
1584
     * @return boolean
1585
     */
1586
    public function hasContainer()
1587
    {
1588
        return self::$container !== null;
1589
    }
1590
1591
    /**
1592
     * @return int
1593
     */
1594 40
    public function getTimeOut()
1595
    {
1596 40
        return $this->timeOut;
1597
    }
1598
1599
    /**
1600
     * @param int $timeOut
1601
     *
1602
     * @return $this
1603
     */
1604 2
    public function setTimeOut($timeOut)
1605
    {
1606 2
        $this->timeOut = $timeOut;
1607
1608 2
        return $this;
1609
    }
1610
1611
    /**
1612
     * @return int
1613
     */
1614 40
    public function getConnectTimeOut()
1615
    {
1616 40
        return $this->connectTimeOut;
1617
    }
1618
1619
    /**
1620
     * @param int $connectTimeOut
1621
     *
1622
     * @return $this
1623
     */
1624 2
    public function setConnectTimeOut($connectTimeOut)
1625
    {
1626 2
        $this->connectTimeOut = $connectTimeOut;
1627
1628 2
        return $this;
1629
    }
1630
1631
    /**
1632
     * An alias for getUpdates that helps readability.
1633
     *
1634
     * @param $params
1635
     */
1636 6
    protected function markUpdateAsRead($params)
1637
    {
1638 6
        return $this->getUpdates($params);
1639
    }
1640
}
1641