KOTOFF.NET
  • Главная
  • Пользователи
  • Контакты
  • Статистика
  • Правила
  • О нас
  • Вход / Регистрация

BOT VK — Роли для беседы | PHP

Статьи / PHP

В одной из предыдущих статей мы делали бота для конференций, добавили возможность кика, бана и мута пользователей. Сегодня мы продолжим эту тему, реализуем систему ролей для участников беседы и настроем права доступа для каждой из них. 



Шаг 1: Введение

Как я уже сказал выше - в этот раз будем использовать уже имеющую базу для бота, о написании которой я рассказывал в этой статье. Далее речь пойдёт исключительно о системе ролей: сделаем возможность добавления и удаления ролей, изменения прав доступа ролей, а также реализуем выдачу ролей юзерам.



Шаг 2: Новые таблички в БД

Пока у нас есть лишь одна таблица `black_list`, в которую записываются баны и муты участников. Однако для текущих планов и задач потребуется создать ещё две. Первая будет хранить в себе список ролей и их настройки, вторая - список пользователей с ролями.


Создаю первую таблицу roles с восьмью полями:

  • id - айди роли (число);
  • name - название роли (строка);
  • g_create_roles - может ли создавать новые роли (число - 1 или 0);
  • g_invite_users - может ли приглашать юзеров в беседу (число - 1 или 0);
  • g_give_roles - может ли выдавать роли участникам (число - 1 или 0);
  • g_block_users - может ли банить участников (число - 1 или 0);
  • g_kick_users - может ли кикать участников (число - 1 или 0);
  • g_mute_users - может ли мутить участников (число - 1 или 0).


Вторая таблица members (4 поля):

  • id - айди записи в таблице, айди участника (число);
  • vk_id - айди пользователя ВК (число);
  • conf_id - айди беседы (число);
  • role_id - айди роли, которая на текущий момент есть у юзера (число).



Шаг 3: Время писать код

Итак, ищем строчку:

if ( $type == 'message_new' ) {

После неё нужно вставить запросы к базе данных, дабы получить инфу об участнике, который отправил мессагу, а также вытащить из БД права доступа его роли (если, конечно, она у него есть):

$row = $db->query( "SELECT * FROM `members` WHERE `vk_id` = ?i AND `conf_id` = ?i", $vk_id, $peer_id )->fetchAssoc();

$role = $db->query( "SELECT * FROM `roles` WHERE `id` = ?i", $row['role_id'] )->fetchAssoc();


Чуть ниже есть кусок кода, где мы проверяли, находится ли приглашённый пользователь в чёрном списке. Если находится - значит исключаем его. Теперь нам нужно добавить ещё одно условие: если у пользователя, который кого-то пригласил нет прав доступа на инвайты - значит приглашённого нужно кикнуть.

Ищем этот код:

if ( isset( $result['id'] ) and $result['id'] and $result['duration'] > time() ) // Проверяем, истёк ли срок наказания
{
    $vk->request( 'messages.removeChatUser', [ 'chat_id' => $peer_id - 2000000000, 'member_id' => $data->object->action->member_id ] ); // Кикаем, если срок не истёк

    $vk->sendMessage( $peer_id, 'Пользователь находится в чёрном списке беседы' ); // Уведомляем об этом участников беседы
}

И заменяем на:

if ( ( isset( $result['id'] ) and $result['id'] and $result['duration'] > time() ) or ( !$role['g_invite_users'] and !$vk->isAdmin( $vk_id, $peer_id ) ) )
{
    $vk->request( 'messages.removeChatUser', [ 'chat_id' => $peer_id - 2000000000, 'member_id' => $data->object->action->member_id ] );

    $vk->sendMessage( $peer_id, 'Вы не можете пригласить в беседу этого пользователя' );
}


Ранее блок с обработкой команд мы оборачивали в проверку на наличие админки в беседе (чтобы левые молодые люди не могли беспредельничать). Поскольку теперь права доступа будут зависеть от роли, то строку:

if ( $vk->isAdmin( $vk_id, $peer_id ) ) {

Заменим на:

if ( strpos( $message, '/' ) === 0 ) {

Это условие будет отсеивать все сообщения, которые не начинаются со слэша (то есть те, которые не являются командами). Это позволит скрипту не срабатывать на все подряд входящие.


Также ко всем командам (кик, мут, размут, бан, разбан) нужно дописать через оператор AND проверку на права доступа роли к действию:

and ( $role['ПРАВО_ДОСТУПА_ИЗ_БД'] or $vk->isAdmin( $vk_id, $peer_id ) )

Я решил разрешить использовать все команды тем, у кого есть системная админка в конфе. В принципе, это можно убрать при желании.



Ну, а теперь переходим к командам. И начну я с выдачи ролей (/выдатьроль). Команда будет иметь примерно такой вид: /выдатьроль *кому* *название роли*. Названия ролей, состоящие из нескольких слов, можно будет писать через нижнее подчёркивание (напомню, что все команды у нас разбиваются на массив через пробелы). То бишь, к примеру, как-то так: Старший_администратор, Создатель_беседы. С помощтю функции str_replce() нижние подчёркивании будут удаляться.

Код вставляем после остальных (уже написанных в прошлой статье) команд:

        else if ( $message_data[0] == '/выдатьроль' and ( $role['g_give_roles'] or $vk->isAdmin( $vk_id, $peer_id ) ) )
        {


            $res = $db->query( "SELECT * FROM `members` WHERE `vk_id` = ?i", $user_info['id'] )->fetchAssoc();

            if ( isset( $res['id'] ) and $res['id'] )
            {

                try
                {
                    $res = $db->query( "SELECT * FROM `roles` WHERE `name` = '?s'", str_replace( '_', ' ', $message_data[2] ) )->fetchAssoc();

                    $db->query( "UPDATE `members` SET `role_id` = ?i WHERE `vk_id` = ?i", $res['id'], $user_info['id'] );


                    $vk->sendMessage( $peer_id, '@id' . $user_info['id'] . '(Пользователю) присвоена роль ' . $res['name'] );
                }
                catch ( \Krugozor\Database\MySqlException $e )
                {
                    $vk->sendMessage( $peer_id, 'Ошибка' );
                }

            }
            else
            {

                try
                {
                    $res = $db->query( "SELECT * FROM `roles` WHERE `name` = '?s'", str_replace( '_', ' ', $message_data[2] ) )->fetchAssoc();

                    $db->query( "INSERT INTO `members` SET `vk_id` = ?i, `conf_id` = ?i, `role_id` = ?i", $user_info['id'], 2000000000 + $peer_id, $res['id'] );


                    $vk->sendMessage( $peer_id, '@id' . $user_info['id'] . '(Пользователю) выдана роль ' . $res['name'] );
                }
                catch ( \Krugozor\Database\MySqlException $e )
                {
                    $vk->sendMessage( $peer_id, 'Ошибка' );
                }

            }


        }


Для того, чтобы снять роль, можно будет юзать команду /снятьроль (/снятьроль *кому*). После этого пользователь удалится из таблицы members и останется без роли:

        else if ( $message_data[0] == '/снятьроль' and ( $role['g_give_roles'] or $vk->isAdmin( $vk_id, $peer_id ) ) )
        {


            $db->query( "DELETE FROM `members` WHERE `vk_id` = ?i AND `conf_id` = ?i", $user_info['id'], $peer_id );

            $vk->sendMessage( $peer_id, 'У @id' . $user_info['id'] . '(пользователя) изъята роль' );


        }


Следующая команда понадобится для создания новых ролей и будет иметь вид: /создатьроль *название*:

        else if ( $message_data[0] == '/создатьроль' and ( $role['g_create_roles'] or $vk->isAdmin( $vk_id, $peer_id ) ) )
        {


            $name = str_replace( '_', ' ', $message_data[1] );


            $res = $db->query( "SELECT `name` FROM `roles` WHERE `name` = '?s'", $name )->fetchAssoc();



            if ( isset( $res['name'] ) )
            {
                $vk->sendMessage( $peer_id, 'Роль а таким названием уже существует, придумайте другое' );
            }
            else
            {
                $db->query( "INSERT INTO `roles` SET `name` = '?s'", $name );

                $vk->sendMessage( $peer_id, 'Роль успешно создана' );
            }


        }


Для удаления ролей также создаю отдельную команду (/удалитьроль *кому*):

        else if ( $message_data[0] == '/удалитьроль' and ( $role['g_create_roles'] or $vk->isAdmin( $vk_id, $peer_id ) ) )
        {


            try
            {
                $res = $db->query( "DELETE FROM `roles` WHERE `name` = '?s'", str_replace( '_', ' ', $message_data[1] ) );

                $vk->sendMessage( $peer_id, 'Роль удалена' );
            }
            catch ( \Krugozor\Database\MySqlException $e )
            {
                $vk->sendMessage( $peer_id, 'Ошибка' );
            }


        }


И напоследок сделаю регулировку прав доступа. Команда будет иметь следующий вид: /правароли *название роли* *право доступа из БД* *значение 1 или 0 (разрешено или нет)*:

        else if ( $message_data[0] == '/правароли' and ( $role['g_create_roles'] or $vk->isAdmin( $vk_id, $peer_id ) ) )
        {

            $role = str_replace( '_', ' ', $message_data[1] );
            $type = $message_data[2];
            $value = $message_data[3] ? 1 : 0;


            try
            {
                $db->query( "UPDATE `roles` SET `$type` = ?i WHERE `name` = '?s'", $value, $role );

                $vk->sendMessage( $peer_id, 'Права (' . $type . ') роли были изменены' );
            }
            catch ( \Krugozor\Database\MySqlException $e )
            {
                $vk->sendMessage( $peer_id, 'Произошла ошибка, убедитесь в правильности введённых данных' );
            }


        }



Шаг 4: Работает? 

Проверяем - работает:


На этом, думаю, всё. Возможно, сделаю ещё одну часть.

Архив с исходниками прикрепляю:

bot.zip

  • 5id15
  • 10.07.2022
  • 2 735
  • 2
Как сделать цепочку сообщений (анкету) для бота ВК на PHP
Как сделать цепочку сообщений (анкету) для бота ВК на PHP
23-06-2022, 16:32, PHP
BOT VK — Скрипт бана и мута пользователей в беседе (PHP)
BOT VK — Скрипт бана и мута пользователей в беседе (PHP)
29-06-2022, 18:06, PHP
Логирование и удаление комментариев, блокировка пользователей в группе ВК через бота | PHP
Логирование и удаление комментариев, блокировка пользователей в группе ВК через бота | PHP
6-07-2022, 16:54, PHP
  1. Айнур

    Айнур Гость 16 июля 2022 10:34

    Как юзать attachment?

    Так?

    message.send.attachment[photo39697579_57854

    1. 5id15

      5id15@Константин Дорофеев 16 июля 2022 23:31

      На PHP с simpleVK так - $vk->sendMessage( $peer_id, $message, [ 'attachment' => 'photo123_321' ] );

{login}

Твой комментарий..

Заказывай!
Разработка ботов на заказ, любой сложности, обращаться:
 VK KOTOFF.net - Сообщество, в личные сообщения или по контактам указанным там 
 mail: [email protected]

Рекламный блок
  • Новости
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
Комментарии
Готовый обработчик платежей ANYPAY.io для ботов ВК и сайтов
А ты сделай на сайт этот шаблон какой-то и отправь запрос они примут
Вывод записей из БД по дням (по месяцам)
А можно просто сгрупировать нужные данные по дням в sql запросе и не городить кучу ненужно кода.
Скрипт исключения из беседы VK и не только, написанный на PHP
Если Ваш код соответствует, то в $userinfo будут лежать first_name и last_name
Callback-кнопки для бота ВК
Если есть предложения про что конкретно нужно написать статью, пишите)
Callback-кнопки для бота ВК
Спасибо за статью! Читаю все ваши статьи про создание ботов, мне было очень полезно! Странно, что
Все комментарии..
Полный список последних комментариев
Лучшие новости
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]

Создание простого

10-08-2022, 20:16
Стейты для бота ВК (последовательный ввод step by step)

Стейты для бота ВК

20-07-2022, 20:03
Callback-кнопки для бота ВК

Callback-кнопки для бота ВК

22-07-2022, 20:20
Карусели для бота ВК

Карусели для бота ВК

24-07-2022, 15:48
Создаем бота VK на библиотеке SimpleVK 3.x [Часть 1]

Создаем бота VK на

26-07-2022, 17:01
Форматы вывода дат относительно текущего времени

Форматы вывода дат

14-07-2022, 00:16
Вывод записей из БД по дням (по месяцам)

Вывод записей из БД по дням

15-07-2022, 15:02
Пагинация кнопок для LongPoll-бота ВК — на библиотеке SimpleVK 3.x [Часть 2]

Пагинация кнопок для

4-08-2022, 16:43
Поиск записей в группе ВКонтакте по автору

Поиск записей в группе

3-08-2022, 17:26
Всего публикаций: 66
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 810
Добавлено за сутки: +0
Пользователей: 3711
Добавлено за сутки: +1
Полная статистика..
Подробная статистика сайта
Loading...

Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter

Полезные ссылки
  • О проекте
  • Наши контакты
  • Администрация
  • Рекламные материалы
  • Идеи и предложения
  • Ответы на вопросы
Информация
  • Условия сделки
  • Способы оплаты
  • Поддержка / F.A.Q
  • Онлайн документация
  • Статистика сайта
  • Список пользователей
Услуги/Работа
  • Разработка ботов ВК
  • Обновление проекта
  • Консультация/поддержка
KOTOFF.net

Copyright © Footer 2019-2022. All right reserved.
KOTOFF.net - Уроки по PHP, SQL, IT новости
Быстрый вход

Используйте социальные сети для быстрой регистрации и авторизации.

Google
ВКонтакте
Яндекс
Mail.ru
Создать аккаунт / Регистрация
Авторизация

Я забыл свой пароль