public override async Task Run(object prm) { if (IsRunning || Queryables.Count == 0) { return; } IsRunning = true; try { if (TickManager.IsNoConnection || !Queryables.Any()) { return; } CurrentEntry = await APIHelper.ZKillAPI.GetRedisqResponce(); if (CurrentEntry?.package == null) { return; } await Queryables.ParallelForEachAsync(async q => { try { await q(CurrentEntry); } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); await LogHelper.LogWarning($"[ZKillCore] error processing {q.Method.Name}! Msg: {ex.Message}", Category); } }); } catch (Exception ex) { await LogHelper.LogEx(ex.Message, ex, Category); } finally { IsRunning = false; } }
private async Task ProcessKill(JsonZKill.ZKillboard kill) { if (_lastPosted != kill.package.killID) { var bigKillGlobalValue = SettingsManager.GetLong("liveKillFeed", "bigKill"); var bigKillGlobalChan = SettingsManager.GetULong("liveKillFeed", "bigKillChannel"); var killmailID = kill.package.killmail.killmail_id; var killTime = kill.package.killmail.killmail_time.ToString("dd.MM.yyyy hh:mm"); var shipID = kill.package.killmail.victim.ship_type_id; var value = kill.package.zkb.totalValue; 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 isNPCKill = kill.package.zkb.npc; var systemId = kill.package.killmail.solar_system_id; var npckill = kill.package.zkb.npc; var postedGlobalBigKill = false; var rSystem = await APIHelper.ESIAPI.GetSystemData(Reason, systemId, false, !_enableCache); if (rSystem == null) { //ESI fail - check back later return; } var rVictimCorp = await APIHelper.ESIAPI.GetCorporationData(Reason, victimCorpID, false, !_enableCache); var rAttackerCorp = finalBlowAttackerCorpId.HasValue && finalBlowAttackerCorpId.Value > 0 ? await APIHelper.ESIAPI.GetCorporationData(Reason, finalBlowAttackerCorpId, false, !_enableCache) : null; if (rAttackerCorp == null) { isNPCKill = true; } 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 sysName = rSystem.name; 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"); // ulong lastChannel = 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 }, }; foreach (var i in SettingsManager.GetSubList("liveKillFeed", "groupsConfig")) { var minimumValue = Convert.ToInt64(i["minimumValue"]); var minimumLossValue = Convert.ToInt64(i["minimumLossValue"]); var allianceID = Convert.ToInt32(i["allianceID"]); var corpID = Convert.ToInt32(i["corpID"]); var bigKillValue = Convert.ToInt64(i["bigKillValue"]); var c = Convert.ToUInt64(i["discordChannel"]); var sendBigToGeneral = Convert.ToBoolean(i["bigKillSendToGeneralToo"]); var bigKillChannel = Convert.ToUInt64(i["bigKillChannel"]); var discordGroupName = i["name"]; if (c == 0) { await LogHelper.LogWarning($"Group {i.Key} has no 'discordChannel' specified! Kills will be skipped.", Category); continue; } if (bigKillGlobalChan != 0 && bigKillGlobalValue != 0 && value >= bigKillGlobalValue && !postedGlobalBigKill) { postedGlobalBigKill = true; if (!await TemplateHelper.PostTemplatedMessage(MessageTemplateType.KillMailBig, dic, bigKillGlobalChan, discordGroupName)) { await APIHelper.DiscordAPI.SendEmbedKillMessage(bigKillGlobalChan, new Color(0xFA2FF4), 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, null); } await LogHelper.LogInfo($"Posting Global Big Kill: {kill.package.killID} Value: {value:n0} ISK", Category); } if (allianceID == 0 && corpID == 0) { if (value >= minimumValue) { if (!await TemplateHelper.PostTemplatedMessage(MessageTemplateType.KillMailGeneral, dic, c, discordGroupName)) { await APIHelper.DiscordAPI.SendEmbedKillMessage(c, new Color(0x00FF00), 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, null); } await LogHelper.LogInfo($"Posting Global Kills: {kill.package.killID} Value: {value:n0} ISK", Category); } } else { //ally & corp //Losses //Big if (bigKillChannel != 0 && bigKillValue != 0 && value >= bigKillValue) { if (victimAllianceID == allianceID || victimCorpID == corpID) { dic.Add("{isLoss}", "true"); if (!await TemplateHelper.PostTemplatedMessage(MessageTemplateType.KillMailBig, dic, bigKillChannel, discordGroupName)) { await APIHelper.DiscordAPI.SendEmbedKillMessage(bigKillChannel, new Color(0xD00000), 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, null, discordGroupName); if (sendBigToGeneral && c != bigKillChannel) { if (!await TemplateHelper.PostTemplatedMessage(MessageTemplateType.KillMailBig, dic, c, discordGroupName)) { await APIHelper.DiscordAPI.SendEmbedKillMessage(c, new Color(0xD00000), 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, null, discordGroupName); } } } await LogHelper.LogInfo($"Posting Big Loss: {kill.package.killID} Value: {value:n0} ISK", Category); continue; } } //Common if (minimumLossValue == 0 || minimumLossValue <= value) { if (victimAllianceID != 0 && victimAllianceID == allianceID || victimCorpID == corpID) { dic.Add("{isLoss}", "true"); if (!await TemplateHelper.PostTemplatedMessage(MessageTemplateType.KillMailGeneral, dic, c, discordGroupName)) { await APIHelper.DiscordAPI.SendEmbedKillMessage(c, new Color(0xFF0000), 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, null, discordGroupName); } await LogHelper.LogInfo($"Posting Loss: {kill.package.killID} Value: {value:n0} ISK", Category); continue; } } //Kills foreach (var attacker in attackers.ToList()) { if (bigKillChannel != 0 && bigKillValue != 0 && value >= bigKillValue && !npckill) { if ((attacker.alliance_id != 0 && attacker.alliance_id == allianceID) || (allianceID == 0 && attacker.corporation_id == corpID)) { dic.Add("{isLoss}", "false"); if (!await TemplateHelper.PostTemplatedMessage(MessageTemplateType.KillMailBig, dic, bigKillChannel, discordGroupName)) { await APIHelper.DiscordAPI.SendEmbedKillMessage(bigKillChannel, new Color(0x00D000), 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, null, discordGroupName); if (sendBigToGeneral && c != bigKillChannel) { if (!await TemplateHelper.PostTemplatedMessage(MessageTemplateType.KillMailBig, dic, c, discordGroupName)) { await APIHelper.DiscordAPI.SendEmbedKillMessage(c, new Color(0x00D000), 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, null, discordGroupName); } } await LogHelper.LogInfo($"Posting Big Kill: {kill.package.killID} Value: {value:#,##0} ISK", Category); } break; } } else if (!npckill && attacker.alliance_id != 0 && allianceID != 0 && attacker.alliance_id == allianceID || !npckill && allianceID == 0 && attacker.corporation_id == corpID) { dic.Add("{isLoss}", "false"); if (!await TemplateHelper.PostTemplatedMessage(MessageTemplateType.KillMailGeneral, dic, c, discordGroupName)) { await APIHelper.DiscordAPI.SendEmbedKillMessage(c, new Color(0x00FF00), 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, null, discordGroupName); } await LogHelper.LogInfo($"Posting Kill: {kill.package.killID} Value: {value:#,##0} ISK", Category); break; } } } } _lastPosted = killmailID; } else if (kill?.package != null && _lastPosted != 0 && _lastPosted == kill.package.killID) { await LogHelper.LogInfo($"Skipping kill: {kill.package.killID} as its been posted recently", Category); } }
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); } }