public MessageRarity RollRarityForUser(UserDbo userDbo) { MessageRarity winner = default; var weights = userDbo.RarityWeights; var capacity = weights.GetCapacity(); var rng = new Random(); var pointer = rng.Next(capacity); var rarities = userDbo.RarityWeights.GetList(); var sum = 0; for (int i = 0; i < rarities.Count; i++) { sum += rarities[i].Weight; if (sum >= pointer) { winner = rarities[i].Rarity; break; } } return(winner); }
public ScheduledMessage(MessageCategory category, MessageType type, MessageRarity rarity, long chatId, DateTime time) { Type = type; Category = category; Rarity = rarity; ChatId = chatId; Time = time; }
public async Task <BotMessage> GetMessage(MessageCategory category, MessageType type, MessageRarity rarity, long chatId) { var xDoc = GetXDoc(); var categoryString = category.ToString().ToLowerInvariant(); var typeString = type.ToString().ToLowerInvariant(); var rarityString = rarity.ToString().ToLowerInvariant(); var xCategory = xDoc.Root.Element(categoryString); var xMessages = xCategory .Elements() .Where(x => x.Attribute(Const.XmlAliases.TypeAttribute).Value == typeString) .Where(x => x.Attribute(Const.XmlAliases.RarityAttribute).Value == rarityString) .ToList(); if (xMessages.Count == 0) { _logger.LogWarning($"Couldn't find any message for query. Category: {xCategory.Name}, Type: {typeString}, Rarity: {rarityString}"); return(null); } var rng = new Random(); var index = rng.Next(xMessages.Count); var xMessage = xMessages[index]; BotMessage message = new BotMessage(); if (string.IsNullOrWhiteSpace(xMessage.Value)) { _logger.LogWarning($"Message text was empty or whitespace. Category: {xCategory.Name}, Type: {typeString}, Rarity: {rarityString}"); return(null); } var user = await _userStorage.GetUserByChatIdNoTracking(chatId); var gender = user.UserSettings.Gender; var botGender = user.UserSettings.BotGender; message.Text = xMessage.Value; if (xMessage.Attribute("insert") != null && !string.IsNullOrWhiteSpace(xMessage.Attribute("insert").Value)) { message.Text = await _messageTextTransformer.ExecuteInsert(xMessage.Attribute("insert").Value, message.Text); } var rantOn = false; if (xMessage.Attribute("rant") != null && xMessage.Attribute("rant").Value == "true") { rantOn = true; message.Text = _messageTextTransformer.ExecuteRant(message.Text, gender, botGender); } if (xMessage.Attribute("imagesrc") != null && !string.IsNullOrWhiteSpace(xMessage.Attribute("imagesrc").Value)) { } if (xMessage.Attribute("image") != null && !string.IsNullOrWhiteSpace(xMessage.Attribute("image").Value)) { message.ImageUrl = await _randomImageProvider.GetRandomImageUrl(xMessage.Attribute("image").Value); } if (xMessage.Attribute("imagerant") != null && !string.IsNullOrWhiteSpace(xMessage.Attribute("imagerant").Value)) { var searchQuery = _messageTextTransformer.ExecuteRant(xMessage.Attribute("imagerant").Value, gender, botGender); message.ImageUrl = await _randomImageProvider.GetRandomImageUrl(searchQuery); } return(message); }
public async Task <SendMessageResult> SendMessageAsync(MessageCategory category, MessageType type, MessageRarity rarity, long chatId) { var redalertMessage = false; var message = await _messageTextProvider.GetMessage(category, type, rarity, chatId); if (message == null) { message.Text = Const.RedAlertMessage; redalertMessage = true; } try { if (message.ImageUrl == null) { await _telegramBotClientWrapper.Client.SendTextMessageAsync(chatId, message.Text); } else { await _telegramBotClientWrapper.Client.SendPhotoAsync(chatId, message.ImageUrl, caption : message.Text); } } catch (ApiRequestException ex) { if (ex.Message.Contains("blocked")) { var result = SendMessageResult.CreateBlocked(); return(result); } _logger.LogError(ex.ToString()); return(SendMessageResult.CreateUnknown()); } if (redalertMessage) { _logger.LogInformation($"RedAlert message sent. ChatId: {chatId}."); } else { _logger.LogInformation($"Message sent. " + $"ChatId: {chatId}, " + $"Category: {category}, " + $"Type: {type}, " + $"Rarity: {rarity}."); } return(SendMessageResult.CreateSuccess()); }
public async Task <List <Message> > SendScheduledMessageToAllUsersAsync(PartOfDay partOfDay, MessageRarity type, CancellationToken cancellationToken) { if (cancellationToken.IsCancellationRequested) { return(null); } var sentMessages = new List <Message>(); IEnumerable <UserDbo> users = null; using (var context = _dbContextFactory.Create()) { users = context.User .Include(x => x.UserSettings) .Include(x => x.RarityWeights) .Where(x => x.UserSettings.RecieveScheduled); } foreach (var user in users) { Message sentMessage = null; var rarity = _rarityRoller.RollRarityForUser(user); var message = await _messageTextProvider.GetMessage(Enum.Parse <MessageCategory>(partOfDay.Name.ToUpperInvariant()), MessageType.STANDARD, rarity, user.ChatId); // could already pass gender and so on if (message.ImageUrl == null) { sentMessage = await _botClient.SendTextMessageAsync(user.ChatId, message.Text); } else { sentMessage = await _botClient.SendPhotoAsync(user.ChatId, message.ImageUrl, caption : message.Text); } sentMessages.Add(sentMessage); } return(sentMessages); }