Ограниченный доступ к командам

Работа с набором привилегий

PRTelegram бот позволяет обрабатывать команды в зависимости от привилегий пользователей.

Для начала создадим перечисление UserPrivilege, которое будет отмечено атрибутом [Flags]. Для тех кто не знаком, что за атрибут Flags, посмотрите статью по этой ссылке.

/// <summary>
/// Привилегии пользователей
/// </summary>
[Flags]
public enum UserPrivilege
{
    [Description("Гость")]
    Guest = 1,
    [Description("Зарегистрированный")]
    Registered = 2,
    [Description("Администратор")]
    Admin = 4,
    [Description("VIP")]
    VIP = 8,
    [Description("Модератор")]
    Moderator = 16,
}

Создадим метод который хотим ограничить для выполнения определенных пользователей

/// <summary>
/// Команда отработает для бота с botId 0.
/// Команда отработает при написание в чат "Проверка доступа".
/// Перед выполнение метода срабатывает событие проверки привилегий <see cref="ExampleEvent.OnCheckPrivilege"/>
/// </summary>
[Access((int)(UserPrivilege.Guest | UserPrivilege.Registered))]
[ReplyMenuHandler("Проверка доступа")]
public static async Task ExampleAccess(ITelegramBotClient botClient, Update update)
{
    string msg = nameof(ExampleAccess);
    await Helpers.Message.Send(botClient, update, msg);
}

Для проверки привилегий используется атрибут Access, который принимает в себя int значение. Это сделано для того чтобы можно было создавать свои перечисления со своим набором привилегий. Принцип работы, закидываем привилегии в виде флагов и преобразуем в int, а потом обратно из int в флаги.

Так же для примера создадим метод расширения заглушку:

public static UserPrivilege LoadExampleFlagPrivilege(this Update update)
{
    return UserPrivilege.Registered;
}

После создания нового экземпляра класса PRBot мы должны подписаться на события проверки привилегий.

telegram.Events.OnCheckPrivilege += OnCheckPrivilege;
 
/// <summary>
/// Событие проверки привилегий пользователя
/// </summary>
/// <param name="callback">callback функция выполняется в случае успеха</param>
/// <param name="mask">Маска доступа</param>
/// Подписка на событие проверки привелегий <see cref="Program"/>
public static async Task OnCheckPrivilege(PrivilegeEventArgs e)
{
    if(!e.Mask.HasValue)
    {
        // Нет маски доступа, выполняем метод.
        await e.ExecuteMethod(e.BotClient, e.Update);
        return;
    }

    // Получаем значение маски требуемого доступа.
    var requiredAccess = e.Mask.Value;

    // Получаем флаги доступа пользователя.
    // Здесь вы на свое усмотрение реализываете логику получение флагов, например можно из базы данных получить.
    var userFlags = e.Update.LoadExampleFlagPrivilege();

    if(requiredAccess.HasFlag(userFlags))
    {
        // Доступ есть, выполняем метод.
        await e.ExecuteMethod(e.BotClient, e.Update);
        return;
    }

    // Доступа нет.
    string errorMsg = "У вас нет доступа к данной функции";
    await Helpers.Message.Send(e.BotClient, e.Update, errorMsg);
    return;

}

Результаты работы:

Last updated