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(); }
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")); }