public async Task GetUsers(long chatId)
        {
            var user = _dbContext.Users.Where(x => x.ChatId == chatId.ToString()).SingleOrDefault();

            if (user == null)
            {
                await Bot.Api.SendTextMessageAsync
                    (chatId,
                    "Подписка не активна.");

                return;
            }
            var clearedPhoneNumber = _phoneHelper.Clear(user.PhoneNumber);

            if (_configService.Config.Admins.Contains(clearedPhoneNumber))
            {
                var result = string.Join("\n", _dbContext.Users.Select(x => $"{x.Username} {_phoneHelper.Format(x.PhoneNumber)}").ToArray());
                await Bot.Api.SendTextMessageAsync
                    (chatId,
                    $"Список активных пользователей:\n{result}");

                await _logger.LogIncoming(LogConst.AdminRequestUsers, _phoneHelper.Format(user.PhoneNumber));

                await _newLogger.LogByType(MessageTypes.System, LogConst.UserRequestSubscribe, _phoneHelper.Format(user.PhoneNumber));

                return;
            }
            await _logger.LogIncoming(LogConst.RequestUsersButPermissionDenied, _phoneHelper.Format(user.PhoneNumber));

            await _newLogger.LogByType(MessageTypes.System, LogConst.RequestUsersButPermissionDenied, _phoneHelper.Format(user.PhoneNumber));
        }
Beispiel #2
0
        public async Task RequestSubscribe(long chatId, string username)
        {
            var user = _dbContext.Users.Where(x => x.ChatId == chatId.ToString()).SingleOrDefault();

            if (user != null)
            {
                await Bot.Api.SendTextMessageAsync(chatId,
                                                   _configService.Config.AlreadySubscribedMessage);

                await _logger.LogAuth(LogConst.UserAlreadySubscribetButSendStart, _phoneHelper.Format(user.PhoneNumber));

                await _newLogger.LogByType(MessageTypes.Incoming, LogConst.UserRequestSubscribe, user.PhoneNumber);

                return;
            }

            await Bot.Api.SendTextMessageAsync
                (chatId,
                _configService.Config.HelloMessage,
                replyMarkup : phoneNumberKeyboard);

            await _logger.LogAuth(LogConst.UserRequestSubscribe, username);

            await _newLogger.LogByType(MessageTypes.Auth, LogConst.UserRequestSubscribe, username);
        }
        public async Task Process(CancellationToken cancellation)
        {
            var errorList       = new List <string>();
            var sendedList      = new List <SendedMessage>();
            var isErrorSended   = false;
            var isSuccessSended = false;

            try
            {
                if (!CheckEnable())
                {
                    _toFileLogger.LogInformation("Sendidng stoped. Do nothing.");
                    await _logger.LogSended(LogConst.SendedStopedDoNothing, null);

                    await _newLogger.LogByType(MessageTypes.System, LogConst.SendedStopedDoNothing);

                    return;
                }
                _toFileLogger.LogInformation("Start sending...");
                await _logger.LogSystem(LogConst.StartSending, null);

                await _newLogger.LogByType(MessageTypes.System, LogConst.StartSending);

                if (!IsListValid())
                {
                    await _logger.LogError(LogConst.InvalidConfig);

                    await _newLogger.LogByType(MessageTypes.Errors, LogConst.InvalidConfig);

                    return;
                }
                var rows = await _messageDataSource.GetMessages(_config);

                var sendedMesageCount = 0;
                if (rows != null)
                {
                    var rowsForUpdate = new Dictionary <string, List <INeedSend> >();
                    foreach (var message in rows.OrderBy(x => x.LastModifiedDate))
                    {
                        {
                            var text = message.Text;
                            if (message.To == null)
                            {
                                var list            = message.CellForUpdate.Substring(0, message.CellForUpdate.IndexOf('!'));                                                  // Regex.Match(message.CellForUpdate, @"/^(.*?)\!/").Groups[0];
                                var cellWithoutList = message.CellForUpdate.Substring(message.CellForUpdate.IndexOf('!') + 1, message.CellForUpdate.Length - list.Length - 1); // Regex.Match(message.CellForUpdate, @"/[^!]*$/").Groups[0];
                                var rownum          = Regex.Match(cellWithoutList, @"\d+").Value;
                                var errNoPhone      = $"У пользователя в таблице {message.Table } на листе {list} в строке {rownum} не указан номер телефона, сообщение НЕ отправлено!";
                                errorList.Add(errNoPhone);
                                await _newLogger.LogByType(MessageTypes.Errors, errNoPhone);

                                continue;
                            }

                            //TODO! Validation to separate service
                            if (_phoneHelper.IsPhone(message.To))
                            {
                                message.To = _phoneHelper.Format(message.To);
                            }

                            if (string.IsNullOrEmpty(message.Text))
                            {
                                var list            = message.CellForUpdate.Substring(0, message.CellForUpdate.IndexOf('!'));                                                  // Regex.Match(message.CellForUpdate, @"/^(.*?)\!/").Groups[0];
                                var cellWithoutList = message.CellForUpdate.Substring(message.CellForUpdate.IndexOf('!') + 1, message.CellForUpdate.Length - list.Length - 1); // Regex.Match(message.CellForUpdate, @"/[^!]*$/").Groups[0];
                                var rownum          = Regex.Match(cellWithoutList, @"\d+").Value;
                                var errEmptyMessage = $"В таблице {message.Table } на листе {list} в строке {rownum} пустое сообщение. Из этой строки ничего не отправляю!";
                                errorList.Add(errEmptyMessage);
                                await _newLogger.LogByType(MessageTypes.Errors, errEmptyMessage);

                                continue;
                            }

                            var senderAgent = _senderAgentProvider.Resolve(message.SenderType);
                            var sendResult  = await senderAgent.Send(message);

                            if (sendResult.IsSuccess)
                            {
                                sendedList.Add(new SendedMessage()
                                {
                                    Message = message.Text,
                                    To      = message.To
                                });
                                await _newLogger.LogByType(MessageTypes.Outgoing, $"На {message.SenderType} : {message.Text}", _phoneHelper.Clear(message.To));

                                if (!rowsForUpdate.ContainsKey(message.Table))
                                {
                                    rowsForUpdate[message.Table] = new List <INeedSend>();
                                }
                                rowsForUpdate[message.Table].Add(message);
                                sendedMesageCount++;
                            }
                            else
                            {
                                var sendErr = $"Не удалось отправить сообщение пользователю {message.To}. Ошибка: {sendResult.Error}";
                                errorList.Add(sendErr);
                                await _newLogger.LogByType(MessageTypes.Errors, sendErr);
                            }
                        }
                    }

                    if (rowsForUpdate.Count > 0)
                    {
                        foreach (var item in rowsForUpdate)
                        {
                            var updateResult = await _messageDataSource.UpdateMessageStatus(item.Value);
                        }
                    }
                    await _logger.LogErrorList(errorList);

                    isErrorSended = true;
                    await _logger.LogSendedList(sendedList);

                    isSuccessSended = true;
                }
                var sendingEnded = $"Отправка сообщений закончена. Сообщений отправлено: {sendedMesageCount}";
                await _logger.LogSystem(sendingEnded, null);

                await _newLogger.LogByType(MessageTypes.System, sendingEnded);

                _toFileLogger.LogInformation($"End sending. Message count: {sendedMesageCount}");
            }
            catch (Exception err)
            {
                _toFileLogger.LogError(err, err.Message);
                if (!isErrorSended)
                {
                    await _logger.LogErrorList(errorList);
                }
                if (!isSuccessSended)
                {
                    await _logger.LogSendedList(sendedList);
                }
                var errToLog = $"Произошла непредвиденная ошибка во время отправки сообщений! Подробнее: {err.Message} . Stack Trace : {err.StackTrace}";
                await _newLogger.LogByType(MessageTypes.SystemErrors, errToLog);

                await _logger.LogError(errToLog);
            }
        }