public async Task ProcessTransaction(object transaction, ITelegramBotClient botClient, ILogger logger, IDbContext db)
        {
            var currentTransaction = transaction as FeedbackTransactionModel;

            await botClient.ForwardMessageAsync(new ChatId(Constants.FeedbackChannelId),
                                                currentTransaction.Message.From.Id,
                                                currentTransaction.Message.MessageId);

            (transaction as BaseTransactionModel).IsComplete = true;
            return;
        }
示例#2
0
        public override async Task Execute(BunkerUser user, ITelegramBotClient client)
        {
            Room room = Program.rooms.GetRoomByPlayer(user);

            int size = room.Players.Count;

            if (size == 1)
            {
                Program.SendMessage(user, "You must have at least 2 players to start a poll!");
            }
            else
            {
                string[] options = new string[size];

                for (int i = 0; i < size; i++)
                {
                    options[i] = $"{room.Players[i].NickName}";
                }

                var pollInt = await client.SendPollAsync(room.Players[0].ChatID, "Whom to quit", options);

                for (int i = 1; i < size; i++)
                {
                    await client.ForwardMessageAsync(room.Players[i].ChatID, pollInt.Chat.Id, pollInt.MessageId);
                }

                await Task.Delay(20000);

                var stoppedPoll = await client.StopPollAsync(pollInt.Chat.Id, pollInt.MessageId);

                int max = 0;

                string name = "";

                foreach (PollOption option in stoppedPoll.Options)
                {
                    if (option.VoterCount > max)
                    {
                        max  = option.VoterCount;
                        name = option.Text;
                    }
                }

                BunkerUser player = room.GetPlayerByName(name);
                room.RemovePlayer(player);
            }
        }
示例#3
0
        private async Task <bool> IsRepostedMessageDeletedInChat(RepostedMessage repostedMessage)
        {
            var technicalChatId = _settings.TechnicalChatId;
            var result          = true;

            try
            {
                var forwarded = await _telegram.ForwardMessageAsync(
                    technicalChatId,
                    repostedMessage.From.ChatId,
                    repostedMessage.From.MessageId,
                    true);

                result = false;
                await _telegram.DeleteMessageAsync(forwarded.Chat.Id, forwarded.MessageId);
            }
            catch (Exception exception) when(exception.Message == "Bad Request: message to forward not found")
            {
                var e = exception;
            }

            return(result);
        }
        private async Task <bool> IsRepostedMessageDeletedInChat(RepostedMessage repostedMessage)
        {
            // Again, can't change it without debugging, probably checking message existence is enough
            var technicalChatId = _settings.TechnicalChatId;

            try
            {
                var forwarded = await _telegram.ForwardMessageAsync(
                    technicalChatId,
                    repostedMessage.From.ChatId,
                    repostedMessage.From.MessageId,
                    true);

                await _telegram.DeleteMessageAsync(forwarded.Chat.Id, forwarded.MessageId);

                return(false);
            }
            catch (Exception exception) when(exception.Message == "Bad Request: message to forward not found")
            {
                var e = exception;
            }

            return(true);
        }
示例#5
0
        static async void Bot_OnMessage(object sender, MessageEventArgs e)
        {
            var  user = e.Message.From;
            var  chat = e.Message.Chat;
            User localUser;

            if (chat.Id == 484323184)
            {
                SendMessage(chat, "пошел нахуй дима");
                return;
            }

            if (DBHandler.ContainsUser(user.Id))
            {
                localUser = DBHandler.GetUserById(user.Id);
            }
            else
            {
                localUser = new User(user.Id, user.Username, user.FirstName, user.LastName);
                localUser = DBHandler.AddNewUser(localUser);
                Logger.Log($"Created new user {user.Username}");
            }

            switch (e.Message.Type)
            {
            case MessageType.Photo:
                Logger.Log($"{user} sent a photo message");
                Logger.Log($"Forwarding to bot owner, id - {ownerChatId}");
                await BotClient.ForwardMessageAsync(ownerChatId, chat, e.Message.MessageId);

                SendMessage(chat, "Принято ;)");
                break;

            case MessageType.Video:
                Logger.Log($"{user} sent a video message");
                Logger.Log($"Forwarding to bot owner, id - {ownerChatId}");
                await BotClient.ForwardMessageAsync(ownerChatId, chat, e.Message.MessageId);

                SendMessage(chat, "Принято ;)");
                break;

            case MessageType.Voice:
                Logger.Log($"{user} sent a voice message");
                Logger.Log($"Forwarding to bot owner, id - {ownerChatId}");
                await BotClient.ForwardMessageAsync(ownerChatId, chat, e.Message.MessageId);

                SendMessage(chat, "Принято ;)");
                break;

            case MessageType.VideoNote:
                Logger.Log($"{user} sent a video note message");
                Logger.Log($"Forwarding to bot owner, id - {ownerChatId}");
                await BotClient.ForwardMessageAsync(ownerChatId, chat, e.Message.MessageId);

                SendMessage(chat, "Принято ;)");
                break;

            case MessageType.Text:

                Logger.Log(
                    $"{user} sent a text message");
                Logger.Log(e.Message.Text);

                string textToSend;

                if (MesWaitList != null)
                {
                    if (MesWaitList.Contains(user))
                    {
                        Logger.Log($"{user} listed in message wait list");
                        if (e.Message.Text == "/cancel")
                        {
                            Logger.Log($"{user} sent /cancel so aborting operation");
                            MesWaitList.Remove(user);
                            textToSend = "Отправка сообщения Вашему Тайному Санте отменена";
                            SendMessage(chat, textToSend);
                        }
                        else
                        {
                            var santaId = DBHandler.findSantaId(user);
                            if (santaId == 0)
                            {
                                Logger.Log("Error: santa ID didnt found");
                                return;
                            }

                            Logger.Log($"{user} Santa ID found - {santaId}, forwarding message to him");
                            SendMessage(santaId, "Вам сообщение от Вашей цели:");
                            await BotClient.ForwardMessageAsync(santaId, chat, e.Message.MessageId);

                            textToSend = "Ваше сообщение успешно переслано!";
                            SendMessage(chat, textToSend);
                            MesWaitList.Remove(user);
                        }
                    }
                }

                switch (e.Message.Text)
                {
                case "/start":
                    SendIntroMessages(chat, user);

                    await Task.Delay(TimeSpan.FromSeconds(4));

                    SendMemo(chat, user);

                    if (IsInSecondStage)
                    {
                        textToSend = "К сожалению регистрация уже закрыта";
                        SendMessage(chat, textToSend);
                    }
                    else
                    {
                        switch (localUser.State)
                        {
                        case States.NewUser:
                            textToSend = "Чтобы начать регистрацию отправьте команду /start_registration";
                            SendMessage(chat, textToSend);
                            break;

                        case States.RegistrationStarted:
                            AskProfileQuestion(chat, user, localUser);
                            break;
                        }
                    }

                    break;

                case "/send_memo":
                    SendMemo(chat, user);
                    break;

                case "/send_my_profile":
                    SendUserProfile(chat, localUser, user);
                    break;

                case "/send_target_profile":
                    Logger.Log($"{user} asked for target profile");
                    if (IsInSecondStage)
                    {
                        if (localUser.State == States.TargetChosen || localUser.State == States.TargetSent)
                        {
                            SendTargetProfile(chat, localUser, DBHandler.GetUserById(localUser.TargetId));
                        }
                        else
                        {
                            Logger.Log(
                                $"{user} asked for target profile but he has no target, sending info message");
                            SendMessage(chat, "Извините, Вам не назначена цель, если Вам нужна помощь - " +
                                        "пишите в наш аккаунт поддержки @bIudger");
                        }
                    }
                    else
                    {
                        Logger.Log("But bot isnt in second stage, ignoring");
                    }

                    break;

                case "/start_registration":
                    Logger.Log($"{user} asked for starting registration");

                    if (IsInSecondStage)
                    {
                        Logger.Log($"{user} But bot is in second stage, sending refuse message");
                        textToSend = "Извините, регистрация уже закончилась";
                        SendMessage(chat, textToSend);
                    }
                    else
                    {
                        if (localUser.State == States.RegistrationCompleted ||
                            localUser.State == States.TargetChosen ||
                            localUser.State == States.TargetSent)
                        {
                            Logger.Log($"{user} But he completed his registration already");
                            textToSend =
                                "Вы уже завершили регистрацию, если вы хотите начать регистрацию заново, " +
                                "то сначала отмените прежнюю отправив команду /abort_registration ";
                            SendMessage(chat, textToSend);
                        }
                        else if (localUser.State == States.RegistrationStarted)
                        {
                            Logger.Log($"{user} But he started his registration already");
                            textToSend = "Вы уже начали регистрацию. Чтобы отменить нынешнюю регистрацию " +
                                         "отправьте команду /abort_registration, либо же /confirm_registration " +
                                         "чтобы завершить нынешнюю";
                            SendMessage(chat, textToSend);
                        }
                        else if (localUser.State == States.NewUser)
                        {
                            Logger.Log($"{user} has state NewUser. Starting registration");
                            localUser.State = States.RegistrationStarted;
                            localUser.Stage = Stages.None;
                            DBHandler.WriteCount();

                            Logger.Log($"{user}Asking a question");
                            AskProfileQuestion(chat, user, localUser);
                        }
                    }

                    break;

                case "/confirm_registration":
                    Logger.Log($"{user} asked for confirming registration");

                    if (IsInSecondStage)
                    {
                        Logger.Log($"But bot is in second stage, sending refuse message");
                        textToSend = "Извините, регистрация уже закончилась";
                        SendMessage(chat, textToSend);
                    }
                    else
                    {
                        if (localUser.State == States.RegistrationCompleted ||
                            localUser.State == States.TargetChosen ||
                            localUser.State == States.TargetSent)
                        {
                            Logger.Log("But he completed his registration already");
                            textToSend = "Вы уже завершили регистрацию. :)";
                            SendMessage(chat, textToSend);
                        }
                        else if (localUser.State == States.NewUser)
                        {
                            Logger.Log("But he didnt start registration");
                            textToSend = "Вы еще не начинали регистрацию, чтобы начать регистрацию " +
                                         "отправьте /start_registration";
                            SendMessage(chat, textToSend);
                        }
                        else if (localUser.State == States.RegistrationStarted)
                        {
                            if (localUser.Stage == Stages.StageBan)
                            {
                                Logger.Log($"{user} has Stage Ban so compliting his registration");
                                textToSend =
                                    "Поздравляем, Вы успешно всё заполнили и теперь остается только ждать, " +
                                    "когда бот пришлет анкету Вашей жертвы. Если Вам нужна будет помощь " +
                                    "или есть какие-то серьезные вопросы, то пишите сюда @bIudger. Для того " +
                                    "чтобы еще раз посмотреть памятку по датам отправьте команду /send_memo, " +
                                    "для того чтобы посмотреть свою анкету отправьте команду " +
                                    "/send_my_profile, чтобы изменить что-то в анкете отправьте " +
                                    "/abort_registration и заполните ее заново 👹";
                                SendMessage(chat, textToSend);

                                localUser.State = States.RegistrationCompleted;
                                DBHandler.WriteCount();
                                Logger.Log($"{user} Set State to RegistrationCompleted");
                            }
                            else
                            {
                                Logger.Log(
                                    $"{user} has another than Ban Stage so cant complite his registration");
                                textToSend =
                                    "Вы еще не закончили регистрацию, пожалуйста заполните анкету до конца.";
                                SendMessage(chat, textToSend);

                                await Task.Delay(TimeSpan.FromSeconds(0.2));

                                AskProfileQuestion(chat, user, localUser);
                            }
                        }
                    }

                    break;

                case "/abort_registration":
                    Logger.Log($"{user} asked for aborting registration");

                    if (IsInSecondStage)
                    {
                        Logger.Log($"But bot is in second stage, sending refuse message");
                        textToSend = "Извините, регистрация уже закончилась";
                        SendMessage(chat, textToSend);
                    }
                    else
                    {
                        if (localUser.State == States.TargetChosen ||
                            localUser.State == States.TargetSent)
                        {
                            Logger.Log("But he had recieve target so his profile cant be deleted");
                            textToSend = "Вы уже получили анкету цели и не можете удалить свою анкету. " +
                                         "Если Вам необходима помощь - обращайтесь в наш аккаунт поддержки @bIudger";
                            SendMessage(chat, textToSend);
                        }
                        else if (localUser.State == States.NewUser)
                        {
                            Logger.Log("But he didnt start registration");
                            textToSend = "Вы еще не начинали регистрацию, чтобы начать регистрацию " +
                                         "отправьте /start_registration";
                            SendMessage(chat, textToSend);
                        }
                        else
                        {
                            textToSend =
                                "Вы хотите отменить регистрацию. Это очистит все поля в вашей анкете, вы уверены?\n" +
                                "Для подтверждения отправьте команду /confirm_abort_registration";
                            SendMessage(chat, textToSend);
                        }
                    }

                    break;

                case "/confirm_abort_registration":
                    Logger.Log($"{user} tried to confirm aborting registration");

                    if (IsInSecondStage)
                    {
                        Logger.Log($"But bot is in second stage, sending refuse message");
                        textToSend = "Извините, регистрация уже закончилась";
                        SendMessage(chat, textToSend);
                    }
                    else
                    {
                        if (localUser.State == States.TargetChosen ||
                            localUser.State == States.TargetSent)
                        {
                            Logger.Log("But he had recieve target so his profile cant be deleted");
                            textToSend = "Вы уже получили анкету цели и не можете удалить свою анкету. " +
                                         "Если Вам необходима помощь - обращайтесь в наш аккаунт поддержки @bIudger";
                            SendMessage(chat, textToSend);
                        }
                        else if (localUser.State == States.NewUser)
                        {
                            Logger.Log("But he didnt start registration");
                            textToSend = "Вы еще не начинали регистрацию, чтобы начать регистрацию " +
                                         "отправьте /start_registration";
                            SendMessage(chat, textToSend);
                        }
                        else
                        {
                            Logger.Log("Wiping user answers...");
                            localUser.OfficialName = null;
                            Logger.Log("--OfficialName");
                            localUser.Phone = null;
                            Logger.Log("--Phone");
                            localUser.Post = null;
                            Logger.Log("--Post");
                            localUser.FanOf = null;
                            Logger.Log("--FanOf");
                            localUser.Ban = null;
                            Logger.Log("--Ban");
                            Logger.Log("Done");
                            DBHandler.WriteCount();

                            localUser.State = States.NewUser;
                            localUser.Stage = Stages.None;
                            DBHandler.WriteCount();

                            Logger.Log($"{user} Successfully wiped profile");
                            textToSend = "Ваша анкета очищена и статус регистрации сброшен. " +
                                         "Чтобы начать регистрацию отправьте команду /start_registration";
                            SendMessage(chat, textToSend);

                            await Task.Delay(TimeSpan.FromSeconds(0.2));

                            SendUserProfile(chat, localUser, user);
                        }
                    }

                    break;

                case "/send_message_to_santa":
                    Logger.Log($"{user} askes to send message to santa");

                    if (!IsInSecondStage)
                    {
                        Logger.Log($"{user} But bot isnt in second stage, sending refuse message");
                        textToSend = "Извините, регистрация еще не закончилась";
                        SendMessage(chat, textToSend);
                    }
                    else
                    {
                        if (localUser.State != States.TargetSent)
                        {
                            Logger.Log($"{user} But he had not recieve target, sending refuse message");
                            textToSend = "Извините, вы не учавствуете в тайном санте. " +
                                         "Если Вам необходима помощь - обращайтесь в наш аккаунт поддержки @bIudger";
                            SendMessage(chat, textToSend);
                        }
                        else
                        {
                            Logger.Log($"{user} Asking for message for santa");
                            textToSend = "Следующее Ваше сообщение (только первое) будет отправлено " +
                                         "Вашему Тайному Санте. Чтобы отменить это отправьте /cancel.";
                            SendMessage(chat, textToSend);

                            Logger.Log($"{user} Adding user to MesWaitList");
                            if (MesWaitList == null)
                            {
                                MesWaitList = new List <Telegram.Bot.Types.User> {
                                    user
                                };
                            }
                            else
                            {
                                MesWaitList.Add(user);
                            }
                        }
                    }

                    break;

                // TODO non-in-registration response

                default:
                    if (localUser.State == States.RegistrationStarted)
                    {
                        Logger.Log($"{user} is in State RegistrationStarted");
                        if (IsInSecondStage)
                        {
                            Logger.Log($"{user} But bot is in second stage, ignoring");
                        }
                        else
                        {
                            switch (localUser.Stage)
                            {
                            case Stages.None:
                                Logger.Log($"{user} is on None stage, saving his answer to Name");
                                localUser.OfficialName = e.Message.Text;
                                Logger.Log($"{user} setting Stage to Name");
                                localUser.Stage = Stages.StageOffName;
                                DBHandler.WriteCount();
                                AskProfileQuestion(chat, user, localUser);
                                break;

                            case Stages.StageOffName:
                                Logger.Log($"{user} is on Name stage, saving his answer to Phone");
                                localUser.Phone = e.Message.Text;
                                Logger.Log($"{user} setting Stage to Phone");
                                localUser.Stage = Stages.StagePhone;
                                DBHandler.WriteCount();
                                AskProfileQuestion(chat, user, localUser);
                                break;

                            case Stages.StagePhone:
                                Logger.Log($"{user} is on Phone stage, saving his answer to Post");
                                localUser.Post = e.Message.Text;
                                Logger.Log($"{user} setting Stage to Post");
                                localUser.Stage = Stages.StagePost;
                                DBHandler.WriteCount();
                                AskProfileQuestion(chat, user, localUser);
                                break;

                            case Stages.StagePost:
                                Logger.Log($"{user} is on Post stage, saving his answer to Fan");
                                localUser.FanOf = e.Message.Text;
                                Logger.Log($"{user} setting Stage to Fan");
                                localUser.Stage = Stages.StageFan;
                                DBHandler.WriteCount();
                                AskProfileQuestion(chat, user, localUser);
                                break;

                            case Stages.StageFan:
                                Logger.Log($"{user} is on Fan stage, saving his answer to Ban");
                                localUser.Ban = e.Message.Text;
                                Logger.Log($"{user} setting Stage to Ban");
                                localUser.Stage = Stages.StageBan;
                                DBHandler.WriteCount();
                                AskProfileQuestion(chat, user, localUser);
                                break;

                            case Stages.StageBan:
                                Logger.Log(
                                    $"{user} is on Ban stage, sending him info about registration confirmation");
                                textToSend =
                                    "Проверьте Вашу анкету еще раз потому, что после подтверждения " +
                                    "изменить ответы через бот невозможно:";
                                SendMessage(chat, textToSend);

                                await Task.Delay(TimeSpan.FromSeconds(0.2));

                                SendUserProfile(chat, localUser, user);

                                await Task.Delay(TimeSpan.FromSeconds(0.2));

                                textToSend = "Если все хорошо, то нажмите команду /confirm_registration " +
                                             "если же хотите что-то изменить, то нажмите команду /abort_registration " +
                                             "и заполните заново 👹";
                                SendMessage(chat, textToSend);
                                break;
                            }
                        }
                    }

                    break;
                }

                break;

            default:
                Logger.Log($"{user} sent a {e.Message.Type} message");
                Logger.Log($"Unresolved type, sending warning message");
                SendMessage(chat, "Извините, бот не принимает таких сообщений, " +
                            "если Вам необходима помощь - обращайтесь в наш аккаунт поддержки @bIudger ");
                break;
            }
        }
示例#6
0
    public async Task SendEventLogCoreAsync(
        string sendText,
        long chatId                 = -1,
        bool disableWebPreview      = false,
        int replyToMessageId        = -1,
        int forwardMessageId        = -1,
        bool deleteForwardedMessage = false,
        bool sendGlobalOnly         = false
        )
    {
        var eventLogTargets = await GetEventLogTargets(chatId, sendGlobalOnly);

        foreach (var eventLogTarget in eventLogTargets)
        {
            try
            {
                if (forwardMessageId > 0)
                {
                    var forwardMessage = await _botClient.ForwardMessageAsync(
                        chatId : eventLogTarget,
                        fromChatId : chatId,
                        messageId : forwardMessageId
                        );

                    replyToMessageId = forwardMessage.MessageId;

                    if (deleteForwardedMessage)
                    {
                        await _botClient.DeleteMessageAsync(
                            chatId : chatId,
                            messageId : forwardMessageId
                            );
                    }
                }
            }
            catch (Exception forwardMessageException)
            {
                Log.Warning(
                    "Fail forward MessageId: {MessageId} at ChatId: {ChatId}. Message: {Message}",
                    forwardMessageId,
                    chatId,
                    forwardMessageException.Message
                    );
            }

            try
            {
                var sentEventLog = await _botClient.SendTextMessageAsync(
                    chatId : eventLogTarget,
                    text : sendText,
                    allowSendingWithoutReply : true,
                    disableWebPagePreview : disableWebPreview,
                    replyToMessageId : replyToMessageId,
                    parseMode : ParseMode.Html
                    );

                Log.Information(
                    "Send EventLog Successfully to ChatId: {ChatId}, Sent MessageId: {MessageId}",
                    eventLogTarget,
                    sentEventLog.MessageId
                    );
            }
            catch (Exception sendEventLogException)
            {
                Log.Error(
                    sendEventLogException,
                    "Fail send EventLog to ChatId: {ChatId}",
                    eventLogTarget
                    );
            }
        }
    }