private void ProcessQuest(QuestData quest) { if (quest == null) { return; } Statistics.Instance.TotalReceivedQuests++; foreach (var(guildId, alarms) in _alarms) { if (!alarms.EnableQuests) { continue; } if (alarms.Alarms?.Count == 0) { continue; } var rewardKeyword = quest.GetReward(); var questAlarms = alarms.Alarms.FindAll(x => x.Filters?.Quests?.RewardKeywords != null); for (var j = 0; j < questAlarms.Count; j++) { var alarm = questAlarms[j]; if (alarm.Filters.Quests == null) { continue; } if (!alarm.Filters.Quests.Enabled) { //_logger.Info($"[{alarm.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: quests filter not enabled."); continue; } var geofence = GeofenceService.GetGeofence(alarm.GeofenceItems, new Location(quest.Latitude, quest.Longitude)); if (geofence == null) { //_logger.Info($"[{alarm.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: not in geofence."); continue; } var contains = alarm.Filters.Quests.RewardKeywords.Select(x => x.ToLower()).FirstOrDefault(x => rewardKeyword.ToLower().Contains(x.ToLower())) != null; if (alarm.Filters.Quests.FilterType == FilterType.Exclude && contains) { //_logger.Info($"[{alarm.Name}] [{geofence.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: filter {alarm.Filters.Quests.FilterType}."); continue; } if (!(alarm.Filters.Quests.FilterType == FilterType.Include && (contains || alarm.Filters.Quests?.RewardKeywords.Count == 0))) { //_logger.Info($"[{alarm.Name}] [{geofence.Name}] Skipping quest PokestopId={quest.PokestopId}: filter {alarm.Filters.Quests.FilterType}."); continue; } if (!contains && alarm.Filters?.Quests?.RewardKeywords?.Count > 0) { //_logger.Info($"[{alarm.Name}] [{geofence.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: rewards does not match reward keywords."); continue; } if (alarm.Filters.Quests.IsShiny && !quest.IsShiny) { //_logger.Info($"[{alarm.Name}] [{geofence.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: filter IsShiny={alarm.Filters.Quests.IsShiny} Quest={quest.IsShiny}."); continue; } OnQuestAlarmTriggered(quest, alarm, guildId); } } }
public async Task ProcessQuestSubscription(QuestData quest) { var reward = quest.Rewards[0].Info; var rewardKeyword = quest.GetReward(); var questName = quest.GetQuestMessage(); var loc = _whm.GetGeofence(quest.Latitude, quest.Longitude); if (loc == null) { //_logger.Warn($"Failed to lookup city for coordinates {quest.Latitude},{quest.Longitude}, skipping..."); return; } var subscriptions = Manager.GetUserSubscriptions(); if (subscriptions == null) { _logger.Warn($"Failed to get subscriptions from database table."); return; } bool isSupporter; SubscriptionObject user; for (int i = 0; i < subscriptions.Count; i++) { try { user = subscriptions[i]; if (user == null) { continue; } if (!user.Enabled) { continue; } if (!_whConfig.Servers.ContainsKey(user.GuildId)) { continue; } if (!_whConfig.Servers[user.GuildId].EnableSubscriptions) { continue; } if (!_servers.ContainsKey(user.GuildId)) { continue; } var client = _servers[user.GuildId]; var member = await client.GetMemberById(user.GuildId, user.UserId); if (member == null) { _logger.Warn($"Failed to find member with id {user.UserId}."); continue; } isSupporter = member.HasSupporterRole(_whConfig.Servers[user.GuildId].DonorRoleIds); if (!isSupporter) { _logger.Info($"User {user.UserId} is not a supporter, skipping quest {questName}..."); continue; } var exists = user.Quests.FirstOrDefault(x => rewardKeyword.ToLower().Contains(x.RewardKeyword.ToLower()) && ( string.IsNullOrEmpty(x.City) || (!string.IsNullOrEmpty(x.City) && string.Compare(loc.Name, x.City, true) == 0) )) != null; if (!exists) { //_logger.Debug($"Skipping notification for user {member.DisplayName} ({member.Id}) for quest {questName} because the quest is in city '{loc.Name}'."); continue; } // Only check distance if user has it set if (user.DistanceM > 0) { var distance = new Coordinates(user.Latitude, user.Longitude).DistanceTo(new Coordinates(quest.Latitude, quest.Longitude)); if (user.DistanceM < distance) { //Skip if distance is set and is not met. _logger.Debug($"Skipping notification for user {member.DisplayName} ({member.Id}) for Quest {quest.Template}, Quest is farther than set distance of '{user.DistanceM} meters."); continue; } } var embed = quest.GenerateQuestMessage(user.GuildId, client, _whConfig, null, loc.Name); foreach (var emb in embed.Embeds) { _queue.Enqueue(new NotificationItem(user, member, emb, questName, loc.Name)); } Statistics.Instance.SubscriptionQuestsSent++; Thread.Sleep(5); } catch (Exception ex) { _logger.Error(ex); } } subscriptions.Clear(); subscriptions = null; user = null; loc = null; await Task.CompletedTask; }
public async Task ProcessQuestSubscription(QuestData quest) { var reward = quest.Rewards.FirstOrDefault().Info; var rewardKeyword = quest.GetReward(); var questName = quest.GetQuestMessage(); // Cache the result per-guild so that geospatial stuff isn't queried for every single subscription below Dictionary <ulong, GeofenceItem> locationCache = new Dictionary <ulong, GeofenceItem>(); GeofenceItem GetGeofence(ulong guildId) { if (!locationCache.TryGetValue(guildId, out var geofence)) { geofence = _whm.GetGeofence(guildId, quest.Latitude, quest.Longitude); locationCache.Add(guildId, geofence); } return(geofence); } var subscriptions = Manager.GetUserSubscriptionsByQuestReward(rewardKeyword); if (subscriptions == null) { _logger.Warn($"Failed to get subscriptions from database table."); return; } bool isSupporter; SubscriptionObject user; for (int i = 0; i < subscriptions.Count; i++) { //var start = DateTime.Now; try { user = subscriptions[i]; if (user == null) { continue; } if (!user.Enabled) { continue; } if (!_whConfig.Instance.Servers.ContainsKey(user.GuildId)) { continue; } if (!_whConfig.Instance.Servers[user.GuildId].Subscriptions.Enabled) { continue; } if (!_servers.ContainsKey(user.GuildId)) { continue; } var client = _servers[user.GuildId]; var member = await client.GetMemberById(user.GuildId, user.UserId); if (member == null) { _logger.Warn($"Failed to find member with id {user.UserId}."); continue; } isSupporter = member.HasSupporterRole(_whConfig.Instance.Servers[user.GuildId].DonorRoleIds); if (!isSupporter) { _logger.Info($"User {user.UserId} is not a supporter, skipping quest {questName}..."); // Automatically disable users subscriptions if not supporter to prevent issues //user.Enabled = false; //user.Save(false); continue; } var subQuest = user.Quests.FirstOrDefault(x => rewardKeyword.ToLower().Contains(x.RewardKeyword.ToLower())); // Not subscribed to quest if (subQuest == null) { //_logger.Debug($"Skipping notification for user {member.DisplayName} ({member.Id}) for quest {questName} because the quest is in city '{loc.Name}'."); continue; } var geofence = GetGeofence(user.GuildId); if (geofence == null) { //_logger.Warn($"Failed to lookup city from coordinates {pkmn.Latitude},{pkmn.Longitude} {db.Pokemon[pkmn.Id].Name} {pkmn.IV}, skipping..."); continue; } var distanceMatches = user.DistanceM > 0 && user.DistanceM > new Coordinates(user.Latitude, user.Longitude).DistanceTo(new Coordinates(quest.Latitude, quest.Longitude)); var geofenceMatches = subQuest.Areas.Select(x => x.ToLower()).Contains(geofence.Name.ToLower()); // If set distance does not match and no geofences match, then skip Pokemon... if (!distanceMatches && !geofenceMatches) { continue; } var embed = quest.GenerateQuestMessage(user.GuildId, client, _whConfig.Instance, null, geofence.Name); //var end = DateTime.Now.Subtract(start); //_logger.Debug($"Took {end} to process quest subscription for user {user.UserId}"); embed.Embeds.ForEach(x => _queue.Enqueue(new NotificationItem(user, member, x, questName, geofence.Name))); Statistics.Instance.SubscriptionQuestsSent++; Thread.Sleep(5); } catch (Exception ex) { _logger.Error(ex); } } subscriptions.Clear(); subscriptions = null; user = null; await Task.CompletedTask; }
public async Task ProcessQuestSubscription(QuestData quest) { var reward = quest.Rewards[0].Info; var rewardKeyword = quest.GetReward(); var questName = quest.GetQuestMessage(); var loc = _whm.GetGeofence(quest.Latitude, quest.Longitude); if (loc == null) { //_logger.Warn($"Failed to lookup city for coordinates {quest.Latitude},{quest.Longitude}, skipping..."); return; } var subscriptions = Manager.GetUserSubscriptions(); if (subscriptions == null) { _logger.Warn($"Failed to get subscriptions from database table."); return; } bool isSupporter; SubscriptionObject user; for (int i = 0; i < subscriptions.Count; i++) { try { user = subscriptions[i]; if (user == null) { continue; } if (!user.Enabled) { continue; } if (!_whConfig.Servers.ContainsKey(user.GuildId)) { continue; } if (!_whConfig.Servers[user.GuildId].Subscriptions.Enabled) { continue; } if (!_servers.ContainsKey(user.GuildId)) { continue; } var client = _servers[user.GuildId]; var member = await client.GetMemberById(user.GuildId, user.UserId); if (member == null) { _logger.Warn($"Failed to find member with id {user.UserId}."); continue; } isSupporter = member.HasSupporterRole(_whConfig.Servers[user.GuildId].DonorRoleIds); if (!isSupporter) { _logger.Info($"User {user.UserId} is not a supporter, skipping quest {questName}..."); // Automatically disable users subscriptions if not supporter to prevent issues user.Enabled = false; user.Save(false); continue; } var subQuest = user.Quests.FirstOrDefault(x => rewardKeyword.ToLower().Contains(x.RewardKeyword.ToLower())); // Not subscribed to quest if (subQuest == null) { //_logger.Debug($"Skipping notification for user {member.DisplayName} ({member.Id}) for quest {questName} because the quest is in city '{loc.Name}'."); continue; } var distanceMatches = user.DistanceM > 0 && user.DistanceM > new Coordinates(user.Latitude, user.Longitude).DistanceTo(new Coordinates(quest.Latitude, quest.Longitude)); var geofenceMatches = subQuest.Areas.Select(x => x.ToLower()).Contains(loc.Name.ToLower()); // If set distance does not match and no geofences match, then skip Pokemon... if (!distanceMatches && !geofenceMatches) { continue; } var embed = quest.GenerateQuestMessage(user.GuildId, client, _whConfig, null, loc.Name); foreach (var emb in embed.Embeds) { _queue.Enqueue(new NotificationItem(user, member, emb, questName, loc.Name)); } Statistics.Instance.SubscriptionQuestsSent++; Thread.Sleep(5); } catch (Exception ex) { _logger.Error(ex); } } subscriptions.Clear(); subscriptions = null; user = null; loc = null; await Task.CompletedTask; }
private void ProcessQuest(QuestData quest) { if (!_alarms.EnableQuests) { return; } if (quest == null) { return; } if (_alarms.Alarms?.Count == 0) { return; } var rewardKeyword = quest.GetReward(); for (var i = 0; i < _alarms.Alarms.Count; i++) { var alarm = _alarms.Alarms[i]; if (alarm.Filters.Quests == null) { continue; } if (!alarm.Filters.Quests.Enabled) { _logger.Info($"[{alarm.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: quests filter not enabled."); continue; } var geofence = InGeofence(alarm.Geofences, new Location(quest.Latitude, quest.Longitude)); if (geofence == null) { //_logger.Info($"[{alarm.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: not in geofence."); continue; } var contains = alarm.Filters.Quests.RewardKeywords.Select(x => x.ToLower()).FirstOrDefault(x => rewardKeyword.ToLower().Contains(x.ToLower())) != null; if (alarm.Filters.Quests.FilterType == FilterType.Exclude && contains) { //_logger.Info($"[{alarm.Name}] [{geofence.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: filter {alarm.Filters.Quests.FilterType}."); continue; } if (!(alarm.Filters.Quests.FilterType == FilterType.Include && (contains || alarm.Filters.Quests?.RewardKeywords.Count == 0))) { //_logger.Info($"[{alarm.Name}] [{geofence.Name}] Skipping quest PokestopId={quest.PokestopId}: filter {alarm.Filters.Quests.FilterType}."); continue; } if (!contains && alarm.Filters?.Quests?.RewardKeywords?.Count > 0) { //_logger.Info($"[{alarm.Name}] [{geofence.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: rewards does not match reward keywords."); continue; } if (alarm.Filters.Quests.IsShiny && !quest.IsShiny) { //_logger.Info($"[{alarm.Name}] [{geofence.Name}] Skipping quest PokestopId={quest.PokestopId}, Type={quest.Type}: filter IsShiny={alarm.Filters.Quests.IsShiny} Quest={quest.IsShiny}."); continue; } OnQuestAlarmTriggered(quest, alarm); } }
public async Task ProcessQuestSubscription(QuestData quest) { if (!_whConfig.Discord.EnableSubscriptions) { return; } var db = Database.Instance; var reward = quest.Rewards[0].Info; var rewardKeyword = quest.GetReward(); var questName = quest.GetQuestMessage(); var loc = _whm.GetGeofence(quest.Latitude, quest.Longitude); if (loc == null) { //_logger.Warn($"Failed to lookup city for coordinates {quest.Latitude},{quest.Longitude}, skipping..."); return; } var subscriptions = Manager.GetUserSubscriptions(); if (subscriptions == null) { _logger.Warn($"Failed to get subscriptions from database table."); return; } bool isSupporter; SubscriptionObject user; //var embed = _embedBuilder.BuildQuestMessage(quest, loc.Name); var embed = quest.GenerateQuestMessage(_client, _whConfig, null, loc.Name); for (int i = 0; i < subscriptions.Count; i++) { try { user = subscriptions[i]; if (user == null) { continue; } if (!user.Enabled) { continue; } var member = await _client.GetMemberById(_whConfig.Discord.GuildId, user.UserId); if (member == null) { _logger.Warn($"Failed to find member with id {user.UserId}."); continue; } isSupporter = member.HasSupporterRole(_whConfig.Discord.DonorRoleIds); if (!isSupporter) { _logger.Info($"User {user.UserId} is not a supporter, skipping quest {questName}..."); continue; } var exists = user.Quests.FirstOrDefault(x => rewardKeyword.ToLower().Contains(x.RewardKeyword.ToLower()) && ( string.IsNullOrEmpty(x.City) || (!string.IsNullOrEmpty(x.City) && string.Compare(loc.Name, x.City, true) == 0) )) != null; if (!exists) { //_logger.Debug($"Skipping notification for user {member.DisplayName} ({member.Id}) for quest {questName} because the quest is in city '{loc.Name}'."); continue; } if (user.DistanceM > 0) { var distance = new Coordinates(user.Latitude, user.Longitude).DistanceTo(new Coordinates(quest.Latitude, quest.Longitude)); if (user.DistanceM < distance) { //Skip if distance is set and is not met. _logger.Debug($"Skipping notification for user {member.DisplayName} ({member.Id}) for Quest {quest.Template}, Quest is farther than set distance of '{user.DistanceM} meters."); continue; } } //_logger.Debug($"Notifying user {member.Username} that a {rewardKeyword} quest is available..."); _queue.Enqueue(new Tuple <DiscordUser, string, DiscordEmbed>(member, questName, embed)); //if (!Manager.AddQuestStatistic(member.Id, quest)) //{ // _logger.Warn($"Failed to add {quest.GetRewardString()} quest statistic for user {user.Id}."); //} Statistics.Instance.SubscriptionQuestsSent++; Thread.Sleep(5); } catch (Exception ex) { _logger.Error(ex); } } }