Beispiel #1
0
        private async Task <bool> OnDisplayTimers(HttpListenerRequestEventArgs context)
        {
            if (!Settings.Config.ModuleTimers)
            {
                return(false);
            }

            var request  = context.Request;
            var response = context.Response;

            try
            {
                var extPort = Settings.WebServerModule.WebExternalPort;
                var port    = Settings.WebServerModule.WebExternalPort;

                if (request.HttpMethod == HttpMethod.Get.ToString())
                {
                    if (request.Url.LocalPath == "/callback.php" || request.Url.LocalPath == $"{extPort}/callback.php" || request.Url.LocalPath == $"{port}/callback.php")
                    {
                        var clientID = Settings.WebServerModule.CcpAppClientId;
                        var secret   = Settings.WebServerModule.CcpAppSecret;

                        var prms  = request.Url.Query.TrimStart('?').Split('&');
                        var code  = prms[0].Split('=')[1];
                        var state = prms.Length > 1 ? prms[1].Split('=')[1] : null;

                        if (state != "11")
                        {
                            return(false);
                        }

                        //state = 11 && have code
                        var result = await WebAuthModule.GetCharacterIdFromCode(code, clientID, secret);

                        if (result == null)
                        {
                            //TODO invalid auth
                            await response.RedirectAsync(new Uri(WebServerModule.GetWebSiteUrl()));

                            return(true);
                        }
                        var characterId = Convert.ToInt64(result[0]);

                        await SQLHelper.UpdateTimersAuth(characterId);

                        //redirect to timers
                        var iid = Convert.ToBase64String(Encoding.UTF8.GetBytes(characterId.ToString()));
                        iid = HttpUtility.UrlEncode(iid);
                        var url = $"{WebServerModule.GetTimersURL()}?data=0&id={iid}&state=11";
                        await response.RedirectAsync(new Uri(url));

                        return(true);
                    }

                    if (request.Url.LocalPath == "/timers.php" || request.Url.LocalPath == $"{extPort}/timers.php" || request.Url.LocalPath == $"{port}/timers.php")
                    {
                        if (string.IsNullOrWhiteSpace(request.Url.Query))
                        {
                            //redirect to auth
                            await response.RedirectAsync(new Uri(WebServerModule.GetTimersAuthURL()));

                            return(true);
                        }

                        var prms = request.Url.Query.TrimStart('?').Split('&');
                        if (prms.Length != 3)
                        {
                            await response.RedirectAsync(new Uri(WebServerModule.GetWebSiteUrl()));

                            return(true);
                        }

                        var data    = prms[0].Split('=')[1];
                        var inputId = prms[1].Split('=')[1];
                        var state   = prms[2].Split('=')[1];
                        if (state != "11")
                        {
                            await response.RedirectAsync(new Uri(WebServerModule.GetWebSiteUrl()));

                            return(true);
                        }
                        var characterId = Convert.ToInt64(Encoding.UTF8.GetString(Convert.FromBase64String(HttpUtility.UrlDecode(inputId))));

                        var rChar = await APIHelper.ESIAPI.GetCharacterData(Reason, characterId, true);

                        if (rChar == null)
                        {
                            await response.RedirectAsync(new Uri(WebServerModule.GetWebSiteUrl()));

                            return(true);
                        }

                        //have charId - had to check it
                        //check in db
                        var timeout = Settings.TimersModule.AuthTimeoutInMinutes;
                        if (timeout != 0)
                        {
                            var result = await SQLHelper.GetTimersAuthTime(characterId);

                            if (result == null || (DateTime.Now - DateTime.Parse(result)).TotalMinutes > timeout)
                            {
                                //redirect to auth
                                await response.RedirectAsync(new Uri(WebServerModule.GetTimersAuthURL()));

                                return(true);
                            }
                        }

                        var checkResult = await CheckAccess(characterId, rChar);

                        if (!checkResult[0])
                        {
                            await WebServerModule.WriteResponce(WebServerModule.GetAccessDeniedPage("Timers Module", LM.Get("accessDenied"), WebServerModule.GetWebSiteUrl()), response);

                            return(true);
                        }

                        if (checkResult[1] && data.StartsWith("delete"))
                        {
                            data = data.Substring(6, data.Length - 6);
                            await SQLHelper.DeleteTimer(Convert.ToInt64(data));

                            var x = HttpUtility.ParseQueryString(request.Url.Query);
                            x.Set("data", "0");
                            await response.RedirectAsync(new Uri($"{request.Url.ToString().Split('?')[0]}?{x}"));

                            return(true);
                        }

                        await WriteCorrectResponce(response, checkResult[1], characterId);

                        return(true);
                    }
                }
                else if (request.HttpMethod == HttpMethod.Post.ToString())
                {
                    var prms = request.Url.Query.TrimStart('?').Split('&');
                    if (prms.Length != 3)
                    {
                        //await response.RedirectAsync(new Uri(WebServerModule.GetWebSiteUrl()));
                        return(false);
                    }
                    var inputId = prms[1].Split('=')[1];
                    var state   = prms[2].Split('=')[1];
                    if (state != "11")
                    {
                        // await response.RedirectAsync(new Uri(WebServerModule.GetWebSiteUrl()));
                        return(false);
                    }

                    var characterId = Convert.ToInt64(Encoding.UTF8.GetString(Convert.FromBase64String(HttpUtility.UrlDecode(inputId))));

                    var rChar = await APIHelper.ESIAPI.GetCharacterData(Reason, characterId, true);

                    if (rChar == null)
                    {
                        // await response.RedirectAsync(new Uri(WebServerModule.GetWebSiteUrl()));
                        return(false);
                    }

                    var checkResult = await CheckAccess(characterId, rChar);

                    if (!checkResult[0])
                    {
                        return(true);
                    }

                    var data = await request.ReadContentAsStringAsync();

                    if (checkResult[1] && data != null)
                    {
                        if (data.StartsWith("delete"))
                        {
                            data = data.Substring(6, data.Length - 6);
                            await SQLHelper.DeleteTimer(Convert.ToInt64(data));
                        }
                        else
                        {
                            TimerItem entry = null;
                            try
                            {
                                entry = JsonConvert.DeserializeObject <TimerItem>(data);
                            }
                            catch
                            {
                                //ignore
                            }

                            if (entry == null)
                            {
                                await response.WriteContentAsync(LM.Get("invalidInputData"));

                                return(true);
                            }

                            var iDate = entry.GetDateTime();
                            if (iDate == null)
                            {
                                await response.WriteContentAsync(LM.Get("invalidTimeFormat"));

                                return(true);
                            }

                            if (iDate < DateTime.Now)
                            {
                                await response.WriteContentAsync(LM.Get("passedTimeValue"));

                                return(true);
                            }

                            //save
                            entry.timerChar = rChar.name;
                            await SQLHelper.UpdateTimer(entry);
                        }
                        return(true);
                    }
                }
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx(ex.Message, ex, Category);
            }

            return(false);
        }
        public static async Task Stats(ICommandContext context, string commandText)
        {
            if (!SettingsManager.Settings.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.Settings.ContinousCheckModule.DailyStatsDefaultAlliance;
                if (!string.IsNullOrEmpty(entity))
                {
                    allyId = (await APIHelper.ESIAPI.SearchAllianceId("Stats", entity))?.alliance?.FirstOrDefault() ?? 0;
                }
                var corpId = SettingsManager.Settings.ContinousCheckModule.DailyStatsDefaultCorp;
                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 == "d" || command == "t" || command == "today" || command == "newday")
                {
                    var isNewDay = command == "newday";
                    var channel  = SettingsManager.Settings.ContinousCheckModule.DailyStatsChannel;
                    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 =
                            $"**{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 =
                            $"**{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,
                                                                     $"**{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,
                                                                     $"**{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,
                                                                     $"**{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);
            }
        }
Beispiel #3
0
        public async Task <string> GenerateTimersHtml(bool isEditor, string baseCharId)
        {
            var timers = await SQLHelper.SelectTimers();

            int counter = 1;
            var sb      = new StringBuilder();

            sb.AppendLine("<thead>");
            sb.AppendLine("<tr>");
            sb.AppendLine($"<th scope=\"col-md-auto\">#</th>");
            sb.AppendLine($"<th scope=\"col-md-auto\">{LM.Get("timersType")}</th>");
            sb.AppendLine($"<th scope=\"col-md-auto\">{LM.Get("timersStage")}</th>");
            sb.AppendLine($"<th scope=\"col\">{LM.Get("timersLocation")}</th>");
            sb.AppendLine($"<th scope=\"col\">{LM.Get("timersOwner")}</th>");
            sb.AppendLine($"<th scope=\"col\" class=\"fixed150\">{LM.Get("timersET")}</th>");
            sb.AppendLine($"<th scope=\"col\" class=\"fixed150\">{LM.Get("timersRemaining")}</th>");
            sb.AppendLine($"<th scope=\"col\">{LM.Get("timersNotes")}</th>");
            sb.AppendLine($"<th scope=\"col\">{LM.Get("timersUser")}</th>");
            sb.AppendLine($"<th scope=\"col-md-auto\" class=\"{(isEditor ? null : "d-none")}\"></th");
            sb.AppendLine("</tr>");
            sb.AppendLine("</thead>");
            sb.AppendLine("<tbody>");

            var timeFormat = Settings.Config.ShortTimeFormat;

            timers.OrderBy(a => a.GetDateTime()).ToList().ForEach(timer =>
            {
                sb.AppendLine("<tr>");
                sb.AppendLine($"  <th scope=\"row\">{counter++}</th>");
                sb.AppendLine($"  <td>{timer.GetModeName()}</td>");
                sb.AppendLine($"  <td>{timer.GetStageName()}</td>");
                sb.AppendLine($"  <td>{HttpUtility.HtmlEncode(timer.timerLocation)}</td>");
                sb.AppendLine($"  <td>{HttpUtility.HtmlEncode(timer.timerOwner)}</td>");
                sb.AppendLine($"  <td>{timer.GetDateTime()?.ToString(timeFormat)}</td>");
                sb.AppendLine($"  <td>{timer.GetRemains()}</td>");
                sb.AppendLine($"  <td>{HttpUtility.HtmlEncode(timer.timerNotes)}</td>");
                sb.AppendLine($"  <td>{HttpUtility.HtmlEncode(timer.timerChar)}</td>");
                if (isEditor)
                {
                    sb.AppendLine($"<td><a class=\"btn btn-danger\" href=\"{WebServerModule.GetTimersURL()}?data=delete{timer.id}&id={HttpUtility.UrlEncode(baseCharId)}&state=11\" role=\"button\" data-toggle=\"confirmation\" data-title=\"{LM.Get("ConfirmDelete")}?\">X</a></td>");
                }
                sb.AppendLine("</tr>");
            });
            sb.AppendLine("</tbody>");
            return(sb.ToString());
        }
Beispiel #4
0
        private async Task <bool> OnAuthRequest(HttpListenerRequestEventArgs context)
        {
            if (!Settings.Config.ModuleIndustrialJobs)
            {
                return(false);
            }

            var request  = context.Request;
            var response = context.Response;

            try
            {
                RunningRequestCount++;
                var port = Settings.WebServerModule.WebExternalPort;

                if (request.HttpMethod == HttpMethod.Get.ToString())
                {
                    if (request.Url.LocalPath == "/callback" || request.Url.LocalPath == $"{port}/callback")
                    {
                        var clientID = Settings.WebServerModule.CcpAppClientId;
                        var secret   = Settings.WebServerModule.CcpAppSecret;
                        var prms     = request.Url.Query.TrimStart('?').Split('&');
                        var code     = prms[0].Split('=')[1];
                        var state    = prms.Length > 1 ? prms[1].Split('=')[1] : null;

                        if (string.IsNullOrEmpty(state))
                        {
                            return(false);
                        }

                        if (!state.StartsWith("ijobsauth"))
                        {
                            return(false);
                        }
                        //var groupName = HttpUtility.UrlDecode(state.Replace("ijobsauth", ""));

                        var result = await WebAuthModule.GetCharacterIdFromCode(code, clientID, secret);

                        if (result == null)
                        {
                            await WebServerModule.WriteResponce(
                                WebServerModule.GetAccessDeniedPage("Industry Jobs Module", LM.Get("accessDenied"),
                                                                    WebServerModule.GetAuthPageUrl()), response);

                            return(true);
                        }

                        var lCharId = Convert.ToInt64(result[0]);
                        //var group = Settings.IndustrialJobsModule.Groups[groupName];
                        var    allowedCharacters = GetAllParsedCharactersWithGroups();
                        string allowedGroup      = null;
                        foreach (var(group, allowedCharacterIds) in allowedCharacters)
                        {
                            if (allowedCharacterIds.Contains(lCharId))
                            {
                                allowedGroup = group;
                                break;
                            }
                        }

                        if (string.IsNullOrEmpty(allowedGroup))
                        {
                            await WebServerModule.WriteResponce(
                                WebServerModule.GetAccessDeniedPage("Industry Jobs Module", LM.Get("accessDenied"),
                                                                    WebServerModule.GetAuthPageUrl()), response);

                            return(true);
                        }

                        await SQLHelper.InsertOrUpdateTokens("", result[0], null, null, result[1]);

                        await WebServerModule.WriteResponce(File
                                                            .ReadAllText(SettingsManager.FileTemplateMailAuthSuccess)
                                                            .Replace("{headerContent}", WebServerModule.GetHtmlResourceDefault(false))
                                                            .Replace("{header}", "authTemplateHeader")
                                                            .Replace("{body}", LM.Get("industryJobsAuthSuccessHeader"))
                                                            .Replace("{body2}", LM.Get("industryJobsAuthSuccessBody"))
                                                            .Replace("{backText}", LM.Get("backText")), response
                                                            );

                        return(true);
                    }
                }
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx(ex.Message, ex, Category);
            }
            finally
            {
                RunningRequestCount--;
            }
            return(false);
        }
        public override async Task Run(object prm)
        {
            if (IsRunning)
            {
                return;
            }
            IsRunning = true;

            await ProcessExistingCampaigns();

            try
            {
                if (DateTime.Now <= _nextNotificationCheck)
                {
                    return;
                }
                _nextNotificationCheck = DateTime.Now.AddMinutes(Settings.NullCampaignModule.CheckIntervalInMinutes);

                var etag   = _tags.GetOrNull(0);
                var result = await APIHelper.ESIAPI.GetNullCampaigns(Reason, etag);

                _tags.AddOrUpdateEx(0, result.Data.ETag);
                if (result.Data.IsNotModified)
                {
                    return;
                }

                var allCampaigns = result.Result;
                if (allCampaigns == null)
                {
                    return;
                }
                foreach (var pair in Settings.NullCampaignModule.GetEnabledGroups())
                {
                    var groupName = pair.Key;
                    var group     = pair.Value;
                    var systems   = new List <JsonClasses.SystemName>();

                    foreach (var regionId in @group.Regions)
                    {
                        systems.AddRange(await SQLHelper.GetSystemsByRegion(regionId));
                    }
                    foreach (var cId in @group.Constellations)
                    {
                        systems.AddRange(await SQLHelper.GetSystemsByConstellation(cId));
                    }

                    var systemIds = systems.Select(a => a.system_id);
                    var campaigns = allCampaigns.Where(a => systemIds.Contains(a.solar_system_id));
                    var existIds  = await SQLHelper.GetNullsecCampaignIdList(groupName);

                    campaigns = campaigns.Where(a => !existIds.Contains(a.campaign_id));

                    foreach (var campaign in campaigns)
                    {
                        if (await SQLHelper.IsNullsecCampaignExists(groupName, campaign.campaign_id))
                        {
                            continue;
                        }

                        var startTime    = campaign.Time;
                        var totalMinutes = DateTime.UtcNow >= startTime ? 0 : (int)(startTime - DateTime.UtcNow).TotalMinutes;
                        if (totalMinutes == 0)
                        {
                            continue;
                        }

                        await SQLHelper.UpdateNullCampaign(groupName, campaign.campaign_id, startTime, campaign.ToJson());

                        if (group.ReportNewCampaign)
                        {
                            await PrepareMessage(campaign, pair.Value, LM.Get("NC_NewCampaign"), 0x00FF00);
                        }

                        await LogHelper.LogInfo($"Nullsec Campaign {campaign.campaign_id} has been registered! [{groupName} - {campaign.campaign_id}]", Category, true, false);
                    }
                }
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx(ex.Message, ex, Category);
            }
            finally
            {
                IsRunning = false;
            }
        }
Beispiel #6
0
        public async Task Auth3(string command, string data)
        {
            if (SettingsManager.Settings.Config.ModuleAuthWeb)
            {
                try
                {
                    string code;
                    int    characterId;
                    if (!data.All(char.IsDigit))
                    {
                        code        = data;
                        characterId = 0;
                    }
                    else
                    {
                        code        = null;
                        characterId = Convert.ToInt32(data);
                    }
                    code = code ?? await SQLHelper.PendingUsersGetCode(characterId);

                    //check if entry exists
                    if (await SQLHelper.UserTokensExists(code) == false)
                    {
                        await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("entryNotFound"));

                        return;
                    }

                    var name = await SQLHelper.UserTokensGetName(code);

                    switch (command)
                    {
                    case "accept":
                    {
                        //check if pending users have valid entry
                        if (await SQLHelper.PendingUsersIsEntryActive(code) == false)
                        {
                            await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("entryNotFound"));

                            return;
                        }
                        //check if user confirmed application
                        if (await SQLHelper.UserTokensIsConfirmed(code) == false)
                        {
                            await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("authUserNotConfirmed", name));

                            return;
                        }

                        var userGroupName = await SQLHelper.UserTokensGetGroupName(code);

                        var groupRoles = SettingsManager.Settings.WebAuthModule.AuthGroups.FirstOrDefault(a => a.Key == userGroupName).Value?.AuthRoles;
                        //check if group exists
                        if (string.IsNullOrEmpty(userGroupName) || groupRoles == null)
                        {
                            await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("authGroupNameNotFound", userGroupName));

                            return;
                        }

                        //check auth rights
                        if (!APIHelper.DiscordAPI.GetUserRoleNames(Context.Message.Author.Id).Any(a => groupRoles.Contains(a)))
                        {
                            await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("authNoAccessRights"));

                            return;
                        }

                        //authed for action!
                        // code = code ?? await SQLHelper.PendingUsersGetCode(characterId);
                        var discordUserId = await SQLHelper.PendingUsersGetDiscordId(code);

                        await WebAuthModule.AuthUser(Context, code, discordUserId);

                        await SQLHelper.UserTokensSetAuthState(code, 2);

                        return;
                    }

                    case "decline":
                    {
                        //check if pending users have valid entry
                        if (await SQLHelper.PendingUsersIsEntryActive(code) == false)
                        {
                            await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("entryNotFound"));

                            return;
                        }

                        characterId = characterId == 0 ? await SQLHelper.PendingUsersGetCharacterId(code) : characterId;

                        await SQLHelper.SQLiteDataDelete("pendingUsers", "characterID", characterId.ToString());

                        await SQLHelper.SQLiteDataDelete("userTokens", "characterID", characterId.ToString());

                        await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("authDiscordUserDeclined", name));

                        return;
                    }

                    case "confirm":
                        code = code ?? data;

                        if (await SQLHelper.UserTokensExists(code) == false || await SQLHelper.PendingUsersIsEntryActive(code) == false || await SQLHelper.UserTokensHasDiscordId(code))
                        {
                            await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("entryNotFound"));

                            return;
                        }

                        await SQLHelper.UserTokensSetDiscordId(code, Context.Message.Author.Id);

                        await SQLHelper.PendingUsersSetCode(code, Context.Message.Author.Id);

                        await SQLHelper.UserTokensSetAuthState(code, 1);

                        await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("authDiscordUserConfirmed", name));

                        return;

                    default:
                        await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("invalidCommandSyntax"));

                        return;
                    }
                }
                catch (Exception ex)
                {
                    await LogHelper.LogEx($"!auth {command} {data}", ex, LogCat.AuthWeb);

                    await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("WebRequestUnexpected"));
                }
            }

            await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("webServerOffline")}");
        }
Beispiel #7
0
        public override async Task Run(object prm)
        {
            if (!Settings.Config.ModuleWebServer)
            {
                return;
            }

            if (Settings.WebServerModule.ServerStatusPort > 0 && (_statusListener == null || !_statusListener.IsListening))
            {
                await LogHelper.LogInfo("Starting Web Server - Status Reporter", Category);

                try
                {
                    _statusListener?.Dispose();
                }
                catch
                {
                    // ignored
                }

                var ip = "0.0.0.0";

                _statusListener          = new HttpListener(IPAddress.Parse(ip), Settings.WebServerModule.ServerStatusPort);
                _statusListener.Request += async(sender, context) =>
                {
                    try
                    {
                        if (_statusQueries.Count > 10)
                        {
                            return;
                        }
                        _statusQueries.Enqueue(DateTime.Now);
                        // var request = context.Request;
                        var response = context.Response;
                        //OK, NO_ESI, NO_CONNECTION, NO_DISCORD
                        var value = "OK";
                        if (TickManager.IsESIUnreachable)
                        {
                            value = "NO_ESI";
                        }
                        if (TickManager.IsNoConnection)
                        {
                            value = "NO_CONNECTION";
                        }
                        if (!APIHelper.DiscordAPI.IsAvailable)
                        {
                            if (Settings.WebServerModule.NoStatusResponseOnDiscordDisconnection)
                            {
                                return;
                            }
                            value = "NO_DISCORD";
                        }

                        await response.WriteContentAsync(value);
                    }
                    catch (Exception ex)
                    {
                        await LogHelper.LogEx(ex.Message, ex, Category);
                    }
                    finally
                    {
                        try
                        {
                            context.Response.Close();
                        }
                        catch
                        {
                            //ignore
                        }
                    }
                };
                _statusListener.Start();
            }

            if (_listener == null || !_listener.IsListening)
            {
                await LogHelper.LogInfo("Starting Web Server", Category);

                try
                {
                    _listener?.Dispose();
                }
                catch
                {
                    // ignored
                }

                //TODO cleanup all occurences in modules in some of the following releases
                var extPort = Settings.WebServerModule.WebExternalPort;
                var ip      = "0.0.0.0";
                _listener          = new System.Net.Http.HttpListener(IPAddress.Parse(ip), extPort);
                _listener.Request += async(sender, context) =>
                {
                    try
                    {
                        var request  = context.Request;
                        var response = context.Response;

                        if (request.Url.LocalPath.EndsWith(".js") || request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css"))
                        {
                            var path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", Path.GetFileName(request.Url.LocalPath));
                            if (request.Url.LocalPath.Contains("moments"))
                            {
                                path = Path.Combine(SettingsManager.RootDirectory, "Content", "scripts", "moments", Path.GetFileName(request.Url.LocalPath));
                            }

                            if (!File.Exists(path))
                            {
                                return;
                            }

                            if (request.Url.LocalPath.EndsWith(".less") || request.Url.LocalPath.EndsWith(".css"))
                            {
                                response.Headers.ContentType.Add("text/css");
                            }

                            if (request.Url.LocalPath.EndsWith(".js"))
                            {
                                response.Headers.ContentType.Add("text/javascript");
                            }

                            await response.WriteContentAsync(File.ReadAllText(path));

                            return;
                        }

                        if (request.Url.LocalPath == "/favicon.ico")
                        {
                            var path = Path.Combine(SettingsManager.RootDirectory, Path.GetFileName(request.Url.LocalPath));
                            if (!File.Exists(path))
                            {
                                return;
                            }

                            await response.WriteContentAsync(File.ReadAllText(path));

                            return;
                        }

                        if (request.Url.LocalPath == "/" || request.Url.LocalPath == $"{extPort}/")
                        {
                            // var extIp = Settings.WebServerModule.WebExternalIP;

                            var text = File.ReadAllText(SettingsManager.FileTemplateMain)
                                       .Replace("{headerContent}", GetHtmlResourceDefault(false))
                                       .Replace("{header}", LM.Get("authTemplateHeader"))
                                       .Replace("{webWelcomeHeader}", LM.Get("webWelcomeHeader"))
                                       .Replace("{authButtonText}", LM.Get("butGeneralAuthPage"));

                            //managecontrols
                            var manageText = new StringBuilder();
                            //timers
                            if (Settings.Config.ModuleTimers)
                            {
                                var authNurl = GetTimersURL();
                                manageText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonTimersText")}</a>");
                            }

                            if (Settings.Config.ModuleHRM)
                            {
                                var authNurl = GetHRMAuthURL();
                                manageText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonHRMText")}</a>");
                            }

                            if (Settings.Config.ModuleWebConfigEditor)
                            {
                                var authNurl = GetWebConfigAuthURL();
                                manageText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("buttonSettingsText")}</a>");
                            }

                            text = text.Replace("{manageControls}", manageText.ToString());
                            await WriteResponce(text, response);

                            return;
                        }

                        if (request.Url.LocalPath == "/authPage.html" || request.Url.LocalPath == $"{extPort}/authPage.html")
                        {
                            var extIp   = Settings.WebServerModule.WebExternalIP;
                            var authUrl = $"{GetWebSiteUrl()}/auth";

                            var text = File.ReadAllText(SettingsManager.FileTemplateAuthPage)
                                       .Replace("{headerContent}", GetHtmlResourceDefault(false))
                                       .Replace("{header}", LM.Get("authTemplateHeader"))
                                       .Replace("{backText}", LM.Get("backText"));

                            //auth controls
                            var authText = new StringBuilder();

                            var grps = Settings.WebAuthModule.GetEnabledAuthGroups();
                            if (Settings.Config.ModuleAuthWeb && grps.Count > 0)
                            {
                                authText.Append($"<h2>{LM.Get("authWebDiscordHeader")}</h4>{LM.Get("authPageGeneralAuthHeader")}");
                            }

                            var groupsForCycle = Settings.WebAuthModule.UseOneAuthButton
                                ? grps.Where(a => a.Value.ExcludeFromOneButtonMode || a.Value.BindToMainCharacter)
                                : grps;

                            if (Settings.WebAuthModule.UseOneAuthButton)
                            {
                                if (Settings.Config.ModuleAuthWeb)
                                {
                                    var url = $"{authUrl}?group={HttpUtility.UrlEncode(WebAuthModule.DEF_NOGROUP_NAME)}";
                                    authText.Append($"\n<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonDiscordText")}</a>");
                                }
                            }

                            //stands auth
                            if (Settings.Config.ModuleAuthWeb)
                            {
                                foreach (var groupPair in groupsForCycle.Where(a => a.Value.StandingsAuth != null))
                                {
                                    var group = groupPair.Value;
                                    if (group.Hidden)
                                    {
                                        continue;
                                    }
                                    var url = $"{authUrl}?group={HttpUtility.UrlEncode(groupPair.Key)}";
                                    authText.Append($"\n<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{group.CustomButtonText}</a>");
                                }
                            }

                            //auth
                            if (Settings.Config.ModuleAuthWeb)
                            {
                                foreach (var @group in groupsForCycle.Where(a => a.Value.StandingsAuth == null))
                                {
                                    if (group.Value.Hidden)
                                    {
                                        continue;
                                    }
                                    var url   = $"{authUrl}?group={HttpUtility.UrlEncode(group.Value.BindToMainCharacter ? WebAuthModule.DEF_ALTREGGROUP_NAME : group.Key)}";
                                    var bText = group.Value.CustomButtonText ?? $"{LM.Get("authButtonDiscordText")} - {group.Key}";
                                    authText.Append($"<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{bText}</a>");
                                }
                            }


                            var len  = authText.Length;
                            var smth = false;

                            //stands auth
                            if (Settings.Config.ModuleAuthWeb)
                            {
                                foreach (var groupPair in grps.Where(a => a.Value.StandingsAuth != null))
                                {
                                    var group = groupPair.Value;
                                    if (group.Hidden)
                                    {
                                        continue;
                                    }
                                    var url = GetStandsAuthURL();
                                    authText.Append($"\n<a href=\"{url}\" class=\"btn btn-info btn-block\" role=\"button\">{group.StandingsAuth.WebAdminButtonText}</a>");
                                }
                                smth = true;
                            }

                            //notifications
                            if (Settings.Config.ModuleNotificationFeed)
                            {
                                var authNurl = GetAuthNotifyURL();
                                authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonNotifyText")}</a>");
                                smth = true;
                            }
                            //mail
                            if (Settings.Config.ModuleMail)
                            {
                                var authNurl = GetMailAuthURL();
                                authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonMailText")}</a>");
                                smth = true;
                            }
                            if (Settings.Config.ModuleContractNotifications)
                            {
                                foreach (var notifyGroup in Settings.ContractNotificationsModule.GetEnabledGroups())
                                {
                                    var group    = notifyGroup.Value;
                                    var authNurl = GetContractsAuthURL(group.FeedPersonalContracts, group.FeedCorporateContracts, notifyGroup.Key);
                                    authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{group.ButtonText}</a>");
                                }
                                smth = true;
                            }

                            if (Settings.Config.ModuleIndustrialJobs)
                            {
                                foreach (var(key, group) in Settings.IndustrialJobsModule.GetEnabledGroups())
                                {
                                    var authNurl = GetIndustryJobsAuthURL(group.Filters.Any(a => a.Value.FeedPersonalJobs), group.Filters.Any(a => a.Value.FeedCorporateJobs), key);
                                    authText.Append($"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{group.ButtonText ?? key}</a>");
                                }
                                smth = true;
                            }

                            if (smth)
                            {
                                authText.Insert(len, $"<h2>{LM.Get("authWebSystemHeader")}</h2>{LM.Get("authPageSystemAuthHeader")}");
                            }

                            text = text.Replace("{authControls}", authText.ToString()).Replace("{authHeaderText}", LM.Get("authPageHeaderText"));
                            await WriteResponce(text, response);

                            return;
                        }

                        var result = false;

                        foreach (var method in ModuleConnectors.Values)
                        {
                            try
                            {
                                result = await method(context);

                                if (result)
                                {
                                    break;
                                }
                            }
                            catch (Exception ex)
                            {
                                await LogHelper.LogEx($"Module method {method.Method.Name} throws ex!", ex, Category);
                            }
                        }

                        if (!result)
                        {
                            await WriteResponce(Get404Page(), response);
                        }
                    }
                    catch (Exception ex)
                    {
                        await LogHelper.LogEx(ex.Message, ex, Category);
                    }
                    finally
                    {
                        try
                        {
                            context.Response.Close();
                        }
                        catch
                        {
                            //ignore
                        }
                    }
                };
                _listener.Start();
            }
        }
Beispiel #8
0
        public async Task <bool> Auth(HttpListenerRequestEventArgs context)
        {
            var esiFailure = false;
            var request    = context.Request;
            var response   = context.Response;

            var extIp       = SettingsManager.Get("webServerModule", "webExternalIP");
            var extPort     = SettingsManager.Get("webServerModule", "webExternalPort");
            var port        = SettingsManager.Get("webServerModule", "webListenPort");
            var callbackurl = $"http://{extIp}:{extPort}/callback.php";


            if (request.HttpMethod != HttpMethod.Get.ToString())
            {
                return(false);
            }
            try
            {
                if (request.Url.LocalPath == "/auth.php" || request.Url.LocalPath == $"{extPort}/auth.php" || request.Url.LocalPath == $"{port}/auth.php")
                {
                    response.Headers.ContentEncoding.Add("utf-8");
                    response.Headers.ContentType.Add("text/html;charset=utf-8");
                    var text = File.ReadAllText(SettingsManager.FileTemplateAuth).Replace("{callbackurl}", callbackurl).Replace("{client_id}", Settings.Core.CcpAppClientId)
                               .Replace("{header}", LM.Get("authTemplateHeader")).Replace("{body}", LM.Get("authTemplateInv")).Replace("{backText}", LM.Get("backText"));
                    await response.WriteContentAsync(text);

                    return(true);
                }

                if (request.Url.LocalPath == "/callback.php" || request.Url.LocalPath == $"{extPort}/callback.php" || request.Url.LocalPath == $"{port}/callback.php" &&
                    !request.Url.Query.Contains("&state=11"))
                {
                    var assembly = Assembly.GetEntryAssembly();
                    // var temp = assembly.GetManifestResourceNames();
                    var resource = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.Discord-01.png");
                    var buffer   = new byte[resource.Length];
                    resource.Read(buffer, 0, Convert.ToInt32(resource.Length));
                    var image = Convert.ToBase64String(buffer);
                    var uid   = GetUniqID();
                    var add   = false;

                    if (!string.IsNullOrWhiteSpace(request.Url.Query))
                    {
                        var prms  = request.Url.Query.TrimStart('?').Split('&');
                        var code  = prms[0].Split('=')[1];
                        var state = prms.Length > 1 ? prms[1].Split('=')[1] : null;

                        var result = await GetCHaracterIdFromCode(code, Settings.Core.CcpAppClientId, Settings.Core.CcpAppSecret);

                        if (result == null)
                        {
                            esiFailure = true;
                        }
                        var characterID   = result?[0];
                        var numericCharId = Convert.ToInt32(characterID);

                        var rChar = await APIHelper.ESIAPI.GetCharacterData(Reason, characterID, true);

                        if (state == "9") //refresh token fetch ops
                        {
                            response.Headers.ContentEncoding.Add("utf-8");
                            response.Headers.ContentType.Add("text/html;charset=utf-8");
                            if (string.IsNullOrEmpty(characterID))
                            {
                                await LogHelper.LogWarning("Bad or outdated notify feed request!");

                                await response.WriteContentAsync(File.ReadAllText(SettingsManager.FileTemplateAuthNotifyFail)
                                                                 .Replace("{message}", LM.Get("authTokenBadRequest"))
                                                                 .Replace("{header}", LM.Get("authTokenHeader")).Replace("{body}", LM.Get("authTokenBodyFail")).Replace("{backText}", LM.Get("backText")));

                                return(true);
                            }

                            if (TickManager.GetModule <NotificationModule>().Settings.Core.Groups.Values.All(g => g.CharacterID != numericCharId))
                            {
                                await LogHelper.LogWarning($"Unathorized notify feed request from {characterID}");

                                await response.WriteContentAsync(File.ReadAllText(SettingsManager.FileTemplateAuthNotifyFail)
                                                                 .Replace("{message}", LM.Get("authTokenInvalid"))
                                                                 .Replace("{header}", LM.Get("authTokenHeader")).Replace("{body}", LM.Get("authTokenBodyFail")).Replace("{backText}", LM.Get("backText")));

                                return(true);
                            }

                            await SQLHelper.SQLiteDataInsertOrUpdateTokens(result[1] ?? "", characterID, null);

                            await LogHelper.LogInfo($"Notification feed added for character: {characterID}", LogCat.AuthWeb);

                            await response.WriteContentAsync(File.ReadAllText(SettingsManager.FileTemplateAuthNotifySuccess)
                                                             .Replace("{body2}", string.Format(LM.Get("authTokenRcv2"), rChar.name))
                                                             .Replace("{body}", LM.Get("authTokenRcv")).Replace("{header}", LM.Get("authTokenHeader")).Replace("{backText}", LM.Get("backText")));

                            return(true);
                        }

                        var foundList = new List <int>();
                        foreach (var group in Settings.Core.AuthGroups.Values)
                        {
                            if (group.CorpID != 0)
                            {
                                foundList.Add(group.CorpID);
                            }
                            if (group.AllianceID != 0)
                            {
                                foundList.Add(group.AllianceID);
                            }
                        }

                        if (rChar == null)
                        {
                            esiFailure = true;
                        }
                        var corpID = rChar?.corporation_id ?? 0;

                        var rCorp = await APIHelper.ESIAPI.GetCorporationData(Reason, rChar?.corporation_id, true);

                        if (rCorp == null)
                        {
                            esiFailure = true;
                        }
                        var allianceID = rCorp?.alliance_id ?? 0;

                        if (corpID != 0 && foundList.Contains(corpID) || allianceID != 0 && foundList.Contains(allianceID) || foundList.Count == 0)
                        {
                            add = true;
                        }

                        if (!esiFailure && add)
                        {
                            await SQLHelper.SQLiteDataInsertOrUpdate("pendingUsers", new Dictionary <string, object>
                            {
                                { "characterID", characterID },
                                { "corporationID", corpID.ToString() },
                                { "allianceID", allianceID.ToString() },
                                { "authString", uid },
                                { "active", "1" },
                                { "groups", "[]" },
                                { "dateCreated", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }
                            });

                            response.Headers.ContentEncoding.Add("utf-8");
                            response.Headers.ContentType.Add("text/html;charset=utf-8");

                            await response.WriteContentAsync(File.ReadAllText(SettingsManager.FileTemplateAuth2).Replace("{url}", Settings.Core.DiscordUrl).Replace("{image}", image)
                                                             .Replace("{uid}", uid).Replace("{header}", LM.Get("authTemplateHeader"))
                                                             .Replace("{body}", string.Format(LM.Get("authTemplateSucc1"), rChar.name))
                                                             .Replace("{body2}", LM.Get("authTemplateSucc2")).Replace("{body3}", LM.Get("authTemplateSucc3")).Replace("{backText}", LM.Get("backText")));
                        }
                        else if (!esiFailure)
                        {
                            var message = "ERROR";
                            if (!add)
                            {
                                message = LM.Get("authNonAlly");
                            }
                            response.Headers.ContentEncoding.Add("utf-8");
                            response.Headers.ContentType.Add("text/html;charset=utf-8");
                            await response.WriteContentAsync(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", message)
                                                             .Replace("{header}", LM.Get("authTemplateHeader")).Replace("{backText}", LM.Get("backText")));
                        }
                        else
                        {
                            var message = LM.Get("ESIFailure");
                            response.Headers.ContentEncoding.Add("utf-8");
                            response.Headers.ContentType.Add("text/html;charset=utf-8");
                            await response.WriteContentAsync(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", message)
                                                             .Replace("{header}", LM.Get("authTemplateHeader")).Replace("{backText}", LM.Get("backText")));
                        }

                        return(true);
                    }
                }
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx($"Error: {ex.Message}", ex, Category);
            }

            return(false);
        }
Beispiel #9
0
        public override async Task Run(object prm)
        {
            if (IsRunning)
            {
                return;
            }
            IsRunning = true;
            try
            {
                if ((DateTime.Now - _lastCheckTime).TotalMinutes < _checkInterval)
                {
                    return;
                }
                _lastCheckTime = DateTime.Now;
                await LogHelper.LogModule("Running Mail module check...", Category);

                foreach (var(groupName, group) in Settings.MailModule.GetEnabledGroups())
                {
                    if (group.DefaultChannel == 0)
                    {
                        continue;
                    }
                    var defaultChannel = group.DefaultChannel;

                    var chars = GetParsedCharacters(groupName) ?? new List <long>();
                    foreach (var charId in chars)
                    {
                        if (charId == 0)
                        {
                            continue;
                        }

                        var rToken = await SQLHelper.GetRefreshTokenMail(charId);

                        if (string.IsNullOrEmpty(rToken))
                        {
                            await SendOneTimeWarning(charId, $"Mail feed token for character {charId} not found! User is not authenticated.");

                            continue;
                        }

                        var tq = await APIHelper.ESIAPI.RefreshToken(rToken, Settings.WebServerModule.CcpAppClientId, Settings.WebServerModule.CcpAppSecret
                                                                     , $"From {Category} | Char ID: {charId}");

                        var token = tq.Result;
                        if (string.IsNullOrEmpty(token))
                        {
                            await LogHelper.LogWarning($"Unable to get contracts token for character {charId}. Refresh token might be outdated or no more valid {tq.Data.ErrorCode}({tq.Data.Message})", Category);

                            continue;
                        }

                        var includePrivate = group.IncludePrivateMail;

                        if (group.Filters.Values.All(a => a.FilterSenders.Count == 0 && a.FilterLabels.Count == 0 && a.FilterMailList.Count == 0))
                        {
                            await LogHelper.LogWarning($"Mail feed for user {charId} has no labels, lists or senders configured!", Category);

                            continue;
                        }

                        var labelsData = await APIHelper.ESIAPI.GetMailLabels(Reason, charId.ToString(), token);

                        var searchLabels = labelsData?.labels.Where(a => a.name?.ToLower() != "sent" && a.name?.ToLower() != "received").ToList() ??
                                           new List <JsonClasses.MailLabel>();
                        var mailLists = await APIHelper.ESIAPI.GetMailLists(Reason, charId, token);

                        var etag   = _tags.GetOrNull(charId);
                        var result = await APIHelper.ESIAPI.GetMailHeaders(Reason, charId.ToString(), token, 0, etag);

                        _tags.AddOrUpdateEx(charId, result.Data.ETag);
                        if (result.Data.IsNotModified)
                        {
                            continue;
                        }

                        var mailsHeaders = result.Result;

                        var lastMailId = await SQLHelper.GetLastMailId(charId);

                        var prevMailId = lastMailId;

                        if (lastMailId > 0)
                        {
                            mailsHeaders = mailsHeaders.Where(a => a.mail_id > lastMailId).OrderBy(a => a.mail_id).ToList();
                        }
                        else
                        {
                            lastMailId = mailsHeaders.OrderBy(a => a.mail_id).LastOrDefault()?.mail_id ?? 0;
                            mailsHeaders.Clear();
                        }

                        foreach (var mailHeader in mailsHeaders)
                        {
                            try
                            {
                                if (mailHeader.mail_id <= lastMailId)
                                {
                                    continue;
                                }
                                lastMailId = mailHeader.mail_id;
                                if (!includePrivate && (mailHeader.recipients.Count(a => a.recipient_id == charId) > 0))
                                {
                                    continue;
                                }

                                foreach (var filter in group.Filters.Values)
                                {
                                    //filter by senders
                                    if (filter.FilterSenders.Count > 0 && !filter.FilterSenders.Contains(mailHeader.from))
                                    {
                                        continue;
                                    }
                                    //filter by labels
                                    var labelIds = searchLabels.Where(a => filter.FilterLabels.Contains(a.name)).Select(a => a.label_id).ToList();
                                    if (labelIds.Count > 0 && !mailHeader.labels.Any(a => labelIds.Contains(a)))
                                    {
                                        continue;
                                    }
                                    //filter by mail lists
                                    var mailListIds = filter.FilterMailList.Count > 0
                                        ? mailLists.Where(a => filter.FilterMailList.Any(b => a.name.Equals(b, StringComparison.OrdinalIgnoreCase))).Select(a => a.mailing_list_id)
                                                      .ToList()
                                        : new List <long>();
                                    if (mailListIds.Count > 0 && !mailHeader.recipients.Where(a => a.recipient_type == "mailing_list")
                                        .Any(a => mailListIds.Contains(a.recipient_id)))
                                    {
                                        continue;
                                    }

                                    var mail = await APIHelper.ESIAPI.GetMail(Reason, charId.ToString(), token, mailHeader.mail_id);

                                    // var labelNames = string.Join(",", mail.labels.Select(a => searchLabels.FirstOrDefault(l => l.label_id == a)?.name)).Trim(',');
                                    var sender = await APIHelper.ESIAPI.GetCharacterData(Reason, mail.from);

                                    var from = sender?.name;
                                    var ml   = mailHeader.recipients.FirstOrDefault(a => a.recipient_type == "mailing_list" && mailListIds.Contains(a.recipient_id));
                                    if (ml != null)
                                    {
                                        from = $"{sender?.name}[{mailLists.First(a => a.mailing_list_id == ml.recipient_id).name}]";
                                    }
                                    var channel = filter.FeedChannel > 0 ? filter.FeedChannel : defaultChannel;
                                    await SendMailNotification(channel, mail, LM.Get("mailMsgTitle", from), group.DefaultMention, filter.DisplayDetailsSummary);

                                    break;
                                }
                            }
                            catch (Exception ex)
                            {
                                await LogHelper.LogEx($"MailCheck: {mailHeader?.mail_id} {mailHeader?.subject}", ex);
                            }
                        }

                        if (prevMailId != lastMailId || lastMailId == 0)
                        {
                            await SQLHelper.UpdateMail(charId, lastMailId);
                        }
                    }
                }

                // await LogHelper.LogModule("Completed", Category);
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx(ex.Message, ex, Category);

                // await LogHelper.LogModule("Completed", Category);
            }
            finally
            {
                IsRunning = false;
            }
        }
Beispiel #10
0
        internal static async Task AuthUser(ICommandContext context, string remainder)
        {
            try
            {
                var esiFailed = false;
                var responce  = await SQLHelper.GetPendingUser(remainder);

                if (!responce.Any())
                {
                    await APIHelper.DiscordAPI.ReplyMessageAsync(context, context.Channel, LM.Get("authHasInvalidKey"), true).ConfigureAwait(false);
                }
                else
                {
                    switch (responce[0]["active"].ToString())
                    {
                    case "0":
                        await APIHelper.DiscordAPI.ReplyMessageAsync(context, context.Channel, LM.Get("authHasInactiveKey"), true).ConfigureAwait(false);

                        break;

                    case "1":
                        // var authgroups = SettingsManager.GetSubList("auth", "authgroups");
                        // var corps = new Dictionary<string, string>();
                        // var alliance = new Dictionary<string, string>();

                        var foundList = new Dictionary <int, List <string> >();
                        foreach (var group in TickManager.GetModule <WebAuthModule>().Settings.Core.AuthGroups.Values)
                        {
                            if (group.CorpID != 0)
                            {
                                foundList.Add(group.CorpID, group.MemberRoles);
                            }
                            if (group.AllianceID != 0)
                            {
                                foundList.Add(group.AllianceID, group.MemberRoles);
                            }
                        }

                        var characterID   = responce[0]["characterID"].ToString();
                        var characterData = await APIHelper.ESIAPI.GetCharacterData("WebAuth", characterID, true);

                        if (characterData == null)
                        {
                            esiFailed = true;
                        }

                        var corporationData = await APIHelper.ESIAPI.GetCorporationData("WebAuth", characterData.corporation_id);

                        if (corporationData == null)
                        {
                            esiFailed = true;
                        }

                        var allianceID = characterData.alliance_id ?? 0;
                        var corpID     = characterData.corporation_id;

                        bool enable = foundList.ContainsKey(corpID) || characterData.alliance_id != null && foundList.ContainsKey(allianceID) || foundList.Count == 0;

                        if (enable && !esiFailed)
                        {
                            await AuthGrantRoles(context, characterID, foundList, characterData, corporationData, remainder);
                        }
                        else
                        {
                            await APIHelper.DiscordAPI.SendMessageAsync(context.Channel, LM.Get("ESIFailure")).ConfigureAwait(false);

                            await LogHelper.LogError("ESI Failure", LogCat.AuthWeb).ConfigureAwait(false);
                        }

                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx($"Error: {ex.Message}", ex, LogCat.AuthWeb).ConfigureAwait(false);
            }
        }
Beispiel #11
0
        private static async Task AuthGrantRoles(ICommandContext context, string characterID, Dictionary <int, List <string> > foundList, JsonClasses.CharacterData characterData, JsonClasses.CorporationData corporationData, string remainder)
        {
            var rolesToAdd = new List <SocketRole>();

            var allianceID = characterData.alliance_id ?? 0;
            var corpID     = characterData.corporation_id;

            var authSettings = TickManager.GetModule <WebAuthModule>()?.Settings.Core;

            try
            {
                //Check for Corp roles
                if (foundList.ContainsKey(corpID))
                {
                    var cRoles = foundList[corpID];
                    cRoles.ForEach(a =>
                    {
                        var f = APIHelper.DiscordAPI.GetGuildRole(a);
                        if (f != null && !rolesToAdd.Contains(f))
                        {
                            rolesToAdd.Add(f);
                        }
                    });
                }

                //Check for Alliance roles
                if (foundList.ContainsKey(allianceID))
                {
                    var cRoles = foundList[allianceID];
                    cRoles.ForEach(a =>
                    {
                        var f = APIHelper.DiscordAPI.GetGuildRole(a);
                        if (f != null && !rolesToAdd.Contains(f))
                        {
                            rolesToAdd.Add(f);
                        }
                    });
                }

                var discordUser = APIHelper.DiscordAPI.GetUser(context.Message.Author.Id);

                if (authSettings.AuthReportChannel != 0)
                {
                    await APIHelper.DiscordAPI.SendMessageAsync(authSettings.AuthReportChannel, string.Format(LM.Get("grantRolesMessage"), characterData.name))
                    .ConfigureAwait(false);
                }
                await APIHelper.DiscordAPI.AssignRolesToUser(discordUser, rolesToAdd);

                var rolesString = new StringBuilder();
                foreach (var role in discordUser.Roles)
                {
                    if (role.Name.StartsWith("@everyone"))
                    {
                        continue;
                    }
                    rolesString.Append(role.Name.Replace("\"", "&br;"));
                    rolesString.Append(",");
                }
                if (rolesString.Length > 0)
                {
                    rolesString.Remove(rolesString.Length - 1, 1);
                }

                await SQLHelper.SQLiteDataUpdate("pendingUsers", "active", "0", "authString", remainder);

                await APIHelper.DiscordAPI.SendMessageAsync(context.Channel, string.Format(LM.Get("msgAuthSuccess"), context.Message.Author.Mention, characterData.name));

                var eveName   = characterData.name;
                var discordID = discordUser.Id;
                var addedOn   = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

                await SQLHelper.SQLiteDataInsertOrUpdate("authUsers", new Dictionary <string, object>
                {
                    { "eveName", eveName },
                    { "characterID", characterID },
                    { "discordID", discordID.ToString() },
                    { "role", rolesString.ToString() },
                    { "active", "yes" },
                    { "addedOn", addedOn }
                });

                if (authSettings.EnforceCorpTickers || authSettings.EnforceCharName)
                {
                    var nickname = "";
                    if (authSettings.EnforceCorpTickers)
                    {
                        nickname = $"[{corporationData.ticker}] ";
                    }
                    if (authSettings.EnforceCharName)
                    {
                        nickname += $"{eveName}";
                    }
                    else
                    {
                        nickname += $"{discordUser.Username}";
                    }

                    try
                    {
                        //will throw ex on admins
                        await discordUser.ModifyAsync(x => x.Nickname = nickname);
                    }
                    catch
                    {
                        //ignore
                    }

                    await APIHelper.DiscordAPI.Dupes(discordUser);
                }
            }

            catch (Exception ex)
            {
                await LogHelper.LogEx($"Failed adding Roles to User {characterData.name}, Reason: {ex.Message}", ex, LogCat.Discord);
            }
        }
Beispiel #12
0
    public override void SearchingObjectivesToAttack()
    {
        myCurrentObjective     = null;
        myCurrentObjectiveTile = null;
        pathToObjective.Clear();

        if (isDead || hasAttacked)
        {
            myCurrentEnemyState = enemyState.Ended;
            return;
        }

        if (!haveIBeenAlerted)
        {
            //Comprobar las unidades que hay en mi rango de acción
            unitsInRange = LM.TM.GetAllUnitsInRangeWithoutPathfinding(rangeOfAction, GetComponent <UnitBase>());

            //Si hay personajes del jugador en mi rango de acción paso a attacking donde me alerto y hago mi accion
            for (int i = 0; i < unitsInRange.Count; i++)
            {
                if (unitsInRange[i].GetComponent <PlayerUnit>())
                {
                    myCurrentEnemyState = enemyState.Attacking;
                    return;
                }
            }

            //Si llega hasta aqui significa que no había personajes en rango y termina
            myCurrentEnemyState = enemyState.Ended;
        }

        else
        {
            //Determinamos el enemigo más cercano.
            currentUnitsAvailableToAttack = LM.CheckEnemyPathfinding(GetComponent <EnemyUnit>());

            //Si esta oculto lo quito de la lista de objetivos
            for (int i = 0; i < currentUnitsAvailableToAttack.Count; i++)
            {
                if (currentUnitsAvailableToAttack[i].isHidden)
                {
                    currentUnitsAvailableToAttack.RemoveAt(i);
                    i--;
                }
            }

            //Si no hay enemigos termina su turno
            if (currentUnitsAvailableToAttack.Count == 0)
            {
                myCurrentEnemyState = enemyState.Ended;
            }

            else if (currentUnitsAvailableToAttack.Count > 0)
            {
                if (currentUnitsAvailableToAttack.Count == 1)
                {
                    //Añado esto para eliminar a los personajes ocultos
                    base.SearchingObjectivesToAttack();

                    if (currentUnitsAvailableToAttack.Count == 1)
                    {
                        myCurrentObjective     = currentUnitsAvailableToAttack[0];
                        myCurrentObjectiveTile = myCurrentObjective.myCurrentTile;
                    }
                }

                //Si hay varios enemigos a la misma distancia, se queda con el que tenga más unidades adyacentes
                else if (currentUnitsAvailableToAttack.Count > 1)
                {
                    //Ordeno la lista de posibles objetivos según el número de unidades dyacentes
                    currentUnitsAvailableToAttack.Sort(delegate(UnitBase a, UnitBase b)
                    {
                        return((b.myCurrentTile.neighboursOcuppied).CompareTo(a.myCurrentTile.neighboursOcuppied));
                    });

                    //Elimino a todos los objetivos de la lista que no tengan el mayor número de enemigos adyacentes
                    for (int i = currentUnitsAvailableToAttack.Count - 1; i > 0; i--)
                    {
                        if (currentUnitsAvailableToAttack[0].myCurrentTile.neighboursOcuppied > currentUnitsAvailableToAttack[i].myCurrentTile.neighboursOcuppied)
                        {
                            currentUnitsAvailableToAttack.RemoveAt(i);
                        }
                    }

                    //Si sigue habiendo varios enemigos los ordeno segun la vida
                    if (currentUnitsAvailableToAttack.Count > 1)
                    {
                        //Añado esto para eliminar a los personajes ocultos
                        base.SearchingObjectivesToAttack();

                        //Ordeno la lista de posibles objetivos de menor a mayor vida actual
                        currentUnitsAvailableToAttack.Sort(delegate(UnitBase a, UnitBase b)
                        {
                            return((a.currentHealth).CompareTo(b.currentHealth));
                        });
                    }

                    myCurrentObjective     = currentUnitsAvailableToAttack[0];
                    myCurrentObjectiveTile = myCurrentObjective.myCurrentTile;
                }

                //CAMBIAR ESTO (lm.tm)
                LM.TM.CalculatePathForMovementCost(myCurrentObjectiveTile.tileX, myCurrentObjectiveTile.tileZ, false);

                //No vale con igualar pathToObjective= LM.TM.currentPath porque entonces toma una referencia de la variable no de los valores.
                //Esto significa que si LM.TM.currentPath cambia de valor también lo hace pathToObjective
                for (int i = 0; i < LM.TM.currentPath.Count; i++)
                {
                    pathToObjective.Add(LM.TM.currentPath[i]);
                }

                myCurrentEnemyState = enemyState.Attacking;
            }
        }
    }
Beispiel #13
0
        public static async Task <bool> Download(string installMode, ObservableCollection <SModel.Ivsu> ivsuList,
                                                 SModel.SRegion selectedRegion, string selectedRelease, string selectedMapVersion, string driveLetter, USBHelper.Drive selectedDrive)
        {
            if (await SetIvsuList(installMode, ivsuList, selectedRegion, selectedRelease, selectedMapVersion, driveLetter) == false)
            {
                await Application.Current.Dispatcher.BeginInvoke(() => UIHelper.ShowErrorDialog(LM.GetValue("MessageBox.NoPackagesSelected")));

                return(false);
            }

            bool canceldownload = false;

            //Install Mode is reformat or downgrade My20 warning
            if ((installMode == "reformat" || installMode == "downgrade") && !AppMan.App.DownloadOnly && AppMan.App.Settings.My20v2 == null)
            {
                if (await Application.Current.Dispatcher.Invoke(() => UIHelper.ShowDialog(string.Format(LM.GetValue("MessageBox.My20Check")), LM.GetValue("String.Warning") + "!", LM.GetValue("String.No"),
                                                                                          LM.GetValue("String.Yes"), null, ContentDialogButton.None, Brushes.DarkRed)) == ContentDialogResult.Primary)
                {
                    await USBHelper.LogPrepareUSBAction(selectedDrive, driveLetter, "logutilitymy20");

                    return(true);
                }
            }

            //Warn is users region is different to new selection
            if (selectedRegion.Code != AppMan.App.Settings.CurrentRegion)
            {
                if (await Application.Current.Dispatcher.Invoke(() => UIHelper.ShowWarningDialog(string.Format(LM.GetValue("MessageBox.CancelRegionMismatch")), LM.GetValue("String.Warning") + "!", LM.GetValue("String.No"),
                                                                                                 LM.GetValue("String.Yes"))) != ContentDialogResult.Primary)
                {
                    canceldownload = true;
                }
            }

            //Cancel no apps package selected
            if (!AppMan.App.AppsSelected && (installMode == "reformat" || installMode == "downgrade"))
            {
                await Application.Current.Dispatcher.BeginInvoke(() => UIHelper.ShowErrorDialog(LM.GetValue("MessageBox.CancelNoApps")));

                canceldownload = true;
            }


            if (!canceldownload && (AppMan.App.DownloadOnly || !await SanityCheckHelper.CancelDownloadCheck(selectedDrive)))
            {
                if (AppMan.App.DownloadOnly)
                {
                    AppMan.Logger.Info($"Starting download only of ({selectedRelease} - {selectedRegion?.Code} - {selectedMapVersion})");
                }
                else
                {
                    AppMan.App.DriveNumber = selectedDrive.Path.Replace("Win32_DiskDrive.DeviceID=\"\\\\\\\\.\\\\PHYSICALDRIVE", "").Replace("\"", "");
                    AppMan.App.DriveLetter = driveLetter;
                    AppMan.Logger.Info($"Starting process ({selectedRelease} - {selectedRegion?.Code} - {selectedMapVersion})");
                }

                AppMan.App.IsDownloading = true;
                AppMan.App.FireDownloadsTabEvent();
                return(true);
            }

            return(false);
        }
        internal static async void OnMessage(object sender, MessageEventArgs e)
        {
            if (!APIHelper.IsDiscordAvailable)
            {
                return;
            }
            var filtered = false;

            if (e.Message.Chatstate != Chatstate.Composing && !string.IsNullOrWhiteSpace(e.Message.Value))
            {
                if (SettingsManager.Settings.JabberModule.Filter)
                {
                    foreach (var filter in SettingsManager.Settings.JabberModule.Filters)
                    {
                        if (e.Message.Value.ToLower().Contains(filter.Key.ToLower()))
                        {
                            var prepend   = SettingsManager.Settings.JabberModule.Prepend;
                            var channelId = Convert.ToUInt64(filter.Value);
                            filtered = true;
                            await APIHelper.DiscordAPI.SendMessageAsync(channelId, $"{prepend + Environment.NewLine}{LM.Get("From")}: {e.Message.From.User} {Environment.NewLine} {LM.Get("Message")}: ```{e.Message.Value}```").ConfigureAwait(false);
                        }
                    }
                }

                if (!string.IsNullOrWhiteSpace(e.Message.Value) && !filtered)
                {
                    var prepend = SettingsManager.Settings.JabberModule.Prepend;
                    if (SettingsManager.Settings.JabberModule.DefChan > 0)
                    {
                        await APIHelper.DiscordAPI.SendMessageAsync(SettingsManager.Settings.JabberModule.DefChan, $"{prepend + Environment.NewLine}{LM.Get("From")}: {e.Message.From.User} {Environment.NewLine} {LM.Get("Message")}: ```{e.Message.Value}```").ConfigureAwait(false);
                    }
                }
            }
        }
Beispiel #15
0
 public async Task Help()
 {
     await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpText")}");
 }
Beispiel #16
0
        public static async Task FeedSpyMail(IEnumerable <AuthUserEntity> users, ulong feedChannel)
        {
            var reason = LogCat.HRM.ToString();

            //preload initial mail IDs to suppress possible dupes on start
            foreach (var user in users.Where(a => a.Data.LastSpyMailId > 0))
            {
                if (!LastSpyMailIds.Contains(user.Data.LastSpyMailId))
                {
                    LastSpyMailIds.Add(user.Data.LastSpyMailId);
                }
            }
            //processing
            foreach (var user in users)
            {
                var corp   = user.Data.CorporationId;
                var ally   = user.Data.AllianceId;
                var filter = SettingsManager.Settings.HRMModule.SpyFilters.FirstOrDefault(a => a.Value.CorpIds.ContainsValue(corp)).Value;
                if (filter != null)
                {
                    feedChannel = filter.MailFeedChannelId;
                }
                else
                {
                    if (ally > 0)
                    {
                        filter = SettingsManager.Settings.HRMModule.SpyFilters.FirstOrDefault(a => a.Value.AllianceIds.ContainsValue(ally)).Value;
                        if (filter != null)
                        {
                            feedChannel = filter.MailFeedChannelId;
                        }
                    }
                }
                if (feedChannel == 0)
                {
                    continue;
                }

                var displaySummary = filter?.DisplayMailDetailsSummary ?? true;

                try
                {
                    if (!SettingsManager.HasReadMailScope(user.Data.PermissionsList))
                    {
                        continue;
                    }

                    var token = (await APIHelper.ESIAPI.RefreshToken(user.RefreshToken, SettingsManager.Settings.WebServerModule.CcpAppClientId,
                                                                     SettingsManager.Settings.WebServerModule.CcpAppSecret, $"From Mail | Char ID: {user.CharacterId} | Char name: {user.Data.CharacterName}"))?.Result;

                    if (string.IsNullOrEmpty(token))
                    {
                        continue;
                    }
                    var mailHeaders = (await APIHelper.ESIAPI.GetMailHeaders(reason, user.CharacterId.ToString(), token, 0, null))?.Result;

                    if (mailHeaders == null || !mailHeaders.Any())
                    {
                        continue;
                    }

                    if (user.Data.LastSpyMailId > 0)
                    {
                        foreach (var mailHeader in mailHeaders.Where(a => a.mail_id > user.Data.LastSpyMailId))
                        {
                            if (LastSpyMailIds.Contains(mailHeader.mail_id))
                            {
                                continue;
                            }
                            LastSpyMailIds.Add(mailHeader.mail_id);
                            if (LastSpyMailIds.Count > 100)
                            {
                                LastSpyMailIds.RemoveRange(0, 20);
                            }
                            var mail = await APIHelper.ESIAPI.GetMail(reason, user.CharacterId, token, mailHeader.mail_id);

                            var sender = await APIHelper.ESIAPI.GetCharacterData(reason, mail.from);

                            mailHeader.ToName = await GetRecepientNames(reason, mailHeader.recipients, user.CharacterId, token);

                            var from = $"{user.Data.CharacterName}[{user.Data.AllianceTicker ?? user.Data.CorporationTicker}]";
                            await SendMailNotification(feedChannel, mail, $"**{LM.Get("hrmSpyFeedFrom")} {from}**\n__{LM.Get("hrmSpyMsgFrom",sender?.name, mailHeader.ToName)}__", " ", displaySummary);
                        }
                    }

                    user.Data.LastSpyMailId = mailHeaders.Max(a => a.mail_id);
                    await SQLHelper.SaveAuthUser(user);
                }
                catch (Exception ex)
                {
                    await LogHelper.LogEx(ex.Message, ex, LogCat.HRM);
                }
            }
        }
Beispiel #17
0
        public async Task TQStatus()
        {
            var tq = await APIHelper.ESIAPI.GetServerStatus("ESIAPI");

            await APIHelper.DiscordAPI.ReplyMessageAsync(Context, LM.Get("tqStatusText", tq.players > 20 ? LM.Get("online") : LM.Get("offline"), tq.players), true);
        }
Beispiel #18
0
        public static async Task <string> SearchRelated(long searchCharId, HRMModule.SearchMailItem item, string authCode)
        {
            var isGlobal = searchCharId == 0;
            var users    = new List <AuthUserEntity>();

            if (isGlobal)
            {
                //users = await SQLHelper.GetAuthUsersWithPerms();
                switch (item.smAuthType)
                {
                case 1:
                    users = (await SQLHelper.GetAuthUsersWithPerms((int)UserStatusEnum.Authed)).ToList();
                    break;

                case 2:
                    users = (await SQLHelper.GetAuthUsersWithPerms((int)UserStatusEnum.Awaiting)).ToList();
                    break;

                default:
                    return(null);
                }
            }
            else
            {
                var u = await SQLHelper.GetAuthUserByCharacterId(searchCharId);

                if (u == null)
                {
                    return(LM.Get("hrmSearchMailErrorSourceNotFound"));
                }
                users.Add(u);
            }

            if (users.Count == 0)
            {
                return(LM.Get("hrmSearchMailNoUsersToCheck"));
            }
            var Reason = "HRM";

            long charId = 0;
            long corpId = 0;
            long allyId = 0;

            //JsonClasses.CharacterData rChar = null;
            switch (item.smSearchType)
            {
            case 1:
                var charIdLookup = await APIHelper.ESIAPI.SearchCharacterId(Reason, item.smText);

                charId = charIdLookup?.character?.FirstOrDefault() ?? 0;
                // rChar = charIdLookup?.character == null || charIdLookup.character.Length == 0 ? null : await APIHelper.ESIAPI.GetCharacterData(Reason, charIdLookup.character.FirstOrDefault());
                if (charId == 0)
                {
                    return(LM.Get("hrmSearchMailErrorCharNotFound"));
                }
                break;

            case 2:
                var corpIdLookup = await APIHelper.ESIAPI.SearchCorporationId(Reason, item.smText);

                corpId = corpIdLookup?.corporation == null || corpIdLookup.corporation.Length == 0 ? 0 : corpIdLookup.corporation.FirstOrDefault();
                if (corpId == 0)
                {
                    return(LM.Get("hrmSearchMailErrorCorpNotFound"));
                }
                break;

            case 3:
                var allyIdLookup = await APIHelper.ESIAPI.SearchAllianceId(Reason, item.smText);

                allyId = allyIdLookup?.alliance == null || allyIdLookup.alliance.Length == 0 ? 0 : allyIdLookup.alliance.FirstOrDefault();
                if (allyId == 0)
                {
                    return(LM.Get("hrmSearchMailErrorAllianceNotFound"));
                }
                break;
            }

            /* JsonClasses.CorporationData sCorp = null;
             * if (!isGlobal && corpId > 0)
             *   sCorp = await APIHelper.ESIAPI.GetCorporationData(Reason, corpId);
             * JsonClasses.AllianceData sAlly = null;
             * if (!isGlobal && allyId > 0)
             *   sAlly = await APIHelper.ESIAPI.GetAllianceData(Reason, allyId);
             */
            var sb = new StringBuilder();

            foreach (var user in users)
            {
                if (!SettingsManager.HasReadMailScope(user.Data.PermissionsList))
                {
                    continue;
                }

                var token = (await APIHelper.ESIAPI.RefreshToken(user.RefreshToken, SettingsManager.Settings.WebServerModule.CcpAppClientId,
                                                                 SettingsManager.Settings.WebServerModule.CcpAppSecret, $"From Mail | Char ID: {user.CharacterId} | Char name: {user.Data.CharacterName}"))?.Result;

                var mailHeaders = (await APIHelper.ESIAPI.GetMailHeaders(Reason, user.CharacterId.ToString(), token, 0, null))?.Result;

                //filter
                switch (item.smSearchType)
                {
                case 1:
                {
                    var newList = new List <JsonClasses.MailHeader>();
                    newList.AddRange(mailHeaders.Where(a => a.@from == charId).ToList());
                    foreach (var header in newList)
                    {
                        header.ToName   = isGlobal ? user.Data.CharacterName : (await GetRecepientNames(Reason, header.recipients, user.CharacterId, token));
                        header.FromName = item.smText;
                    }

                    var tmp = mailHeaders.Where(a => a.recipients.Any(b => b.recipient_id == charId)).ToList();
                    foreach (var header in tmp)
                    {
                        header.ToName   = isGlobal ? item.smText : (await GetRecepientNames(Reason, header.recipients, user.CharacterId, token));
                        header.FromName = user.Data.CharacterName;
                    }

                    mailHeaders = newList;
                    mailHeaders.AddRange(tmp);
                }
                break;

                case 2:     //corp
                {
                    var newList = new List <JsonClasses.MailHeader>();
                    foreach (var header in mailHeaders)
                    {
                        var ch = await APIHelper.ESIAPI.GetCharacterData(Reason, header.@from);

                        if (ch == null)
                        {
                            continue;
                        }
                        if (ch.corporation_id == corpId)
                        {
                            header.ToName   = isGlobal ? user.Data.CharacterName : (await GetRecepientNames(Reason, header.recipients, user.CharacterId, token));
                            header.FromName = item.smText;
                            newList.Add(header);
                            continue;
                        }

                        if (isGlobal)
                        {
                            if (header.recipients.Any(b => b.recipient_id == corpId))
                            {
                                header.ToName   = item.smText;
                                header.FromName = user.Data.CharacterName;
                                newList.Add(header);
                                continue;
                            }
                        }
                        else     //detailed personal search
                        {
                            foreach (var recipient in header.recipients)
                            {
                                if (recipient.recipient_type == "character")
                                {
                                    var r = await APIHelper.ESIAPI.GetCharacterData(Reason, recipient.recipient_id);

                                    if (r == null)
                                    {
                                        continue;
                                    }
                                    if (r.corporation_id == corpId)
                                    {
                                        header.ToName = await GetRecepientNames(Reason, header.recipients, user.CharacterId, token);

                                        header.FromName = user.Data.CharacterName;
                                        newList.Add(header);
                                        break;
                                    }
                                }
                                else if (recipient.recipient_type == "corporation")
                                {
                                    if (recipient.recipient_id == corpId)
                                    {
                                        header.ToName = await GetRecepientNames(Reason, header.recipients, user.CharacterId, token);

                                        header.FromName = user.Data.CharacterName;
                                        newList.Add(header);
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    mailHeaders = newList.ToList();
                }
                break;

                case 3:     //ally
                {
                    var newList = new List <JsonClasses.MailHeader>();
                    foreach (var header in mailHeaders)
                    {
                        var ch = await APIHelper.ESIAPI.GetCharacterData(Reason, header.@from);

                        if (ch?.alliance_id != null && (ch.alliance_id == allyId || header.@from == allyId))
                        {
                            header.ToName   = isGlobal ? user.Data.CharacterName : (await GetRecepientNames(Reason, header.recipients, user.CharacterId, token));
                            header.FromName = item.smText;
                            newList.Add(header);
                            continue;
                        }

                        if (isGlobal)
                        {
                            if (ch?.alliance_id != null && header.recipients.Any(b => b.recipient_id == allyId))
                            {
                                header.ToName   = item.smText;
                                header.FromName = user.Data.CharacterName;
                                newList.Add(header);
                                continue;
                            }
                        }
                        else
                        {
                            foreach (var recipient in header.recipients)
                            {
                                if (recipient.recipient_type == "character")
                                {
                                    var r = await APIHelper.ESIAPI.GetCharacterData(Reason, recipient.recipient_id);

                                    if (r == null)
                                    {
                                        continue;
                                    }
                                    if (r.alliance_id.HasValue && r.alliance_id == allyId)
                                    {
                                        header.ToName = await GetRecepientNames(Reason, header.recipients, user.CharacterId, token);

                                        header.FromName = user.Data.CharacterName;
                                        newList.Add(header);
                                        break;
                                    }
                                }
                                else if (recipient.recipient_type == "corporation")
                                {
                                    var corp = await APIHelper.ESIAPI.GetCorporationData(Reason, recipient.recipient_id);

                                    if (corp == null)
                                    {
                                        continue;
                                    }
                                    if (corp.alliance_id.HasValue && corp.alliance_id == allyId)
                                    {
                                        header.ToName = await GetRecepientNames(Reason, header.recipients, user.CharacterId, token);

                                        header.FromName = user.Data.CharacterName;
                                        newList.Add(header);
                                        break;
                                    }
                                }
                                else if (recipient.recipient_type == "alliance")
                                {
                                    if (recipient.recipient_id == allyId)
                                    {
                                        header.ToName = await GetRecepientNames(Reason, header.recipients, user.CharacterId, token);

                                        header.FromName = user.Data.CharacterName;
                                        newList.Add(header);
                                        break;
                                    }
                                }
                            }
                            continue;
                        }
                    }

                    mailHeaders = newList.ToList();
                }
                break;

                case 4:     //header text
                {
                    mailHeaders = mailHeaders.Where(a => a.subject.Contains(item.smText, StringComparison.OrdinalIgnoreCase)).ToList();
                }
                break;
                }

                foreach (var entry in mailHeaders)
                {
                    var mailBodyUrl = WebServerModule.GetHRM_AjaxMailURL(entry.mail_id, user.CharacterId, authCode);

                    sb.AppendLine("<tr>");
                    sb.AppendLine($"  <td><a href=\"#\" onclick=\"openMailDialog('{mailBodyUrl}')\">{entry.subject}</td>");
                    sb.AppendLine($"  <td>{entry.FromName ?? LM.Get("Unknown")}</td>");
                    sb.AppendLine($"  <td>{entry.ToName ?? LM.Get("Unknown")}</td>");
                    sb.AppendLine($"  <td>{entry.Date.ToShortDateString()}</td>");
                    sb.AppendLine("</tr>");
                }
            }

            if (sb.Length > 0)
            {
                var sbFinal = new StringBuilder();
                sbFinal.AppendLine("<thead>");
                sbFinal.AppendLine("<tr>");
                sbFinal.AppendLine($"<th scope=\"col-md-auto\">{LM.Get("mailSubjectHeader")}</th>");
                sbFinal.AppendLine($"<th scope=\"col-md-auto\">{LM.Get("mailFromHeader")}</th>");
                sbFinal.AppendLine($"<th scope=\"col-md-auto\">{LM.Get("mailToHeader")}</th>");
                sbFinal.AppendLine($"<th scope=\"col\">{LM.Get("mailDateHeader")}</th>");
                sbFinal.AppendLine("</tr>");
                sbFinal.AppendLine("</thead>");
                sbFinal.AppendLine("<tbody>");
                sbFinal.Append(sb.ToString());
                sbFinal.AppendLine("</tbody>");
                return(sbFinal.ToString());
            }

            return("No results");
        }
Beispiel #19
0
        public async Task Help([Remainder] string x)
        {
            var forbidden = APIHelper.DiscordAPI.GetConfigForbiddenPublicChannels();

            if (forbidden.Any() && forbidden.Contains(Context.Channel.Id))
            {
                return;
            }
            switch (x)
            {
            case "help":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpHelp")}", true);

                break;

            case "web":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpWeb")}", true);

                break;

            case "auth":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpAuth")}", true);

                break;

            case "authnotify":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpAuthNotify")}", true);

                break;

            case "evetime":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpTime")}", true);

                break;

            case "stat":
            case "stats":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpStat")}", true);

                break;

            case "about":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpAbout")}", true);

                break;

            case "char":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpChar")}", true);

                break;

            case "corp":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpCorp")}", true);

                break;

            case CMD_TQ:
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpTQ")}", true);

                break;

            case "jita":
            case "amarr":
            case "dodixie":
            case "rens":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpJita")}", true);

                break;

            case "pc":
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpPc")}", true);

                break;

            case CMD_FWSTATS:
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpFwstats", CMD_FWSTATS)}", true);

                break;

            case CMD_TURL:
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpTurl")}", true);

                break;

            case CMD_TIMERS:
                await APIHelper.DiscordAPI.ReplyMessageAsync(Context, $"{LM.Get("helpTimers")}", true);

                break;
            }
        }
        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);
        }
Beispiel #21
0
        private async Task SendDiscordMessage(JsonClasses.IndustryJob job, bool isStatusChange, List <ulong> discordChannels, bool isCorp, string token)
        {
            if (job == null)
            {
                return;
            }

            string statusText;
            string timeToComplete = null;

            switch (job.StatusValue)
            {
            case IndustryJobStatusEnum.active:
                statusText     = LM.Get("industryJobsStatusActive");
                timeToComplete = TimeSpan.FromSeconds(job.duration).ToFormattedString(" ");
                break;

            case IndustryJobStatusEnum.cancelled:
                statusText = LM.Get("industryJobsStatusCancelled");
                break;

            case IndustryJobStatusEnum.delivered:
                statusText = LM.Get("industryJobsStatusDelivered");
                break;

            case IndustryJobStatusEnum.paused:
                statusText = LM.Get("industryJobsStatusPaused");
                break;

            case IndustryJobStatusEnum.ready:
                statusText = LM.Get("industryJobsStatusReady");
                break;

            case IndustryJobStatusEnum.reverted:
                statusText = LM.Get("industryJobsStatusReverted");
                break;

            default:
                throw new ArgumentOutOfRangeException($"Unknown job status: {job.StatusValue}");
            }

            string activityText;

            switch (job.Activity)
            {
            case IndustryJobActivity.none:
                activityText = LM.Get("industryJobsActivityNone");
                break;

            case IndustryJobActivity.build:
                activityText = LM.Get("industryJobsActivityBuild");
                break;

            case IndustryJobActivity.techResearch:
                activityText = LM.Get("industryJobsActivityTechResearch");
                break;

            case IndustryJobActivity.te:
                activityText = LM.Get("industryJobsActivityTEResearch");
                break;

            case IndustryJobActivity.me:
                activityText = LM.Get("industryJobsActivityMEResearch");
                break;

            case IndustryJobActivity.copy:
                activityText = LM.Get("industryJobsActivityCopying");
                break;

            case IndustryJobActivity.duplicating:
                activityText = LM.Get("industryJobsActivityDuplicating");
                break;

            case IndustryJobActivity.reverseEng:
                activityText = LM.Get("industryJobsActivityReverseEng");
                break;

            case IndustryJobActivity.inventing:
                activityText = LM.Get("industryJobsActivityInventing");
                break;

            case IndustryJobActivity.reaction:
                activityText = LM.Get("industryJobsActivityReaction");
                break;

            case IndustryJobActivity.reaction2:
                activityText = LM.Get("industryJobsActivityReaction");
                break;

            default:
                throw new ArgumentOutOfRangeException($"Unknown activity {job.activity_id}");
            }

            var bpType = await APIHelper.ESIAPI.GetTypeId(Reason, job.blueprint_type_id);

            var productType = await APIHelper.ESIAPI.GetTypeId(Reason, job.product_type_id);

            var completedBy = job.completed_character_id > 0 ? await APIHelper.ESIAPI.GetCharacterData(Reason, job.completed_character_id) : null;

            var unk       = LM.Get("Unknown");
            var installer = job.installer_id > 0 ? await APIHelper.ESIAPI.GetCharacterData(Reason, job.installer_id) : null;

            var station = (await APIHelper.ESIAPI.GetStationData(Reason, job.facility_id, token))?.name ?? (await APIHelper.ESIAPI.GetStructureData(Reason, job.facility_id, token))?.name;

            var header    = isStatusChange ? LM.Get("industryJobsStatusHeader") : LM.Get("industryJobsNewHeader");
            var sb        = new StringBuilder();
            var color     = isStatusChange ? null : "fix";
            var colorMark = string.Empty;
            var colorMove = string.Empty;

            if (job.StatusValue == IndustryJobStatusEnum.cancelled || job.StatusValue == IndustryJobStatusEnum.reverted)
            {
                color     = "diff";
                colorMark = "-";
                colorMove = " ";
            }

            if (job.StatusValue == IndustryJobStatusEnum.ready || job.StatusValue == IndustryJobStatusEnum.delivered)
            {
                color     = "diff";
                colorMark = "+";
                colorMove = " ";
            }

            sb.AppendLine($"```{color}");
            sb.AppendLine($"*{header}*");
            sb.AppendLine($"{colorMove}{LM.Get("industryJobsRowActivity"),-11}: {activityText}");
            sb.AppendLine($"{colorMark}{LM.Get("industryJobsRowStatus"),-11}: {statusText}");

            if (job.Activity == IndustryJobActivity.build || job.Activity == IndustryJobActivity.inventing || job.Activity == IndustryJobActivity.reverseEng)
            {
                sb.AppendLine($"{colorMove}{LM.Get("industryJobsRowFrom"),-11}: {bpType?.name ?? unk}");
                sb.AppendLine($"{colorMove}{LM.Get("industryJobsRowTo"),-11}: {productType?.name ?? unk}");
            }
            else
            {
                sb.AppendLine($"{colorMove}{LM.Get("industryJobsRowBPO"),-11}: {productType?.name ?? unk}");
            }
            if (!string.IsNullOrEmpty(timeToComplete))
            {
                sb.AppendLine($"{colorMove}{LM.Get("industryJobsRowDuration"),-11}: {timeToComplete}");
            }

            if (installer != null)
            {
                sb.AppendLine($"{colorMove}{LM.Get("industryJobsRowInstaller"),-11}: {installer.name}");
            }
            if (completedBy != null && isCorp)
            {
                sb.AppendLine($"{colorMove}{LM.Get("industryJobsRowCompletedBy"),-11}: {completedBy.name}");
            }
            sb.AppendLine($"{colorMark}{LM.Get("industryJobsRowStation"),-11}: {station ?? LM.Get("Unknown")}");
            sb.AppendLine("```");
            //sb.Append($"{LM.Get("industryJobsRowTime"),10}": {job.});
            foreach (var channel in discordChannels)
            {
                await APIHelper.DiscordAPI.SendMessageAsync(channel, sb.ToString());
            }
        }
        public static async Task OneSec_TQStatusPost(DateTime now)
        {
            if (!_IsTQOnline.HasValue)
            {
                _IsTQOnline = TickManager.IsConnected;
            }

            if (!_isTQOnlineRunning && SettingsManager.Settings.ContinousCheckModule.EnableTQStatusPost && SettingsManager.Settings.ContinousCheckModule.TQStatusPostChannels.Any() && _IsTQOnline != TickManager.IsConnected)
            {
                try
                {
                    _isTQOnlineRunning = true;
                    if (APIHelper.DiscordAPI.IsAvailable)
                    {
                        var msg   = _IsTQOnline.Value ? $"{LM.Get("autopost_tq")} {LM.Get("Offline")}" : $"{LM.Get("autopost_tq")} {LM.Get("Online")}";
                        var color = _IsTQOnline.Value ? new Discord.Color(0xFF0000) : new Discord.Color(0x00FF00);
                        foreach (var channelId in SettingsManager.Settings.ContinousCheckModule.TQStatusPostChannels)
                        {
                            try
                            {
                                var embed = new EmbedBuilder().WithTitle(msg).WithColor(color);
                                await APIHelper.DiscordAPI.SendMessageAsync(channelId, SettingsManager.Settings.ContinousCheckModule.TQStatusPostMention, embed.Build()).ConfigureAwait(false);
                            }
                            catch (Exception ex)
                            {
                                await LogHelper.LogEx("Autopost - TQStatus", ex, LogCat.Continuous);
                            }
                        }

                        _IsTQOnline = TickManager.IsConnected;
                    }
                }
                catch (Exception ex)
                {
                    await LogHelper.LogEx("OneSec_TQStatusPost", ex, LogCat.Continuous);
                }
                finally
                {
                    _isTQOnlineRunning = false;
                }
            }
        }
Beispiel #23
0
        private async Task WriteCorrectResponce(HttpListenerResponse response, bool isEditor, long characterId)
        {
            var baseCharId = Convert.ToBase64String(Encoding.UTF8.GetBytes(characterId.ToString()));
            var rChar      = await APIHelper.ESIAPI.GetCharacterData(Reason, characterId, true);

            if (rChar == null)
            {
                await response.WriteContentAsync("ERROR: Probably EVE ESI is shut down at the moment. Please try again later.");

                return;
            }

            var text = File.ReadAllText(SettingsManager.FileTemplateTimersPage).Replace("{header}", LM.Get("timersTemplateHeader"))
                       .Replace("{headerContent}",
                                WebServerModule.GetHtmlResourceDefault(true) + WebServerModule.GetHtmlResourceDatetime() + WebServerModule.GetHtmlResourceConfirmation())
                       .Replace("{loggedInAs}", LM.Get("loggedInAs", rChar.name))
                       .Replace("{charId}", baseCharId)
                       .Replace("{body}", await GenerateTimersHtml(isEditor, baseCharId))
                       .Replace("{isEditorElement}", isEditor ? null : "d-none")
                       .Replace("{addNewTimerHeader}", LM.Get("timersAddHeader"))
                       .Replace("{addNewRfTimerHeader}", LM.Get("timersAddRfHeader"))
                       .Replace("{timersType}", LM.Get("timersType"))
                       .Replace("{timersStage}", LM.Get("timersStage"))
                       .Replace("{timersLocation}", LM.Get("timersLocation"))
                       .Replace("{timersOwner}", LM.Get("timersOwner"))
                       .Replace("{timersET}", LM.Get("timersET"))
                       .Replace("{timersRfET}", LM.Get("timersRfET"))
                       .Replace("{timersNotes}", LM.Get("timersNotes"))
                       .Replace("{Add}", LM.Get("Add"))
                       .Replace("{Cancel}", LM.Get("Cancel"))
                       .Replace("{timerOffensive}", LM.Get("timerOffensive"))
                       .Replace("{timerDefensive}", LM.Get("timerDefensive"))
                       .Replace("{timerHull}", LM.Get("timerHull"))
                       .Replace("{timerArmor}", LM.Get("timerArmor"))
                       .Replace("{timerShield}", LM.Get("timerShield"))
                       .Replace("{timerOther}", LM.Get("timerOther"))
                       .Replace("{LogOutUrl}", WebServerModule.GetWebSiteUrl())
                       .Replace("{LogOut}", LM.Get("LogOut"))
                       .Replace("{timerTooltipLocation}", LM.Get("timerTooltipLocation"))
                       .Replace("{timerTooltipOwner}", LM.Get("timerTooltipOwner"))
                       .Replace("{timerTooltipET}", LM.Get("timerTooltipET"))
                       .Replace("{locale}", LM.Locale)
                       .Replace("{dateformat}", Settings.TimersModule.TimeInputFormat)
            ;
            await WebServerModule.WriteResponce(text, response);
        }
Beispiel #24
0
        public async Task ProcessExistingCampaigns()
        {
            if (_isCheckRunning)
            {
                return;
            }
            try
            {
                _isCheckRunning = true;
                if (DateTime.Now <= _nextNotificationCheck2)
                {
                    return;
                }
                _nextNotificationCheck2 = DateTime.Now.AddMinutes(1);

                await LogHelper.LogModule("Running NullCampaign module check...", Category);

                foreach (var pair in Settings.NullCampaignModule.GetEnabledGroups())
                {
                    foreach (var campaign in await SQLHelper.GetNullCampaigns(pair.Key))
                    {
                        var startTime = campaign.Time;
                        //delete outdated campaigns
                        if (startTime <= DateTime.UtcNow)
                        {
                            if (!pair.Value.Announces.Any())
                            {
                                await PrepareMessage(campaign, pair.Value, LM.Get("NC_LessThanMinsLeft", TimeSpan.FromMinutes(0).ToFormattedString()), 0xFF0000);
                            }

                            await SQLHelper.DeleteNullCampaign(pair.Key, campaign.campaign_id);

                            await LogHelper.LogInfo($"Nullsec Campaign {campaign.campaign_id} has been deleted...", Category, true, false);

                            continue;
                        }

                        if (pair.Value.Announces.Any())
                        {
                            var announceList = pair.Value.Announces.OrderBy(a => a).ToList();
                            var max          = announceList.Max();
                            //not a notification time
                            var minutesLeft = (startTime - DateTime.UtcNow).TotalMinutes;
                            if (minutesLeft > max)
                            {
                                continue;
                            }


                            foreach (var announce in announceList.Where(a => campaign.LastAnnounce == 0 || a < campaign.LastAnnounce))
                            {
                                if (minutesLeft < announce)
                                {
                                    await PrepareMessage(campaign, pair.Value, LM.Get("NC_LessThanMinsLeft", TimeSpan.FromMinutes(minutesLeft).ToFormattedString()), 0xFF0000);

                                    //update last announce
                                    await SQLHelper.UpdateNullCampaignAnnounce(pair.Key, campaign.campaign_id, announce);

                                    break;
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                await LogHelper.LogEx(ex.Message, ex, Category);
            }
            finally
            {
                _isCheckRunning = false;
            }
        }