private async void EndGetRequest(HttpListenerContext context, System.Net.Http.HttpListener listener)
        {
            try
            {
                using (context.Response)
                    HandleRequest(context);
            }
            catch (Exception ex)
            {
                Console.Write("Exception in listener: {0}{1}", Environment.NewLine, ex);
            }
            finally
            {
                try
                {
                    if (listener.IsListening)
                    {
                        context = await listener.GetContextAsync();

                        EndGetRequest(context, listener);
                    }
                }
                catch
                {
                    Stop();
                }
            }
        }
Example #2
0
 public void Dispose()
 {
     if (_httpListener != null)
     {
         _httpListener.Dispose();
         _httpListener = null;
     }
 }
        /// <summary>
        /// Stops listening for incoming connections
        /// </summary>
        public override void Stop()
        {
            if (!Running)
            {
                return;
            }

            IDisposable d = (IDisposable)listener;

            listener = null;
            d.Dispose();
        }
        private System.Net.Http.HttpListener StartHttpListener(int port, EventHandler <HttpListenerRequestEventArgs> requestHandler = null)
        {
            address = "127.0.0.1";
            url     = (new UriBuilder($"http://{address}:{port}/test")).Uri;

            var listener = new System.Net.Http.HttpListener(IPAddress.Parse(address), port);

            if (requestHandler != null)
            {
                listener.Request += requestHandler;
            }
            listener.Start();

            return(listener);
        }
Example #5
0
        public Task Launch()
        {
            if (_cancellationToken.IsCancellationRequested)
            {
                throw new OperationCanceledException();
            }

            if (_httpListener == null)
            {
                _logger.Info($"Starting server on {_endPoint.ToString()}");
                _httpListener = new System.Net.Http.HttpListener(_endPoint, this, _cancellationToken);
                return(_httpListener.GetListenerTask());
            }

            throw new InvalidOperationException("RestServerServer already running.");
        }
        /// <summary>
        /// Starts listening for incoming connections
        /// </summary>
        public async override void Start()
        {
            if (Running)
            {
                return;
            }

#if NETSTANDARD1_5
            listener = new System.Net.Http.HttpListener(address, port);
            listener.Start();
            var context = await listener.GetContextAsync();

            EndGetRequest(context, listener);
#else
            listener = new System.Net.HttpListener();
            listener.Prefixes.Add(prefix);
            listener.Start();
            listener.BeginGetContext(EndGetRequest, listener);
#endif
        }
Example #7
0
        public HttpServer()
        {
            #region 初始化串口
            int    baudRate = 38400;
            string portName = "COM1";
            try
            {
                baudRate = Convert.ToInt32(ConfigurationManager.AppSettings["BaudRate"]);
            }
            catch (Exception)
            {
                Console.WriteLine("波特率获取失败");
                return;
            }

            if (Environment.OSVersion.Platform.ToString().StartsWith("Win"))
            {
                portName = ConfigurationManager.AppSettings["WinPortName"];
            }
            else
            {
                portName = ConfigurationManager.AppSettings["LinuxPortName"];
            }

            if (string.IsNullOrWhiteSpace(portName))
            {
                Console.WriteLine("串口获取失败");
                return;
            }

            serialPortInput.ConnectionStatusChanged += SerialPortInput_ConnectionStatusChanged;
            serialPortInput.MessageReceived         += SerialPortInput_MessageReceived;
            serialPortInput.SetPort(portName, baudRate);
            serialPortInput.Connect();

            Console.Write($"等待串口{portName}连接");
            while (!serialPortInput.IsConnected)
            {
                Console.Write(".");
                Thread.Sleep(1000);
            }
            Console.WriteLine($"\n串口{portName}连接成功");

            serialPortInput.SendMessage(new byte[] { 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x01, 0x00 });
            #endregion

            #region 初始化服务器
            var listener = new System.Net.Http.HttpListener(IPAddress.Any, 8081);
            try
            {
                listener.Request += async(sender, context) =>
                {
                    var request  = context.Request;
                    var response = context.Response;

                    //如果是GET请求
                    if (request.HttpMethod == HttpMethods.Get)
                    {
                        string content = @"<h2>提供POST方法测试</h2>
                                <form method=""POST"" action=""http://192.168.123.166:8081/login"">
                                    <input name=""data""></input>                                   
                                    <button type=""submit"">Send</button>
                                </form>";

                        await response.WriteContentAsync(MakeDocument(content));
                    }

                    //如果是POST请求
                    else if (request.HttpMethod == HttpMethods.Post)
                    {
                        var data = await request.ReadUrlEncodedContentAsync();

                        //登录
                        if (request.Url.LocalPath.ToLower().Contains("login"))
                        {
                            ProcessLogin(data, response);
                        }

                        //获取数据
                        else if (request.Url.LocalPath.ToLower().Contains("getdata"))
                        {
                            ProcessGetData(data, response);
                        }

                        //控制开关
                        else if (request.Url.LocalPath.ToLower().Contains("control"))
                        {
                            ProcessControl(data, response);
                        }

                        //登出
                        else if (request.Url.LocalPath.ToLower().Contains("logout"))
                        {
                            ProcessLogOut(data, response);
                        }
                        else
                        {
                            //请求出错
                        }
                    }
                    else
                    {
                        response.MethodNotAllowed();
                    }
                    response.Close();
                };
                listener.Start();

                Console.WriteLine("服务器已启动...");
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc.ToString());
                listener.Close();
            }
            #endregion
        }
Example #8
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 (Exception ex)
                {
                }

                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 (Exception ex)
                {
                }

                //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();

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

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

                            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;
                                    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))
                                {
                                    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 Settings.WebAuthModule.AuthGroups.Where(a => a.Value.StandingsAuth != null))
                                {
                                    var group = groupPair.Value;
                                    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.Groups)
                                {
                                    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.Groups)
                                {
                                    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();
            }
        }
Example #9
0
        public override async Task Run(object prm)
        {
            if (!SettingsManager.GetBool("config", "moduleWebServer"))
            {
                return;
            }

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

                _listener?.Dispose();
                var port    = SettingsManager.GetInt("webServerModule", "webListenPort");
                var extPort = SettingsManager.Get("webServerModule", "webExternalPort");
                var ip      = SettingsManager.Get("webServerModule", "webListenIP");
                _listener          = new System.Net.Http.HttpListener(IPAddress.Parse(ip), port);
                _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 == "/" || request.Url.LocalPath == $"{port}/" || request.Url.LocalPath == $"{extPort}/")
                        {
                            var extIp    = SettingsManager.Get("webServerModule", "webExternalIP");
                            var authUrl  = $"http://{extIp}:{extPort}/auth.php";
                            var authNurl = GetAuthNotifyURL();

                            response.Headers.ContentEncoding.Add("utf-8");
                            response.Headers.ContentType.Add("text/html;charset=utf-8");
                            var text = File.ReadAllText(SettingsManager.FileTemplateMain).Replace("{authUrl}", authUrl)
                                       .Replace("{authNotifyUrl}", authNurl).Replace("{header}", LM.Get("authTemplateHeader"))
                                       .Replace("{timersUrl}", GetTimersURL())
                                       .Replace("{authButtonDiscordText}", LM.Get("authButtonDiscordText"))
                                       .Replace("{authButtonNotifyText}", LM.Get("authButtonNotifyText"))
                                       .Replace("{authButtonTimersText}", LM.Get("authButtonTimersText"))
                                       .Replace("{authMailUrl}", GetMailAuthURL())
                                       .Replace("{authButtonMailText}", LM.Get("authButtonMailText"))
                                       .Replace("{webAuthHeader}", LM.Get("webAuthHeader"))
                                       .Replace("{webWelcomeHeader}", LM.Get("webWelcomeHeader"))
                            ;
                            text = text.Replace("{disableWebAuth}", !SettingsManager.GetBool("config", "moduleAuthWeb") ? "disabled" : "");
                            text = text.Replace("{disableWebNotify}", !SettingsManager.GetBool("config", "moduleNotificationFeed") ? "disabled" : "");
                            text = text.Replace("{disableWebTimers}", !SettingsManager.GetBool("config", "moduleTimers") ? "disabled" : "");
                            text = text.Replace("{disableMailNotify}", !SettingsManager.GetBool("config", "moduleMail") ? "disabled" : "");

                            await response.WriteContentAsync(text);

                            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)
                        {
                            response.Headers.ContentEncoding.Add("utf-8");
                            response.Headers.ContentType.Add("text/html;charset=utf-8");
                            await response.WriteContentAsync(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", "404 Not Found!")
                                                             .Replace("{header}", LM.Get("authTemplateHeader"))
                                                             .Replace("{body}", LM.Get("WebRequestUnexpected"))
                                                             );
                        }
                    }
                    catch (Exception ex)
                    {
                        await LogHelper.LogEx(ex.Message, ex, Category);
                    }
                    finally
                    {
                        try
                        {
                            context.Response.Close();
                        }
                        catch
                        {
                            //ignore
                        }
                    }
                };
                _listener.Start();
            }
        }
Example #10
0
        public override async Task Run(object prm)
        {
            if (!Settings.Config.ModuleWebServer)
            {
                return;
            }

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

                _listener?.Dispose();
                var port    = Settings.WebServerModule.WebListenPort;
                var extPort = Settings.WebServerModule.WebExternalPort;
                var ip      = Settings.WebServerModule.WebListenIP;
                _listener          = new System.Net.Http.HttpListener(IPAddress.Parse(ip), port);
                _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 == $"{port}/" || request.Url.LocalPath == $"{extPort}/")
                        {
                            var extIp   = Settings.WebServerModule.WebExternalIP;
                            var authUrl = $"http://{extIp}:{extPort}/auth.php";

                            var text = File.ReadAllText(SettingsManager.FileTemplateMain)
                                       .Replace("{header}", LM.Get("authTemplateHeader"))
                                       .Replace("{webAuthHeader}", LM.Get("webAuthHeader"))
                                       .Replace("{webWelcomeHeader}", LM.Get("webWelcomeHeader"));

                            //auth controls
                            var authText = string.Empty;
                            //auth
                            if (SettingsManager.Settings.Config.ModuleAuthWeb)
                            {
                                var groups = SettingsManager.Settings.WebAuthModule.AuthGroups.Where(a => a.Value.PreliminaryAuthMode || a.Value.ESICustomAuthRoles.Any()).ToList();
                                //no default auth if there are no default groups
                                if (groups.Count != SettingsManager.Settings.WebAuthModule.AuthGroups.Count)
                                {
                                    authText = $"<a href=\"{authUrl}\" class=\"btn btn-info btn-block {(!Settings.Config.ModuleAuthWeb ? "disabled" : "")}\" role=\"button\">{LM.Get("authButtonDiscordText")}</a>";
                                }

                                foreach (var @group in groups)
                                {
                                    var customAuthString = GetCustomAuthUrl(group.Value.ESICustomAuthRoles, group.Key);
                                    var bText            = group.Value.CustomButtonText ?? $"{LM.Get("authButtonDiscordText")} - {group.Key}";
                                    authText += $"\n<a href=\"{customAuthString}\" class=\"btn btn-info btn-block\" role=\"button\">{bText}</a>";
                                }
                            }

                            //notifications
                            if (Settings.Config.ModuleNotificationFeed)
                            {
                                var authNurl = GetAuthNotifyURL();
                                authText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonNotifyText")}</a>";
                            }
                            //mail
                            if (Settings.Config.ModuleMail)
                            {
                                var authNurl = GetMailAuthURL();
                                authText += $"\n<a href=\"{authNurl}\" class=\"btn btn-info btn-block\" role=\"button\">{LM.Get("authButtonMailText")}</a>";
                            }
                            text = text.Replace("{authControls}", authText);

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

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

                            text = text.Replace("{manageControls}", manageText);
                            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(File.ReadAllText(SettingsManager.FileTemplateAuth3).Replace("{message}", "404 Not Found!")
                                                .Replace("{header}", LM.Get("authTemplateHeader"))
                                                .Replace("{body}", LM.Get("WebRequestUnexpected"))
                                                .Replace("{backText}", LM.Get("backText")), response);
                        }
                    }
                    catch (Exception ex)
                    {
                        await LogHelper.LogEx(ex.Message, ex, Category);
                    }
                    finally
                    {
                        try
                        {
                            context.Response.Close();
                        }
                        catch
                        {
                            //ignore
                        }
                    }
                };
                _listener.Start();
            }
        }