async Task HandleMudaeMessageAsync(IUserMessage message) { if (!message.Embeds.Any()) { return; } var guild = ((IGuildChannel)message.Channel).Guild; var embed = message.Embeds.First(); if (embed.Footer.HasValue) { // character must not belong to another user if (embed.Footer.Value.Text.StartsWith("Belongs to", StringComparison.OrdinalIgnoreCase)) { return; } // message must not be $im if (_imFooterRegex.IsMatch(embed.Footer.Value.Text)) { return; } } // if (!embed.Author.HasValue || embed.Author.Value.IconUrl != null) { return; } var description = embed.Description.Split('\n'); var character = embed.Author.Value.Name.Trim().ToLowerInvariant(); var anime = description[0].Trim().ToLowerInvariant(); var KakeraValue = 0; //if length >= 2 then description includes additional info if (description.Length >= 2) { //46983... is emoji symbol if (description[description.Length - 1].Contains("469835869059153940")) { String KakeraValueString = new String(description[description.Length - 1].SkipWhile(c => !Char.IsDigit(c)).TakeWhile(Char.IsDigit).ToArray()); KakeraValue = Convert.ToInt32(KakeraValueString); } } // matching by character and name var matched = false; var kakeraThreshold = _config.KakeraThreshold; matched |= _config.WishedCharacterRegex?.IsMatch(character) ?? false; matched |= _config.WishedAnimeRegex?.IsMatch(anime) ?? false; // matching by wishlist if (message.Content.StartsWith("Wished by")) { matched |= message.GetUserIds().Any(_config.ClaimWishlistUserIds.Contains); } if (matched) { var state = _state.Get(guild.Id); // ensure we can claim right now if (!state.CanClaim && DateTime.Now < state.ClaimReset) { Log.Warning($"{guild} {message.Channel}: Found character '{character}' but cannot claim it due to cooldown."); return; } //check and see if character's kakera value is at or above threshold if (KakeraValue >= kakeraThreshold) { Log.Warning($"{guild} {message.Channel}: Found character '{character}', trying marriage."); } else { Log.Warning($"{guild} {message.Channel}: Found character '{character}' but cannot claim it due to character's kakera value '{KakeraValue}' not greater than or equal to threshold. '{kakeraThreshold}'"); return; } // reactions may not have been attached when we received this message // remember this message so we can attach an appropriate reaction later when we receive it _claimQueue[message.Id] = new ClaimQueueItem { Message = message, Character = new CharacterInfo(character, anime), Measure = new MeasureContext() }; } else { Log.Info($"{guild} #{message.Channel}: Ignored character '{character}', not wished."); } }