Completed
Push — master ( 466468...8588b9 )
by Armando
02:38 queued 36s
created

Command::getConfig()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 5
nc 3
nop 1
dl 0
loc 10
ccs 6
cts 6
cp 1
crap 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * This file is part of the TelegramBot package.
5
 *
6
 * (c) Avtandil Kikabidze aka LONGMAN <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Longman\TelegramBot\Commands;
13
14
use Longman\TelegramBot\DB;
15
use Longman\TelegramBot\Entities\CallbackQuery;
16
use Longman\TelegramBot\Entities\ChosenInlineResult;
17
use Longman\TelegramBot\Entities\InlineQuery;
18
use Longman\TelegramBot\Entities\Message;
19
use Longman\TelegramBot\Entities\Payments\PreCheckoutQuery;
20
use Longman\TelegramBot\Entities\Payments\ShippingQuery;
21
use Longman\TelegramBot\Entities\Poll;
22
use Longman\TelegramBot\Entities\ServerResponse;
23
use Longman\TelegramBot\Entities\Update;
24
use Longman\TelegramBot\Exception\TelegramException;
25
use Longman\TelegramBot\Request;
26
use Longman\TelegramBot\Telegram;
27
28
/**
29
 * Class Command
30
 *
31
 * Base class for commands. It includes some helper methods that can fetch data directly from the Update object.
32
 *
33
 * @method Message             getMessage()            Optional. New incoming message of any kind — text, photo, sticker, etc.
34
 * @method Message             getEditedMessage()      Optional. New version of a message that is known to the bot and was edited
35
 * @method Message             getChannelPost()        Optional. New post in the channel, can be any kind — text, photo, sticker, etc.
36
 * @method Message             getEditedChannelPost()  Optional. New version of a post in the channel that is known to the bot and was edited
37
 * @method InlineQuery         getInlineQuery()        Optional. New incoming inline query
38
 * @method ChosenInlineResult  getChosenInlineResult() Optional. The result of an inline query that was chosen by a user and sent to their chat partner.
39
 * @method CallbackQuery       getCallbackQuery()      Optional. New incoming callback query
40
 * @method ShippingQuery       getShippingQuery()      Optional. New incoming shipping query. Only for invoices with flexible price
41
 * @method PreCheckoutQuery    getPreCheckoutQuery()   Optional. New incoming pre-checkout query. Contains full information about checkout
42
 * @method Poll                getPoll()               Optional. New poll state. Bots receive only updates about polls, which are sent or stopped by the bot
43
 */
44
abstract class Command
45
{
46
    /**
47
     * Telegram object
48
     *
49
     * @var Telegram
50
     */
51
    protected $telegram;
52
53
    /**
54
     * Update object
55
     *
56
     * @var Update
57
     */
58
    protected $update;
59
60
    /**
61
     * Name
62
     *
63
     * @var string
64
     */
65
    protected $name = '';
66
67
    /**
68
     * Description
69
     *
70
     * @var string
71
     */
72
    protected $description = 'Command description';
73
74
    /**
75
     * Usage
76
     *
77
     * @var string
78
     */
79
    protected $usage = 'Command usage';
80
81
    /**
82
     * Show in Help
83
     *
84
     * @var bool
85
     */
86
    protected $show_in_help = true;
87
88
    /**
89
     * Version
90
     *
91
     * @var string
92
     */
93
    protected $version = '1.0.0';
94
95
    /**
96
     * If this command is enabled
97
     *
98
     * @var boolean
99
     */
100
    protected $enabled = true;
101
102
    /**
103
     * If this command needs mysql
104
     *
105
     * @var boolean
106
     */
107
    protected $need_mysql = false;
108
109
    /*
110
    * Make sure this command only executes on a private chat.
111
    *
112
    * @var bool
113
    */
114
    protected $private_only = false;
115
116
    /**
117
     * Command config
118
     *
119
     * @var array
120
     */
121
    protected $config = [];
122
123
    /**
124
     * Constructor
125
     *
126
     * @param Telegram $telegram
127
     * @param Update   $update
128
     */
129 14
    public function __construct(Telegram $telegram, Update $update = null)
130
    {
131 14
        $this->telegram = $telegram;
132 14
        $this->setUpdate($update);
133 14
        $this->config = $telegram->getCommandConfig($this->name);
134 14
    }
135
136
    /**
137
     * Set update object
138
     *
139
     * @param Update $update
140
     *
141
     * @return Command
142
     */
143 14
    public function setUpdate(Update $update = null)
144
    {
145 14
        if ($update !== null) {
146 1
            $this->update = $update;
147
        }
148
149 14
        return $this;
150
    }
151
152
    /**
153
     * Pre-execute command
154
     *
155
     * @return ServerResponse
156
     * @throws TelegramException
157
     */
158
    public function preExecute()
159
    {
160
        if ($this->need_mysql && !($this->telegram->isDbEnabled() && DB::isDbConnected())) {
161
            return $this->executeNoDb();
162
        }
163
164
        if ($this->isPrivateOnly() && $this->removeNonPrivateMessage()) {
165
            $message = $this->getMessage();
166
167
            if ($user = $message->getFrom()) {
168
                return Request::sendMessage([
169
                    'chat_id'    => $user->getId(),
170
                    'parse_mode' => 'Markdown',
171
                    'text'       => sprintf(
172
                        "/%s command is only available in a private chat.\n(`%s`)",
173
                        $this->getName(),
174
                        $message->getText()
175
                    ),
176
                ]);
177
            }
178
179
            return Request::emptyResponse();
180
        }
181
182
        return $this->execute();
183
    }
184
185
    /**
186
     * Execute command
187
     *
188
     * @return ServerResponse
189
     * @throws TelegramException
190
     */
191
    abstract public function execute();
192
193
    /**
194
     * Execution if MySQL is required but not available
195
     *
196
     * @return ServerResponse
197
     * @throws TelegramException
198
     */
199
    public function executeNoDb()
200
    {
201
        return $this->replyToChat('Sorry no database connection, unable to execute "' . $this->name . '" command.');
202
    }
203
204
    /**
205
     * Get update object
206
     *
207
     * @return Update
208
     */
209 2
    public function getUpdate()
210
    {
211 2
        return $this->update;
212
    }
213
214
    /**
215
     * Relay any non-existing function calls to Update object.
216
     *
217
     * This is purely a helper method to make requests from within execute() method easier.
218
     *
219
     * @param string $name
220
     * @param array  $arguments
221
     *
222
     * @return Command
223
     */
224 1
    public function __call($name, array $arguments)
225
    {
226 1
        if ($this->update === null) {
227 1
            return null;
228
        }
229 1
        return call_user_func_array([$this->update, $name], $arguments);
230
    }
231
232
    /**
233
     * Get command config
234
     *
235
     * Look for config $name if found return it, if not return null.
236
     * If $name is not set return all set config.
237
     *
238
     * @param string|null $name
239
     *
240
     * @return array|mixed|null
241
     */
242 3
    public function getConfig($name = null)
243
    {
244 3
        if ($name === null) {
245 3
            return $this->config;
246
        }
247 1
        if (isset($this->config[$name])) {
248 1
            return $this->config[$name];
249
        }
250
251 1
        return null;
252
    }
253
254
    /**
255
     * Get telegram object
256
     *
257
     * @return Telegram
258
     */
259 1
    public function getTelegram()
260
    {
261 1
        return $this->telegram;
262
    }
263
264
    /**
265
     * Get usage
266
     *
267
     * @return string
268
     */
269 1
    public function getUsage()
270
    {
271 1
        return $this->usage;
272
    }
273
274
    /**
275
     * Get version
276
     *
277
     * @return string
278
     */
279 1
    public function getVersion()
280
    {
281 1
        return $this->version;
282
    }
283
284
    /**
285
     * Get description
286
     *
287
     * @return string
288
     */
289 1
    public function getDescription()
290
    {
291 1
        return $this->description;
292
    }
293
294
    /**
295
     * Get name
296
     *
297
     * @return string
298
     */
299 1
    public function getName()
300
    {
301 1
        return $this->name;
302
    }
303
304
    /**
305
     * Get Show in Help
306
     *
307
     * @return bool
308
     */
309 1
    public function showInHelp()
310
    {
311 1
        return $this->show_in_help;
312
    }
313
314
    /**
315
     * Check if command is enabled
316
     *
317
     * @return bool
318
     */
319 1
    public function isEnabled()
320
    {
321 1
        return $this->enabled;
322
    }
323
324
    /**
325
     * If this command is intended for private chats only.
326
     *
327
     * @return bool
328
     */
329
    public function isPrivateOnly()
330
    {
331
        return $this->private_only;
332
    }
333
334
    /**
335
     * If this is a SystemCommand
336
     *
337
     * @return bool
338
     */
339
    public function isSystemCommand()
340
    {
341
        return ($this instanceof SystemCommand);
342
    }
343
344
    /**
345
     * If this is an AdminCommand
346
     *
347
     * @return bool
348
     */
349
    public function isAdminCommand()
350
    {
351
        return ($this instanceof AdminCommand);
352
    }
353
354
    /**
355
     * If this is a UserCommand
356
     *
357
     * @return bool
358
     */
359
    public function isUserCommand()
360
    {
361
        return ($this instanceof UserCommand);
362
    }
363
364
    /**
365
     * Delete the current message if it has been called in a non-private chat.
366
     *
367
     * @return bool
368
     */
369
    protected function removeNonPrivateMessage()
370
    {
371
        $message = $this->getMessage() ?: $this->getEditedMessage();
372
373
        if ($message) {
0 ignored issues
show
introduced by
$message is of type Longman\TelegramBot\Entities\Message, thus it always evaluated to true.
Loading history...
374
            $chat = $message->getChat();
375
376
            if (!$chat->isPrivateChat()) {
377
                // Delete the falsely called command message.
378
                Request::deleteMessage([
379
                    'chat_id'    => $chat->getId(),
380
                    'message_id' => $message->getMessageId(),
381
                ]);
382
383
                return true;
384
            }
385
        }
386
387
        return false;
388
    }
389
390
    /**
391
     * Helper to reply to a chat directly.
392
     *
393
     * @param string $text
394
     * @param array  $data
395
     *
396
     * @return ServerResponse
397
     * @throws TelegramException
398
     */
399
    public function replyToChat($text, array $data = [])
400
    {
401
        if ($message = $this->getMessage() ?: $this->getEditedMessage() ?: $this->getChannelPost() ?: $this->getEditedChannelPost()) {
402
            return Request::sendMessage(array_merge([
403
                'chat_id' => $message->getChat()->getId(),
404
                'text'    => $text,
405
            ], $data));
406
        }
407
408
        return Request::emptyResponse();
409
    }
410
411
    /**
412
     * Helper to reply to a user directly.
413
     *
414
     * @param string $text
415
     * @param array  $data
416
     *
417
     * @return ServerResponse
418
     * @throws TelegramException
419
     */
420
    public function replyToUser($text, array $data = [])
421
    {
422
        if ($message = $this->getMessage() ?: $this->getEditedMessage()) {
423
            return Request::sendMessage(array_merge([
424
                'chat_id' => $message->getFrom()->getId(),
425
                'text'    => $text,
426
            ], $data));
427
        }
428
429
        return Request::emptyResponse();
430
    }
431
}
432