public static async Task <bool> OnCallbackPinMessageAsync(this TelegramService telegramService)
    {
        var chatId = telegramService.ChatId;

        if (!await telegramService.CheckFromAdminOrAnonymous())
        {
            await telegramService.AnswerCallbackQueryAsync("Kamu tidak memiliki izin untuk melakukan tidakan!", true);

            return(true);
        }

        var messageId           = telegramService.GetCallbackDataAt <int>(1);
        var pinMode             = telegramService.GetCallbackDataAt <string>(2);
        var disableNotification = pinMode == "silent";

        var client = telegramService.Client;

        await client.UnpinChatMessageAsync(chatId, messageId);

        await client.PinChatMessageAsync(
            chatId : chatId,
            messageId : messageId,
            disableNotification : disableNotification
            );

        await telegramService.DeleteCurrentCallbackMessageAsync();

        return(true);
    }
    public static async Task <bool> OnCallbackDeleteAsync(this TelegramService telegramService)
    {
        var chatId        = telegramService.ChatId;
        var fromId        = telegramService.FromId;
        var messageTarget = telegramService.GetCallbackDataAt <string>(1);

        Log.Information(
            "Callback delete message at ChatId: {ChatId}. Target: {MessageTarget}",
            chatId,
            messageTarget
            );

        if (!await telegramService.CheckUserPermission())
        {
            Log.Information(
                "UserId: '{UserId}' at ChatId: '{ChatId}' has no permission to delete message",
                fromId,
                chatId
                );

            await telegramService.AnswerCallbackQueryAsync("Kamu tidak mempunyai akses melakukan tindakan ini!", true);

            return(true);
        }

        if (messageTarget == "current-message")
        {
            await telegramService.DeleteCurrentCallbackMessageAsync();
        }
        else
        {
            var messageId = telegramService.GetCallbackDataAt <int>(1);
            await telegramService.DeleteAsync(messageId);
        }

        return(true);
    }
    public static async Task <bool> OnCallbackGlobalBanAsync(this TelegramService telegramService)
    {
        var chatId        = telegramService.ChatId;
        var fromId        = telegramService.FromId;
        var chatUsername  = telegramService.Chat.Username;
        var message       = telegramService.CallbackMessage;
        var callbackDatas = telegramService.CallbackQueryDatas;

        if (!await telegramService.CheckFromAdminOrAnonymous())
        {
            Log.Debug(
                "UserId: {UserId} is not admin at ChatId: {ChatId}",
                fromId,
                chatId
                );

            return(false);
        }

        var globalBanService = telegramService.GetRequiredService <GlobalBanService>();
        var eventLogService  = telegramService.GetRequiredService <EventLogService>();

        var action = telegramService.GetCallbackDataAt <string>(1);
        var userId = telegramService.GetCallbackDataAt <long>(2);

        var replyToMessageId = telegramService.ReplyToMessage?.MessageId ?? -1;

        var answerCallback = string.Empty;

        var messageLog = HtmlMessage.Empty
                         .TextBr("Global Ban di tambahkan baru")
                         .Bold("Ban By: ").CodeBr(fromId.ToString())
                         .Bold("UserId: ").CodeBr(userId.ToString());

        switch (action)
        {
        case "add":
            await globalBanService.SaveBanAsync(
                new GlobalBanItem
            {
                UserId     = userId,
                ReasonBan  = "@" + chatUsername,
                BannedBy   = fromId,
                BannedFrom = chatId,
                CreatedAt  = DateTime.UtcNow
            }
                );

            await globalBanService.UpdateCache(userId);

            await telegramService.KickMemberAsync(userId, untilDate : DateTime.Now.AddSeconds(30));

            await eventLogService.SendEventLogAsync(
                chatId : chatId,
                message : message,
                text : messageLog.ToString(),
                forwardMessageId : replyToMessageId,
                deleteForwardedMessage : true,
                messageFlag : MessageFlag.GBan
                );

            telegramService.DeleteMessageManyAsync(customUserId: userId).InBackground();

            answerCallback = "Berhasil Memblokir Pengguna!";

            break;

        case "del":
            await globalBanService.DeleteBanAsync(userId);

            await globalBanService.UpdateCache(userId);

            answerCallback = "Terima kasih atas konfirmasinya!";

            break;
        }

        await telegramService.AnswerCallbackQueryAsync(answerCallback, true);

        await telegramService.DeleteCurrentCallbackMessageAsync();

        return(true);
    }