Создание команды только для администраторов
В данном примере разберем как можно использовать внутренний чекер команд для создания методов, которые могут использовать только администраторы.
Для начала нужно создать атрибут, в примере будет использоваться AdminOnlyExampleAttribute. Данным атрибутом будут помечаться те методы, которые могут вызвать только администраторы бота.
namespace ConsoleExample.Attributes
{
internal class AdminOnlyExampleAttribute : Attribute
{
}
}
Создадим чекер AdminExampleChecher, чекер будет проверять, может ли пользователь вызвать метод или нет.
namespace ConsoleExample.Checkers
{
// Обязательно реализовываем интерфейс IInternalCheck.
internal class AdminExampleChecher : IInternalCheck
{
public async Task<InternalCheckResult> Check(PRBotBase bot, Update update, CommandHandler handler)
{
// Из обработчика получаем ссылку на метод.
var method = handler.Command.Method;
// Из методы пытаемся получить наш атрибут.
var adminAttribute = method.GetCustomAttribute<AdminOnlyExampleAttribute>();
if(adminAttribute != null)
{
var userIsAdmin = await bot.IsAdmin(update.GetChatId());
if(!userIsAdmin)
await PRTelegramBot.Helpers.Message.Send(bot.botClient, update.GetChatId(), "Вы не админ!");
// Пользователь админ возращаем результат Passed, что позволяет выполнить метод, иначе выполнение метода будет приостановлено.
return userIsAdmin ? InternalCheckResult.Passed : InternalCheckResult.Custom;
}
return InternalCheckResult.Passed;
}
}
}
При создание бота добавляем наш чекер.
var adminChecker = new InternalChecker(new List<CommandType>() { CommandType.Reply, CommandType.NextStep, CommandType.Inline, CommandType.DynamicReply, CommandType.Slash }, new AdminExampleChecher());
var telegram = new PRBotBuilder("Token")
.SetBotId(0)
.AddCommandChecker(adminChecker)
.Build();
Создаем метод который должен быть доступен только для администраторов. Подставляем созданный нами атрибут.
/// <summary>
/// Команда отработает для бота с botId 0.
/// Команда отработает при написание в чат "Только админы".
/// Пример работы кастомного чекера и кастомного атрибута.
/// </summary>
[AdminOnlyExample]
[ReplyMenuHandler("Только админы")]
public static async Task AdminOnlyExample(ITelegramBotClient botClient, Update update)
{
bool isAdminUpdate = await botClient.IsAdmin(update);
bool isAdminById = await botClient.IsAdmin(update.GetChatId());
await PRTelegramBot.Helpers.Message.Send(botClient, update, $"Вы администратор бота: {isAdminById} {isAdminUpdate}");
}

Это один из примеров как можно использовать чекеры.
Last updated