Ejemplo n.º 1
0
        public async Task AnswerInlineKeyboard(ITelegramBotClient client, User from, Message message, string answer, CancellationToken cancellationToken)
        {
            var tasks = new List <Task>(2);

            tasks.Add(
                client.EditMessageTextAsync(message.Chat.Id, message.MessageId, string.Format(L10n.strings.InlineQueryAnswerMessage, message.Text, answer), parseMode: ParseMode.Markdown, cancellationToken: cancellationToken)
                );
            tasks.Add(_session.RemoveAsync(message.Chat.Id, cancellationToken));

            if (answer != L10n.strings.YesKeyword)
            {
                await Task.WhenAll(tasks); return;
            }

            tasks.Add(
                client.SendTextMessageAsync(message.Chat.Id, L10n.strings.StoppedBotMessage, cancellationToken: cancellationToken)
                );

            var user = await _userRepository.GetByIdentifierAsync(from.Id, cancellationToken);

            if (user.Identifier != from.Id)
            {
                var authorizedUser = user.AuthorizedUsers.Single(x => x.Identifier == from.Id);
                user.AuthorizedUsers.Remove(authorizedUser);
                _userCache.AddOrUpdate(user);
                tasks.Add(_userRepository.RemoveAuthorizedUserAsync(user.Identifier, authorizedUser, cancellationToken));
            }
            else
            {
                _userCache.Remove(user.Identifier);
                tasks.Add(_userRepository.DeleteAsync(user.Identifier, cancellationToken));
                tasks.Add(_packagesRepository.DeleteByUsernameAsync(user.Username, cancellationToken));
                if (user.AuthorizedUsers?.Any() == true)
                {
                    tasks.Add(
                        client.SendTextMessageAsync(message.Chat.Id, L10n.strings.StoppedBotFollowUpMessage, cancellationToken: cancellationToken)
                        );
                }

                foreach (var authorizedUser in user.AuthorizedUsers)
                {
                    tasks.Add(
                        client.SendTextMessageAsync(
                            authorizedUser.ChatIdentifier,
                            string.Format(L10n.strings.StoppedBotAuthorizedUsersMessage, user.Username),
                            cancellationToken: cancellationToken
                            )
                        );
                }
            }

            await Task.WhenAll(tasks);
        }
        public async Task Handle(ITelegramBotClient client, Message message, CancellationToken cancellationToken)
        {
            var exists = await _userRepository.ExistsAsync(message.From.Id, cancellationToken);

            if (!exists)
            {
                await client.SendTextMessageAsync(
                    chatId : message.Chat,
                    text : L10n.strings.DontKnowYouMessage,
                    replyToMessageId : message.MessageId,
                    cancellationToken : cancellationToken
                    );

                return;
            }

            var password = string.Join(' ', message.Text.Split(' ').Skip(1));

            if (string.IsNullOrEmpty(password))
            {
                await client.SendTextMessageAsync(
                    chatId : message.Chat,
                    text : L10n.strings.EmptyPasswordMessage,
                    replyToMessageId : message.MessageId,
                    cancellationToken : cancellationToken
                    );

                return;
            }

            var user = await _userRepository.GetByIdentifierAsync(message.From.Id, cancellationToken);

            // TODO: investigate false positive
            var result = await _flypack.TestCredentialsAsync(user.Username, password);

            if (!result)
            {
                await client.SendTextMessageAsync(
                    chatId : message.Chat,
                    text : L10n.strings.WrongPasswordMessage,
                    replyToMessageId : message.MessageId,
                    cancellationToken : cancellationToken
                    );

                return;
            }

            var encrypted = _encrypter.Encrypt(password);

            user.Password = encrypted.Password;
            user.Salt     = encrypted.Salt;
            if (user.Identifier == message.From.Id)
            {
                user.FirstName      = message.From.FirstName;
                user.ChatIdentifier = message.Chat.Id;
            }
            else
            {
                var authorizedUser = user.AuthorizedUsers.Single(x => x.Identifier == message.From.Id);
                authorizedUser.FirstName      = message.From.FirstName;
                authorizedUser.ChatIdentifier = message.Chat.Id;
            }

            _userCache.AddOrUpdate(user);
            await _userRepository.UpdateAsync(user, cancellationToken);

            await client.SendTextMessageAsync(
                chatId : message.Chat,
                text : L10n.strings.UpdatedPasswordMessage,
                replyToMessageId : message.MessageId,
                cancellationToken : cancellationToken
                );
        }
Ejemplo n.º 3
0
        public async Task Login(ITelegramBotClient client, Message message, CancellationToken cancellationToken)
        {
            _session.Add(message, message.From.Id, SessionScope.Login);
            var credentials = message.Text.Split(',', 2, StringSplitOptions.RemoveEmptyEntries);

            if (credentials.Length < 2)
            {
                var sent = await client.SendTextMessageAsync(
                    chatId : message.Chat,
                    text : L10n.strings.SendUsernameAndPasswordSecondMessage,
                    parseMode : ParseMode.Markdown,
                    replyMarkup : new ForceReplyMarkup()
                {
                    InputFieldPlaceholder = L10n.strings.UsernameAndPasswordPlaceholder
                },
                    cancellationToken : cancellationToken
                    );

                _session.Add(sent, message.From.Id, SessionScope.Login);
                return;
            }

            var validCredentials = await _flypack.TestCredentialsAsync(credentials[0], credentials[1]);

            if (validCredentials == false)
            {
                var sent = await client.SendTextMessageAsync(
                    chatId : message.Chat,
                    text : L10n.strings.WrongUsernameAndPasswordMessage,
                    parseMode : ParseMode.Markdown,
                    replyMarkup : new ForceReplyMarkup()
                {
                    InputFieldPlaceholder = L10n.strings.UsernameAndPasswordPlaceholder
                },
                    cancellationToken : cancellationToken
                    );

                _session.Add(sent, message.From.Id, SessionScope.Login);
                return;
            }

            foreach (var msg in _session.Get(message.Chat.Id).Messages)
            {
                await client.DeleteMessageAsync(message.Chat, msg.Identifier, cancellationToken);
            }

            await _session.RemoveAsync(message.Chat.Id, cancellationToken);

            await client.SendChatActionAsync(message.Chat, ChatAction.Typing, cancellationToken);

            var loggedUser = await _userRepository.GetAsync(x => x.Username == credentials[0], cancellationToken);

            var authorizedUsers = loggedUser?.AuthorizedUsers ?? new SecondaryUser[] { };

            if (loggedUser != null && authorizedUsers.Count(x => x.Identifier == message.From.Id) == 0)
            {
                await NotifyUserOfLoginAttempt(client, loggedUser, message.From, message.Chat.Id, cancellationToken);

                var sent = await client.SendTextMessageAsync(
                    chatId : message.Chat,
                    text : L10n.strings.AlreadyLoggedInWithThatAccountMessage,
                    parseMode : ParseMode.Markdown,
                    cancellationToken : cancellationToken
                    );

                _session.Add(sent, message.From.Id, SessionScope.Login);
                return;
            }

            var encrypted = _encrypter.Encrypt(credentials[1]);
            var user      = new LoggedUser(message, credentials[0], encrypted.Password, encrypted.Salt);

            _userCache.AddOrUpdate(user);

            var task1 = _userRepository.AddAsync(user, cancellationToken);
            var task2 = client.SendTextMessageAsync(
                chatId: message.Chat,
                text: string.Format(L10n.strings.LoginWelcomeMessage, message.From.FirstName),
                parseMode: ParseMode.Markdown,
                cancellationToken: cancellationToken
                );
            var task3 = _session.RemoveAsync(message.Chat.Id);

            await Task.WhenAll(task1, task2, task3);

            var packages = await _flypack.LoginAndFetchPackagesAsync(credentials[0], credentials[1]);

            await SendPackagesToChat(client, packages, message.From.Id, cancellationToken);
        }