private async Task ReportIncursion(JsonClasses.IncursionData incursion, JsonClasses.ConstellationData c, IMessageChannel channel) { var result = await SQLHelper.SQLiteDataQuery <int>("incursions", "constId", "constId", incursion.constellation_id); //skip existing incursion report var isUpdate = result > 0 && Settings.Core.ReportIncursionStatusAfterDT; if (!isUpdate && result > 0) { return; } if (!isUpdate) { await SQLHelper.SQLiteDataInsertOrUpdate("incursions", new Dictionary <string, object> { { "constId", incursion.constellation_id } }); } c = c ?? await APIHelper.ESIAPI.GetConstellationData(Reason, incursion.constellation_id); var r = await APIHelper.ESIAPI.GetRegionData(Reason, c.region_id); var sb = new StringBuilder(); foreach (var system in incursion.infested_solar_systems) { sb.Append((await APIHelper.ESIAPI.GetSystemData(Reason, system)).name); sb.Append(" | "); } sb.Remove(sb.Length - 3, 2); var x = new EmbedBuilder().WithTitle(isUpdate ? string.Format(LM.Get("incursionUpdateHeader"), c.name, r.name) : string.Format(LM.Get("incursionNewHeader"), c.name, r.name)) .WithColor(isUpdate ? new Color(0x000045) : new Color(0xdd5353)) .WithThumbnailUrl(SettingsManager.Get("resources", "imgIncursion")) .AddField(LM.Get("incursionInfestedSystems"), sb.ToString()) .AddInlineField(LM.Get("incursionInfluence"), (incursion.influence).ToString("P")) .AddInlineField(LM.Get("incursionBoss"), incursion.has_boss ? LM.Get("Alive") : LM.Get("Defeated")) .WithCurrentTimestamp() .Build(); await APIHelper.DiscordAPI.SendMessageAsync(channel, "@everyone", x); }
private async Task ReportIncursion(JsonClasses.IncursionData incursion, JsonClasses.ConstellationData c, IMessageChannel channel) { var result = await SQLHelper.IsIncurionExists(incursion.constellation_id); //skip existing incursion report var isUpdate = result && Settings.IncursionNotificationModule.ReportIncursionStatusAfterDT; if (!isUpdate && result) { return; } if (!isUpdate) { await SQLHelper.AddIncursion(incursion.constellation_id); } c = c ?? await APIHelper.ESIAPI.GetConstellationData(Reason, incursion.constellation_id); var r = await APIHelper.ESIAPI.GetRegionData(Reason, c.region_id); var sb = new StringBuilder(); foreach (var system in incursion.infested_solar_systems) { sb.Append((await APIHelper.ESIAPI.GetSystemData(Reason, system)).name); sb.Append(" | "); } sb.Remove(sb.Length - 3, 2); var x = new EmbedBuilder().WithTitle(isUpdate ? LM.Get("incursionUpdateHeader", c.name, r.name) : LM.Get("incursionNewHeader", c.name, r.name)) .WithColor(isUpdate ? new Color(0x000045) : new Color(0xdd5353)) .WithThumbnailUrl(Settings.Resources.ImgIncursion) .AddField(LM.Get("incursionInfestedSystems"), sb.ToString()) .AddField(LM.Get("incursionInfluence"), (incursion.influence).ToString("P"), true) .AddField(LM.Get("incursionBoss"), incursion.has_boss ? LM.Get("Alive") : LM.Get("Defeated"), true) .WithCurrentTimestamp() .Build(); await APIHelper.DiscordAPI.SendMessageAsync(channel, Settings.IncursionNotificationModule.DefaultMention ?? "", x); }
private async Task <bool> ProcessLocation(long radiusId, JsonZKill.Killmail kill, KillFeedGroup @group, KillMailFilter filter, string groupName) { var mode = RadiusMode.Range; var isUrlOnly = group.FeedUrlsOnly; var radius = filter.Radius; if (radiusId <= 0) { await LogHelper.LogError("Radius feed must have systemId!", Category); return(false); } var km = new KillDataEntry(); await km.Refresh(Reason, kill); var routeLength = 0; JsonClasses.ConstellationData rConst = null; JsonClasses.RegionData rRegion; var srcSystem = mode == RadiusMode.Range ? await APIHelper.ESIAPI.GetSystemData(Reason, radiusId) : null; if (radiusId == km.systemId) { //right there rConst = km.rSystem.constellation_id == 0 ? null : await APIHelper.ESIAPI.GetConstellationData(Reason, km.rSystem.constellation_id); rRegion = rConst?.region_id == null || rConst.region_id == 0 ? null : await APIHelper.ESIAPI.GetRegionData(Reason, rConst.region_id); } else { switch (mode) { case RadiusMode.Range: if (radius == 0 || km.isUnreachableSystem || (srcSystem?.IsUnreachable() ?? true)) //Thera WH Abyss { return(false); } var route = await APIHelper.ESIAPI.GetRawRoute(Reason, radiusId, km.systemId); if (string.IsNullOrEmpty(route)) { return(false); } JArray data; try { data = JArray.Parse(route); } catch (Exception ex) { await LogHelper.LogEx("Route parse: " + ex.Message, ex, Category); return(false); } routeLength = data.Count - 1; //not in range if (routeLength > radius) { return(false); } var rSystemName = radiusId > 0 ? srcSystem?.name ?? LM.Get("Unknown") : LM.Get("Unknown"); km.dic.Add("{radiusSystem}", rSystemName); km.dic.Add("{radiusJumps}", routeLength.ToString()); break; case RadiusMode.Constellation: if (km.rSystem.constellation_id != radiusId) { return(false); } break; case RadiusMode.Region: if (km.rSystem.DB_RegionId > 0) { if (km.rSystem.DB_RegionId != radiusId) { return(false); } } else { rConst = await APIHelper.ESIAPI.GetConstellationData(Reason, km.rSystem.constellation_id); if (rConst == null || rConst.region_id != radiusId) { return(false); } } break; } rConst = rConst ?? await APIHelper.ESIAPI.GetConstellationData(Reason, km.rSystem.constellation_id); rRegion = await APIHelper.ESIAPI.GetRegionData(Reason, rConst.region_id); } //var rSystemName = rSystem?.name ?? LM.Get("Unknown"); km.dic.Add("{isRangeMode}", (mode == RadiusMode.Range).ToString()); km.dic.Add("{isConstMode}", (mode == RadiusMode.Constellation).ToString()); km.dic.Add("{isRegionMode}", (mode == RadiusMode.Region).ToString()); km.dic.AddOrUpdateEx("{constName}", rConst?.name); km.dic.AddOrUpdateEx("{regionName}", rRegion?.name); var template = isUrlOnly ? null : await TemplateHelper.GetTemplatedMessage(MessageTemplateType.KillMailRadius, km.dic); var channels = filter.DiscordChannels.Any() ? filter.DiscordChannels : group.DiscordChannels; foreach (var channel in channels) { if (isUrlOnly) { await APIHelper.DiscordAPI.SendMessageAsync(channel, kill.zkb.url); } else { if (template != null) { await APIHelper.DiscordAPI.SendMessageAsync(channel, group.ShowGroupName?groupName : " ", template).ConfigureAwait(false); } else { var jumpsText = routeLength > 0 ? $"{routeLength} {LM.Get("From")} {srcSystem?.name}" : $"{LM.Get("InSmall")} {km.sysName} ({km.systemSecurityStatus})"; await APIHelper.DiscordAPI.SendEmbedKillMessage(new List <ulong> { channel }, new Color(0x989898), km, string.IsNullOrEmpty(jumpsText)? "-" : jumpsText, group.ShowGroupName?groupName : " "); } } } return(true); }
private async Task ProcessLocation(long radiusId, RadiusMode mode, JsonZKill.Killmail kill, RadiusGroup @group, string groupName) { var isUrlOnly = group.FeedUrlsOnly; var radius = group.Radius; var minimumValue = group.MinimumValue; if (radiusId <= 0) { await LogHelper.LogError("Radius feed must have systemId, constId or regionId defined!", Category); return; } var km = new KillDataEntry(); await km.Refresh(Reason, kill); //validity check if (minimumValue > 0 && km.value < minimumValue) { return; } var routeLength = 0; JsonClasses.ConstellationData rConst = null; JsonClasses.RegionData rRegion; var srcSystem = mode == RadiusMode.Range ? await APIHelper.ESIAPI.GetSystemData(Reason, radiusId) : null; if (radiusId == km.systemId) { //right there rConst = km.rSystem.constellation_id == 0 ? null : await APIHelper.ESIAPI.GetConstellationData(Reason, km.rSystem.constellation_id); rRegion = rConst?.region_id == null || rConst.region_id == 0 ? null : await APIHelper.ESIAPI.GetRegionData(Reason, rConst.region_id); } else { if (radius == 0 || km.isUnreachableSystem || (srcSystem?.IsUnreachable() ?? false)) //Thera WH Abyss { return; } switch (mode) { case RadiusMode.Range: var route = await APIHelper.ESIAPI.GetRawRoute(Reason, radiusId, km.systemId); if (string.IsNullOrEmpty(route)) { return; } JArray data; try { data = JArray.Parse(route); } catch (Exception ex) { await LogHelper.LogEx("Route parse: " + ex.Message, ex, Category); return; } routeLength = data.Count - 1; //not in range if (routeLength > radius) { return; } var rSystemName = radiusId > 0 ? srcSystem?.name ?? LM.Get("Unknown") : LM.Get("Unknown"); km.dic.Add("{radiusSystem}", rSystemName); km.dic.Add("{radiusJumps}", routeLength.ToString()); break; case RadiusMode.Constellation: if (km.rSystem.constellation_id != radiusId) { return; } break; case RadiusMode.Region: rConst = await APIHelper.ESIAPI.GetConstellationData(Reason, km.rSystem.constellation_id); if (rConst == null || rConst.region_id != radiusId) { return; } break; } rConst = rConst ?? await APIHelper.ESIAPI.GetConstellationData(Reason, km.rSystem.constellation_id); rRegion = await APIHelper.ESIAPI.GetRegionData(Reason, rConst.region_id); } //var rSystemName = rSystem?.name ?? LM.Get("Unknown"); km.dic.Add("{isRangeMode}", (mode == RadiusMode.Range).ToString()); km.dic.Add("{isConstMode}", (mode == RadiusMode.Constellation).ToString()); km.dic.Add("{isRegionMode}", (mode == RadiusMode.Region).ToString()); km.dic.Add("{constName}", rConst?.name); km.dic.Add("{regionName}", rRegion?.name); var template = isUrlOnly ? null : await TemplateHelper.GetTemplatedMessage(MessageTemplateType.KillMailRadius, km.dic); foreach (var channel in group.RadiusChannels) { if (isUrlOnly) { await APIHelper.DiscordAPI.SendMessageAsync(channel, kill.zkb.url); } else { if (template != null) { await APIHelper.DiscordAPI.SendMessageAsync(channel, group.ShowGroupName?groupName : " ", template).ConfigureAwait(false); } else { var jumpsText = routeLength > 0 ? $"{routeLength} {LM.Get("From")} {srcSystem?.name}" : $"{LM.Get("InSmall")} {km.sysName} ({km.systemSecurityStatus})"; await APIHelper.DiscordAPI.SendEmbedKillMessage(channel, new Color(0x989898), km, jumpsText, group.ShowGroupName?groupName : " "); } } } await LogHelper.LogInfo($"Posting Radius Kill: {kill.killmail_id} Value: {km.value:n0} ISK", Category); }
public override async Task Run(object prm) { if (_runAt.Date != DateTime.UtcNow.Date) { _isChecked = false; _runAt = DateTime.UtcNow.Date + TimeSpan.FromHours(11) + TimeSpan.FromMinutes(5); } if (IsRunning) { return; } IsRunning = true; try { if (_runAt < DateTime.UtcNow && !_isChecked) { if (!await APIHelper.ESIAPI.IsServerOnline(Reason)) { await Task.Delay(1000); return; } var channel = APIHelper.DiscordAPI.GetChannel(Settings.Core.DiscordChannelId); if (channel == null) { await LogHelper.LogError( "IncursionNotificationModule is not configured properly! Make sure you have correct channel specified and bot have correct access rights!"); return; } var incursions = await APIHelper.ESIAPI.GetIncursions(Reason); if (incursions == null) { return; } _isChecked = true; foreach (var incursion in incursions) { if (Settings.Core.Constellations.Count == 0 && Settings.Core.Regions.Count == 0) { await ReportIncursion(incursion, null, channel); continue; } var result = false; JsonClasses.ConstellationData c = null; if (Settings.Core.Constellations.Count > 0) { result = Settings.Core.Constellations.Contains(incursion.constellation_id); } if (!result) { if (Settings.Core.Regions.Count > 0) { c = await APIHelper.ESIAPI.GetConstellationData(Reason, incursion.constellation_id); if (Settings.Core.Regions.Contains(c.region_id)) { result = true; } } } if (result) { await ReportIncursion(incursion, c, channel); } } await SQLHelper.SQLiteDataDeleteWhereIn("incursions", "constId", incursions.Select(a => a.constellation_id).ToList(), not : true); } } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { IsRunning = false; } }
private async Task ProcessKill(JsonZKill.ZKillboard kill) { try { foreach (var group in SettingsManager.GetSubList("radiusKillFeedModule", "groupsConfig")) { if (!_lastPosted.ContainsKey(group.Key)) { _lastPosted.Add(group.Key, 0); } if (_lastPosted[group.Key] == kill.package.killID) { continue; } _lastPosted[group.Key] = kill.package.killID; var killmailID = kill.package.killmail.killmail_id; var value = kill.package.zkb.totalValue; var systemId = kill.package.killmail.solar_system_id; var radius = Convert.ToInt16(group["radius"]); var radiusSystemId = Convert.ToInt32(group["radiusSystemId"]); var radiusConstId = Convert.ToInt32(group["radiusConstellationId"]); var radiusRegionId = Convert.ToInt32(group["radiusRegionId"]); var radiusChannelId = Convert.ToUInt64(group["radiusChannel"]); int radiusValue = Convert.ToInt32(group["minimumValue"]); var rSystem = await APIHelper.ESIAPI.GetSystemData(Reason, systemId, false, !_enableCache); var sysName = rSystem?.name ?? "J"; if (radiusSystemId == 0 && radiusConstId == 0 && radiusRegionId == 0) { await LogHelper.LogError("Radius feed must have systemId, constId or regionId defined!", Category); continue; } if (radiusChannelId == 0) { await LogHelper.LogWarning($"Group {group.Key} has no 'radiusChannel' specified! Kills will be skipped.", Category); continue; } var mode = radiusSystemId != 0 ? RadiusMode.Range : (radiusConstId != 0 ? RadiusMode.Constellation : RadiusMode.Region); //validity check if (radiusChannelId <= 0 || (sysName[0] == 'J' && int.TryParse(sysName.Substring(1), out int _) && radiusSystemId != systemId) || (radiusValue > 0 && value < radiusValue)) { continue; } var routeLength = 0; JsonClasses.ConstellationData rConst = null; JsonClasses.RegionData rRegion = null; if (radiusSystemId == systemId) { //right there rConst = rSystem.constellation_id == 0 ? null : await APIHelper.ESIAPI.GetConstellationData(Reason, rSystem.constellation_id); rRegion = rConst?.region_id == null || rConst.region_id == 0 ? null : await APIHelper.ESIAPI.GetRegionData(Reason, rConst.region_id); } else { switch (mode) { case RadiusMode.Range: var route = await APIHelper.ESIAPI.GetRawRoute(Reason, radiusSystemId, systemId); if (string.IsNullOrEmpty(route)) { continue; } JArray data; try { data = JArray.Parse(route); } catch (Exception ex) { await LogHelper.LogEx("Route parse: " + ex.Message, ex, Category); continue; } routeLength = data.Count - 1; //not in range if (routeLength > radius) { continue; } rConst = await APIHelper.ESIAPI.GetConstellationData(Reason, rSystem.constellation_id); rRegion = await APIHelper.ESIAPI.GetRegionData(Reason, rConst.region_id); break; case RadiusMode.Constellation: if (rSystem.constellation_id != radiusConstId) { continue; } rConst = await APIHelper.ESIAPI.GetConstellationData(Reason, rSystem.constellation_id); rRegion = await APIHelper.ESIAPI.GetRegionData(Reason, rConst.region_id); break; case RadiusMode.Region: rConst = await APIHelper.ESIAPI.GetConstellationData(Reason, rSystem.constellation_id); if (rConst == null || rConst.region_id != radiusRegionId) { continue; } rRegion = await APIHelper.ESIAPI.GetRegionData(Reason, rConst.region_id); break; } } var rSystemName = rSystem?.name ?? LM.Get("Unknown"); var victimCharacterID = kill.package.killmail.victim.character_id; var victimCorpID = kill.package.killmail.victim.corporation_id; var victimAllianceID = kill.package.killmail.victim.alliance_id; var attackers = kill.package.killmail.attackers; var finalBlowAttacker = attackers.FirstOrDefault(a => a.final_blow); var finalBlowAttackerCorpId = finalBlowAttacker?.corporation_id; var finalBlowAttackerAllyId = finalBlowAttacker?.alliance_id; var shipID = kill.package.killmail.victim.ship_type_id; var isNPCKill = kill.package.zkb.npc; var killTime = kill.package.killmail.killmail_time.ToString("dd.MM.yyyy hh:mm"); var rVictimCorp = await APIHelper.ESIAPI.GetCorporationData(Reason, victimCorpID, false, !_enableCache); var rAttackerCorp = finalBlowAttackerCorpId.HasValue && finalBlowAttackerCorpId.Value > 0 ? await APIHelper.ESIAPI.GetCorporationData(Reason, finalBlowAttackerCorpId) : null; var rVictimAlliance = victimAllianceID != 0 ? await APIHelper.ESIAPI.GetAllianceData(Reason, victimAllianceID, false, !_enableCache) : null; var rAttackerAlliance = finalBlowAttackerAllyId.HasValue && finalBlowAttackerAllyId.Value > 0 ? await APIHelper.ESIAPI.GetAllianceData(Reason, finalBlowAttackerAllyId) : null; var rShipType = await APIHelper.ESIAPI.GetTypeId(Reason, shipID); var rVictimCharacter = await APIHelper.ESIAPI.GetCharacterData(Reason, victimCharacterID, false, !_enableCache); var rAttackerCharacter = await APIHelper.ESIAPI.GetCharacterData(Reason, finalBlowAttacker?.character_id, false, !_enableCache); var systemSecurityStatus = Math.Round(rSystem.security_status, 1).ToString("0.0"); var dic = new Dictionary <string, string> { { "{shipID}", shipID.ToString() }, { "{shipType}", rShipType?.name }, { "{iskValue}", value.ToString("n0") }, { "{systemName}", sysName }, { "{systemSec}", systemSecurityStatus }, { "{victimName}", rVictimCharacter?.name }, { "{victimCorpName}", rVictimCorp?.name }, { "{victimCorpTicker}", rVictimCorp?.ticker }, { "{victimAllyName}", rVictimAlliance?.name }, { "{victimAllyTicker}", rVictimAlliance == null ? null : $"<{rVictimAlliance.ticker}>" }, { "{attackerName}", rAttackerCharacter?.name }, { "{attackerCorpName}", rAttackerCorp?.name }, { "{attackerCorpTicker}", rAttackerCorp?.ticker }, { "{attackerAllyTicker}", rAttackerAlliance == null ? null : $"<{rAttackerAlliance.ticker}>" }, { "{attackerAllyName}", rAttackerAlliance?.name }, { "{attackersCount}", attackers?.Length.ToString() }, { "{kmId}", killmailID.ToString() }, { "{isNpcKill}", isNPCKill.ToString() }, { "{timestamp}", killTime }, { "{radiusSystem}", rSystemName.ToString() }, { "{radiusJumps}", routeLength.ToString() }, { "{isRangeMode}", (mode == RadiusMode.Range).ToString() }, { "{isConstMode}", (mode == RadiusMode.Constellation).ToString() }, { "{isRegionMode}", (mode == RadiusMode.Region).ToString() }, { "{constName}", rConst?.name }, { "{regionName}", rRegion?.name }, }; if (!await TemplateHelper.PostTemplatedMessage(MessageTemplateType.KillMailRadius, dic, radiusChannelId, group.Key)) { var jumpsText = routeLength > 0 ? $"{routeLength} {LM.Get("From")} {rSystemName}" : $"{LM.Get("InSmall")} {sysName} ({systemSecurityStatus})"; await APIHelper.DiscordAPI.SendEmbedKillMessage(radiusChannelId, new Color(0x989898), shipID, killmailID, rShipType?.name, (long)value, sysName, systemSecurityStatus, killTime, rVictimCharacter == null?rShipType?.name : rVictimCharacter?.name, rVictimCorp?.name, rVictimAlliance == null? "" : $"[{rVictimAlliance?.ticker}]", isNPCKill, rAttackerCharacter?.name, rAttackerCorp?.name, rAttackerAlliance == null?null : $"[{rAttackerAlliance?.ticker}]", attackers.Length, jumpsText); } await LogHelper.LogInfo($"Posting Radius Kill: {kill.package.killID} Value: {value:n0} ISK", Category); } } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } }