コード例 #1
0
 private static Task <T> RequestAsync <T>(ZkbRequestHandler h, Uri uri)
 {
     return(h.RequestAsync <T>(uri));
 }
コード例 #2
0
        private static async Task ProcessStats(ICommandContext context, string command, string entity, DailyStatsGroup grp)
        {
            var now   = DateTime.Now;
            var today = DateTime.Today;

            var isNewDay        = command.Equals("newday", stringComparison);
            var isRatingCommand = command.Equals("r", stringComparison) || command.Equals("rating", stringComparison);
            var requestHandler  = new ZkbRequestHandler(new JsonSerializer("yyyy-MM-dd HH:mm:ss"));

            //daily rating
            if (isRatingCommand || (isNewDay && grp == null && SettingsManager.Settings.StatsModule.RatingModeChannelId > 0))
            {
                if (context != null)
                {
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, LM.Get("dailyStatsWait"), false).ConfigureAwait(false);
                }

                var groups  = SettingsManager.Settings.StatsModule.DailyStatsGroups.Values.Where(a => a.IncludeInRating);
                var channel = isRatingCommand ? context.Channel.Id : SettingsManager.Settings.StatsModule.RatingModeChannelId;
                var to      = (now.Add(TimeSpan.FromHours(1)));
                to = to.Subtract(TimeSpan.FromMinutes(to.Minute));
                var startTime = isNewDay ? today.Subtract(TimeSpan.FromDays(1)) : today;
                var endTime   = isNewDay ? startTime.AddHours(24) : to;

                var list = new List <ZKillAPI.ZkillEntityStats>();

                foreach (var @group in groups)
                {
                    var data = await APIHelper.ZKillAPI.GetKillsLossesStats(@group.DailyStatsAlliance > 0?group.DailyStatsAlliance : group.DailyStatsCorp, group.DailyStatsAlliance > 0, startTime, endTime);

                    if (group.DailyStatsAlliance > 0)
                    {
                        var alliance = await APIHelper.ESIAPI.GetAllianceData(LogCat.Stats.ToString(), group.DailyStatsAlliance);

                        data.EntityName = $"{alliance?.name}[{alliance?.ticker}]";
                    }
                    else
                    {
                        if (group.DailyStatsCorp > 0)
                        {
                            var corp = await APIHelper.ESIAPI.GetCorporationData(LogCat.Stats.ToString(), group.DailyStatsCorp);

                            data.EntityName = $"{corp?.name}[{corp?.ticker}]";
                        }
                    }
                    list.Add(data);
                }
                list = list.OrderByDescending(item =>
                {
                    /* var iskDiff = item.IskDestroyed - item.IskLost;
                     * var isk = iskDiff / 1000000d;
                     * var pts = (item.PointsDestroyed - item.PointsLost) / 10d;
                     * var ships = item.ShipsDestroyed - item.ShipsLost;
                     * isk = isk < 0 ? 0 : isk;
                     * pts = pts < 0 ? 0 : pts;
                     * ships = ships < 0 ? 0 : ships;
                     * var avg = (3 * isk + 2*pts + 1 * ships + 1) / (isk + pts + ships + 1);*/

                    var isk   = item.IskDestroyed / (double)item.IskLost.ReturnMinimum(1);
                    var pts   = item.PointsDestroyed / (double)item.PointsLost.ReturnMinimum(1);
                    var ships = item.ShipsDestroyed / (double)item.ShipsLost.ReturnMinimum(1);

                    var avg = (3 * isk + 2 * ships + 1 * pts + 1) / (isk + pts + ships + 1);

                    /*  isk = item.IskLost / 1000000d;
                     * pts = item.PointsLost / 10d;
                     * var avg2 = (2*pts + 1 * item.ShipsLost + 1) / (pts + item.ShipsLost + 1);
                     *
                     * if (avg == 0 && avg2 == 0) return -1000;
                     *
                     * var result = avg - avg2;*/
                    return(avg);
                }).ToList();

                var date = today.Subtract(TimeSpan.FromDays(1));
                var sb   = new StringBuilder();
                sb.AppendLine("```css");
                sb.Append($"{"#".FixedLength(15)} {"ISK  ".FillSpacesBefore(8)} {LM.Get("dailyRatingColShips").FillSpacesBefore(5)} {LM.Get("dailyRatingColPoints").FillSpacesBefore(10)} {LM.Get("dailyRatingColSystem").FillSpacesBefore(15)}{Environment.NewLine}");
                sb.AppendLine("```");
                int count         = 1;
                var topIskIndex   = list.IndexOf(list.OrderByDescending(a => a.IskDestroyed).FirstOrDefault()) + 1;
                var topKillsIndex = list.IndexOf(list.OrderByDescending(a => a.ShipsDestroyed).FirstOrDefault()) + 1;
                var topPtsIndex   = list.IndexOf(list.OrderByDescending(a => a.PointsDestroyed).FirstOrDefault()) + 1;
                foreach (var item in list)
                {
                    var addon = string.Empty;
                    if (count == 1)
                    {
                        addon += $"{LM.Get("dailyRatingTopEff")} / ";
                    }
                    if (count == topKillsIndex)
                    {
                        addon += $"{LM.Get("dailyRatingTopKill")} / ";
                    }
                    if (count == topIskIndex)
                    {
                        addon += $"{LM.Get("dailyRatingTopIsk")} / ";
                    }
                    if (count == topPtsIndex)
                    {
                        addon += $"{LM.Get("dailyRatingTopPts")} / ";
                    }
                    if (addon.EndsWith(" / "))
                    {
                        addon = addon.Substring(0, addon.Length - 3);
                    }

                    sb.Append(count.ToString().FixedLength(3));
                    sb.Append($"**{item.EntityName}** ");
                    if (!string.IsNullOrEmpty(addon))
                    {
                        sb.Append($"***{addon}***");
                    }
                    sb.Append(Environment.NewLine);
                    sb.AppendLine("```C");
                    sb.Append($"   {LM.Get("dailyRatingKilled")}:".FixedLength(15));
                    sb.Append(item.IskDestroyed.ToKMB().FillSpacesBefore(8));
                    sb.Append(item.ShipsDestroyed.ToString("N0").FillSpacesBefore(5));
                    sb.Append(item.PointsDestroyed.ToKMB().FillSpacesBefore(10));
                    sb.Append(item.MostSystems?.FillSpacesBefore(15));
                    sb.Append(Environment.NewLine);
                    sb.Append($"   {LM.Get("dailyRatingLost")}:".FixedLength(15));
                    sb.Append(item.IskLost.ToKMB().FillSpacesBefore(8));
                    sb.Append(item.ShipsLost.ToString("N0").FillSpacesBefore(5));
                    sb.Append(item.PointsLost.ToKMB().FillSpacesBefore(10));
                    sb.AppendLine("```");

                    count++;
                }
                var msg = $"**{LM.Get("dailyStatsRating", date.ToString(SettingsManager.Settings.Config.DateFormat))}**\n{sb}\n";
                //  $"**{LM.Get("dailyStats", date, entity)}**\n{LM.Get("Killed")}:\t**{data.ShipsDestroyed}** ({data.IskDestroyed:n0} ISK)\n{LM.Get("Lost")}:\t**{data.ShipsLost}** ({data.IskLost:n0} ISK)";
                await APIHelper.DiscordAPI.SendMessageAsync(APIHelper.DiscordAPI.GetChannel(channel), msg).ConfigureAwait(false);

                return;
            }

            var allyId = grp?.DailyStatsAlliance ?? ((await APIHelper.ESIAPI.SearchAllianceId("Stats", entity))?.alliance?.FirstOrDefault() ?? 0);
            var corpId = grp?.DailyStatsCorp ?? (await APIHelper.ESIAPI.SearchCorporationId("Stats", entity))?.corporation?.FirstOrDefault() ?? 0;

            if (allyId == 0 && corpId == 0)
            {
                await APIHelper.DiscordAPI.ReplyMessageAsync(context, LM.Get("entryNotFound"), true).ConfigureAwait(false);

                return;
            }

            var isAlliance = allyId > 0;
            var id         = isAlliance ? allyId : corpId;

            entity = string.IsNullOrEmpty(entity) ? (isAlliance ? (await APIHelper.ESIAPI.GetAllianceData("Stats", id))?.name :(await APIHelper.ESIAPI.GetCorporationData("Stats", id))?.name) : entity;
            var dayCommands = new List <string> {
                "d", "t", "today", "newday"
            };

            if (dayCommands.Contains(command, StringComparer.InvariantCultureIgnoreCase))
            {
                /* var channel = grp?.DailyStatsChannel ?? 0;
                 * if(isNewDay && channel == 0) return;
                 * var to = now.Add(TimeSpan.FromHours(1));
                 * to = to.Subtract(TimeSpan.FromMinutes(to.Minute));
                 * var startTime = isNewDay ? today.Subtract(TimeSpan.FromDays(1)) : today;
                 * var endTime = isNewDay ? startTime.AddHours(24) : to;
                 * var options = new ZKillboardOptions
                 * {
                 *   StartTime = startTime,
                 *   EndTime = endTime,
                 * };
                 * if (isAlliance)
                 *   options.AllianceId = new List<long> {id};
                 * else options.CorporationId = new List<long> {id};
                 *
                 * string relPath = "/api/losses";
                 * relPath = options.GetQueryString(relPath);
                 * var losses = await RequestAsync<List<ZkbResponse.ZkbKill>>(requestHandler, new Uri(new Uri("https://zkillboard.com"), relPath)) ??
                 *               new List<ZkbResponse.ZkbKill>();
                 * relPath = "/api/kills";
                 * relPath = options.GetQueryString(relPath);
                 * var kills = await RequestAsync<List<ZkbResponse.ZkbKill>>(requestHandler, new Uri(new Uri("https://zkillboard.com"), relPath)) ??
                 *           new List<ZkbResponse.ZkbKill>();
                 * var shipsDestroyed = kills.Count;
                 * var shipsLost = losses.Count;
                 * var iskDestroyed = kills.Where(a=> a).Sum(a => a.Stats.TotalValue);
                 * var iskLost = losses.Sum(a => a.Stats.TotalValue);*/
                var channel = grp?.DailyStatsChannel ?? 0;
                if (isNewDay && channel == 0)
                {
                    return;
                }

                var to = (now.Add(TimeSpan.FromHours(1)));
                to = to.Subtract(TimeSpan.FromMinutes(to.Minute));
                var startTime = isNewDay ? today.Subtract(TimeSpan.FromDays(1)) : today;
                var endTime   = isNewDay ? startTime.AddHours(24) : to;
                var data      = await APIHelper.ZKillAPI.GetKillsLossesStats(id, isAlliance, startTime, endTime);

                var date = today;
                if (isNewDay)
                {
                    date = today.Subtract(TimeSpan.FromDays(1));
                    var msg =
                        GetMsg(LM.Get("dailyStats", date, entity), data.ShipsDestroyed, data.IskDestroyed, data.ShipsLost, data.IskLost);
                    await APIHelper.DiscordAPI.SendMessageAsync(APIHelper.DiscordAPI.GetChannel(channel), msg).ConfigureAwait(false);
                }
                else
                {
                    var msg = GetMsg(LM.Get("dailyStats", date, entity), data.ShipsDestroyed, data.IskDestroyed, data.ShipsLost, data.IskLost);
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, msg, true).ConfigureAwait(false);
                }
            }
            else
            {
                if (command.Equals("week", stringComparison) || command.Equals("w", stringComparison))
                {
                    var data = await APIHelper.ZKillAPI.GetKillsLossesStats(id, isAlliance, DateTime.UtcNow.StartOfWeek(DayOfWeek.Monday), DateTime.UtcNow);

                    var msg = GetMsg(LM.Get("statsCalendarWeekly", entity), data.ShipsDestroyed, data.IskDestroyed, data.ShipsLost, data.IskLost);
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, msg);

                    return;
                }
                if (command.Equals("lastweek", stringComparison) || command.Equals("lw", stringComparison))
                {
                    var data = await APIHelper.ZKillAPI.GetKillsLossesStats(id, isAlliance, null, null, 604800);

                    var msg = GetMsg(LM.Get("statsLastWeek", entity), data.ShipsDestroyed, data.IskDestroyed, data.ShipsLost, data.IskLost);
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, msg);

                    return;
                }
                if (command.Equals("lastday", stringComparison) || command.Equals("ld", stringComparison))
                {
                    var data = await APIHelper.ZKillAPI.GetKillsLossesStats(id, isAlliance, null, null, 86400);

                    var msg = GetMsg(LM.Get("statsLastDay", entity), data.ShipsDestroyed, data.IskDestroyed, data.ShipsLost, data.IskLost);
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, msg);

                    return;
                }


                var t       = isAlliance ? "allianceID" : "corporationID";
                var relPath = $"/api/stats/{t}/{id}/";
                var result  = await RequestAsync <ZkbStatResponse>(requestHandler, new Uri(new Uri("https://zkillboard.com"), relPath));

                if (command.Equals("month", stringComparison) || command.Equals("m", stringComparison))
                {
                    var data = result.Months.FirstOrDefault(a => a.Value.Year == now.Year && a.Value.Month == now.Month).Value;
                    if (data == null)
                    {
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, LM.Get("statNoDataFound"), true).ConfigureAwait(false);

                        return;
                    }
                    var msg = GetMsg(LM.Get("monthlyStats", entity), data.ShipsDestroyed, data.IskDestroyed, data.ShipsLost, data.IskLost);
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, msg);
                }
                else if (command.Equals("year", stringComparison) || command.Equals("y", stringComparison))
                {
                    var data = result.Months.FirstOrDefault(a => a.Value.Year == now.Year).Value;
                    if (data == null)
                    {
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, LM.Get("statNoDataFound"), true).ConfigureAwait(false);

                        return;
                    }
                    var msg = GetMsg(LM.Get("yearlyStats", result.Info.Name, now.Year), data.ShipsDestroyed, data.IskDestroyed, data.ShipsLost, data.IskLost);
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, msg);
                }
                else if (command.All(char.IsDigit))
                {
                    var list = result.Months.Where(a => a.Value.Year.ToString() == command).ToList();
                    if (!list.Any())
                    {
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, LM.Get("statNoDataFound"), true).ConfigureAwait(false);

                        return;
                    }
                    var shipsDestroyed = list.Sum(a => a.Value.ShipsDestroyed);
                    var shipsLost      = list.Sum(a => a.Value.ShipsLost);
                    var iskDestroyed   = list.Sum(a => a.Value.IskDestroyed);
                    var iskLost        = list.Sum(a => a.Value.IskLost);
                    var msg            = GetMsg(LM.Get("yearlyStats", result.Info.Name, now.Year), shipsDestroyed, iskDestroyed, shipsLost, iskLost);
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, msg);
                }
                else if (command.Contains("/"))
                {
                    var tmp = command.Split("/");
                    if (!tmp[0].All(char.IsDigit) || tmp[0].Length != 4)
                    {
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, LM.Get("statUnknownCommandSyntax", SettingsManager.Settings.Config.BotDiscordCommandPrefix), true).ConfigureAwait(false);

                        return;
                    }

                    if (!tmp[1].All(char.IsDigit) || tmp[1].Length < 1 || tmp[1].Length > 2)
                    {
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, LM.Get("statUnknownCommandSyntax", SettingsManager.Settings.Config.BotDiscordCommandPrefix), true).ConfigureAwait(false);

                        return;
                    }
                    var m    = int.Parse(tmp[1]);
                    var list = result.Months.Where(a => a.Value.Year.ToString() == tmp[0] && a.Value.Month == m).ToList();
                    if (!list.Any())
                    {
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, LM.Get("statNoDataFound"), true).ConfigureAwait(false);

                        return;
                    }
                    var shipsDestroyed = list.Sum(a => a.Value.ShipsDestroyed);
                    var shipsLost      = list.Sum(a => a.Value.ShipsLost);
                    var iskDestroyed   = list.Sum(a => a.Value.IskDestroyed);
                    var iskLost        = list.Sum(a => a.Value.IskLost);
                    var msg            = GetMsg(LM.Get("monthlyCustomStats", result.Info.Name, now.Year), shipsDestroyed, iskDestroyed, shipsLost, iskLost);
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, msg);
                }
            }
        }
コード例 #3
0
ファイル: ZKillboard.cs プロジェクト: dinomight/evelib
 /// <summary>
 ///     Default constructor
 /// </summary>
 public ZKillboard() {
     RequestHandler = new ZkbRequestHandler(new JsonSerializer(), Config.CacheFactory("ZKillboard"));
     Host = new Uri(DefaultHost);
 }
コード例 #4
0
 /// <summary>
 ///     Default constructor
 /// </summary>
 public ZKillboard()
 {
     RequestHandler = new ZkbRequestHandler(new JsonSerializer("yyyy-MM-dd HH:mm:ss"), Config.CacheFactory("ZKillboard"));
     Host           = new Uri(DefaultHost);
 }
コード例 #5
0
 /// <summary>
 ///     Default constructor
 /// </summary>
 public zKillboard_Check()
 {
     RequestHandler = new ZkbRequestHandler(new JsonSerializer(), Config.CacheFactory());
     Host           = new Uri(DefaultHost);
 }
コード例 #6
0
        public static async Task Stats(ICommandContext context, string commandText)
        {
            if (!SettingsManager.GetBool("config", "moduleStats"))
            {
                return;
            }

            try
            {
                var    now      = DateTime.Now;
                var    today    = DateTime.Today;
                var    comms    = commandText.Split(' ').ToList();
                var    isSingle = comms.Count == 1;
                var    command  = string.IsNullOrEmpty(commandText) ? "t" : comms[0].ToLower();
                string entity   = null;
                if (!isSingle)
                {
                    comms.RemoveAt(0);
                    entity = string.Join(' ', comms);
                }

                var requestHandler = new ZkbRequestHandler(new JsonSerializer("yyyy-MM-dd HH:mm:ss"));
                //TODO introduce own variables and may be even settings section
                var allyId = SettingsManager.GetLong("statsModule", "autodailyStatsDefaultAlliance");
                if (!string.IsNullOrEmpty(entity))
                {
                    allyId = (await APIHelper.ESIAPI.SearchAllianceId("Stats", entity))?.alliance?.FirstOrDefault() ?? 0;
                }
                var corpId = SettingsManager.GetLong("statsModule", "autoDailyStatsDefaultCorp");
                if (!string.IsNullOrEmpty(entity) && allyId == 0)
                {
                    corpId = (await APIHelper.ESIAPI.SearchCorporationId("Stats", entity))?.corporation.FirstOrDefault() ?? 0;
                }
                if (allyId == 0 && corpId == 0)
                {
                    return;
                }

                bool isAlliance = corpId == 0;
                var  id         = isAlliance ? allyId : corpId;
                entity = string.IsNullOrEmpty(entity) ? (isAlliance ? (await APIHelper.ESIAPI.GetAllianceData("Stats", id))?.name :(await APIHelper.ESIAPI.GetCorporationData("Stats", id))?.name) : entity;

                if (command == "t" || command == "today" || command == "newday")
                {
                    var isNewDay = command == "newday";
                    var channel  = SettingsManager.GetULong("config", "autoDailyStatsChannel");
                    if (isNewDay && channel == 0)
                    {
                        return;
                    }
                    var to = now.Add(TimeSpan.FromHours(1));
                    to = to.Subtract(TimeSpan.FromMinutes(to.Minute));
                    var startTime = isNewDay ? today.Subtract(TimeSpan.FromDays(1)) : today;
                    var endTime   = isNewDay ? startTime.AddHours(24) : to;
                    var options   = new ZKillboardOptions
                    {
                        StartTime = startTime,
                        EndTime   = endTime,
                    };
                    if (isAlliance)
                    {
                        options.AllianceId = new List <long> {
                            id
                        }
                    }
                    ;
                    else
                    {
                        options.CorporationId = new List <long> {
                            id
                        }
                    };

                    string relPath = "/api/losses";
                    relPath = options.GetQueryString(relPath);
                    var losses = await RequestAsync <List <ZkbResponse.ZkbKill> >(requestHandler, new Uri(new Uri("https://zkillboard.com"), relPath)) ??
                                 new List <ZkbResponse.ZkbKill>();

                    relPath = "/api/kills";
                    relPath = options.GetQueryString(relPath);
                    var kills = await RequestAsync <List <ZkbResponse.ZkbKill> >(requestHandler, new Uri(new Uri("https://zkillboard.com"), relPath)) ??
                                new List <ZkbResponse.ZkbKill>();

                    var shipsDestroyed = kills.Count;
                    var shipsLost      = losses.Count;
                    var iskDestroyed   = kills.Sum(a => a.Stats.TotalValue);
                    var iskLost        = losses.Sum(a => a.Stats.TotalValue);
                    var date           = today;
                    if (isNewDay)
                    {
                        date = today.Subtract(TimeSpan.FromDays(1));
                        var msg =
                            $"**{string.Format(LM.Get("dailyStats"), date, entity)}**\n{LM.Get("Killed")}:\t**{shipsDestroyed}** ({iskDestroyed:n0} ISK)\n{LM.Get("Lost")}:\t**{shipsLost}** ({iskLost:n0} ISK)";
                        await APIHelper.DiscordAPI.SendMessageAsync(APIHelper.DiscordAPI.GetChannel(channel), msg).ConfigureAwait(false);
                    }
                    else
                    {
                        var msg =
                            $"**{string.Format(LM.Get("dailyStats"), date, entity)}**\n{LM.Get("Killed")}:\t**{shipsDestroyed}** ({iskDestroyed:n0} ISK)\n{LM.Get("Lost")}:\t**{shipsLost}** ({iskLost:n0} ISK)";
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, msg, true).ConfigureAwait(false);
                    }
                }
                else
                {
                    var t       = isAlliance ? "allianceID" : "corporationID";
                    var relPath = $"/api/stats/{t}/{id}/";
                    var result  = await RequestAsync <ZkbStatResponse>(requestHandler, new Uri(new Uri("https://zkillboard.com"), relPath));

                    if (command == "month" || command == "m")
                    {
                        var data = result.Months.FirstOrDefault(a => a.Value.Year == now.Year && a.Value.Month == now.Month).Value;
                        if (data == null)
                        {
                            return;
                        }
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context,
                                                                     $"**{string.Format(LM.Get("monthlyStats"), result.Info.Name)}**\n{LM.Get("Killed")}:\t**{data.ShipsDestroyed}** ({data.IskDestroyed:n0} ISK)\n{LM.Get("Lost")}:\t**{data.ShipsLost}** ({data.IskLost:n0} ISK)");
                    }
                    else if (command.All(char.IsDigit))
                    {
                        var list = result.Months.Where(a => a.Value.Year.ToString() == command).ToList();
                        if (!list.Any())
                        {
                            return;
                        }
                        var shipsDestroyed = list.Sum(a => a.Value.ShipsDestroyed);
                        var shipsLost      = list.Sum(a => a.Value.ShipsLost);
                        var iskDestroyed   = list.Sum(a => a.Value.IskDestroyed);
                        var iskLost        = list.Sum(a => a.Value.IskLost);
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context,
                                                                     $"**{string.Format(LM.Get("yearlyStats"), result.Info.Name, command)}**\n{LM.Get("Killed")}:\t**{shipsDestroyed}** ({iskDestroyed:n0} ISK)\n{LM.Get("Lost")}:\t**{shipsLost}** ({iskLost:n0} ISK)");
                    }
                    else if (command.Contains("/"))
                    {
                        var tmp = command.Split("/");
                        if (!tmp[0].All(char.IsDigit) || tmp[0].Length != 4)
                        {
                            return;
                        }
                        if (!tmp[1].All(char.IsDigit) || tmp[1].Length < 1 || tmp[1].Length > 2)
                        {
                            return;
                        }
                        var m    = int.Parse(tmp[1]);
                        var list = result.Months.Where(a => a.Value.Year.ToString() == tmp[0] && a.Value.Month == m).ToList();
                        if (!list.Any())
                        {
                            return;
                        }
                        var shipsDestroyed = list.Sum(a => a.Value.ShipsDestroyed);
                        var shipsLost      = list.Sum(a => a.Value.ShipsLost);
                        var iskDestroyed   = list.Sum(a => a.Value.IskDestroyed);
                        var iskLost        = list.Sum(a => a.Value.IskLost);
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context,
                                                                     $"**{string.Format(LM.Get("monthlyCustomStats"), result.Info.Name, command)}**\n{LM.Get("Killed")}:\t**{shipsDestroyed}** ({iskDestroyed:n0} ISK)\n{LM.Get("Lost")}:\t**{shipsLost}** ({iskLost:n0} ISK)");
                    }
                }
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx(ex.Message, ex, LogCat.Stats);
            }
        }