예제 #1
0
        public async Task CheckSocials(IDialogContext context, LuisResult result)
        {
            PostTelemetryCustomEvent("hello", 0, false);
            BotDB botDB   = new BotDB();
            var   message = botDB.GetString(null, "simplifai.intent.CheckSocials");

            BotDbAnalytics.UpdateAnalyticDatabase(result.Intents[0].Intent, (double)result.Intents[0].Score);
            await context.PostAsync(BotDbStrings.MakeItAcceptable(message));

            context.Wait(MessageReceived);
        }
 public bool IsAccountCanStopBot(BotDB bot, int accountId)
 {
     if (bot == null)
     {
         throw new ArgumentNullException(nameof(bot));
     }
     if (accountId == default)
     {
         throw new ArgumentOutOfRangeException(nameof(accountId));
     }
     return(bot.OwnerId == accountId);
 }
        public IActionResult Settings(int botId)
        {
            BotDB bot = _contextDb.Bots.Find(botId);

            ViewData["sum"] = 0;

            ViewData["botId"]         = botId;
            ViewData["botType"]       = bot.BotType;
            ViewData["usersCount"]    = 0;
            ViewData["ordersCount"]   = 0;
            ViewData["messagesCount"] = 0;

            return(View());
        }
        public BotStartMessage StartBot(int botId, int accountId)
        {
            BotStartMessage result;
            BotDB           bot = dbContext.Bots.Find(botId);

            //Такой бот существует?
            if (bot == null)
            {
                result = new BotStartMessage
                {
                    Success       = false,
                    FailureReason = BotStartFailureReason.BotWithSuchIdDoesNotExist
                };
                return(result);
            }

            //Аккаунт может запускать бота?
            bool accountCanRunABot = accessCheckService.IsAccountCanRunBot(bot, accountId);

            if (!accountCanRunABot)
            {
                logger.Log(LogLevel.WARNING,
                           Source.WEBSITE_BOTS_AIRSTRIP_SERVICE,
                           "Попытка запуска бота аккаунтом, который не имеет к нему доступа.",
                           accountId);
                result = new BotStartMessage
                {
                    Success       = false,
                    FailureReason = BotStartFailureReason.NoAccessToThisBot
                };
                return(result);
            }

            //У собственника бота есть деньги?
            Account botOwner = dbContext.Accounts.Find(bot.OwnerId);

            if (botOwner.Money <= 0)
            {
                logger.Log(LogLevel.WARNING,
                           Source.WEBSITE_BOTS_AIRSTRIP_SERVICE,
                           "Попытка запуска бота с маленьким количеством средств на счету.",
                           accountId: accountId);

                result = new BotStartMessage
                {
                    Success       = false,
                    FailureReason = BotStartFailureReason.NotEnoughFundsInTheAccountOfTheBotOwner
                };

                return(result);
            }

            //без токена запускаться нельзя
            if (bot.Token == null)
            {
                logger.Log(LogLevel.USER_INTERFACE_ERROR_OR_HACKING_ATTEMPT, Source.WEBSITE,
                           $"Попытка запутить бота без токена. botId={botId}");
                result = new BotStartMessage
                {
                    Success       = false,
                    FailureReason = BotStartFailureReason.TokenMissing
                };
                return(result);
            }

            //без разметки запускаться нельзя
            if (bot.Markup == null)
            {
                logger.Log(LogLevel.USER_INTERFACE_ERROR_OR_HACKING_ATTEMPT, Source.WEBSITE,
                           $"Попытка запутить бота без разметки. botId={botId}");
                result = new BotStartMessage
                {
                    Success       = false,
                    FailureReason = BotStartFailureReason.NoMarkupData
                };
                return(result);
            }

            //Если бот уже запущен, вернуть ошибку
            RouteRecord existingRecord = dbContext.RouteRecords.Find(botId);

            if (existingRecord != null)
            {
                logger.Log(LogLevel.USER_INTERFACE_ERROR_OR_HACKING_ATTEMPT, Source.WEBSITE,
                           $"Попытка запутить запущенного бота.");
                result = new BotStartMessage
                {
                    Success       = false,
                    FailureReason = BotStartFailureReason.ThisBotIsAlreadyRunning
                };
                return(result);
            }

            //Попытка запуска
            try
            {
                string forestAnswer = forestNegotiatorService.SendStartBotMessage(botId);

                JObject answer = (JObject)JsonConvert.DeserializeObject(forestAnswer);

                bool   successfulStart = (bool)answer["success"];
                string failMessage     = (string)answer["failMessage"];

                //Лес вернул ок?
                if (!successfulStart)
                {
                    result = new BotStartMessage
                    {
                        Success         = false,
                        FailureReason   = BotStartFailureReason.ServerErrorWhileStartingTheBot,
                        ForestException = failMessage
                    };
                    return(result);
                }

                //Лес сохранил данные для про запуск в БД?
                RouteRecord rr = dbContext.RouteRecords.SingleOrDefault(record => record.BotId == botId);
                if (rr == null)
                {
                    return(new BotStartMessage
                    {
                        Success = false,
                        FailureReason = BotStartFailureReason.ServerErrorWhileStartingTheBot
                    });
                }

                //Ну тоды всё хорошо.
                return(new BotStartMessage {
                    Success = true
                });
            }
            catch (Exception ex)
            {
                logger.Log(LogLevel.ERROR, Source.WEBSITE, $"Не удалось запустить бота. botId={botId}. " +
                           $"ex.Message={ex.Message}");
                result = new BotStartMessage
                {
                    Success       = false,
                    FailureReason = BotStartFailureReason.ConnectionError
                };
                return(result);
            }
        }
        public BotStopMessage StopBot(int botId, int accountId)
        {
            //Такой бот существует?
            BotDB bot = dbContext.Bots.Find(botId);

            if (bot == null)
            {
                return(new BotStopMessage
                {
                    Success = false,
                    FailureReason = BotStopFailureReason.BotWithSuchIdDoesNotExist
                });
            }

            //Аккаунт может останавливать бота?
            bool accountCanStopTheBot = accessCheckService.IsAccountCanStopBot(bot, accountId);

            if (!accountCanStopTheBot)
            {
                logger.Log(LogLevel.WARNING,
                           Source.WEBSITE_BOTS_AIRSTRIP_SERVICE,
                           "Попытка остановки бота аккаунтом, который не имеет к нему доступа.",
                           accountId);
                return(new BotStopMessage
                {
                    Success = false,
                    FailureReason = BotStopFailureReason.NoAccessToThisBot
                });
            }

            //Бот запущен?
            RouteRecord record = dbContext.RouteRecords.Find(bot.Id);

            if (record == null)
            {
                logger.Log(LogLevel.LOGICAL_DATABASE_ERROR, Source.WEBSITE,
                           $"При остановке бота(botId={bot.Id}, " +
                           $"ownerId={bot.OwnerId}, пользователем accountId={accountId}) в БД не была найдена" +
                           $"запись о сервере на котором бот работает. Возможно, она была удалена или не добавлена.");

                return(new BotStopMessage
                {
                    Success = false,
                    FailureReason = BotStopFailureReason.ThisBotIsAlreadyStopped
                });
            }

            try
            {
                //запрос на остановку бота
                var forestAnswer = forestNegotiatorService.SendStopBotMessage(bot.Id);

                JObject answer          = (JObject)JsonConvert.DeserializeObject(forestAnswer);
                bool    successfulStart = (bool)answer["success"];
                string  failMessage     = (string)answer["failMessage"];

                //Лес вернул ок?
                if (!successfulStart)
                {
                    return(new BotStopMessage
                    {
                        Success = false,
                        FailureReason = BotStopFailureReason.ServerErrorWhileStoppingTheBot,
                        ForestException = failMessage
                    });
                }

                //Лес удалил данные про бота?
                RouteRecord rr = dbContext
                                 .RouteRecords
                                 .SingleOrDefault(_rr => _rr.BotId == botId);

                if (rr == null)
                {
                    logger.Log(LogLevel.INFO, Source.WEBSITE_BOTS_AIRSTRIP_SERVICE,
                               $"Бот {bot.Id} был нормально остановлен.");
                    return(new BotStopMessage {
                        Success = true
                    });
                }
                else
                {
                    logger.Log(LogLevel.LOGICAL_DATABASE_ERROR, Source.WEBSITE,
                               $"При остановке бота botId={botId}," +
                               $" accountId={accountId}. Лес ответил Ok, но не удалил RouteRecord из БД ");
                    return(new BotStopMessage
                    {
                        Success = false,
                        FailureReason = BotStopFailureReason.ServerErrorWhileStoppingTheBot
                    });
                }
            }
            catch (Exception exe)
            {
                logger.Log(LogLevel.LOGICAL_DATABASE_ERROR, Source.WEBSITE,
                           $"При остановке бота(botId={bot.Id}, " +
                           $"ownerId={bot.OwnerId}, пользователем accountId={accountId}) не удалось выполнить post запрос на лес." +
                           $"Exception message ={exe.Message}");
                return(new BotStopMessage
                {
                    Success = false,
                    FailureReason = BotStopFailureReason.ConnectionError
                });
            }
        }
        public async Task <int> MakeMassMailing(BotDB botDb, BotMassMailingViewModel model)
        {
            var botUsers = _dbContext.BotUsers
                           .Where(botUser => botUser.BotUsername == botDb.BotName)
                           .Select(botUser => botUser.BotUserTelegramId);


            if (!botUsers.Any())
            {
                return(0);
            }

            int errorsCount = 0;

            var bot = new TelegramBotClient(botDb.Token);

            if (model.File == null)
            {
                foreach (var userId in botUsers)
                {
                    try
                    {
                        await bot.SendTextMessageAsync(userId, model.Text);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        errorsCount++;
                    }
                }
            }
            else
            {
                var fileType = model.File.ContentType.Split('/').FirstOrDefault();

                InputOnlineFile onlineFile;
                Message         msg;

                while (true)
                {
                    try
                    {
                        var firstUserId = botUsers.Skip(errorsCount).First();
                        using (var stream = model.File.OpenReadStream())
                        {
                            onlineFile = new InputOnlineFile(stream);
                            switch (fileType)
                            {
                            case "image":
                                msg = await bot.SendPhotoAsync(firstUserId, onlineFile, model.Text,
                                                               ParseMode.Markdown);

                                break;

                            case "audio":
                                msg = await bot.SendAudioAsync(firstUserId, onlineFile, model.Text,
                                                               ParseMode.Markdown);

                                break;

                            case "video":
                                msg = await bot.SendVideoAsync(firstUserId, onlineFile, caption : model.Text,
                                                               parseMode : ParseMode.Markdown);

                                break;

                            default:
                                msg = await bot.SendDocumentAsync(firstUserId, onlineFile, model.Text,
                                                                  ParseMode.Markdown);

                                break;
                            }
                        }

                        break;
                    }
                    catch (InvalidOperationException e)
                    {
                        Console.WriteLine(e);
                        return(errorsCount);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        errorsCount++;
                    }
                }

                Func <int, Task <Message> > senderFunc;
                switch (msg.Type)
                {
                case Telegram.Bot.Types.Enums.MessageType.Photo:
                    onlineFile = new InputOnlineFile(msg.Photo.First().FileId);
                    senderFunc = (userId) =>
                                 bot.SendPhotoAsync(userId, onlineFile, model.Text, ParseMode.Markdown);
                    break;

                case Telegram.Bot.Types.Enums.MessageType.Audio:
                    onlineFile = new InputOnlineFile(msg.Audio.FileId);
                    senderFunc = (userId) =>
                                 bot.SendAudioAsync(userId, onlineFile, model.Text, ParseMode.Markdown);
                    break;

                case Telegram.Bot.Types.Enums.MessageType.Video:
                    onlineFile = new InputOnlineFile(msg.Video.FileId);
                    senderFunc = (userId) =>
                                 bot.SendVideoAsync(userId, onlineFile, caption: model.Text, parseMode: ParseMode.Markdown);
                    break;

                case Telegram.Bot.Types.Enums.MessageType.Voice:
                    onlineFile = new InputOnlineFile(msg.Voice.FileId);
                    senderFunc = (userId) =>
                                 bot.SendVoiceAsync(userId, onlineFile, model.Text, ParseMode.Markdown);
                    break;

                case Telegram.Bot.Types.Enums.MessageType.Document:
                    onlineFile = new InputOnlineFile(msg.Document.FileId);
                    senderFunc = (userId) =>
                                 bot.SendDocumentAsync(userId, onlineFile, model.Text, ParseMode.Markdown);
                    break;

                case Telegram.Bot.Types.Enums.MessageType.Sticker:
                    onlineFile = new InputOnlineFile(msg.Sticker.FileId);
                    senderFunc = (userId) =>
                                 bot.SendStickerAsync(userId, onlineFile);
                    break;

                default:
                    throw new NotImplementedException($"Поддержка сообщений типа {msg.Type} не реализована.");
                }

                foreach (var userId in botUsers.Skip(errorsCount + 1))
                {
                    try
                    {
                        await senderFunc(userId);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        errorsCount++;
                    }
                }
            }

            return(errorsCount);
        }
 public bool IsAccountCanRunBot(BotDB bot, Account account)
 {
     throw new NotImplementedException();
 }
예제 #8
0
        public IActionResult CreateNewBotForSales(TokenChange tokenModel, BotType botType)
        {
            int accountId = (int)HttpContext.Items["accountId"];

            try
            {
                string token         = tokenModel?.Token;
                string botUsername   = new TelegramBotClient(token).GetMeAsync().Result.Username;
                string jsonBotMarkup = localizer[botType.ToString()];

                int statusGroupId = contextDb.OrderStatusGroups.First(stat => stat.OwnerId == accountId).Id;



                //нужно установить групппу статусов
                if (jsonBotMarkup.Contains("1000001"))
                {
                    jsonBotMarkup = jsonBotMarkup.Replace("1000001", statusGroupId.ToString());
                }


                BotDB bot = new BotDB
                {
                    OwnerId = accountId,
                    BotType = "BotForSales",
                    Token   = token,
                    BotName = botUsername,
                    Markup  = jsonBotMarkup
                };

                contextDb.Bots.Add(bot);

                //Создание статистики для бота
                BotForSalesStatistics botForSalesStatistics = new BotForSalesStatistics
                {
                    Bot = bot, NumberOfOrders = 0, NumberOfUniqueMessages = 0, NumberOfUniqueUsers = 0
                };

                contextDb.BotForSalesStatistics.Add(botForSalesStatistics);

                try
                {
                    contextDb.SaveChanges();
                }
                catch (Exception exception)
                {
                    throw new TokenMatchException("Возможно в базе уже есть этот бот", exception);
                }

                return(RedirectToAction("SalesTreeEditor", "BotForSalesEditing", new { botId = bot.Id }));
            }
            catch (TokenMatchException ex)
            {
                logger.Log(LogLevel.USER_ERROR, Source.WEBSITE, $"Сайт. Создание нового бота. При " +
                           $"запросе botUsername было выброшено исключение (возможно, введённый" +
                           $"токен был специально испорчен)" + ex.Message, accountId: accountId);

                ModelState.AddModelError("", "Этот бот уже зарегистрирован.");
            }
            catch (Exception ee)
            {
                logger.Log(LogLevel.USER_ERROR, Source.WEBSITE, $"Сайт. Создание нового бота. При " +
                           $"запросе botUsername было выброшено исключение (возможно, введённый" +
                           $"токен был специально испорчен)" + ee.Message, accountId: accountId);

                ModelState.AddModelError("", "Ошибка обработки токена.");
            }


            return(View("BotForSalesTokenEntry"));
        }