Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
 public ScheduledMessage(MessageCategory category, MessageType type, MessageRarity rarity, long chatId, DateTime time)
 {
     Type     = type;
     Category = category;
     Rarity   = rarity;
     ChatId   = chatId;
     Time     = time;
 }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }