Задать вопрос

Как избавиться от «такого» кода?

Есть код, нужна критика и советы по улучшению моего "говно кода"...
Это код для бота ВК.
Суть: автоответ на вопросы пользователей

Сам код

bot.php

<?php
require 'config.php';

$data = json_decode(file_get_contents('php://input'));

if(!isset($data)) exit;

if(strcmp($data->secret, VK_SECRET_KEY) !== 0 && strcmp($data->type, VK_TYPE_CONFIRMATION) !== 0) return;

/*
* __init__
*/

switch ($data->type) {
	case VK_TYPE_CONFIRMATION:
		echo VK_CONFIRMATION_TOKEN;
		break;

	case VK_TYPE_NEW_MESSAGE:
		$GROUP_ID = $data->group_id;
		$USER_ID = $data->object->user_id;
		$PEER_ID = $data->object->peer_id;
		$RANDOM_ID = $data->object->random_id;
		$USER_TEXT = mb_strtolower($data->object->text);
		$USER_INFO = json_decode(file_get_contents('https://api.vk.com/method/users.get?user_ids='.$USER_ID.'&access_token='.VK_TOKEN.'&v='.VK_API_VERSION.''));
		$USER_NAME = $USER_INFO->response[0]->first_name;
		$BOT_ANSWER = 'Бот не нашёл ответа на ваш вопрос!';
		$BOT_COMMANDS = [
			'!{user_name}' => $USER_NAME,
			'!{bot_name}' => BOT_NAME,
			'!{bot_version}' => BOT_VERSION
		];

		foreach ($VK_CONFIG_FAQ as $k => $v) {
			$res = strpos(mb_strtolower($k), mb_strtolower($USER_TEXT));
			if($res !== false){
				$BOT_ANSWER = $v[array_rand($v)];
			}
		}

		if($BOT_ANSWER != 'Бот не нашёл ответа на ваш вопрос!' and strpos($BOT_ANSWER, '!{') != false){
			foreach ($BOT_COMMANDS as $command => $val) {
				$BOT_ANSWER = str_replace($command, $val, $BOT_ANSWER);
			}
		}

		$params = http_build_query([
			'message' => $BOT_ANSWER,
			'peer_id' => $PEER_ID,
			'user_id' => $USER_ID,
			'random_id' => $RANDOM_ID,
			'access_token' => VK_TOKEN,
			'v' => VK_API_VERSION
		]);

		file_get_contents('https://api.vk.com/method/messages.send?' . $params);

		echo 'ok';
		break;
}


config.php

// TYPES
define('VK_TYPE_CONFIRMATION', 'confirmation');
define('VK_TYPE_NEW_MESSAGE', 'message_new');

// BOT PARAMS
define('BOT_NAME', 'NameBot');
define('BOT_VERSION', '0.0.1');

// FAQ
$VK_CONFIG_FAQ = [
	'Привет | Hi' => [
		'Привет, !{user_name}!!!! Тебя приветствует бот !{bot_name} версии !{bot_version}',
		'Опять вы.... Ну, hi....'
	],
];
  • Вопрос задан
  • 564 просмотра
Подписаться 2 Простой 2 комментария
Решения вопроса 2
Zraza
@Zraza
Помог ответ? Отметь решением!
Я бы посоветовал:
1) Разбить код на функции с осмысленными названиями.
Гораздо лучшее читаются короткие участки кода.
Для примера, я бы вынес функции validateRequest, sendMessage, findAnswer. Перенести в отдельные функции/методы классы запросы к внешним сервисам (vk)
2) Убрать неиспользуемые переменные. Зачем тут $GROUP_ID ?
3) Не использовать однобуквенные переменные.
Вместо `foreach ($VK_CONFIG_FAQ as $k => $v) {` лучше что-то вроде `foreach ($VK_CONFIG_FAQ as $questionPattern => $answers) {`
4) Не дублировать строковые константы типа 'Бот не нашёл ответа на ваш вопрос!'. Лучше вынести в отдельную константу типа NOT_FOUND_ANSWER

Ну и про PSR уже написали
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега PHP
♬♬
Бот «сломается» при большом числе запросов. Прежде, чем отдать ожидаемое «ok», он выполняет ещё два веб-запроса: users.get() и messages.send()– это съедает время и память. Будье готовы переключиться на схему с очередью и отдельными рабочими. Приняли запрос, сохранили, отдали "ok". Другой процесс, рабочий, неспеша разбирает задачи из очереди, отправляет ответы. Стали популярнее, добавили рабочих с других серверов.

Не проверяете user text на минимальную длину. Пришлют одну букву - получат весь FAQ. По мере роста FAQ'а, можете столкнуться с дубликацией: на запрос "hi" найдётся, скажем, ключ с "high load".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы