Пишу бота для группы в ВК…
Как реализовать функцию при которой при получении сообщения "Подписка" и если его ID не занесён в список он заносит его ID в файл user_id.txt.
А при получении сообщения "Отписка" и если его ID занесен в этот список он убирает ID пользователя из данного списка.
PS. Так же буду благодарен если кто-то скажет как можно перечислять переменные (Например: Привет, привет, хай, ку и т.д.) и он будет понимать что на все эти команды ему нужно отвечать одним сообщением.
Заранее спасибо
if($user_msg == 'Подписка'){
if($user_id == "ID_USER"){
$v->msgSend("$user_name, ты уже подписан на рассылку!", $user_id, $access_token);
} else {
$v->msgSend("$user_name, спасибо что подписались на рассылку записей. Для отписки используй команду: Отписка.", $user_id, $access_token);
}
}
if($user_msg == 'Отписка'){
if($user_id == "ID_USER"){
$v->msgSend("Вы успешно отписались от «Рассылки постов»!", $user_id, $access_token);
} else {
$v->msgSend("$user_name, вы не можете отписаться от рассылки, так как вы не были подписаны на неё.", $user_id, $access_token);
}
}
Текстовый файл, возможно, не лучшее хранилище, но для обучения сойдёт.
Первым делом надо придумать формат хранения данных в файле. Это могут быть просто id разделённые символом, который в id точно никогда не встретится. Пусть это будет символ новой строки \n
, например.
Далее, чтобы искать в уже записанных id, их значения надо прочитать:
$idsFile = __DIR__ . '/user_id.txt';
$idsStr = file_get_contents($idsFile);
$ids = array_filter(explode("\n", $idsStr));
var_dump($ids);
Соответственно проверить, что id уже есть среди ранее сохранённых id можно с помощью функции array_search
. Если пользователя ещё нет в списке и Подписка, то добавляем его в массив $ids
, если Отписка и пользователь есть в массиве то удаляем:
$pos = array_search($user_id, $ids);
switch ($user_msg) {
case 'Подписка':
if ($pos === false) {
$ids[] = $user_id;
$v->msgSend("$user_name, спасибо что подписались на рассылку записей. Для отписки используй команду: Отписка.", $user_id, $access_token);
} else {
$v->Send("$user_name, ты уже подписан на рассылку!", $user_id, $access_token);
}
break;
case 'Отписка':
if ($pos !== false) {
unset($ids[$pos]);
$v->msgSend("Вы успешно отписались от «Рассылки постов»!", $user_id, $access_token);
} else {
$v->msgSend("$user_name, вы не можете отписаться от рассылки, так как вы не были подписаны на неё.", $user_id, $access_token);
}
break;
case 'привет':
case 'хай':
case 'ку':
//
break;
}
Ну и остаётся сохранить массив $ids
в файл:
file_put_contents($idsFile, implode("\n", $ids));
Однако у такого способа много недостатков.
Эти проблемы хорошо известны и решения для них давно придуманы. Для обеспечения согласованности данных используются блокировки (пока один работает с файлом, остальные ждут). Для ускорения поиска используются индексы (это как алфавитный указатель в книге, позволяет не листать всё сначала, а сразу открыть нужную страницу).
Реализация блокировок и индексов может оказаться достаточно сложной задачей для новичка и достаточно скучной для многоопытного разработчика, но есть готовое решение! Это базы данных. Самым простым вариантом может стать SQLite, для работ с ней надо освоить PDO. Умение работать с базами данных не только поможет вам в задаче с ботом, но и очень пригодится в будущем.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть такой код, как реализовать функцию (не сильно меняя код) которая будет сравнивать ID в списке user_idtxt и в зависимости от True или False (есть или...
Всем приветКогда я создаю новый action , и перехожу на него ,то backend его не видит, хотя actionLogout, actionLogin,actionIndex - работают, но мои - нет