Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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;
            }
        }
Пример #6
0
        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);
            }
        }