Completed
Pull Request — master (#519)
by
unknown
02:19
created

DB   D

Complexity

Total Complexity 115

Size/Duplication

Total Lines 1143
Duplicated Lines 11.02 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 30.2%

Importance

Changes 0
Metric Value
wmc 115
lcom 1
cbo 9
dl 126
loc 1143
ccs 154
cts 510
cp 0.302
rs 4.4102
c 0
b 0
f 0

21 Methods

Rating   Name   Duplication   Size   Complexity  
B initialize() 0 28 3
A externalInitialize() 0 18 2
A defineTables() 0 21 3
A isDbConnected() 0 4 1
A getPdo() 0 4 1
B selectTelegramUpdate() 0 33 6
A getTimestamp() 0 8 2
B selectMessages() 0 27 4
A entitiesArrayToJson() 0 13 2
C insertTelegramUpdate() 0 38 8
B insertUser() 0 58 5
B insertChat() 0 48 4
B insertInlineQueryRequest() 39 39 4
B insertChosenInlineResultRequest() 39 39 4
B insertCallbackQueryRequest() 0 61 6
F insertMessageRequest() 0 158 11
B insertEditedMessageRequest() 0 55 5
F selectChats() 0 92 19
B getTelegramRequestCount() 0 30 3
B insertTelegramRequest() 0 31 5
D insertRequest() 48 101 17

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like DB often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use DB, and based on these observations, apply Extract Interface, too.

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
 * Written by Marco Boretto <[email protected]>
10
 */
11
12
namespace Longman\TelegramBot;
13
14
use Longman\TelegramBot\Entities\CallbackQuery;
15
use Longman\TelegramBot\Entities\Chat;
16
use Longman\TelegramBot\Entities\ChosenInlineResult;
17
use Longman\TelegramBot\Entities\InlineQuery;
18
use Longman\TelegramBot\Entities\Message;
19
use Longman\TelegramBot\Entities\ReplyToMessage;
20
use Longman\TelegramBot\Entities\Update;
21
use Longman\TelegramBot\Entities\User;
22
use Longman\TelegramBot\Exception\TelegramException;
23
use PDO;
24
use PDOException;
25
26
class DB
27
{
28
    /**
29
     * MySQL credentials
30
     *
31
     * @var array
32
     */
33
    static protected $mysql_credentials = [];
34
35
    /**
36
     * PDO object
37
     *
38
     * @var PDO
39
     */
40
    static protected $pdo;
41
42
    /**
43
     * Table prefix
44
     *
45
     * @var string
46
     */
47
    static protected $table_prefix;
48
49
    /**
50
     * Telegram class object
51
     *
52
     * @var \Longman\TelegramBot\Telegram
53
     */
54
    static protected $telegram;
55
56
    /**
57
     * Initialize
58
     *
59
     * @param array                         $credentials  Database connection details
60
     * @param \Longman\TelegramBot\Telegram $telegram     Telegram object to connect with this object
61
     * @param string                        $table_prefix Table prefix
62
     * @param string                        $encoding     Database character encoding
63
     *
64
     * @return PDO PDO database object
65
     * @throws \Longman\TelegramBot\Exception\TelegramException
66
     */
67 9
    public static function initialize(
68
        array $credentials,
69
        Telegram $telegram,
70
        $table_prefix = null,
71
        $encoding = 'utf8mb4'
72
    ) {
73 9
        if (empty($credentials)) {
74
            throw new TelegramException('MySQL credentials not provided!');
75
        }
76
77 9
        $dsn     = 'mysql:host=' . $credentials['host'] . ';dbname=' . $credentials['database'];
78 9
        $options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . $encoding];
79
        try {
80 9
            $pdo = new PDO($dsn, $credentials['user'], $credentials['password'], $options);
81 9
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
82
        } catch (PDOException $e) {
83
            throw new TelegramException($e->getMessage());
84
        }
85
86 9
        self::$pdo               = $pdo;
87 9
        self::$telegram          = $telegram;
88 9
        self::$mysql_credentials = $credentials;
89 9
        self::$table_prefix      = $table_prefix;
90
91 9
        self::defineTables();
92
93 9
        return self::$pdo;
94
    }
95
96
    /**
97
     * External Initialize
98
     *
99
     * Let you use the class with an external already existing Pdo Mysql connection.
100
     *
101
     * @param PDO                           $external_pdo_connection PDO database object
102
     * @param \Longman\TelegramBot\Telegram $telegram                Telegram object to connect with this object
103
     * @param string                        $table_prefix            Table prefix
104
     *
105
     * @return PDO PDO database object
106
     * @throws \Longman\TelegramBot\Exception\TelegramException
107
     */
108
    public static function externalInitialize(
109
        $external_pdo_connection,
110
        Telegram $telegram,
111
        $table_prefix = null
112
    ) {
113
        if ($external_pdo_connection === null) {
114
            throw new TelegramException('MySQL external connection not provided!');
115
        }
116
117
        self::$pdo               = $external_pdo_connection;
118
        self::$telegram          = $telegram;
119
        self::$mysql_credentials = [];
120
        self::$table_prefix      = $table_prefix;
121
122
        self::defineTables();
123
124
        return self::$pdo;
125
    }
126
127
    /**
128
     * Define all the tables with the proper prefix
129
     */
130 9
    protected static function defineTables()
131
    {
132
        $tables = [
133 9
            'callback_query',
134
            'chat',
135
            'chosen_inline_result',
136
            'edited_message',
137
            'inline_query',
138
            'message',
139
            'request_limiter',
140
            'telegram_update',
141
            'user',
142
            'user_chat',
143
        ];
144 9
        foreach ($tables as $table) {
145 9
            $table_name = 'TB_' . strtoupper($table);
146 9
            if (!defined($table_name)) {
147 1
                define($table_name, self::$table_prefix . $table);
148
            }
149
        }
150 9
    }
151
152
    /**
153
     * Check if database connection has been created
154
     *
155
     * @return bool
156
     */
157 9
    public static function isDbConnected()
158
    {
159 9
        return self::$pdo !== null;
160
    }
161
162
    /**
163
     * Get the PDO object of the connected database
164
     *
165
     * @return \PDO
166
     */
167
    public static function getPdo()
168
    {
169
        return self::$pdo;
170
    }
171
172
    /**
173
     * Fetch update(s) from DB
174
     *
175
     * @param int $limit Limit the number of updates to fetch
176
     * @param int $id    Check for unique update id
177
     *
178
     * @return array|bool Fetched data or false if not connected
179
     * @throws \Longman\TelegramBot\Exception\TelegramException
180
     */
181
    public static function selectTelegramUpdate($limit = null, $id = null)
182
    {
183
        if (!self::isDbConnected()) {
184
            return false;
185
        }
186
187
        try {
188
            $sql = 'SELECT `id` FROM `' . TB_TELEGRAM_UPDATE . '`';
189
190
            if ($id !== null) {
191
                $sql .= ' WHERE `id` = :id';
192
            }
193
194
            $sql .= ' ORDER BY `id` DESC';
195
196
            if ($limit !== null) {
197
                $sql .= ' LIMIT :limit';
198
            }
199
200
            $sth = self::$pdo->prepare($sql);
201
            $sth->bindParam(':limit', $limit, PDO::PARAM_INT);
202
203
            if ($id !== null) {
204
                $sth->bindParam(':id', $id, PDO::PARAM_INT);
205
            }
206
207
            $sth->execute();
208
209
            return $sth->fetchAll(PDO::FETCH_ASSOC);
210
        } catch (PDOException $e) {
211
            throw new TelegramException($e->getMessage());
212
        }
213
    }
214
215
    /**
216
     * Fetch message(s) from DB
217
     *
218
     * @param int $limit Limit the number of messages to fetch
219
     *
220
     * @return array|bool Fetched data or false if not connected
221
     * @throws \Longman\TelegramBot\Exception\TelegramException
222
     */
223
    public static function selectMessages($limit = null)
224
    {
225
        if (!self::isDbConnected()) {
226
            return false;
227
        }
228
229
        try {
230
            $sql = '
231
                SELECT *
232
                FROM `' . TB_MESSAGE . '`
233
                WHERE `update_id` != 0
234
                ORDER BY `message_id` DESC
235
            ';
236
237
            if ($limit !== null) {
238
                $sql .= 'LIMIT :limit';
239
            }
240
241
            $sth = self::$pdo->prepare($sql);
242
            $sth->bindParam(':limit', $limit, PDO::PARAM_INT);
243
            $sth->execute();
244
245
            return $sth->fetchAll(PDO::FETCH_ASSOC);
246
        } catch (PDOException $e) {
247
            throw new TelegramException($e->getMessage());
248
        }
249
    }
250
251
    /**
252
     * Convert from unix timestamp to timestamp
253
     *
254
     * @param int $time Unix timestamp (if null, current timestamp is used)
255
     *
256
     * @return string
257
     */
258 7
    protected static function getTimestamp($time = null)
259
    {
260 7
        if ($time === null) {
261 6
            $time = time();
262
        }
263
264 7
        return date('Y-m-d H:i:s', $time);
265
    }
266
267
    /**
268
     * Convert array of Entity items to a JSON array
269
     *
270
     * @todo Find a better way, as json_* functions are very heavy
271
     *
272
     * @param array|null $entities
273
     * @param mixed      $default
274
     *
275
     * @return mixed
276
     */
277 6
    public static function entitiesArrayToJson($entities, $default = null)
278
    {
279 6
        if (!is_array($entities)) {
280 6
            return $default;
281
        }
282
283
        //Convert each Entity item into an object based on its JSON reflection
284
        $json_entities = array_map(function ($entity) {
285
            return json_decode($entity, true);
286
        }, $entities);
287
288
        return json_encode($json_entities);
289
    }
290
291
    /**
292
     * Insert entry to telegram_update table
293
     *
294
     * @param int $id
295
     * @param int $chat_id
296
     * @param int $message_id
297
     * @param int $inline_query_id
298
     * @param int $chosen_inline_result_id
299
     * @param int $callback_query_id
300
     * @param int $edited_message_id
301
     *
302
     * @return bool If the insert was successful
303
     * @throws \Longman\TelegramBot\Exception\TelegramException
304
     */
305
    public static function insertTelegramUpdate(
306
        $id,
307
        $chat_id,
308
        $message_id,
309
        $inline_query_id,
310
        $chosen_inline_result_id,
311
        $callback_query_id,
312
        $edited_message_id
313
    ) {
314
        if ($message_id === null && $inline_query_id === null && $chosen_inline_result_id === null && $callback_query_id === null && $edited_message_id === null) {
315
            throw new TelegramException('message_id, inline_query_id, chosen_inline_result_id, callback_query_id, edited_message_id are all null');
316
        }
317
318
        if (!self::isDbConnected()) {
319
            return false;
320
        }
321
322
        try {
323
            $sth = self::$pdo->prepare('
324
                INSERT IGNORE INTO `' . TB_TELEGRAM_UPDATE . '`
325
                (`id`, `chat_id`, `message_id`, `inline_query_id`, `chosen_inline_result_id`, `callback_query_id`, `edited_message_id`)
326
                VALUES
327
                (:id, :chat_id, :message_id, :inline_query_id, :chosen_inline_result_id, :callback_query_id, :edited_message_id)
328
            ');
329
330
            $sth->bindParam(':id', $id, PDO::PARAM_INT);
331
            $sth->bindParam(':chat_id', $chat_id, PDO::PARAM_INT);
332
            $sth->bindParam(':message_id', $message_id, PDO::PARAM_INT);
333
            $sth->bindParam(':inline_query_id', $inline_query_id, PDO::PARAM_INT);
334
            $sth->bindParam(':chosen_inline_result_id', $chosen_inline_result_id, PDO::PARAM_INT);
335
            $sth->bindParam(':callback_query_id', $callback_query_id, PDO::PARAM_INT);
336
            $sth->bindParam(':edited_message_id', $edited_message_id, PDO::PARAM_INT);
337
338
            return $sth->execute();
339
        } catch (PDOException $e) {
340
            throw new TelegramException($e->getMessage());
341
        }
342
    }
343
344
    /**
345
     * Insert users and save their connection to chats
346
     *
347
     * @param  \Longman\TelegramBot\Entities\User $user
348
     * @param  string                             $date
349
     * @param  \Longman\TelegramBot\Entities\Chat $chat
350
     *
351
     * @return bool If the insert was successful
352
     * @throws \Longman\TelegramBot\Exception\TelegramException
353
     */
354 6
    public static function insertUser(User $user, $date, Chat $chat = null)
355
    {
356 6
        if (!self::isDbConnected()) {
357
            return false;
358
        }
359
360 6
        $user_id    = $user->getId();
361 6
        $username   = $user->getUsername();
362 6
        $first_name = $user->getFirstName();
363 6
        $last_name  = $user->getLastName();
364
365
        try {
366 6
            $sth = self::$pdo->prepare('
367 6
                INSERT INTO `' . TB_USER . '`
368
                (`id`, `username`, `first_name`, `last_name`, `created_at`, `updated_at`)
369
                VALUES
370
                (:id, :username, :first_name, :last_name, :created_at, :updated_at)
371
                ON DUPLICATE KEY UPDATE
372
                    `username`   = VALUES(`username`),
373
                    `first_name` = VALUES(`first_name`),
374
                    `last_name`  = VALUES(`last_name`),
375
                    `updated_at` = VALUES(`updated_at`)
376
            ');
377
378 6
            $sth->bindParam(':id', $user_id, PDO::PARAM_INT);
379 6
            $sth->bindParam(':username', $username, PDO::PARAM_STR, 255);
380 6
            $sth->bindParam(':first_name', $first_name, PDO::PARAM_STR, 255);
381 6
            $sth->bindParam(':last_name', $last_name, PDO::PARAM_STR, 255);
382 6
            $sth->bindParam(':created_at', $date, PDO::PARAM_STR);
383 6
            $sth->bindParam(':updated_at', $date, PDO::PARAM_STR);
384
385 6
            $status = $sth->execute();
386
        } catch (PDOException $e) {
387
            throw new TelegramException($e->getMessage());
388
        }
389
390
        //insert also the relationship to the chat into user_chat table
391 6
        if ($chat instanceof Chat) {
392 6
            $chat_id = $chat->getId();
393
            try {
394 6
                $sth = self::$pdo->prepare('
395 6
                    INSERT IGNORE INTO `' . TB_USER_CHAT . '`
396
                    (`user_id`, `chat_id`)
397
                    VALUES
398
                    (:user_id, :chat_id)
399
                ');
400
401 6
                $sth->bindParam(':user_id', $user_id, PDO::PARAM_INT);
402 6
                $sth->bindParam(':chat_id', $chat_id, PDO::PARAM_INT);
403
404 6
                $status = $sth->execute();
405
            } catch (PDOException $e) {
406
                throw new TelegramException($e->getMessage());
407
            }
408
        }
409
410 6
        return $status;
411
    }
412
413
    /**
414
     * Insert chat
415
     *
416
     * @param  \Longman\TelegramBot\Entities\Chat $chat
417
     * @param  string                             $date
418
     * @param  int                                $migrate_to_chat_id
419
     *
420
     * @return bool If the insert was successful
421
     * @throws \Longman\TelegramBot\Exception\TelegramException
422
     */
423 6
    public static function insertChat(Chat $chat, $date, $migrate_to_chat_id = null)
424
    {
425 6
        if (!self::isDbConnected()) {
426
            return false;
427
        }
428
429 6
        $chat_id                             = $chat->getId();
430 6
        $chat_title                          = $chat->getTitle();
431 6
        $chat_username                       = $chat->getUsername();
432 6
        $chat_type                           = $chat->getType();
433 6
        $chat_all_members_are_administrators = $chat->getAllMembersAreAdministrators();
434
435
        try {
436 6
            $sth = self::$pdo->prepare('
437 6
                INSERT IGNORE INTO `' . TB_CHAT . '`
438
                (`id`, `type`, `title`, `username`, `all_members_are_administrators`, `created_at` ,`updated_at`, `old_id`)
439
                VALUES
440
                (:id, :type, :title, :username, :all_members_are_administrators, :created_at, :updated_at, :oldid)
441
                ON DUPLICATE KEY UPDATE
442
                    `type`                           = VALUES(`type`),
443
                    `title`                          = VALUES(`title`),
444
                    `username`                       = VALUES(`username`),
445
                    `all_members_are_administrators` = VALUES(`all_members_are_administrators`),
446
                    `updated_at`                     = VALUES(`updated_at`)
447
            ');
448
449 6
            if ($migrate_to_chat_id) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $migrate_to_chat_id of type integer|null is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
450
                $chat_type = 'supergroup';
451
452
                $sth->bindParam(':id', $migrate_to_chat_id, PDO::PARAM_INT);
453
                $sth->bindParam(':oldid', $chat_id, PDO::PARAM_INT);
454
            } else {
455 6
                $sth->bindParam(':id', $chat_id, PDO::PARAM_INT);
456 6
                $sth->bindParam(':oldid', $migrate_to_chat_id, PDO::PARAM_INT);
457
            }
458
459 6
            $sth->bindParam(':type', $chat_type, PDO::PARAM_INT);
460 6
            $sth->bindParam(':title', $chat_title, PDO::PARAM_STR, 255);
461 6
            $sth->bindParam(':username', $chat_username, PDO::PARAM_STR, 255);
462 6
            $sth->bindParam(':all_members_are_administrators', $chat_all_members_are_administrators, PDO::PARAM_INT);
463 6
            $sth->bindParam(':created_at', $date, PDO::PARAM_STR);
464 6
            $sth->bindParam(':updated_at', $date, PDO::PARAM_STR);
465
466 6
            return $sth->execute();
467
        } catch (PDOException $e) {
468
            throw new TelegramException($e->getMessage());
469
        }
470
    }
471
472
    /**
473
     * Insert request into database
474
     *
475
     * @todo self::$pdo->lastInsertId() - unsafe usage if expected previous insert fails?
476
     *
477
     * @param \Longman\TelegramBot\Entities\Update $update
478
     *
479
     * @return bool
480
     * @throws \Longman\TelegramBot\Exception\TelegramException
481
     */
482
    public static function insertRequest(Update $update)
483
    {
484
        if (!self::isDbConnected()) {
485
            return false;
486
        }
487
488
        $update_id   = $update->getUpdateId();
489
        $update_type = $update->getUpdateType();
490
491
        if (count(self::selectTelegramUpdate(1, $update_id)) === 1) {
492
            throw new TelegramException('Duplicate update received!');
493
        }
494
495
        if ($update_type === 'message') {
496
            $message = $update->getMessage();
497
498 View Code Duplication
            if (self::insertMessageRequest($message)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
499
                $message_id = $message->getMessageId();
500
                $chat_id    = $message->getChat()->getId();
501
502
                return self::insertTelegramUpdate($update_id, $chat_id, $message_id, null, null, null, null);
503
            }
504 View Code Duplication
        } elseif ($update_type === 'edited_message') {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
505
            $edited_message = $update->getEditedMessage();
506
507
            if (self::insertEditedMessageRequest($edited_message)) {
508
                $chat_id                 = $edited_message->getChat()->getId();
509
                $edited_message_local_id = self::$pdo->lastInsertId();
510
511
                return self::insertTelegramUpdate(
512
                    $update_id,
513
                    $chat_id,
514
                    null,
515
                    null,
516
                    null,
517
                    null,
518
                    $edited_message_local_id
519
                );
520
            }
521
        } elseif ($update_type === 'channel_post') {
522
            $channel_post = $update->getChannelPost();
523
524 View Code Duplication
            if (self::insertMessageRequest($channel_post)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
525
                $message_id = $channel_post->getMessageId();
526
                $chat_id    = $channel_post->getChat()->getId();
527
528
                return self::insertTelegramUpdate($update_id, $chat_id, $message_id, null, null, null, null);
529
            }
530 View Code Duplication
        } elseif ($update_type === 'edited_channel_post') {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
531
            $edited_channel_post = $update->getEditedChannelPost();
532
533
            if (self::insertEditedMessageRequest($edited_channel_post)) {
534
                $chat_id                      = $edited_channel_post->getChat()->getId();
535
                $edited_channel_post_local_id = self::$pdo->lastInsertId();
536
537
                return self::insertTelegramUpdate(
538
                    $update_id,
539
                    $chat_id,
540
                    null,
541
                    null,
542
                    null,
543
                    null,
544
                    $edited_channel_post_local_id
545
                );
546
            }
547
        } elseif ($update_type === 'inline_query') {
548
            $inline_query = $update->getInlineQuery();
549
550
            if (self::insertInlineQueryRequest($inline_query)) {
551
                $inline_query_id = $inline_query->getId();
552
553
                return self::insertTelegramUpdate($update_id, null, null, $inline_query_id, null, null, null);
554
            }
555
        } elseif ($update_type === 'chosen_inline_result') {
556
            $chosen_inline_result = $update->getChosenInlineResult();
557
558
            if (self::insertChosenInlineResultRequest($chosen_inline_result)) {
559
                $chosen_inline_result_local_id = self::$pdo->lastInsertId();
560
561
                return self::insertTelegramUpdate(
562
                    $update_id,
563
                    null,
564
                    null,
565
                    null,
566
                    $chosen_inline_result_local_id,
567
                    null,
568
                    null
569
                );
570
            }
571
        } elseif ($update_type === 'callback_query') {
572
            $callback_query = $update->getCallbackQuery();
573
574
            if (self::insertCallbackQueryRequest($callback_query)) {
575
                $callback_query_id = $callback_query->getId();
576
577
                return self::insertTelegramUpdate($update_id, null, null, null, null, $callback_query_id, null);
578
            }
579
        }
580
581
        return false;
582
    }
583
584
    /**
585
     * Insert inline query request into database
586
     *
587
     * @param \Longman\TelegramBot\Entities\InlineQuery $inline_query
588
     *
589
     * @return bool If the insert was successful
590
     * @throws \Longman\TelegramBot\Exception\TelegramException
591
     */
592 View Code Duplication
    public static function insertInlineQueryRequest(InlineQuery $inline_query)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
593
    {
594
        if (!self::isDbConnected()) {
595
            return false;
596
        }
597
598
        try {
599
            $sth = self::$pdo->prepare('
600
                INSERT IGNORE INTO `' . TB_INLINE_QUERY . '`
601
                (`id`, `user_id`, `location`, `query`, `offset`, `created_at`)
602
                VALUES
603
                (:inline_query_id, :user_id, :location, :query, :param_offset, :created_at)
604
            ');
605
606
            $date            = self::getTimestamp();
607
            $inline_query_id = $inline_query->getId();
608
            $from            = $inline_query->getFrom();
609
            $user_id         = null;
610
            if ($from instanceof User) {
611
                $user_id = $from->getId();
612
                self::insertUser($from, $date);
613
            }
614
615
            $location = $inline_query->getLocation();
616
            $query    = $inline_query->getQuery();
617
            $offset   = $inline_query->getOffset();
618
619
            $sth->bindParam(':inline_query_id', $inline_query_id, PDO::PARAM_INT);
620
            $sth->bindParam(':user_id', $user_id, PDO::PARAM_INT);
621
            $sth->bindParam(':location', $location, PDO::PARAM_STR);
622
            $sth->bindParam(':query', $query, PDO::PARAM_STR);
623
            $sth->bindParam(':param_offset', $offset, PDO::PARAM_STR);
624
            $sth->bindParam(':created_at', $date, PDO::PARAM_STR);
625
626
            return $sth->execute();
627
        } catch (PDOException $e) {
628
            throw new TelegramException($e->getMessage());
629
        }
630
    }
631
632
    /**
633
     * Insert chosen inline result request into database
634
     *
635
     * @param \Longman\TelegramBot\Entities\ChosenInlineResult $chosen_inline_result
636
     *
637
     * @return bool If the insert was successful
638
     * @throws \Longman\TelegramBot\Exception\TelegramException
639
     */
640 View Code Duplication
    public static function insertChosenInlineResultRequest(ChosenInlineResult $chosen_inline_result)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
641
    {
642
        if (!self::isDbConnected()) {
643
            return false;
644
        }
645
646
        try {
647
            $sth = self::$pdo->prepare('
648
                INSERT INTO `' . TB_CHOSEN_INLINE_RESULT . '`
649
                (`result_id`, `user_id`, `location`, `inline_message_id`, `query`, `created_at`)
650
                VALUES
651
                (:result_id, :user_id, :location, :inline_message_id, :query, :created_at)
652
            ');
653
654
            $date      = self::getTimestamp();
655
            $result_id = $chosen_inline_result->getResultId();
656
            $from      = $chosen_inline_result->getFrom();
657
            $user_id   = null;
658
            if ($from instanceof User) {
659
                $user_id = $from->getId();
660
                self::insertUser($from, $date);
661
            }
662
663
            $location          = $chosen_inline_result->getLocation();
664
            $inline_message_id = $chosen_inline_result->getInlineMessageId();
665
            $query             = $chosen_inline_result->getQuery();
666
667
            $sth->bindParam(':result_id', $result_id, PDO::PARAM_STR);
668
            $sth->bindParam(':user_id', $user_id, PDO::PARAM_INT);
669
            $sth->bindParam(':location', $location, PDO::PARAM_STR);
670
            $sth->bindParam(':inline_message_id', $inline_message_id, PDO::PARAM_STR);
671
            $sth->bindParam(':query', $query, PDO::PARAM_STR);
672
            $sth->bindParam(':created_at', $date, PDO::PARAM_STR);
673
674
            return $sth->execute();
675
        } catch (PDOException $e) {
676
            throw new TelegramException($e->getMessage());
677
        }
678
    }
679
680
    /**
681
     * Insert callback query request into database
682
     *
683
     * @param \Longman\TelegramBot\Entities\CallbackQuery $callback_query
684
     *
685
     * @return bool If the insert was successful
686
     * @throws \Longman\TelegramBot\Exception\TelegramException
687
     */
688
    public static function insertCallbackQueryRequest(CallbackQuery $callback_query)
689
    {
690
        if (!self::isDbConnected()) {
691
            return false;
692
        }
693
694
        try {
695
            $sth = self::$pdo->prepare('
696
                INSERT IGNORE INTO `' . TB_CALLBACK_QUERY . '`
697
                (`id`, `user_id`, `chat_id`, `message_id`, `inline_message_id`, `data`, `created_at`)
698
                VALUES
699
                (:callback_query_id, :user_id, :chat_id, :message_id, :inline_message_id, :data, :created_at)
700
            ');
701
702
            $date              = self::getTimestamp();
703
            $callback_query_id = $callback_query->getId();
704
            $from              = $callback_query->getFrom();
705
            $user_id           = null;
706
            if ($from instanceof User) {
707
                $user_id = $from->getId();
708
                self::insertUser($from, $date);
709
            }
710
711
            $message    = $callback_query->getMessage();
712
            $chat_id    = null;
713
            $message_id = null;
714
            if ($message instanceof Message) {
715
                $chat_id    = $message->getChat()->getId();
716
                $message_id = $message->getMessageId();
717
718
                $is_message = self::$pdo->query('
719
                    SELECT *
720
                    FROM `' . TB_MESSAGE . '`
721
                    WHERE `id` = ' . $message_id . '
722
                      AND `chat_id` = ' . $chat_id . '
723
                    LIMIT 1
724
                ')->rowCount();
725
726
                if ($is_message) {
727
                    self::insertEditedMessageRequest($message);
728
                } else {
729
                    self::insertMessageRequest($message);
730
                }
731
            }
732
733
            $inline_message_id = $callback_query->getInlineMessageId();
734
            $data              = $callback_query->getData();
735
736
            $sth->bindParam(':callback_query_id', $callback_query_id, PDO::PARAM_INT);
737
            $sth->bindParam(':user_id', $user_id, PDO::PARAM_INT);
738
            $sth->bindParam(':chat_id', $chat_id, PDO::PARAM_INT);
739
            $sth->bindParam(':message_id', $message_id, PDO::PARAM_INT);
740
            $sth->bindParam(':inline_message_id', $inline_message_id, PDO::PARAM_STR);
741
            $sth->bindParam(':data', $data, PDO::PARAM_STR);
742
            $sth->bindParam(':created_at', $date, PDO::PARAM_STR);
743
744
            return $sth->execute();
745
        } catch (PDOException $e) {
746
            throw new TelegramException($e->getMessage());
747
        }
748
    }
749
750
    /**
751
     * Insert Message request in db
752
     *
753
     * @param \Longman\TelegramBot\Entities\Message $message
754
     *
755
     * @return bool If the insert was successful
756
     * @throws \Longman\TelegramBot\Exception\TelegramException
757
     */
758 6
    public static function insertMessageRequest(Message $message)
759
    {
760 6
        if (!self::isDbConnected()) {
761
            return false;
762
        }
763
764 6
        $from = $message->getFrom();
765 6
        $chat = $message->getChat();
766
767 6
        $chat_id = $chat->getId();
768
769 6
        $date = self::getTimestamp($message->getDate());
770
771 6
        $forward_from            = $message->getForwardFrom();
772 6
        $forward_from_chat       = $message->getForwardFromChat();
773 6
        $forward_from_message_id = $message->getForwardFromMessageId();
774 6
        $photo                   = self::entitiesArrayToJson($message->getPhoto(), '');
775 6
        $entities                = self::entitiesArrayToJson($message->getEntities(), null);
776 6
        $new_chat_member         = $message->getNewChatMember();
777 6
        $new_chat_photo          = self::entitiesArrayToJson($message->getNewChatPhoto(), '');
778 6
        $left_chat_member        = $message->getLeftChatMember();
779 6
        $migrate_to_chat_id      = $message->getMigrateToChatId();
780
781
        //Insert chat, update chat id in case it migrated
782 6
        self::insertChat($chat, $date, $migrate_to_chat_id);
783
784
        //Insert user and the relation with the chat
785 6
        if (is_object($from)) {
786 6
            self::insertUser($from, $date, $chat);
787
        }
788
789
        //Insert the forwarded message user in users table
790 6
        if ($forward_from instanceof User) {
791
            $forward_date = self::getTimestamp($message->getForwardDate());
792
            self::insertUser($forward_from, $forward_date);
793
            $forward_from = $forward_from->getId();
794
        }
795
796 6
        if ($forward_from_chat instanceof Chat) {
797
            $forward_date = self::getTimestamp($message->getForwardDate());
798
            self::insertChat($forward_from_chat, $forward_date);
799
            $forward_from_chat = $forward_from_chat->getId();
800
        }
801
802
        //New and left chat member
803 6
        if ($new_chat_member instanceof User) {
804
            //Insert the new chat user
805
            self::insertUser($new_chat_member, $date, $chat);
806
            $new_chat_member = $new_chat_member->getId();
807 6
        } elseif ($left_chat_member instanceof User) {
808
            //Insert the left chat user
809
            self::insertUser($left_chat_member, $date, $chat);
810
            $left_chat_member = $left_chat_member->getId();
811
        }
812
813
        try {
814 6
            $sth = self::$pdo->prepare('
815 6
                INSERT IGNORE INTO `' . TB_MESSAGE . '`
816
                (
817
                    `id`, `user_id`, `chat_id`, `date`, `forward_from`, `forward_from_chat`, `forward_from_message_id`,
818
                    `forward_date`, `reply_to_chat`, `reply_to_message`, `text`, `entities`, `audio`, `document`,
819
                    `photo`, `sticker`, `video`, `voice`, `caption`, `contact`,
820
                    `location`, `venue`, `new_chat_member`, `left_chat_member`,
821
                    `new_chat_title`,`new_chat_photo`, `delete_chat_photo`, `group_chat_created`,
822
                    `supergroup_chat_created`, `channel_chat_created`,
823
                    `migrate_from_chat_id`, `migrate_to_chat_id`, `pinned_message`
824
                ) VALUES (
825
                    :message_id, :user_id, :chat_id, :date, :forward_from, :forward_from_chat, :forward_from_message_id,
826
                    :forward_date, :reply_to_chat, :reply_to_message, :text, :entities, :audio, :document,
827
                    :photo, :sticker, :video, :voice, :caption, :contact,
828
                    :location, :venue, :new_chat_member, :left_chat_member,
829
                    :new_chat_title, :new_chat_photo, :delete_chat_photo, :group_chat_created,
830
                    :supergroup_chat_created, :channel_chat_created,
831
                    :migrate_from_chat_id, :migrate_to_chat_id, :pinned_message
832
                )
833
            ');
834
835 6
            $message_id = $message->getMessageId();
836
837 6
            if (is_object($from)) {
838 6
                $from_id = $from->getId();
839
            } else {
840
                $from_id = null;
841
            }
842
843 6
            $reply_to_message    = $message->getReplyToMessage();
844 6
            $reply_to_message_id = null;
845 6
            if ($reply_to_message instanceof ReplyToMessage) {
846
                $reply_to_message_id = $reply_to_message->getMessageId();
847
                // please notice that, as explained in the documentation, reply_to_message don't contain other
848
                // reply_to_message field so recursion deep is 1
849
                self::insertMessageRequest($reply_to_message);
850
            }
851
852 6
            $text                    = $message->getText();
853 6
            $audio                   = $message->getAudio();
854 6
            $document                = $message->getDocument();
855 6
            $sticker                 = $message->getSticker();
856 6
            $video                   = $message->getVideo();
857 6
            $voice                   = $message->getVoice();
858 6
            $caption                 = $message->getCaption();
859 6
            $contact                 = $message->getContact();
860 6
            $location                = $message->getLocation();
861 6
            $venue                   = $message->getVenue();
862 6
            $new_chat_title          = $message->getNewChatTitle();
863 6
            $delete_chat_photo       = $message->getDeleteChatPhoto();
864 6
            $group_chat_created      = $message->getGroupChatCreated();
865 6
            $supergroup_chat_created = $message->getSupergroupChatCreated();
866 6
            $channel_chat_created    = $message->getChannelChatCreated();
867 6
            $migrate_from_chat_id    = $message->getMigrateFromChatId();
868 6
            $migrate_to_chat_id      = $message->getMigrateToChatId();
869 6
            $pinned_message          = $message->getPinnedMessage();
870
871 6
            $sth->bindParam(':chat_id', $chat_id, PDO::PARAM_INT);
872 6
            $sth->bindParam(':message_id', $message_id, PDO::PARAM_INT);
873 6
            $sth->bindParam(':user_id', $from_id, PDO::PARAM_INT);
874 6
            $sth->bindParam(':date', $date, PDO::PARAM_STR);
875 6
            $sth->bindParam(':forward_from', $forward_from, PDO::PARAM_INT);
876 6
            $sth->bindParam(':forward_from_chat', $forward_from_chat, PDO::PARAM_INT);
877 6
            $sth->bindParam(':forward_from_message_id', $forward_from_message_id, PDO::PARAM_INT);
878 6
            $sth->bindParam(':forward_date', $forward_date, PDO::PARAM_STR);
879
880 6
            $reply_to_chat_id = null;
881 6
            if ($reply_to_message_id) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $reply_to_message_id of type integer|null is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
882
                $reply_to_chat_id = $chat_id;
883
            }
884
885 6
            $sth->bindParam(':reply_to_chat', $reply_to_chat_id, PDO::PARAM_INT);
886 6
            $sth->bindParam(':reply_to_message', $reply_to_message_id, PDO::PARAM_INT);
887 6
            $sth->bindParam(':text', $text, PDO::PARAM_STR);
888 6
            $sth->bindParam(':entities', $entities, PDO::PARAM_STR);
889 6
            $sth->bindParam(':audio', $audio, PDO::PARAM_STR);
890 6
            $sth->bindParam(':document', $document, PDO::PARAM_STR);
891 6
            $sth->bindParam(':photo', $photo, PDO::PARAM_STR);
892 6
            $sth->bindParam(':sticker', $sticker, PDO::PARAM_STR);
893 6
            $sth->bindParam(':video', $video, PDO::PARAM_STR);
894 6
            $sth->bindParam(':voice', $voice, PDO::PARAM_STR);
895 6
            $sth->bindParam(':caption', $caption, PDO::PARAM_STR);
896 6
            $sth->bindParam(':contact', $contact, PDO::PARAM_STR);
897 6
            $sth->bindParam(':location', $location, PDO::PARAM_STR);
898 6
            $sth->bindParam(':venue', $venue, PDO::PARAM_STR);
899 6
            $sth->bindParam(':new_chat_member', $new_chat_member, PDO::PARAM_INT);
900 6
            $sth->bindParam(':left_chat_member', $left_chat_member, PDO::PARAM_INT);
901 6
            $sth->bindParam(':new_chat_title', $new_chat_title, PDO::PARAM_STR);
902 6
            $sth->bindParam(':new_chat_photo', $new_chat_photo, PDO::PARAM_STR);
903 6
            $sth->bindParam(':delete_chat_photo', $delete_chat_photo, PDO::PARAM_INT);
904 6
            $sth->bindParam(':group_chat_created', $group_chat_created, PDO::PARAM_INT);
905 6
            $sth->bindParam(':supergroup_chat_created', $supergroup_chat_created, PDO::PARAM_INT);
906 6
            $sth->bindParam(':channel_chat_created', $channel_chat_created, PDO::PARAM_INT);
907 6
            $sth->bindParam(':migrate_from_chat_id', $migrate_from_chat_id, PDO::PARAM_INT);
908 6
            $sth->bindParam(':migrate_to_chat_id', $migrate_to_chat_id, PDO::PARAM_INT);
909 6
            $sth->bindParam(':pinned_message', $pinned_message, PDO::PARAM_STR);
910
911 6
            return $sth->execute();
912
        } catch (PDOException $e) {
913
            throw new TelegramException($e->getMessage());
914
        }
915
    }
916
917
    /**
918
     * Insert Edited Message request in db
919
     *
920
     * @param \Longman\TelegramBot\Entities\Message $edited_message
921
     *
922
     * @return bool If the insert was successful
923
     * @throws \Longman\TelegramBot\Exception\TelegramException
924
     */
925
    public static function insertEditedMessageRequest(Message $edited_message)
926
    {
927
        if (!self::isDbConnected()) {
928
            return false;
929
        }
930
931
        $from = $edited_message->getFrom();
932
        $chat = $edited_message->getChat();
933
934
        $chat_id = $chat->getId();
935
936
        $edit_date = self::getTimestamp($edited_message->getEditDate());
937
938
        $entities = self::entitiesArrayToJson($edited_message->getEntities(), null);
939
940
        //Insert chat
941
        self::insertChat($chat, $edit_date);
942
943
        //Insert user and the relation with the chat
944
        if (is_object($from)) {
945
            self::insertUser($from, $edit_date, $chat);
946
        }
947
948
        try {
949
            $sth = self::$pdo->prepare('
950
                INSERT IGNORE INTO `' . TB_EDITED_MESSAGE . '`
951
                (`chat_id`, `message_id`, `user_id`, `edit_date`, `text`, `entities`, `caption`)
952
                VALUES
953
                (:chat_id, :message_id, :user_id, :edit_date, :text, :entities, :caption)
954
            ');
955
956
            $message_id = $edited_message->getMessageId();
957
958
            if (is_object($from)) {
959
                $from_id = $from->getId();
960
            } else {
961
                $from_id = null;
962
            }
963
964
            $text    = $edited_message->getText();
965
            $caption = $edited_message->getCaption();
966
967
            $sth->bindParam(':chat_id', $chat_id, PDO::PARAM_INT);
968
            $sth->bindParam(':message_id', $message_id, PDO::PARAM_INT);
969
            $sth->bindParam(':user_id', $from_id, PDO::PARAM_INT);
970
            $sth->bindParam(':edit_date', $edit_date, PDO::PARAM_STR);
971
            $sth->bindParam(':text', $text, PDO::PARAM_STR);
972
            $sth->bindParam(':entities', $entities, PDO::PARAM_STR);
973
            $sth->bindParam(':caption', $caption, PDO::PARAM_STR);
974
975
            return $sth->execute();
976
        } catch (PDOException $e) {
977
            throw new TelegramException($e->getMessage());
978
        }
979
    }
980
981
    /**
982
     * Select Group and/or single Chats
983
     *
984
     * @param bool   $select_groups
985
     * @param bool   $select_super_groups
986
     * @param bool   $select_users
987
     * @param string $date_from
988
     * @param string $date_to
989
     * @param int    $chat_id
990
     * @param string $text
991
     *
992
     * @return array|bool (Selected chats or false if invalid arguments)
993
     * @throws \Longman\TelegramBot\Exception\TelegramException
994
     */
995
    public static function selectChats(
996
        $select_groups = true,
997
        $select_super_groups = true,
998
        $select_users = true,
999
        $date_from = null,
1000
        $date_to = null,
1001
        $chat_id = null,
1002
        $text = null
1003
    ) {
1004
        if (!self::isDbConnected()) {
1005
            return false;
1006
        }
1007
1008
        if (!$select_groups && !$select_users && !$select_super_groups) {
1009
            return false;
1010
        }
1011
1012
        try {
1013
            $query = '
1014
                SELECT * ,
1015
                ' . TB_CHAT . '.`id` AS `chat_id`,
1016
                ' . TB_CHAT . '.`created_at` AS `chat_created_at`,
1017
                ' . TB_CHAT . '.`updated_at` AS `chat_updated_at`
1018
            ';
1019
            if ($select_users) {
1020
                $query .= '
1021
                    , ' . TB_USER . '.`id` AS `user_id`
1022
                    FROM `' . TB_CHAT . '`
1023
                    LEFT JOIN `' . TB_USER . '`
1024
                    ON ' . TB_CHAT . '.`id`=' . TB_USER . '.`id`
1025
                ';
1026
            } else {
1027
                $query .= 'FROM `' . TB_CHAT . '`';
1028
            }
1029
1030
            //Building parts of query
1031
            $where  = [];
1032
            $tokens = [];
1033
1034
            if (!$select_groups || !$select_users || !$select_super_groups) {
1035
                $chat_or_user = [];
1036
1037
                $select_groups && $chat_or_user[] = TB_CHAT . '.`type` = "group"';
1038
                $select_super_groups && $chat_or_user[] = TB_CHAT . '.`type` = "supergroup"';
1039
                $select_users && $chat_or_user[] = TB_CHAT . '.`type` = "private"';
1040
1041
                $where[] = '(' . implode(' OR ', $chat_or_user) . ')';
1042
            }
1043
1044
            if (null !== $date_from) {
1045
                $where[]              = TB_CHAT . '.`updated_at` >= :date_from';
1046
                $tokens[':date_from'] = $date_from;
1047
            }
1048
1049
            if (null !== $date_to) {
1050
                $where[]            = TB_CHAT . '.`updated_at` <= :date_to';
1051
                $tokens[':date_to'] = $date_to;
1052
            }
1053
1054
            if (null !== $chat_id) {
1055
                $where[]            = TB_CHAT . '.`id` = :chat_id';
1056
                $tokens[':chat_id'] = $chat_id;
1057
            }
1058
1059
            if (null !== $text) {
1060
                if ($select_users) {
1061
                    $where[] = '(
1062
                        LOWER(' . TB_CHAT . '.`title`) LIKE :text
1063
                        OR LOWER(' . TB_USER . '.`first_name`) LIKE :text
1064
                        OR LOWER(' . TB_USER . '.`last_name`) LIKE :text
1065
                        OR LOWER(' . TB_USER . '.`username`) LIKE :text
1066
                    )';
1067
                } else {
1068
                    $where[] = 'LOWER(' . TB_CHAT . '.`title`) LIKE :text';
1069
                }
1070
                $tokens[':text'] = '%' . strtolower($text) . '%';
1071
            }
1072
1073
            if (!empty($where)) {
1074
                $query .= ' WHERE ' . implode(' AND ', $where);
1075
            }
1076
1077
            $query .= ' ORDER BY ' . TB_CHAT . '.`updated_at` ASC';
1078
1079
            $sth = self::$pdo->prepare($query);
1080
            $sth->execute($tokens);
1081
1082
            return $sth->fetchAll(PDO::FETCH_ASSOC);
1083
        } catch (PDOException $e) {
1084
            throw new TelegramException($e->getMessage());
1085
        }
1086
    }
1087
1088
    /**
1089
     * Get Telegram API request count for current chat / message
1090
     *
1091
     * @param integer $chat_id
1092
     * @param string  $inline_message_id
1093
     *
1094
     * @return array|bool (Array containing TOTAL and CURRENT fields or false on invalid arguments)
1095
     * @throws \Longman\TelegramBot\Exception\TelegramException
1096
     */
1097
    public static function getTelegramRequestCount($chat_id = null, $inline_message_id = null)
1098
    {
1099
        if (!self::isDbConnected()) {
1100
            return false;
1101
        }
1102
1103
        try {
1104
            $sth = self::$pdo->prepare('SELECT 
1105
                (SELECT COUNT(*) FROM `' . TB_REQUEST_LIMITER . '` WHERE `created_at` >= :created_at_1) as LIMIT_PER_SEC_ALL,
1106
                (SELECT COUNT(*) FROM `' . TB_REQUEST_LIMITER . '` WHERE `created_at` >= :created_at_2 AND ((`chat_id` = :chat_id_1 AND `inline_message_id` IS NULL) OR (`inline_message_id` = :inline_message_id AND `chat_id` IS NULL))) as LIMIT_PER_SEC,
1107
                (SELECT COUNT(*) FROM `' . TB_REQUEST_LIMITER . '` WHERE `created_at` >= :created_at_minute AND `chat_id` = :chat_id_2) as LIMIT_PER_MINUTE
1108
            ');
1109
1110
            $date = self::getTimestamp();
1111
            $date_minute = self::getTimestamp(strtotime('-1 minute'));
1112
1113
            $sth->bindParam(':chat_id_1', $chat_id, \PDO::PARAM_STR);
1114
            $sth->bindParam(':chat_id_2', $chat_id, \PDO::PARAM_STR);
1115
            $sth->bindParam(':inline_message_id', $inline_message_id, \PDO::PARAM_STR);
1116
            $sth->bindParam(':created_at_1', $date, \PDO::PARAM_STR);
1117
            $sth->bindParam(':created_at_2', $date, \PDO::PARAM_STR);
1118
            $sth->bindParam(':created_at_minute', $date_minute, \PDO::PARAM_STR);
1119
1120
            $sth->execute();
1121
1122
            return $sth->fetch();
1123
        } catch (\Exception $e) {
1124
            throw new TelegramException($e->getMessage());
1125
        }
1126
    }
1127
1128
    /**
1129
     * Insert Telegram API request in db
1130
     *
1131
     * @param string $method
1132
     * @param array  $data
1133
     *
1134
     * @return bool If the insert was successful
1135
     * @throws \Longman\TelegramBot\Exception\TelegramException
1136
     */
1137
    public static function insertTelegramRequest($method, $data)
1138
    {
1139
        if (!self::isDbConnected()) {
1140
            return false;
1141
        }
1142
1143
        $chat_id = ((isset($data['chat_id'])) ? $data['chat_id'] : null);
1144
        $inline_message_id = (isset($data['inline_message_id']) ? $data['inline_message_id'] : null);
1145
1146
        try {
1147
            $sth = self::$pdo->prepare('INSERT INTO `' . TB_REQUEST_LIMITER . '`
1148
                (
1149
                `method`, `chat_id`, `inline_message_id`, `created_at`
1150
                )
1151
                VALUES (
1152
                :method, :chat_id, :inline_message_id, :created_at
1153
                );
1154
            ');
1155
1156
            $created_at = self::getTimestamp();
1157
1158
            $sth->bindParam(':chat_id', $chat_id, \PDO::PARAM_STR);
1159
            $sth->bindParam(':inline_message_id', $inline_message_id, \PDO::PARAM_STR);
1160
            $sth->bindParam(':method', $method, \PDO::PARAM_STR);
1161
            $sth->bindParam(':created_at', $created_at, \PDO::PARAM_STR);
1162
1163
            return $sth->execute();
1164
        } catch (\Exception $e) {
1165
            throw new TelegramException($e->getMessage());
1166
        }
1167
    }
1168
}
1169