Completed
Push — master ( 8fbc07...04de59 )
by Armando
03:05 queued 01:27
created

src/Telegram.php (2 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * This file is part of the TelegramBot package.
4
 *
5
 * (c) Avtandil Kikabidze aka LONGMAN <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace Longman\TelegramBot;
12
13 1
define('BASE_PATH', __DIR__);
14 1
define('BASE_COMMANDS_PATH', BASE_PATH . '/Commands');
15
16
use Exception;
17
use Longman\TelegramBot\Commands\Command;
18
use Longman\TelegramBot\Entities\ServerResponse;
19
use Longman\TelegramBot\Entities\Update;
20
use Longman\TelegramBot\Exception\TelegramException;
21
use PDO;
22
use RecursiveDirectoryIterator;
23
use RecursiveIteratorIterator;
24
use RegexIterator;
25
26
class Telegram
27
{
28
    /**
29
     * Version
30
     *
31
     * @var string
32
     */
33
    protected $version = '0.48.0';
34
35
    /**
36
     * Telegram API key
37
     *
38
     * @var string
39
     */
40
    protected $api_key = '';
41
42
    /**
43
     * Telegram Bot username
44
     *
45
     * @var string
46
     */
47
    protected $bot_username = '';
48
49
    /**
50
     * Telegram Bot id
51
     *
52
     * @var string
53
     */
54
    protected $bot_id = '';
55
56
    /**
57
     * Raw request data (json) for webhook methods
58
     *
59
     * @var string
60
     */
61
    protected $input;
62
63
    /**
64
     * Custom commands paths
65
     *
66
     * @var array
67
     */
68
    protected $commands_paths = [];
69
70
    /**
71
     * Current Update object
72
     *
73
     * @var \Longman\TelegramBot\Entities\Update
74
     */
75
    protected $update;
76
77
    /**
78
     * Upload path
79
     *
80
     * @var string
81
     */
82
    protected $upload_path;
83
84
    /**
85
     * Download path
86
     *
87
     * @var string
88
     */
89
    protected $download_path;
90
91
    /**
92
     * MySQL integration
93
     *
94
     * @var boolean
95
     */
96
    protected $mysql_enabled = false;
97
98
    /**
99
     * PDO object
100
     *
101
     * @var \PDO
102
     */
103
    protected $pdo;
104
105
    /**
106
     * Commands config
107
     *
108
     * @var array
109
     */
110
    protected $commands_config = [];
111
112
    /**
113
     * Admins list
114
     *
115
     * @var array
116
     */
117
    protected $admins_list = [];
118
119
    /**
120
     * ServerResponse of the last Command execution
121
     *
122
     * @var \Longman\TelegramBot\Entities\ServerResponse
123
     */
124
    protected $last_command_response;
125
126
    /**
127
     * Botan.io integration
128
     *
129
     * @var boolean
130
     */
131
    protected $botan_enabled = false;
132
133
    /**
134
     * Check if runCommands() is running in this session
135
     *
136
     * @var boolean
137
     */
138
    protected $run_commands = false;
139
140
    /**
141
     * Telegram constructor.
142
     *
143
     * @param string $api_key
144
     * @param string $bot_username
145
     *
146
     * @throws \Longman\TelegramBot\Exception\TelegramException
147
     */
148 30
    public function __construct($api_key, $bot_username = '')
149
    {
150 30
        if (empty($api_key)) {
151 1
            throw new TelegramException('API KEY not defined!');
152
        }
153 30
        preg_match('/(\d+)\:[\w\-]+/', $api_key, $matches);
154 30
        if (!isset($matches[1])) {
155 1
            throw new TelegramException('Invalid API KEY defined!');
156
        }
157 30
        $this->bot_id  = $matches[1];
158 30
        $this->api_key = $api_key;
159
160 30
        if (!empty($bot_username)) {
161 30
            $this->bot_username = $bot_username;
162
        }
163
164
        //Add default system commands path
165 30
        $this->addCommandsPath(BASE_COMMANDS_PATH . '/SystemCommands');
166
167 30
        Request::initialize($this);
168 30
    }
169
170
    /**
171
     * Initialize Database connection
172
     *
173
     * @param array  $credential
174
     * @param string $table_prefix
175
     * @param string $encoding
176
     *
177
     * @return \Longman\TelegramBot\Telegram
178
     * @throws \Longman\TelegramBot\Exception\TelegramException
179
     */
180 9 View Code Duplication
    public function enableMySql(array $credential, $table_prefix = null, $encoding = 'utf8mb4')
181
    {
182 9
        $this->pdo = DB::initialize($credential, $this, $table_prefix, $encoding);
183 9
        ConversationDB::initializeConversation();
184 9
        $this->mysql_enabled = true;
185
186 9
        return $this;
187
    }
188
189
    /**
190
     * Initialize Database external connection
191
     *
192
     * @param PDO    $external_pdo_connection PDO database object
193
     * @param string $table_prefix
194
     *
195
     * @return \Longman\TelegramBot\Telegram
196
     * @throws \Longman\TelegramBot\Exception\TelegramException
197
     */
198 View Code Duplication
    public function enableExternalMySql($external_pdo_connection, $table_prefix = null)
199
    {
200
        $this->pdo = DB::externalInitialize($external_pdo_connection, $this, $table_prefix);
201
        ConversationDB::initializeConversation();
202
        $this->mysql_enabled = true;
203
204
        return $this;
205
    }
206
207
    /**
208
     * Get commands list
209
     *
210
     * @return array $commands
211
     * @throws \Longman\TelegramBot\Exception\TelegramException
212
     */
213 1
    public function getCommandsList()
214
    {
215 1
        $commands = [];
216
217 1
        foreach ($this->commands_paths as $path) {
218
            try {
219
                //Get all "*Command.php" files
220 1
                $files = new RegexIterator(
221 1
                    new RecursiveIteratorIterator(
222 1
                        new RecursiveDirectoryIterator($path)
223
                    ),
224 1
                    '/^.+Command.php$/'
225
                );
226
227 1
                foreach ($files as $file) {
228
                    //Remove "Command.php" from filename
229 1
                    $command      = $this->sanitizeCommand(substr($file->getFilename(), 0, -11));
230 1
                    $command_name = strtolower($command);
231
232 1
                    if (array_key_exists($command_name, $commands)) {
233
                        continue;
234
                    }
235
236 1
                    require_once $file->getPathname();
237
238 1
                    $command_obj = $this->getCommandObject($command);
239 1
                    if ($command_obj instanceof Command) {
240 1
                        $commands[$command_name] = $command_obj;
241
                    }
242
                }
243
            } catch (Exception $e) {
244 1
                throw new TelegramException('Error getting commands from path: ' . $path);
245
            }
246
        }
247
248 1
        return $commands;
249
    }
250
251
    /**
252
     * Get an object instance of the passed command
253
     *
254
     * @param string $command
255
     *
256
     * @return \Longman\TelegramBot\Commands\Command|null
257
     */
258 1
    public function getCommandObject($command)
259
    {
260 1
        $which = ['System'];
261 1
        $this->isAdmin() && $which[] = 'Admin';
262 1
        $which[] = 'User';
263
264 1
        foreach ($which as $auth) {
265 1
            $command_namespace = __NAMESPACE__ . '\\Commands\\' . $auth . 'Commands\\' . $this->ucfirstUnicode($command) . 'Command';
266 1
            if (class_exists($command_namespace)) {
267 1
                return new $command_namespace($this, $this->update);
268
            }
269
        }
270
271
        return null;
272
    }
273
274
    /**
275
     * Set custom input string for debug purposes
276
     *
277
     * @param string $input (json format)
278
     *
279
     * @return \Longman\TelegramBot\Telegram
280
     */
281
    public function setCustomInput($input)
282
    {
283
        $this->input = $input;
284
285
        return $this;
286
    }
287
288
    /**
289
     * Get custom input string for debug purposes
290
     *
291
     * @return string
292
     */
293
    public function getCustomInput()
294
    {
295
        return $this->input;
296
    }
297
298
    /**
299
     * Get the ServerResponse of the last Command execution
300
     *
301
     * @return \Longman\TelegramBot\Entities\ServerResponse
302
     */
303
    public function getLastCommandResponse()
304
    {
305
        return $this->last_command_response;
306
    }
307
308
    /**
309
     * Handle getUpdates method
310
     *
311
     * @param int|null $limit
312
     * @param int|null $timeout
313
     *
314
     * @return \Longman\TelegramBot\Entities\ServerResponse
315
     * @throws \Longman\TelegramBot\Exception\TelegramException
316
     */
317
    public function handleGetUpdates($limit = null, $timeout = null)
318
    {
319
        if (empty($this->bot_username)) {
320
            throw new TelegramException('Bot Username is not defined!');
321
        }
322
323
        if (!DB::isDbConnected()) {
324
            return new ServerResponse(
325
                [
326
                    'ok'          => false,
327
                    'description' => 'getUpdates needs MySQL connection!',
328
                ],
329
                $this->bot_username
330
            );
331
        }
332
333
        //Take custom input into account.
334
        if ($custom_input = $this->getCustomInput()) {
335
            $response = new ServerResponse(json_decode($custom_input, true), $this->bot_username);
336
        } else {
337
            //DB Query
338
            $last_update = DB::selectTelegramUpdate(1);
339
            $last_update = reset($last_update);
340
341
            //As explained in the telegram bot api documentation
342
            $offset = isset($last_update['id']) ? $last_update['id'] + 1 : null;
343
344
            $response = Request::getUpdates(
345
                [
346
                    'offset'  => $offset,
347
                    'limit'   => $limit,
348
                    'timeout' => $timeout,
349
                ]
350
            );
351
        }
352
353
        if ($response->isOk()) {
354
            //Process all updates
355
            /** @var Update $result */
356
            foreach ((array) $response->getResult() as $result) {
357
                $this->processUpdate($result);
358
            }
359
        }
360
361
        return $response;
362
    }
363
364
    /**
365
     * Handle bot request from webhook
366
     *
367
     * @return bool
368
     *
369
     * @throws \Longman\TelegramBot\Exception\TelegramException
370
     */
371
    public function handle()
372
    {
373
        if (empty($this->bot_username)) {
374
            throw new TelegramException('Bot Username is not defined!');
375
        }
376
377
        $this->input = Request::getInput();
378
379
        if (empty($this->input)) {
380
            throw new TelegramException('Input is empty!');
381
        }
382
383
        $post = json_decode($this->input, true);
384
        if (empty($post)) {
385
            throw new TelegramException('Invalid JSON!');
386
        }
387
388
        if ($response = $this->processUpdate(new Update($post, $this->bot_username))) {
389
            return $response->isOk();
390
        }
391
392
        return false;
393
    }
394
395
    /**
396
     * Get the command name from the command type
397
     *
398
     * @param string $type
399
     *
400
     * @return string
401
     */
402
    protected function getCommandFromType($type)
403
    {
404
        return $this->ucfirstUnicode(str_replace('_', '', $type));
405
    }
406
407
    /**
408
     * Process bot Update request
409
     *
410
     * @param \Longman\TelegramBot\Entities\Update $update
411
     *
412
     * @return \Longman\TelegramBot\Entities\ServerResponse
413
     * @throws \Longman\TelegramBot\Exception\TelegramException
414
     */
415
    public function processUpdate(Update $update)
416
    {
417
        $this->update = $update;
418
419
        //If all else fails, it's a generic message.
420
        $command = 'genericmessage';
421
422
        $update_type = $this->update->getUpdateType();
423
        if (in_array($update_type, ['edited_message', 'channel_post', 'edited_channel_post', 'inline_query', 'chosen_inline_result', 'callback_query'], true)) {
424
            $command = $this->getCommandFromType($update_type);
425
        } elseif ($update_type === 'message') {
426
            $message = $this->update->getMessage();
427
428
            //Load admin commands
429
            if ($this->isAdmin()) {
430
                $this->addCommandsPath(BASE_COMMANDS_PATH . '/AdminCommands', false);
431
            }
432
433
            $type = $message->getType();
434
            if ($type === 'command') {
435
                $command = $message->getCommand();
436
            } elseif (in_array($type, [
437
                'channel_chat_created',
438
                'delete_chat_photo',
439
                'group_chat_created',
440
                'left_chat_member',
441
                'migrate_from_chat_id',
442
                'migrate_to_chat_id',
443
                'new_chat_members',
444
                'new_chat_photo',
445
                'new_chat_title',
446
                'pinned_message',
447
                'supergroup_chat_created',
448
            ], true)
449
            ) {
450
                $command = $this->getCommandFromType($type);
451
            }
452
        }
453
454
        //Make sure we have an up-to-date command list
455
        //This is necessary to "require" all the necessary command files!
456
        $this->getCommandsList();
457
458
        DB::insertRequest($this->update);
459
460
        return $this->executeCommand($command);
0 ignored issues
show
It seems like $command defined by $message->getCommand() on line 435 can also be of type boolean; however, Longman\TelegramBot\Telegram::executeCommand() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
461
    }
462
463
    /**
464
     * Execute /command
465
     *
466
     * @param string $command
467
     *
468
     * @return mixed
469
     * @throws \Longman\TelegramBot\Exception\TelegramException
470
     */
471
    public function executeCommand($command)
472
    {
473
        $command     = strtolower($command);
474
        $command_obj = $this->getCommandObject($command);
475
476
        if (!$command_obj || !$command_obj->isEnabled()) {
477
            //Failsafe in case the Generic command can't be found
478
            if ($command === 'generic') {
479
                throw new TelegramException('Generic command missing!');
480
            }
481
482
            //Handle a generic command or non existing one
483
            $this->last_command_response = $this->executeCommand('generic');
484
        } else {
485
            //Botan.io integration, make sure only the actual command user executed is reported
486
            if ($this->botan_enabled) {
487
                Botan::lock($command);
488
            }
489
490
            //execute() method is executed after preExecute()
491
            //This is to prevent executing a DB query without a valid connection
492
            $this->last_command_response = $command_obj->preExecute();
493
494
            //Botan.io integration, send report after executing the command
495
            if ($this->botan_enabled) {
496
                Botan::track($this->update, $command);
497
            }
498
        }
499
500
        return $this->last_command_response;
501
    }
502
503
    /**
504
     * Sanitize Command
505
     *
506
     * @param string $command
507
     *
508
     * @return string
509
     */
510 1
    protected function sanitizeCommand($command)
511
    {
512 1
        return str_replace(' ', '', $this->ucwordsUnicode(str_replace('_', ' ', $command)));
513
    }
514
515
    /**
516
     * Enable a single Admin account
517
     *
518
     * @param integer $admin_id Single admin id
519
     *
520
     * @return \Longman\TelegramBot\Telegram
521
     */
522 1
    public function enableAdmin($admin_id)
523
    {
524 1
        if (!is_int($admin_id) || $admin_id <= 0) {
525 1
            TelegramLog::error('Invalid value "%s" for admin.', $admin_id);
526 1
        } elseif (!in_array($admin_id, $this->admins_list, true)) {
527 1
            $this->admins_list[] = $admin_id;
528
        }
529
530 1
        return $this;
531
    }
532
533
    /**
534
     * Enable a list of Admin Accounts
535
     *
536
     * @param array $admin_ids List of admin ids
537
     *
538
     * @return \Longman\TelegramBot\Telegram
539
     */
540 1
    public function enableAdmins(array $admin_ids)
541
    {
542 1
        foreach ($admin_ids as $admin_id) {
543 1
            $this->enableAdmin($admin_id);
544
        }
545
546 1
        return $this;
547
    }
548
549
    /**
550
     * Get list of admins
551
     *
552
     * @return array
553
     */
554 1
    public function getAdminList()
555
    {
556 1
        return $this->admins_list;
557
    }
558
559
    /**
560
     * Check if the passed user is an admin
561
     *
562
     * If no user id is passed, the current update is checked for a valid message sender.
563
     *
564
     * @param int|null $user_id
565
     *
566
     * @return bool
567
     */
568 1
    public function isAdmin($user_id = null)
569
    {
570 1
        if ($user_id === null && $this->update !== null) {
571
            //Try to figure out if the user is an admin
572
            $update_methods = [
573
                'getMessage',
574
                'getEditedMessage',
575
                'getChannelPost',
576
                'getEditedChannelPost',
577
                'getInlineQuery',
578
                'getChosenInlineResult',
579
                'getCallbackQuery',
580
            ];
581
            foreach ($update_methods as $update_method) {
582
                $object = call_user_func([$this->update, $update_method]);
583
                if ($object !== null && $from = $object->getFrom()) {
584
                    $user_id = $from->getId();
585
                    break;
586
                }
587
            }
588
        }
589
590 1
        return ($user_id === null) ? false : in_array($user_id, $this->admins_list, true);
591
    }
592
593
    /**
594
     * Check if user required the db connection
595
     *
596
     * @return bool
597
     */
598
    public function isDbEnabled()
599
    {
600
        if ($this->mysql_enabled) {
601
            return true;
602
        } else {
603
            return false;
604
        }
605
    }
606
607
    /**
608
     * Add a single custom commands path
609
     *
610
     * @param string $path   Custom commands path to add
611
     * @param bool   $before If the path should be prepended or appended to the list
612
     *
613
     * @return \Longman\TelegramBot\Telegram
614
     */
615 30
    public function addCommandsPath($path, $before = true)
616
    {
617 30
        if (!is_dir($path)) {
618 1
            TelegramLog::error('Commands path "%s" does not exist.', $path);
619 30
        } elseif (!in_array($path, $this->commands_paths, true)) {
620 30
            if ($before) {
621 30
                array_unshift($this->commands_paths, $path);
622
            } else {
623
                $this->commands_paths[] = $path;
624
            }
625
        }
626
627 30
        return $this;
628
    }
629
630
    /**
631
     * Add multiple custom commands paths
632
     *
633
     * @param array $paths  Custom commands paths to add
634
     * @param bool  $before If the paths should be prepended or appended to the list
635
     *
636
     * @return \Longman\TelegramBot\Telegram
637
     */
638 1
    public function addCommandsPaths(array $paths, $before = true)
639
    {
640 1
        foreach ($paths as $path) {
641 1
            $this->addCommandsPath($path, $before);
642
        }
643
644 1
        return $this;
645
    }
646
647
    /**
648
     * Return the list of commands paths
649
     *
650
     * @return array
651
     */
652 1
    public function getCommandsPaths()
653
    {
654 1
        return $this->commands_paths;
655
    }
656
657
    /**
658
     * Set custom upload path
659
     *
660
     * @param string $path Custom upload path
661
     *
662
     * @return \Longman\TelegramBot\Telegram
663
     */
664
    public function setUploadPath($path)
665
    {
666
        $this->upload_path = $path;
667
668
        return $this;
669
    }
670
671
    /**
672
     * Get custom upload path
673
     *
674
     * @return string
675
     */
676
    public function getUploadPath()
677
    {
678
        return $this->upload_path;
679
    }
680
681
    /**
682
     * Set custom download path
683
     *
684
     * @param string $path Custom download path
685
     *
686
     * @return \Longman\TelegramBot\Telegram
687
     */
688
    public function setDownloadPath($path)
689
    {
690
        $this->download_path = $path;
691
692
        return $this;
693
    }
694
695
    /**
696
     * Get custom download path
697
     *
698
     * @return string
699
     */
700
    public function getDownloadPath()
701
    {
702
        return $this->download_path;
703
    }
704
705
    /**
706
     * Set command config
707
     *
708
     * Provide further variables to a particular commands.
709
     * For example you can add the channel name at the command /sendtochannel
710
     * Or you can add the api key for external service.
711
     *
712
     * @param string $command
713
     * @param array  $config
714
     *
715
     * @return \Longman\TelegramBot\Telegram
716
     */
717 14
    public function setCommandConfig($command, array $config)
718
    {
719 14
        $this->commands_config[$command] = $config;
720
721 14
        return $this;
722
    }
723
724
    /**
725
     * Get command config
726
     *
727
     * @param string $command
728
     *
729
     * @return array
730
     */
731 15
    public function getCommandConfig($command)
732
    {
733 15
        return isset($this->commands_config[$command]) ? $this->commands_config[$command] : [];
734
    }
735
736
    /**
737
     * Get API key
738
     *
739
     * @return string
740
     */
741 1
    public function getApiKey()
742
    {
743 1
        return $this->api_key;
744
    }
745
746
    /**
747
     * Get Bot name
748
     *
749
     * @return string
750
     */
751 1
    public function getBotUsername()
752
    {
753 1
        return $this->bot_username;
754
    }
755
756
    /**
757
     * Get Bot Id
758
     *
759
     * @return string
760
     */
761
    public function getBotId()
762
    {
763
        return $this->bot_id;
764
    }
765
766
    /**
767
     * Get Version
768
     *
769
     * @return string
770
     */
771
    public function getVersion()
772
    {
773
        return $this->version;
774
    }
775
776
    /**
777
     * Set Webhook for bot
778
     *
779
     * @param string $url
780
     * @param array  $data Optional parameters.
781
     *
782
     * @return \Longman\TelegramBot\Entities\ServerResponse
783
     * @throws \Longman\TelegramBot\Exception\TelegramException
784
     */
785
    public function setWebhook($url, array $data = [])
786
    {
787
        if (empty($url)) {
788
            throw new TelegramException('Hook url is empty!');
789
        }
790
791
        $data        = array_intersect_key($data, array_flip([
792
            'certificate',
793
            'max_connections',
794
            'allowed_updates',
795
        ]));
796
        $data['url'] = $url;
797
798
        // If the certificate is passed as a path, encode and add the file to the data array.
799
        if (!empty($data['certificate']) && is_string($data['certificate'])) {
800
            $data['certificate'] = Request::encodeFile($data['certificate']);
801
        }
802
803
        $result = Request::setWebhook($data);
804
805 View Code Duplication
        if (!$result->isOk()) {
806
            throw new TelegramException(
807
                'Webhook was not set! Error: ' . $result->getErrorCode() . ' ' . $result->getDescription()
808
            );
809
        }
810
811
        return $result;
812
    }
813
814
    /**
815
     * Delete any assigned webhook
816
     *
817
     * @return mixed
818
     * @throws \Longman\TelegramBot\Exception\TelegramException
819
     */
820
    public function deleteWebhook()
821
    {
822
        $result = Request::deleteWebhook();
823
824 View Code Duplication
        if (!$result->isOk()) {
825
            throw new TelegramException(
826
                'Webhook was not deleted! Error: ' . $result->getErrorCode() . ' ' . $result->getDescription()
827
            );
828
        }
829
830
        return $result;
831
    }
832
833
    /**
834
     * Replace function `ucwords` for UTF-8 characters in the class definition and commands
835
     *
836
     * @param string $str
837
     * @param string $encoding (default = 'UTF-8')
838
     *
839
     * @return string
840
     */
841 1
    protected function ucwordsUnicode($str, $encoding = 'UTF-8')
842
    {
843 1
        return mb_convert_case($str, MB_CASE_TITLE, $encoding);
844
    }
845
846
    /**
847
     * Replace function `ucfirst` for UTF-8 characters in the class definition and commands
848
     *
849
     * @param string $str
850
     * @param string $encoding (default = 'UTF-8')
851
     *
852
     * @return string
853
     */
854 1
    protected function ucfirstUnicode($str, $encoding = 'UTF-8')
855
    {
856
        return
857 1
            mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding)
858 1
            . mb_strtolower(mb_substr($str, 1, mb_strlen($str), $encoding), $encoding);
859
    }
860
861
    /**
862
     * Enable Botan.io integration
863
     *
864
     * @param  string $token
865
     * @param  array  $options
866
     *
867
     * @return \Longman\TelegramBot\Telegram
868
     * @throws \Longman\TelegramBot\Exception\TelegramException
869
     */
870
    public function enableBotan($token, array $options = [])
871
    {
872
        Botan::initializeBotan($token, $options);
873
        $this->botan_enabled = true;
874
875
        return $this;
876
    }
877
878
    /**
879
     * Enable requests limiter
880
     *
881
     * @param  array $options
882
     *
883
     * @return \Longman\TelegramBot\Telegram
884
     */
885
    public function enableLimiter(array $options = [])
886
    {
887
        Request::setLimiter(true, $options);
888
889
        return $this;
890
    }
891
892
    /**
893
     * Run provided commands
894
     *
895
     * @param array $commands
896
     *
897
     * @throws TelegramException
898
     */
899
    public function runCommands($commands)
900
    {
901
        if (!is_array($commands) || empty($commands)) {
902
            throw new TelegramException('No command(s) provided!');
903
        }
904
905
        $this->run_commands  = true;
906
        $this->botan_enabled = false;   // Force disable Botan.io integration, we don't want to track self-executed commands!
907
908
        $result = Request::getMe();
909
910
        if ($result->isOk()) {
911
            $result = $result->getResult();
912
913
            $bot_id       = $result->getId();
914
            $bot_name     = $result->getFirstName();
915
            $bot_username = $result->getUsername();
916
        } else {
917
            $bot_id       = $this->getBotId();
918
            $bot_name     = $this->getBotUsername();
919
            $bot_username = $this->getBotUsername();
920
        }
921
922
923
        $this->enableAdmin($bot_id);    // Give bot access to admin commands
924
        $this->getCommandsList();       // Load full commands list
925
926
        foreach ($commands as $command) {
927
            $this->update = new Update(
928
                [
929
                    'update_id' => 0,
930
                    'message'   => [
931
                        'message_id' => 0,
932
                        'from'       => [
933
                            'id'         => $bot_id,
934
                            'first_name' => $bot_name,
935
                            'username'   => $bot_username,
936
                        ],
937
                        'date'       => time(),
938
                        'chat'       => [
939
                            'id'   => $bot_id,
940
                            'type' => 'private',
941
                        ],
942
                        'text'       => $command,
943
                    ],
944
                ]
945
            );
946
947
            $this->executeCommand($this->update->getMessage()->getCommand());
0 ignored issues
show
It seems like $this->update->getMessage()->getCommand() targeting Longman\TelegramBot\Entities\Message::getCommand() can also be of type boolean; however, Longman\TelegramBot\Telegram::executeCommand() does only seem to accept string, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
948
        }
949
    }
950
951
    /**
952
     * Is this session initiated by runCommands()
953
     *
954
     * @return bool
955
     */
956
    public function isRunCommands()
957
    {
958
        return $this->run_commands;
959
    }
960
}
961