Completed
Push — master ( 21c0e8...be5cea )
by Владислав
02:16
created

DeCaptchaWiki::setText()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 2
eloc 4
nc 2
nop 2
1
<?php
2
3
namespace jumper423\decaptcha\core;
4
5
/**
6
 * Class DeCaptchaAbstract.
7
 */
8
class DeCaptchaWiki
9
{
10
    private $texts = [];
11
    /**
12
     * @var DeCaptchaBase
13
     */
14
    private $class;
15
    private $lang = 'en';
16
17
    public function setLang($lang)
18
    {
19
        $this->lang = $lang;
20
    }
21
22
    public function __construct($class)
23
    {
24
        $this->class = $class;
25
        $this->texts = [
26
            'constructor_data' => [
27
                ($this->class)::ACTION_FIELD_KEY => '94f39af4bb295c40546fba5c932e0d32',
28
            ],
29
            'recognize_file'      => true,
30
            'recognize_data_file' => 'http://site.com/captcha.jpg',
31
            'recognize_data'      => [
32
                ($this->class)::ACTION_FIELD_FILE => 'http://site.com/captcha.jpg',
33
            ],
34
            'field_main_name_'.($this->class)::ACTION_FIELD_KEY => [
35
                'ru' => 'Ключ',
36
            ],
37
            'field_main_desc_'.($this->class)::ACTION_FIELD_KEY => [
38
                'ru' => 'Ключ от учетной записи',
39
            ],
40
            'field_main_name_'.($this->class)::ACTION_FIELD_LANGUAGE => [
41
                'ru' => 'Язык',
42
            ],
43
            'field_main_desc_'.($this->class)::ACTION_FIELD_LANGUAGE => [
44
                'ru' => 'На каком языке текст на капче',
45
            ],
46
            'field_main_name_'.($this->class)::ACTION_FIELD_FILE => [
47
                'ru' => 'Картинка',
48
            ],
49
            'field_main_desc_'.($this->class)::ACTION_FIELD_FILE => [
50
                'ru' => 'Путь на файл с картинкой или ссылка на него',
51
            ],
52
            'field_main_name_'.($this->class)::ACTION_FIELD_PHRASE => [
53
                'ru' => 'Несколько слов',
54
            ],
55
            'field_main_desc_'.($this->class)::ACTION_FIELD_PHRASE => [
56
                'ru' => 'Работник должен ввести текст с одним или несколькими пробелами',
57
            ],
58
            'field_main_name_'.($this->class)::ACTION_FIELD_REGSENSE => [
59
                'ru' => 'Регистр',
60
            ],
61
            'field_main_desc_'.($this->class)::ACTION_FIELD_REGSENSE => [
62
                'ru' => 'Работник должен ввсести ответ с учетом регистра',
63
            ],
64
            'field_main_name_'.($this->class)::ACTION_FIELD_NUMERIC => [
65
                'ru' => 'Символы',
66
            ],
67
            'field_main_desc_'.($this->class)::ACTION_FIELD_NUMERIC => [
68
                'ru' => 'Какие символы используется в капче',
69
            ],
70
            'field_main_name_'.($this->class)::ACTION_FIELD_CALC => [
71
                'ru' => 'Вычисление',
72
            ],
73
            'field_main_desc_'.($this->class)::ACTION_FIELD_CALC => [
74
                'ru' => 'На капче изображенно математичекая выражение и её необходимо решить',
75
            ],
76
            'field_main_name_'.($this->class)::ACTION_FIELD_MIN_LEN => [
77
                'ru' => 'Длина min',
78
            ],
79
            'field_main_desc_'.($this->class)::ACTION_FIELD_MIN_LEN => [
80
                'ru' => 'Минимальная длина капчи',
81
            ],
82
            'field_main_name_'.($this->class)::ACTION_FIELD_MAX_LEN => [
83
                'ru' => 'Длина max',
84
            ],
85
            'field_main_desc_'.($this->class)::ACTION_FIELD_MAX_LEN => [
86
                'ru' => 'Максимальная длина капчи',
87
            ],
88
            'field_main_name_'.($this->class)::ACTION_FIELD_QUESTION => [
89
                'ru' => 'Вопрос',
90
            ],
91
            'field_main_desc_'.($this->class)::ACTION_FIELD_QUESTION => [
92
                'ru' => 'На изображении задан вопрос, работник должен написать ответ',
93
            ],
94
            'field_main_name_'.($this->class)::ACTION_FIELD_IS_RUSSIAN => [
95
                'ru' => 'Кириллица',
96
            ],
97
            'field_main_desc_'.($this->class)::ACTION_FIELD_IS_RUSSIAN => [
98
                'ru' => 'На изображении присутствуют русские символы',
99
            ],
100
            'field_main_name_'.($this->class)::ACTION_FIELD_LANGUAGE => [
101
                'ru' => 'Язык',
102
            ],
103
            'field_main_desc_'.($this->class)::ACTION_FIELD_LANGUAGE => [
104
                'ru' => 'Символы какого языка размещенны на капче',
105
            ],
106
            'field_main_name_'.($this->class)::ACTION_FIELD_HEADER_ACAO => [
107
                'ru' => 'Кросс-доменный',
108
            ],
109
            'field_main_desc_'.($this->class)::ACTION_FIELD_HEADER_ACAO => [
110
                'ru' => 'Необходимо для кросс-доменных AJAX запросов в браузерных приложениях.',
111
            ],
112
            'field_main_name_'.($this->class)::ACTION_FIELD_INSTRUCTIONS => [
113
                'ru' => 'Инструкция',
114
            ],
115
            'field_main_desc_'.($this->class)::ACTION_FIELD_INSTRUCTIONS => [
116
                'ru' => 'Текстовая капча или инструкция для прохождения капчи.',
117
            ],
118
            'field_main_name_'.($this->class)::ACTION_FIELD_PINGBACK => [
119
                'ru' => 'Ответ на',
120
            ],
121
            'field_main_desc_'.($this->class)::ACTION_FIELD_PINGBACK => [
122
                'ru' => 'Указание для сервера, что после распознания изображения, нужно отправить ответ на указанный адрес.',
123
            ],
124
            'field_main_name_'.($this->class)::ACTION_FIELD_LABEL => [
125
                'ru' => 'От куда',
126
            ],
127
            'field_main_desc_'.($this->class)::ACTION_FIELD_LABEL => [
128
                'ru' => 'Пояснение от куда пришла капча ("vk", "google", "recaptcha", "yandex", "mailru", "yahoo" и т.д.).',
129
            ],
130
            'field_main_name_'.($this->class)::ACTION_FIELD_PAGEURL => [
131
                'ru' => 'Адрес',
132
            ],
133
            'field_main_desc_'.($this->class)::ACTION_FIELD_PAGEURL => [
134
                'ru' => 'Адрес страницы на которой решается капча.',
135
            ],
136
            'field_main_name_'.($this->class)::ACTION_FIELD_GOOGLEKEY => [
137
                'ru' => 'Google key',
138
            ],
139
            'field_main_desc_'.($this->class)::ACTION_FIELD_GOOGLEKEY => [
140
                'ru' => 'Ключ-индентификатор рекапчи на целевой странице. <div class="g-recaptcha" data-sitekey="ВОТ_ЭТОТ"></div>',
141
            ],
142
            'field_main_name_'.($this->class)::ACTION_FIELD_GOOGLETOKEN => [
143
                'ru' => 'Google token',
144
            ],
145
            'field_main_desc_'.($this->class)::ACTION_FIELD_GOOGLETOKEN => [
146
                'ru' => 'Секретный токен для предыдущей версии рекапчи. В большинстве случаев сайты используют новую версию и этот токен не требуется. Секретный токен генерируется на сервере Google и вставляется на страницу в атрибуте data-stoken. Выглядит это примерно так: <script type="text/javascript" src="...." data-type="normal"  data-ray="..." async data-sitekey="..." data-stoken="ВОТ_ЭТОТ"></script> Токен действует пару минут после генерации, затем нужно снова зайти на страницу и получить его.',
147
            ],
148
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYTYPE => [
149
                'ru' => 'Тип прокси',
150
            ],
151
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYTYPE => [
152
                'ru' => 'Тип прокси (http, socks4, ...)',
153
            ],
154
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXY => [
155
                'ru' => 'Адрес прокси',
156
            ],
157
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXY => [
158
                'ru' => 'IP адрес прокси ipv4/ipv6.',
159
            ],
160
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYPORT => [
161
                'ru' => 'Порт прокси',
162
            ],
163
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYPORT => [
164
                'ru' => 'Порт прокси.',
165
            ],
166
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYLOGIN => [
167
                'ru' => 'Логин прокси',
168
            ],
169
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYLOGIN => [
170
                'ru' => 'Логин от прокси-сервера.',
171
            ],
172
            'field_main_name_'.($this->class)::ACTION_FIELD_PROXYPASS => [
173
                'ru' => 'Пароль прокси',
174
            ],
175
            'field_main_desc_'.($this->class)::ACTION_FIELD_PROXYPASS => [
176
                'ru' => 'Пароль от прокси-сервера.',
177
            ],
178
            'field_main_name_'.($this->class)::ACTION_FIELD_USERAGENT => [
179
                'ru' => 'User-Agent браузера',
180
            ],
181
            'field_main_desc_'.($this->class)::ACTION_FIELD_USERAGENT => [
182
                'ru' => 'User-Agent браузера, используемый в эмуляции. Необходимо использовать подпись современного браузера, иначе Google будет возвращать ошибку, требуя обновить браузер.',
183
            ],
184
            'field_main_name_'.($this->class)::ACTION_FIELD_COOKIES => [
185
                'ru' => 'Куки',
186
            ],
187
            'field_main_desc_'.($this->class)::ACTION_FIELD_COOKIES => [
188
                'ru' => 'Дополнительные cookies которые мы должны использовать во время взаимодействия с целевой страницей.',
189
            ],
190
            'table_th_name' => [
191
                'ru' => 'Название',
192
            ],
193
            'table_th_code' => [
194
                'ru' => 'Код',
195
            ],
196
            'table_th_type' => [
197
                'ru' => 'Тип',
198
            ],
199
            'table_th_req' => [
200
                'ru' => 'Обязательное',
201
            ],
202
            'table_th_def' => [
203
                'ru' => 'По умолчания',
204
            ],
205
            'table_th_enum' => [
206
                'ru' => 'Возможные значения',
207
            ],
208
            'table_th_desc' => [
209
                'ru' => 'Описание',
210
            ],
211
            'slug_link' => [
212
                'ru' => 'Ссылка',
213
            ],
214
            'slug_price' => [
215
                'ru' => 'Цены',
216
            ],
217
            'slug_service_desc' => [
218
                'ru' => 'Описание сервиса',
219
            ],
220
            'slug_recognize_desc' => [
221
                'ru' => 'Описание распознания',
222
            ],
223
            'slug_fields_desc' => [
224
                'ru' => 'Описание полей',
225
            ],
226
        ];
227
    }
228
229
    /**
230
     * @param string|array $name
231
     * @param string|array $value
232
     */
233
    public function setText($name, $value)
234
    {
235
        if (is_array($name)) {
236
            $name = implode('_', $name);
237
        }
238
        $this->texts[$name] = $value;
239
    }
240
241
    /**
242
     * @param string|array $name
243
     * @param string       $separator
244
     *
245
     * @return string
246
     */
247
    public function getText($name, $separator = '; ')
248
    {
249
        $getResult = function ($name, $texts) {
250
            if (is_array($name)) {
251
                $name = implode('_', $name);
252
            }
253
            if (!isset($texts[$name])) {
254
                return null;
255
            }
256
            if (is_array($texts[$name])) {
257
                if (isset($texts[$name][$this->lang])) {
258
                    return $texts[$name][$this->lang];
259
                }
260
261
                return array_values($texts[$name])[0];
262
            }
263
264
            return $texts[$name];
265
        };
266
        $result = $getResult($name, $this->texts);
267
        if (is_array($result)) {
268
            $result = implode($separator, $result);
269
        }
270
271
        return $result;
272
    }
273
274
    public function viewFields()
275
    {
276
        $str = " {$this->getText(['table', 'th', 'name'])} | {$this->getText(['table', 'th', 'code'])} | {$this->getText(['table', 'th', 'type'])} | {$this->getText(['table', 'th', 'req'])} | {$this->getText(['table', 'th', 'def'])} | {$this->getText(['table', 'th', 'enum'])} | {$this->getText(['table', 'th', 'desc'])} ".PHP_EOL;
277
        $str .= ' --- | --- | --- | --- | --- | --- | --- '.PHP_EOL;
278
        $rr = (new \ReflectionClass($this->class))->getConstants();
279
        foreach ($this->class->actions[($this->class)::ACTION_RECOGNIZE][($this->class)::ACTION_FIELDS] as $param => $setting) {
280
            if (array_key_exists(($this->class)::ACTION_FIELDS, $setting) && is_array($setting[($this->class)::ACTION_FIELDS])) {
281
                foreach ($setting[($this->class)::ACTION_FIELDS] as $param1 => $setting1) {
282
                    if (array_key_exists(($this->class)::PARAM_SLUG_NOTWIKI, $setting1) && $setting1[($this->class)::PARAM_SLUG_NOTWIKI] === true) {
283
                        continue;
284
                    }
285
                    $str .= $this->viewFieldLine($rr, $param1, $setting1);
286
                }
287
            }
288
            if (array_key_exists(($this->class)::PARAM_SLUG_NOTWIKI, $setting) && $setting[($this->class)::PARAM_SLUG_NOTWIKI] === true) {
289
                continue;
290
            }
291
            $str .= $this->viewFieldLine($rr, $param, $setting);
292
        }
293
294
        return $str;
295
    }
296
297
    public function viewFieldLine($rr, $param, $setting)
298
    {
299
        $str = " {$this->getText(['field', 'main', 'name', $param])} |";
300
        $str .= " {$this->getNameConst($rr, 'ACTION_FIELD_', $param)} |";
301
        $str .= ' '.substr($this->getNameConst($rr, 'PARAM_FIELD_TYPE_', $setting[($this->class)::PARAM_SLUG_TYPE]), 17).' |';
302
        $str .= ' '.(array_key_exists(($this->class)::PARAM_SLUG_REQUIRE, $setting) ? '+' : '-').' |';
303
        $str .= ' '.(array_key_exists(($this->class)::PARAM_SLUG_DEFAULT, $setting) ? $setting[($this->class)::PARAM_SLUG_DEFAULT] : '').' |';
304
        $str .= " {$this->getText(['field', 'slug', ($this->class)::PARAM_SLUG_ENUM, $param])} |";
305
        $str .= " {$this->getText(['field', 'main', 'desc', $param])} |";
306
        $str .= PHP_EOL;
307
308
        return $str;
309
    }
310
311
    public function getNameConst($constants, $keyMask, $value)
312
    {
313
        foreach ($constants as $key => $val) {
314
            if (stripos($key, $keyMask) !== false && $val === $value) {
315
                return $key;
316
            }
317
        }
318
319
        return null;
320
    }
321
322
    public function view(){
323
        $str = $this->getText(['service','name']). PHP_EOL;
324
        $str .= '=============='. PHP_EOL;
325
        $str .= "###{$this->getText(['slug','link'])}". PHP_EOL;
326
        $str .= "[{$this->getText(['slug','link','to_service'])} {$this->getText(['service','name'])}]({$this->getText(['service','href'])})". PHP_EOL. PHP_EOL;
327
        $str .= "###{$this->getText(['slug','service','desc'])}". PHP_EOL;
328
        $str .= "{$this->getText(['service','desc'])}". PHP_EOL. PHP_EOL;
329
        $str .= "###{$this->getText(['slug','price'])}". PHP_EOL;
330
        $str .= "{$this->getText(['recognize','price'])}". PHP_EOL. PHP_EOL;
331
        $str .= "###{$this->getText(['slug','recognize','desc'])}". PHP_EOL;
332
        $str .= "{$this->getText(['recognize','desc'])}". PHP_EOL. PHP_EOL;
333
        $str .= "###{$this->getText(['slug','fields','desc'])}". PHP_EOL;
334
        $str .= $this->viewFields(). PHP_EOL;
335
        return $str;
336
    }
337
}
338