internal static void RemoveModule(GrooveModule p_Module)
        {
            if (p_Module.Default)
            {
                return;
            }

            using (var s_Db = Database.GetConnection())
                s_Db.Delete(p_Module);
        }
        internal static void CompileModule(GrooveModule p_Module)
        {
            if (m_LoadedModules.ContainsKey(p_Module.Name) || !p_Module.Enabled)
            {
                return;
            }

            try
            {
                var s_Scope = m_ScriptEngine.CreateScope();

                s_Scope.ImportModule("clr");

                m_ScriptEngine.Execute("import clr", s_Scope);
                m_ScriptEngine.Execute("from clr import Convert", s_Scope);

                m_ScriptEngine.Execute("clr.AddReference('System.Core')", s_Scope);
                m_ScriptEngine.Execute("from System import Action", s_Scope);
                m_ScriptEngine.Execute("from System.Collections.Generic import List", s_Scope);

                m_ScriptEngine.Execute("clr.AddReference('GS.Lib')", s_Scope);
                m_ScriptEngine.Execute("from GS.Lib import *", s_Scope);

                m_ScriptEngine.Execute("clr.AddReference('GrooveCasterServer')", s_Scope);
                m_ScriptEngine.Execute("from GrooveCaster import *", s_Scope);
                m_ScriptEngine.Execute("from GrooveCaster.Managers import BroadcastManager, ChatManager, QueueManager, SettingsManager, UserManager, SuggestionManager, PlaylistManager", s_Scope);
                m_ScriptEngine.Execute("from GrooveCaster.Application import Library as SharpShark", s_Scope);
                m_ScriptEngine.Execute("from GrooveCaster.Util import ModuleTimer as Timer", s_Scope);


                var s_ScriptSource = m_ScriptEngine.CreateScriptSourceFromString(p_Module.Script.Trim(), SourceCodeKind.File);
                var s_Script       = s_ScriptSource.Execute(s_Scope);

                m_LoadedModules.Add(p_Module.Name, new ModuleScript()
                {
                    Source = s_ScriptSource,
                    Script = s_Script,
                    Scope  = s_Scope
                });
            }
            catch (Exception s_Exception)
            {
                Console.WriteLine(s_Exception);
                LoadExceptions.Add(p_Module.Name, s_Exception.Message);
            }
        }
 internal static void UpdateModule(GrooveModule p_Module)
 {
     using (var s_Db = Database.GetConnection())
         s_Db.Update(p_Module);
 }
 internal static void EnableModule(GrooveModule p_Module)
 {
     p_Module.Enabled = true;
     UpdateModule(p_Module);
 }
 internal static void DisableModule(GrooveModule p_Module)
 {
     p_Module.Enabled = false;
     UpdateModule(p_Module);
 }
        public ModulesModule()
        {
            this.RequiresAuthentication();

            Get["/modules"] = p_Parameters =>
            {
                if (!Context.CurrentUser.Claims.Contains("super"))
                {
                    return(new RedirectResponse("/"));
                }

                return(View["Modules", new { SuperUser = Context.CurrentUser.Claims.Contains("super"), Modules = ModuleManager.GetModules(), Errors = ModuleManager.LoadExceptions }]);
            };

            Get["/modules/edit/{module}"] = p_Parameters =>
            {
                if (!Context.CurrentUser.Claims.Contains("super"))
                {
                    return(new RedirectResponse("/"));
                }

                String s_ModuleName = p_Parameters.module;

                var s_Module = ModuleManager.GetModule(s_ModuleName);

                if (s_Module == null)
                {
                    return(new RedirectResponse("/modules"));
                }

                return(View["EditModule", new { SuperUser = Context.CurrentUser.Claims.Contains("super"), Data = s_Module, HasError = false, Error = "" }]);
            };

            Post["/modules/edit/{module}"] = p_Parameters =>
            {
                if (!Context.CurrentUser.Claims.Contains("super"))
                {
                    return(new RedirectResponse("/"));
                }

                String s_ModuleName = p_Parameters.module;

                var s_Module = ModuleManager.GetModule(s_ModuleName);

                if (s_Module == null)
                {
                    return(new RedirectResponse("/modules"));
                }

                var s_Request = this.Bind <EditModuleRequest>();

                s_Module.DisplayName = s_Request.Display;
                s_Module.Description = s_Request.Description;
                s_Module.Script      = s_Request.Script;

                if (String.IsNullOrWhiteSpace(s_Request.Display) ||
                    String.IsNullOrWhiteSpace(s_Request.Script))
                {
                    return(View["EditModule", new { SuperUser = Context.CurrentUser.Claims.Contains("super"), Data = s_Module, HasError = true, Error = "Please fill in all the required fields." }]);
                }

                ModuleManager.UpdateModule(s_Module);
                ModuleManager.ReloadModules();

                return(new RedirectResponse("/modules"));
            };

            Get["/modules/add"] = p_Parameters =>
            {
                if (!Context.CurrentUser.Claims.Contains("super"))
                {
                    return(new RedirectResponse("/"));
                }

                return(View["AddModule", new { HasError = false, SuperUser = Context.CurrentUser.Claims.Contains("super"), Data = new AddModuleRequest()
                                               {
                                                   Name = "", Display = "", Description = "", Script = ""
                                               }, Error = "" }]);
            };

            Post["/modules/add"] = p_Parameters =>
            {
                if (!Context.CurrentUser.Claims.Contains("super"))
                {
                    return(new RedirectResponse("/"));
                }

                var s_Request = this.Bind <AddModuleRequest>();

                if (String.IsNullOrWhiteSpace(s_Request.Name.Trim()) || String.IsNullOrWhiteSpace(s_Request.Display) ||
                    String.IsNullOrWhiteSpace(s_Request.Script))
                {
                    return(View["AddModule", new { SuperUser = Context.CurrentUser.Claims.Contains("super"), Data = s_Request, HasError = true, Error = "Please fill in all the required fields." }]);
                }

                var s_ID = s_Request.Name.Trim().ToLowerInvariant();

                if (ModuleManager.GetModule(s_ID) != null)
                {
                    return(View["AddModule", new { SuperUser = Context.CurrentUser.Claims.Contains("super"), Data = s_Request, HasError = true, Error = "A module with that name already exists." }]);
                }

                var s_Module = new GrooveModule
                {
                    Name        = s_ID,
                    DisplayName = s_Request.Display,
                    Description = s_Request.Description,
                    Script      = s_Request.Script,
                    Enabled     = true,
                    Default     = false
                };

                using (var s_Db = Database.GetConnection())
                    s_Db.Insert(s_Module);

                ModuleManager.ReloadModules();

                return(new RedirectResponse("/modules"));
            };

            Get["/modules/delete/{module}"] = p_Parameters =>
            {
                if (!Context.CurrentUser.Claims.Contains("super"))
                {
                    return(new RedirectResponse("/"));
                }

                String s_ModuleName = p_Parameters.module;

                var s_Module = ModuleManager.GetModule(s_ModuleName);

                if (s_Module == null || s_Module.Default)
                {
                    return(new RedirectResponse("/modules"));
                }

                ModuleManager.RemoveModule(s_Module);
                ModuleManager.ReloadModules();

                return(new RedirectResponse("/modules"));
            };

            Get["/modules/disable/{module}"] = p_Parameters =>
            {
                if (!Context.CurrentUser.Claims.Contains("super"))
                {
                    return(new RedirectResponse("/"));
                }

                String s_ModuleName = p_Parameters.module;

                var s_Module = ModuleManager.GetModule(s_ModuleName);

                if (s_Module == null)
                {
                    return(new RedirectResponse("/modules"));
                }

                ModuleManager.DisableModule(s_Module);
                ModuleManager.ReloadModules();

                return(new RedirectResponse("/modules"));
            };

            Get["/modules/enable/{module}"] = p_Parameters =>
            {
                if (!Context.CurrentUser.Claims.Contains("super"))
                {
                    return(new RedirectResponse("/"));
                }

                String s_ModuleName = p_Parameters.module;

                var s_Module = ModuleManager.GetModule(s_ModuleName);

                if (s_Module == null)
                {
                    return(new RedirectResponse("/modules"));
                }

                ModuleManager.EnableModule(s_Module);
                ModuleManager.ReloadModules();

                return(new RedirectResponse("/modules"));
            };
        }