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

Реализация мута пользователей в групповом чате — Telegram-Bot

Статьи / PHP

Наша библиотека вновь обновлена, посему продолжим учиться создавать Телеграм-ботов. В сегодняшней статье поговорим о реализации системы мута пользователей. 


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

  • Метод deleteMessage( $chat_id, $message_id ) — удаляет указанное сообщение
    • $chat_id - айди чата
    • $message_id - айди сообщения
public function deleteMessage( int $chat_id, int $message_id ) : void
{
    $this->request( 'deleteMessage', [ 'chat_id' => $chat_id, 'message_id' => $message_id ] );
}


  • Метод memberStatus( $chat_id, $user_id ) — возвращает роль пользователя в чате (может вернуть следующие значения: creator - создатель, left - админ, false - пользователь, null - пользователя нет в чате)
    • $chat_id - айди чата
    • $user_id - айди пользователя
public function memberStatus( int $chat_id, int $user_id ) : string|false|null
{
    $member_info = $this->request( 'getChatMember', [ 'chat_id' => $chat_id, 'user_id' => $user_id ] );

    return ( $member_info['result']
        ? ( $member_info['result']['status'] == 'creator' ) ? 'creator'
        : ( $member_info['result']['status'] == 'left' ? 'left' : false ) : null );
}


  • Метод mute( $chat_id, $user_id, $unit, $value, $reason ) — мутит пользователя в чате на определённый срок, либо навсегда при неуказании времени
    • $chat_id - айди чата 
    • $user_id - айди пользователя
    • $unit - единица измерения времени - дни, часы, минуты, секунды (необязательный параметр)
    • $value - срок мута в указанных единицах измерения времени (необязательный параметр)
    • $reason - причина (необязательный параметр)
public function mute( int $chat_id, int $user_id, string $unit = '', int $value = 0, string $reason = '' ) : void
{
    [ $arr, $mutes_file ] = $this->blacklistCache( 'mutes' );

    $arr[$chat_id . '_' . $user_id] = [
        'duration' => $this->durationCount( $unit, $value ),
        'reason' => $reason,
    ];

    $this->record( $arr, $mutes_file );
}


  • Метод unMute( $chat_id, $user_id ) — размучивает пользователя в групповом чате
    • $chat_id - айди чата
    • $user_id - айди пользователя
public function unMute( int $chat_id, int $user_id ) : void
{
    [ $arr ] = $this->blacklistCache( 'mutes' );
    unset( $arr[$chat_id . '_' . $user_id] );
}


  • Метод isMuted( $chat_id, $user_id ) — проверяет, замучен ли пользователь (true - замучен, false- не замучен)
    • $chat_id - айди чата
    • $user_id - айди пользователя
public function isMuted( int $chat_id, int $user_id ) : bool
{
    [ $arr ] = $this->blacklistCache( 'mutes' );


    if ( isset( $arr[$chat_id . '_' . $user_id] ) and $arr[$chat_id . '_' . $user_id]['duration'] >= time() )
        return true;


    return false;
}


  • Метод blacklistCache( $type )— возвращает чёрный список пользователей (в нашем случае чёрным списком является список мутов, однако можно реализовать, к примеру, и баны)
    • $type - тип чёрного списка (мы рассматриваем муты, поэтому в $type передавать будем строку 'mutes')
private function blacklistCache( string $type ) : array
{
    if ( !is_dir( self::$cache_dir ) )
        mkdir( self::$cache_dir );

    $bans_file = self::$cache_dir . '/' . $type . '.php';
    $arr = file_exists( $bans_file ) ? require $bans_file : [];


    return [ $arr, $bans_file ];
}


  • Метод durationCount( $unit, $value ) — высчитывает срок пребывания в чёрном списке (в муте) в зависимости от заданной единицы измерения времени (определяется по первой букве: д/d - дни, ч/h - часы, м/m - минуты, с/s- секунды)
    • $unit - единица измерения времени - дни, часы, минуты, секунды
    • $value - срок мута в указанных единицах измерения времени
private function durationCount( string $unit = '', int $value = 0 ) : int
{
    if ( str_starts_with( $unit, 'с' ) or str_starts_with( $unit, 's' ) )
        $duration = time() + $value;
    else if ( str_starts_with( $unit, 'м' ) or str_starts_with( $unit, 'm' ) )
        $duration = time() + ( $value * 60 );
    else if ( str_starts_with( $unit, 'ч' ) or str_starts_with( $unit, 'h' ) )
        $duration = time() + ( $value * 60 * 60 );
    else if ( str_starts_with( $unit, 'д' ) or str_starts_with( $unit, 'd' ) )
        $duration = time() + ( $value * 60 * 60 * 24 );
    else
        $duration = 1.e10;


    return $duration;
}


  • Метод record( $arr ) — перекочевал из класса Storage в класс Bot. Принцип работы не изменился, добавился второй аргумент (теперь путь к файлу можно указать вручную)
    • $arr - массив для записи в кэш
protected function record( array $arr, string $path ) : false|int
{
    $str = "<?php\n\nreturn " . var_export( $arr, true ) . ";\n";

    return file_put_contents( $path, $str, LOCK_EX );
}



Теперь переходим непосредственно к написанию бота. Создаём php-файл, подключаем библиотеку, создаём экземпляр класса Bot и инициализируем необходимые перменные:

<?php

require_once __DIR__ . '/telekot/autoload.php'; // Подключение библиотеки


$tg = \telekot\Bot::create( '*************************' ) // Создаём экземпляр класса Bot, передаём в метод create() токен бота
    ->initData( $data )
    ->initChatId( $chat_id ) // Инициализируем айди чата, из которого поступают боту сообщения (например, это может быть айди пользователя, написавшего боту)
    ->initUserId( $user_id ) // Инициализация ID пользователя
    ->initMessage( $message ); // Инициализируем текст сообщения, которе было отправлено боту


Мы уже рассмотрели метод isMuted(), поэтому теперь смело можем его применять. А применять мы его будем для того, чтобы удалять сообщения юзеров, которые были замучены:

if ( $tg->isMuted( $chat_id, $user_id ) )
{

    $tg->deleteMessage( $chat_id, $data['message']['message_id'] );

}

Теперь все сообщения от заткнутых пользователей бот будет автоматически подчищать. 


Далее переходим к реализации самого мута. Чтобы такая привилегия была исключительно у администраторов - проверяем роль пользователя, который ввёл команду, с помощью метода memberStatus():

else if ( str_starts_with( $message, '/' ) )
{



    if ( $tg->memberStatus( $chat_id, $user_id ) )
    {

       // Тут продолжим писать код

    }




}

Условие выполнится только если будет возвращена строка (creator или left). Напомню, что для обычных пользователей возвращается false.


Теперь, когда проверка пройдена - можно раздробить команду на части через пробелы и далее обработать её:

$message_data = explode( ' ', $message );


switch ( $message_data[0] )
{

    case '/мут':
    {
        $tg->mute( $chat_id, $data['message']['reply_to_message']['from']['id'], $message_data[2], $message_data[1], $message_data[3] ?? '' );
        $tg->reply( 'Пользователь заткнут' );

        break;
    }

    case '/размут':
    {
        $tg->unMute( $chat_id, $data['message']['reply_to_message']['from']['id'] );
        $tg->reply( 'Пользователь размучен' );

        break;
    }

}


И на этом, пожалуй, всё 🙃 

bot.zip

  • 5id15
  • 01.09.2022
  • 9 712
  • 1
[PHP] Создание простого Telegram-бота на простой библиотеке.
[PHP] Создание простого Telegram-бота на простой библиотеке.
2-12-2019, 03:21, PHP
Как сделать цепочку сообщений (анкету) для бота ВК на PHP
Как сделать цепочку сообщений (анкету) для бота ВК на PHP
23-06-2022, 16:32, PHP
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
10-08-2022, 20:16, PHP
BOT VK — Использование хранилища (Store) на библиотеке SimpleVK 3.x [Часть 3]
BOT VK — Использование хранилища (Store) на библиотеке SimpleVK 3.x [Часть 3]
22-08-2022, 00:49, PHP
Report-Bot — Предложка для Telegram [Часть 3]
Report-Bot — Предложка для Telegram [Часть 3]
23-08-2022, 20:46, PHP
  1. ГостЪ

    ГостЪ Гость 29 июля 2023 10:06

    Может есть ссылка на github, где залита сама библиотека?

{login}

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

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

Рекламный блок
  • Новости
  • Платная категория
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
    • JS
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
    • Скрипты
Комментарии
Система комментариев на PHP
<Script>Alert("hello");</Script>
Генерация всевозможных комбинаций из набора символов — комбинаторика в Python (itertools)
Qwertyuiopasdfghjklzxcvbnm 1234567890
Система комментариев на PHP
Полезная статья
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Класс, хорошая тема
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Как отключить вывод результата cron в папку modules/cron в Open Server? Крон запускает несколько
Все комментарии..
Полный список последних комментариев
Лучшие новости
Всего публикаций: 115
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 938
Добавлено за сутки: +0
Пользователей: 4124
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

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

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

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

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

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

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