GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Keyboard::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 0
dl 0
loc 7
ccs 4
cts 4
cp 1
crap 1
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
 * Written by Marco Boretto <[email protected]>
12
 */
13
14
namespace Longman\TelegramBot\Entities;
15
16
use Longman\TelegramBot\Exception\TelegramException;
17
18
/**
19
 * Class Keyboard
20
 *
21
 * @link https://core.telegram.org/bots/api#replykeyboardmarkup
22
 *
23
 * @method bool   getResizeKeyboard()        Optional. Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). Defaults to false, in which case the custom keyboard is always of the same height as the app's standard keyboard.
24
 * @method bool   getOneTimeKeyboard()       Optional. Requests clients to remove the keyboard as soon as it's been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat – the user can press a special button in the input field to see the custom keyboard again. Defaults to false.
25
 * @method string getInputFieldPlaceholder() Optional. The placeholder to be shown in the input field when the keyboard is active; 1-64 characters
26
 * @method bool   getSelective()             Optional. Use this parameter if you want to show the keyboard to specific users only. Targets: 1) users that are @mentioned in the text of the Message object; 2) if the bot's message is a reply (has reply_to_message_id), sender of the original message.
27
 *
28
 * @method $this setResizeKeyboard(bool $resize_keyboard)                  Optional. Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). Defaults to false, in which case the custom keyboard is always of the same height as the app's standard keyboard.
29
 * @method $this setOneTimeKeyboard(bool $one_time_keyboard)               Optional. Requests clients to remove the keyboard as soon as it's been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat – the user can press a special button in the input field to see the custom keyboard again. Defaults to false.
30
 * @method $this setInputFieldPlaceholder(string $input_field_placeholder) Optional. The placeholder to be shown in the input field when the keyboard is active; 1-64 characters
31
 * @method $this setSelective(bool $selective)                             Optional. Use this parameter if you want to show the keyboard to specific users only. Targets: 1) users that are @mentioned in the text of the Message object; 2) if the bot's message is a reply (has reply_to_message_id), sender of the original message.
32
 */
33
class Keyboard extends Entity
34
{
35 18
    public function __construct()
36
    {
37 18
        $data = $this->createFromParams(...func_get_args());
38 18
        parent::__construct($data);
39
40
        // Remove any empty buttons.
41 14
        $this->{$this->getKeyboardType()} = array_filter($this->{$this->getKeyboardType()});
42 14
    }
43
44
    /**
45
     * If this keyboard is an inline keyboard.
46
     *
47
     * @return bool
48
     */
49 18
    public function isInlineKeyboard(): bool
50
    {
51 18
        return $this instanceof InlineKeyboard;
52
    }
53
54
    /**
55
     * Get the proper keyboard button class for this keyboard.
56
     *
57
     * @return string
58
     */
59 12
    public function getKeyboardButtonClass(): string
60
    {
61 12
        return $this->isInlineKeyboard() ? InlineKeyboardButton::class : KeyboardButton::class;
62
    }
63
64
    /**
65
     * Get the type of keyboard, either "inline_keyboard" or "keyboard".
66
     *
67
     * @return string
68
     */
69 18
    public function getKeyboardType(): string
70
    {
71 18
        return $this->isInlineKeyboard() ? 'inline_keyboard' : 'keyboard';
72
    }
73
74
    /**
75
     * If no explicit keyboard is passed, try to create one from the parameters.
76
     *
77
     * @return array
78
     */
79 18
    protected function createFromParams(): array
80
    {
81 18
        $keyboard_type = $this->getKeyboardType();
82
83 18
        $args = func_get_args();
84
85
        // Force button parameters into individual rows.
86 18
        foreach ($args as &$arg) {
87 18
            !is_array($arg) && $arg = [$arg];
88
        }
89 18
        unset($arg);
90
91 18
        $data = reset($args);
92
93 18
        if ($from_data = array_key_exists($keyboard_type, (array) $data)) {
94 6
            $args = $data[$keyboard_type];
95
96
            // Make sure we're working with a proper row.
97 6
            if (!is_array($args)) {
98 2
                $args = [];
99
            }
100
        }
101
102 18
        $new_keyboard = [];
103 18
        foreach ($args as $row) {
104 15
            $new_keyboard[] = $this->parseRow($row);
105
        }
106
107 18
        if (!empty($new_keyboard)) {
108 15
            if (!$from_data) {
109 12
                $data = [];
110
            }
111 15
            $data[$keyboard_type] = $new_keyboard;
112
        }
113
114 18
        // If $args was empty, $data still contains `false`
115
        return $data ?: [];
116
    }
117
118
    /**
119
     * Create a new row in keyboard and add buttons.
120
     *
121
     * @return Keyboard
122 2
     */
123
    public function addRow(): Keyboard
124 2
    {
125 2
        if (($new_row = $this->parseRow(func_get_args())) !== null) {
0 ignored issues
show
introduced by
The condition $new_row = $this->parseR...nc_get_args()) !== null is always true.
Loading history...
126
            $this->{$this->getKeyboardType()}[] = $new_row;
127
        }
128 2
129
        return $this;
130
    }
131
132
    /**
133
     * Parse a given row to the correct array format.
134
     *
135
     * @param array|string $row
136
     *
137
     * @return array|null
138 15
     */
139
    protected function parseRow($row): ?array
140 15
    {
141 2
        if (!is_array($row)) {
142
            return null;
143
        }
144 13
145 13
        $new_row = [];
146 12
        foreach ($row as $button) {
147 12
            if (($new_button = $this->parseButton($button)) !== null) {
148
                $new_row[] = $new_button;
149
            }
150
        }
151 13
152
        return $new_row;
153
    }
154
155
    /**
156
     * Parse a given button to the correct KeyboardButton object type.
157
     *
158
     * @param array|string|KeyboardButton $button
159
     *
160
     * @return KeyboardButton|null
161 12
     */
162
    protected function parseButton($button): ?KeyboardButton
163 12
    {
164
        $button_class = $this->getKeyboardButtonClass();
165 12
166 6
        if ($button instanceof $button_class) {
167
            return $button;
168
        }
169 6
170 6
        if (!$this->isInlineKeyboard() || call_user_func([$button_class, 'couldBe'], $button)) {
171
            return new $button_class($button);
172
        }
173
174
        return null;
175
    }
176
177
    /**
178
     * {@inheritdoc}
179 18
     */
180
    protected function validate(): void
181 18
    {
182 18
        $keyboard_type = $this->getKeyboardType();
183
        $keyboard      = $this->getProperty($keyboard_type);
184 18
185 18
        if ($keyboard !== null) {
186 2
            if (!is_array($keyboard)) {
187
                throw new TelegramException($keyboard_type . ' field is not an array!');
188
            }
189 16
190 15
            foreach ($keyboard as $item) {
191 15
                if (!is_array($item)) {
192
                    throw new TelegramException($keyboard_type . ' subfield is not an array!');
193
                }
194
            }
195 14
        }
196
    }
197
198
    /**
199
     * Remove the current custom keyboard and display the default letter-keyboard.
200
     *
201
     * @link https://core.telegram.org/bots/api/#replykeyboardremove
202
     *
203
     * @param array $data
204
     *
205
     * @return Keyboard
206
     */
207 1
    public static function remove(array $data = []): Keyboard
208
    {
209 1
        return new static(array_merge(['keyboard' => [], 'remove_keyboard' => true, 'selective' => false], $data));
210
    }
211
212
    /**
213
     * Display a reply interface to the user (act as if the user has selected the bot's message and tapped 'Reply').
214
     *
215
     * @link https://core.telegram.org/bots/api#forcereply
216
     *
217
     * @param array $data
218
     *
219
     * @return Keyboard
220
     */
221
    public static function forceReply(array $data = []): Keyboard
222 1
    {
223
        return new static(array_merge(['keyboard' => [], 'force_reply' => true, 'selective' => false], $data));
224 1
    }
225
}
226