diff --git a/Application/API/Master/Heartbeat.cs b/Application/API/Master/Heartbeat.cs index 2666a494..0c14f1f7 100644 --- a/Application/API/Master/Heartbeat.cs +++ b/Application/API/Master/Heartbeat.cs @@ -10,15 +10,13 @@ namespace IW4MAdmin.Application.API.Master { public class Heartbeat { - static IMasterApi api; public static async Task Send(ApplicationManager mgr, bool firstHeartbeat = false) { + var api = Endpoint.Get(); if (firstHeartbeat) { - api = RestClient.For("http://127.0.0.1"); - var token = await api.Authenticate(new AuthenticationId() { Id = mgr.GetApplicationSettings().Configuration().Id @@ -48,12 +46,12 @@ namespace IW4MAdmin.Application.API.Master if (firstHeartbeat) { - instance = await api.AddInstance(instance); + var message = await api.AddInstance(instance); } else { - instance = await api.UpdateInstance(instance.Id, instance); + var message = await api.UpdateInstance(instance.Id, instance); } } } diff --git a/Application/API/Master/IMasterApi.cs b/Application/API/Master/IMasterApi.cs index 2609b4f3..4d49fee4 100644 --- a/Application/API/Master/IMasterApi.cs +++ b/Application/API/Master/IMasterApi.cs @@ -19,6 +19,30 @@ namespace IW4MAdmin.Application.API.Master public string AccessToken { get; set; } } + public class VersionInfo + { + [JsonProperty("current-version-stable")] + public float CurrentVersionStable { get; set; } + [JsonProperty("current-version-prerelease")] + public float CurrentVersionPrerelease { get; set; } + } + + public class ResultMessage + { + [JsonProperty("message")] + public string Message { get; set; } + } + + public class Endpoint + { +#if !DEBUG + private static IMasterApi api = RestClient.For("http://api.raidmax.org:5000"); +#else + private static IMasterApi api = RestClient.For("http://127.0.0.1"); +#endif + public static IMasterApi Get() => api; + } + [Header("User-Agent", "IW4MAdmin-RestEase")] public interface IMasterApi { @@ -29,9 +53,12 @@ namespace IW4MAdmin.Application.API.Master Task Authenticate([Body] AuthenticationId Id); [Post("instance/")] - Task AddInstance([Body] ApiInstance instance); + Task AddInstance([Body] ApiInstance instance); [Put("instance/{id}")] - Task UpdateInstance([Path] string id, [Body] ApiInstance instance); + Task UpdateInstance([Path] string id, [Body] ApiInstance instance); + + [Get("version")] + Task GetVersion(); } } diff --git a/Application/Application.csproj b/Application/Application.csproj index d13e54b3..10cbc9f7 100644 --- a/Application/Application.csproj +++ b/Application/Application.csproj @@ -17,19 +17,9 @@ https://raidmax.org/IW4MAdmin/img/iw4adminicon-3.png IW4MAdmin + Debug;Release;Prerelease - - - - - - - PreserveNewest - PreserveNewest - - - @@ -44,6 +34,12 @@ + + + Always + + + diff --git a/Application/IW4MAdminSettings.json b/Application/DefaultSettings.json similarity index 91% rename from Application/IW4MAdminSettings.json rename to Application/DefaultSettings.json index eb6056e3..9309408a 100644 --- a/Application/IW4MAdminSettings.json +++ b/Application/DefaultSettings.json @@ -1,4 +1,4 @@ -{ +{ "AutoMessagePeriod": 60, "AutoMessages": [ "This server uses ^5IW4M Admin v{{VERSION}} ^7get it at ^5raidmax.org/IW4MAdmin", @@ -361,6 +361,34 @@ { "Alias": "Takeoff", "Name": "mp_takeoff" + }, + { + "Alias": "Buried/Resolution 1295", + "Name": "zm_buried" + }, + { + "Alias": "Die Rise/Great Leap Forward", + "Name": "zm_highrise" + }, + { + "Alias": "Nuketown", + "Name": "zm_nuked" + }, + { + "Alias": "Mob of the Dead", + "Name": "zm_prison" + }, + { + "Alias": "Origins", + "Name": "zm_tomb" + }, + { + "Alias": "Diner", + "Name": "zm_transit_dr" + }, + { + "Alias": "Green Run/Bus Depot/Farm/Town", + "Name": "zm_transit" } ] } diff --git a/Application/Main.cs b/Application/Main.cs index 568998ef..47518158 100644 --- a/Application/Main.cs +++ b/Application/Main.cs @@ -25,7 +25,7 @@ namespace IW4MAdmin.Application Console.WriteLine("====================================================="); Console.WriteLine(" IW4M ADMIN"); Console.WriteLine(" by RaidMax "); - Console.WriteLine($" Version {Version}"); + Console.WriteLine($" Version {Version.ToString("0.0")}"); Console.WriteLine("====================================================="); try @@ -36,9 +36,63 @@ namespace IW4MAdmin.Application CheckDirectories(); ServerManager = ApplicationManager.GetInstance(); + + var api = API.Master.Endpoint.Get(); + var version = new API.Master.VersionInfo() + { + CurrentVersionStable = 99.99f + }; + + try + { + version = api.GetVersion().Result; + } + + catch (Exception e) + { + ServerManager.Logger.WriteWarning($"Could not get latest IW4MAdmin version"); + while (e.InnerException != null) + { + e = e.InnerException; + } + + ServerManager.Logger.WriteDebug(e.Message); + } + + if (version.CurrentVersionStable == 99.99f) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("Could not get latest IW4MAdmin version."); + Console.ForegroundColor = ConsoleColor.White; + } + +#if !PRERELEASE + else if (version.CurrentVersionStable > Version) + { + Console.ForegroundColor = ConsoleColor.DarkYellow; + Console.WriteLine($"IW4MAdmin has an update. Latest version is [v{version.CurrentVersionStable.ToString("0.0")}]"); + Console.WriteLine($"Your version is [v{Version.ToString("0.0")}]"); + Console.ForegroundColor = ConsoleColor.White; + } +#else + else if (version.CurrentVersionPrerelease > Version) + { + Console.ForegroundColor = ConsoleColor.DarkYellow; + Console.WriteLine($"IW4MAdmin-Prerelease has an update. Latest version is [v{version.CurrentVersionPrerelease.ToString("0.0")}-pr]"); + Console.WriteLine($"Your version is [v{Version.ToString("0.0")}-pr]"); + Console.ForegroundColor = ConsoleColor.White; + } +#endif + else + { + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine("IW4MAdmin is up to date."); + Console.ForegroundColor = ConsoleColor.White; + } + ServerManager.Init().Wait(); - Task.Run(() => + var consoleTask = Task.Run(() => { String userInput; Player Origin = ServerManager.GetClientService().Get(1).Result.AsPlayer(); @@ -51,10 +105,13 @@ namespace IW4MAdmin.Application ServerManager.Stop(); if (ServerManager.Servers.Count == 0) - return; + { + Console.WriteLine("No servers are currently being monitored"); + continue; + } Origin.CurrentServer = ServerManager.Servers[0]; - GameEvent E = new GameEvent((GameEvent.EventType)GameEvent.EventType.Say, userInput, Origin, null, ServerManager.Servers[0]); + GameEvent E = new GameEvent(GameEvent.EventType.Say, userInput, Origin, null, ServerManager.Servers[0]); ServerManager.Servers[0].ExecuteEvent(E); Console.Write('>'); @@ -73,12 +130,12 @@ namespace IW4MAdmin.Application catch (Exception e) { - Console.WriteLine($"Fatal Error during initialization: {e.Message}"); + Console.WriteLine($"Fatal Error during initialization"); while (e.InnerException != null) { e = e.InnerException; - Console.WriteLine($"Inner exception: {e.Message}"); } + Console.WriteLine($"Exception: {e.Message}"); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } diff --git a/Application/Manager.cs b/Application/Manager.cs index 8ecf8e6b..36bea63b 100644 --- a/Application/Manager.cs +++ b/Application/Manager.cs @@ -121,27 +121,41 @@ namespace IW4MAdmin.Application #region CONFIG var config = ConfigHandler.Configuration(); - if (config?.Servers == null) - { - var newConfig = (ApplicationConfiguration)ConfigHandler.Configuration().Generate(); - ConfigHandler.Set(newConfig); - newConfig.AutoMessagePeriod = config.AutoMessagePeriod; - newConfig.AutoMessages = config.AutoMessages; - newConfig.GlobalRules = config.GlobalRules; - newConfig.Maps = config.Maps; - newConfig.Servers = ConfigurationGenerator.GenerateServerConfig(new List()); - config = newConfig; - await ConfigHandler.Save(); + // copy over default config if it doesn't exist + if (config == null) + { + var defaultConfig = new BaseConfigurationHandler("DefaultSettings").Configuration(); + ConfigHandler.Set((ApplicationConfiguration)new ApplicationConfiguration().Generate()); + var newConfig = ConfigHandler.Configuration(); + + newConfig.AutoMessagePeriod = defaultConfig.AutoMessagePeriod; + newConfig.AutoMessages = defaultConfig.AutoMessages; + newConfig.GlobalRules = defaultConfig.GlobalRules; + newConfig.Maps = defaultConfig.Maps; + + if (newConfig.Servers == null) + { + ConfigHandler.Set(newConfig); + newConfig.Servers = ConfigurationGenerator.GenerateServerConfig(new List()); + config = newConfig; + await ConfigHandler.Save(); + } } - else if(config != null) + else if (config != null) { if (string.IsNullOrEmpty(config.Id)) { config.Id = Guid.NewGuid().ToString(); await ConfigHandler.Save(); } + + if (string.IsNullOrEmpty(config.WebfrontBindUrl)) + { + config.WebfrontBindUrl = "http://127.0.0.1:1624"; + await ConfigHandler.Save(); + } } else if (config.Servers.Count == 0) diff --git a/IW4MAdmin.sln b/IW4MAdmin.sln index 429223e0..28473b10 100644 --- a/IW4MAdmin.sln +++ b/IW4MAdmin.sln @@ -36,6 +36,10 @@ Global Debug|Mixed Platforms = Debug|Mixed Platforms Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + Prerelease|Any CPU = Prerelease|Any CPU + Prerelease|Mixed Platforms = Prerelease|Mixed Platforms + Prerelease|x64 = Prerelease|x64 + Prerelease|x86 = Prerelease|x86 Release|Any CPU = Release|Any CPU Release|Mixed Platforms = Release|Mixed Platforms Release|x64 = Release|x64 @@ -50,6 +54,10 @@ Global {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|x64.Build.0 = Debug|Any CPU {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|x86.ActiveCfg = Debug|x86 {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|x86.Build.0 = Debug|x86 + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Prerelease|Any CPU.ActiveCfg = Release-Stable|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Prerelease|Mixed Platforms.ActiveCfg = Release-Stable|x86 + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Prerelease|x64.ActiveCfg = Release-Stable|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Prerelease|x86.ActiveCfg = Release-Stable|x86 {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|Any CPU.ActiveCfg = Release-Stable|Any CPU {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|Any CPU.Build.0 = Release-Stable|Any CPU {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|Mixed Platforms.ActiveCfg = Release-Stable|x86 @@ -66,6 +74,14 @@ Global {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Debug|x64.Build.0 = Debug|Any CPU {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Debug|x86.ActiveCfg = Debug|Any CPU {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Debug|x86.Build.0 = Debug|Any CPU + {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU + {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU + {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Prerelease|Mixed Platforms.ActiveCfg = Prerelease|Any CPU + {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Prerelease|Mixed Platforms.Build.0 = Prerelease|Any CPU + {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Prerelease|x64.ActiveCfg = Prerelease|Any CPU + {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Prerelease|x64.Build.0 = Prerelease|Any CPU + {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Prerelease|x86.ActiveCfg = Prerelease|Any CPU + {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Prerelease|x86.Build.0 = Prerelease|Any CPU {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Release|Any CPU.Build.0 = Release|Any CPU {AA0541A2-8D51-4AD9-B0AC-3D1F5B162481}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -82,6 +98,14 @@ Global {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Debug|x64.Build.0 = Debug|Any CPU {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Debug|x86.ActiveCfg = Debug|Any CPU {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Debug|x86.Build.0 = Debug|Any CPU + {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU + {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU + {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Prerelease|Mixed Platforms.ActiveCfg = Prerelease|Any CPU + {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Prerelease|Mixed Platforms.Build.0 = Prerelease|Any CPU + {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Prerelease|x64.ActiveCfg = Prerelease|Any CPU + {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Prerelease|x64.Build.0 = Prerelease|Any CPU + {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Prerelease|x86.ActiveCfg = Prerelease|Any CPU + {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Prerelease|x86.Build.0 = Prerelease|Any CPU {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Release|Any CPU.ActiveCfg = Release|Any CPU {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Release|Any CPU.Build.0 = Release|Any CPU {D59AC1F1-2FB9-4BE7-813E-0CCCC4FE9067}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -98,6 +122,14 @@ Global {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Debug|x64.Build.0 = Debug|Any CPU {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Debug|x86.ActiveCfg = Debug|Any CPU {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Debug|x86.Build.0 = Debug|Any CPU + {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU + {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU + {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Prerelease|Mixed Platforms.ActiveCfg = Prerelease|Any CPU + {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Prerelease|Mixed Platforms.Build.0 = Prerelease|Any CPU + {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Prerelease|x64.ActiveCfg = Prerelease|Any CPU + {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Prerelease|x64.Build.0 = Prerelease|Any CPU + {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Prerelease|x86.ActiveCfg = Prerelease|Any CPU + {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Prerelease|x86.Build.0 = Prerelease|Any CPU {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Release|Any CPU.ActiveCfg = Release|Any CPU {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Release|Any CPU.Build.0 = Release|Any CPU {B4626E78-BB22-43F8-A6AD-890B0853D61F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -114,6 +146,14 @@ Global {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Debug|x64.Build.0 = Debug|Any CPU {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Debug|x86.ActiveCfg = Debug|Any CPU {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Debug|x86.Build.0 = Debug|Any CPU + {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU + {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU + {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Prerelease|Mixed Platforms.ActiveCfg = Prerelease|Any CPU + {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Prerelease|Mixed Platforms.Build.0 = Prerelease|Any CPU + {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Prerelease|x64.ActiveCfg = Prerelease|Any CPU + {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Prerelease|x64.Build.0 = Prerelease|Any CPU + {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Prerelease|x86.ActiveCfg = Prerelease|Any CPU + {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Prerelease|x86.Build.0 = Prerelease|Any CPU {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Release|Any CPU.ActiveCfg = Release|Any CPU {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Release|Any CPU.Build.0 = Release|Any CPU {98BE4A81-8AFD-4957-83F7-009D353C6BCB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -130,6 +170,14 @@ Global {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Debug|x64.Build.0 = Debug|Any CPU {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Debug|x86.ActiveCfg = Debug|Any CPU {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Debug|x86.Build.0 = Debug|Any CPU + {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU + {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU + {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Prerelease|Mixed Platforms.ActiveCfg = Prerelease|Any CPU + {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Prerelease|Mixed Platforms.Build.0 = Prerelease|Any CPU + {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Prerelease|x64.ActiveCfg = Prerelease|Any CPU + {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Prerelease|x64.Build.0 = Prerelease|Any CPU + {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Prerelease|x86.ActiveCfg = Prerelease|Any CPU + {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Prerelease|x86.Build.0 = Prerelease|Any CPU {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Release|Any CPU.ActiveCfg = Release|Any CPU {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Release|Any CPU.Build.0 = Release|Any CPU {179140D3-97AA-4CB4-8BF6-A0C73CA75701}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -146,6 +194,14 @@ Global {958FF7EC-0226-4E85-A85B-B84EC768197D}.Debug|x64.Build.0 = Debug|Any CPU {958FF7EC-0226-4E85-A85B-B84EC768197D}.Debug|x86.ActiveCfg = Debug|Any CPU {958FF7EC-0226-4E85-A85B-B84EC768197D}.Debug|x86.Build.0 = Debug|Any CPU + {958FF7EC-0226-4E85-A85B-B84EC768197D}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU + {958FF7EC-0226-4E85-A85B-B84EC768197D}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU + {958FF7EC-0226-4E85-A85B-B84EC768197D}.Prerelease|Mixed Platforms.ActiveCfg = Prerelease|Any CPU + {958FF7EC-0226-4E85-A85B-B84EC768197D}.Prerelease|Mixed Platforms.Build.0 = Prerelease|Any CPU + {958FF7EC-0226-4E85-A85B-B84EC768197D}.Prerelease|x64.ActiveCfg = Prerelease|Any CPU + {958FF7EC-0226-4E85-A85B-B84EC768197D}.Prerelease|x64.Build.0 = Prerelease|Any CPU + {958FF7EC-0226-4E85-A85B-B84EC768197D}.Prerelease|x86.ActiveCfg = Prerelease|Any CPU + {958FF7EC-0226-4E85-A85B-B84EC768197D}.Prerelease|x86.Build.0 = Prerelease|Any CPU {958FF7EC-0226-4E85-A85B-B84EC768197D}.Release|Any CPU.ActiveCfg = Release|Any CPU {958FF7EC-0226-4E85-A85B-B84EC768197D}.Release|Any CPU.Build.0 = Release|Any CPU {958FF7EC-0226-4E85-A85B-B84EC768197D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -162,6 +218,14 @@ Global {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Debug|x64.Build.0 = Debug|Any CPU {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Debug|x86.ActiveCfg = Debug|Any CPU {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Debug|x86.Build.0 = Debug|Any CPU + {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU + {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU + {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Prerelease|Mixed Platforms.ActiveCfg = Prerelease|Any CPU + {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Prerelease|Mixed Platforms.Build.0 = Prerelease|Any CPU + {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Prerelease|x64.ActiveCfg = Prerelease|Any CPU + {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Prerelease|x64.Build.0 = Prerelease|Any CPU + {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Prerelease|x86.ActiveCfg = Prerelease|Any CPU + {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Prerelease|x86.Build.0 = Prerelease|Any CPU {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Release|Any CPU.ActiveCfg = Release|Any CPU {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Release|Any CPU.Build.0 = Release|Any CPU {D9F2ED28-6FA5-40CA-9912-E7A849147AB1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU @@ -178,6 +242,14 @@ Global {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Debug|x64.Build.0 = Debug|Any CPU {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Debug|x86.ActiveCfg = Debug|Any CPU {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Debug|x86.Build.0 = Debug|Any CPU + {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Prerelease|Any CPU.ActiveCfg = Prerelease|Any CPU + {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Prerelease|Any CPU.Build.0 = Prerelease|Any CPU + {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Prerelease|Mixed Platforms.ActiveCfg = Prerelease|Any CPU + {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Prerelease|Mixed Platforms.Build.0 = Prerelease|Any CPU + {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Prerelease|x64.ActiveCfg = Prerelease|Any CPU + {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Prerelease|x64.Build.0 = Prerelease|Any CPU + {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Prerelease|x86.ActiveCfg = Prerelease|Any CPU + {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Prerelease|x86.Build.0 = Prerelease|Any CPU {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Release|Any CPU.ActiveCfg = Release|Any CPU {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Release|Any CPU.Build.0 = Release|Any CPU {F5051A32-6BD0-4128-ABBA-C202EE15FC5C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU diff --git a/Master/Master.pyproj b/Master/Master.pyproj index f7b9a4ec..d7626837 100644 --- a/Master/Master.pyproj +++ b/Master/Master.pyproj @@ -27,6 +27,11 @@ true false + + true + false + bin\Prerelease\ + Code @@ -52,6 +57,9 @@ Code + + Code + Code @@ -76,6 +84,7 @@ + @@ -86,6 +95,7 @@ + diff --git a/Master/master/__init__.py b/Master/master/__init__.py index 444b9e37..ce4335bb 100644 --- a/Master/master/__init__.py +++ b/Master/master/__init__.py @@ -6,12 +6,15 @@ from flask import Flask from flask_restful import Resource, Api from flask_jwt_extended import JWTManager from master.context.base import Base +import json app = Flask(__name__) app.config['JWT_SECRET_KEY'] = 'my key!' +app.config['PROPAGATE_EXCEPTIONS'] = True jwt = JWTManager(app) api = Api(app) ctx = Base() +config = json.load(open('./master/config/master.json')) import master.routes import master.views diff --git a/Master/master/config/master.json b/Master/master/config/master.json new file mode 100644 index 00000000..53bc048d --- /dev/null +++ b/Master/master/config/master.json @@ -0,0 +1,4 @@ +{ + "current-version-stable": 2.0, + "current-version-prerelease": 2.0 +} \ No newline at end of file diff --git a/Master/master/context/base.py b/Master/master/context/base.py index c2d97375..6439c56a 100644 --- a/Master/master/context/base.py +++ b/Master/master/context/base.py @@ -23,7 +23,10 @@ class Base(): print('[_remove_staleinstances] removing stale instance {id}'.format(id=key)) del self.instance_list[key] del self.token_list[key] - print('[_remove_staleinstances] {count} active instances'.format(count=len(self.instance_list))) + print('[_remove_staleinstances] {count} active instances'.format(count=len(self.instance_list.items()))) + + def get_instances(self): + return self.instance_list.values() def get_server_count(self): return self.server_list.count diff --git a/Master/master/resources/authenticate.py b/Master/master/resources/authenticate.py index a0711332..78cff468 100644 --- a/Master/master/resources/authenticate.py +++ b/Master/master/resources/authenticate.py @@ -2,6 +2,7 @@ from flask_restful import Resource from flask import request, jsonify from flask_jwt_extended import create_access_token from master import app, ctx +import datetime class Authenticate(Resource): @@ -10,7 +11,7 @@ class Authenticate(Resource): if ctx.get_token(instance_id) is not False: return { 'message' : 'that id already has a token'}, 401 else: - token = create_access_token(instance_id) + expires = datetime.timedelta(days=1) + token = create_access_token(instance_id, expires_delta=expires) ctx.add_token(instance_id, token) return { 'access_token' : token }, 200 - \ No newline at end of file diff --git a/Master/master/resources/instance.py b/Master/master/resources/instance.py index cb1882d2..c84154a1 100644 --- a/Master/master/resources/instance.py +++ b/Master/master/resources/instance.py @@ -9,7 +9,7 @@ class Instance(Resource): def get(self, id=None): if id is None: schema = InstanceSchema(many=True) - instances = schema.dump(ctx.instance_list.values()) + instances = schema.dump(ctx.get_instances()) return instances else: try: @@ -25,13 +25,13 @@ class Instance(Resource): except ValidationError as err: return {'message' : err.messages }, 400 ctx.update_instance(instance) - return InstanceSchema().dump(instance) + return { 'message' : 'instance updated successfully' }, 200 @jwt_required def post(self): try: instance = InstanceSchema().load(request.json) except ValidationError as err: - return err.messages + return {'message' : err.messages }, 400 ctx.add_instance(instance) - return InstanceSchema().dump(instance) + return { 'message' : 'instance added successfully' }, 200 diff --git a/Master/master/resources/version.py b/Master/master/resources/version.py new file mode 100644 index 00000000..15d78ddd --- /dev/null +++ b/Master/master/resources/version.py @@ -0,0 +1,9 @@ +from flask_restful import Resource +from master import config + +class Version(Resource): + def get(self): + return { + 'current-version-stable' : config['current-version-stable'], + 'current-version-prerelease' : config['current-version-prerelease'] + }, 200 \ No newline at end of file diff --git a/Master/master/routes.py b/Master/master/routes.py index 2c551725..84285775 100644 --- a/Master/master/routes.py +++ b/Master/master/routes.py @@ -3,8 +3,9 @@ from master import api from master.resources.null import Null from master.resources.instance import Instance from master.resources.authenticate import Authenticate +from master.resources.version import Version api.add_resource(Null, '/null') api.add_resource(Instance, '/instance/', '/instance/') - +api.add_resource(Version, '/version') api.add_resource(Authenticate, '/authenticate') \ No newline at end of file diff --git a/Plugins/Login/Login.csproj b/Plugins/Login/Login.csproj index d42397a7..90f8afe2 100644 --- a/Plugins/Login/Login.csproj +++ b/Plugins/Login/Login.csproj @@ -9,6 +9,7 @@ RaidMax Forever None Login Plugin for IW4MAdmin + Debug;Release;Prerelease diff --git a/Plugins/ProfanityDeterment/ProfanityDeterment.csproj b/Plugins/ProfanityDeterment/ProfanityDeterment.csproj index faf94c81..20eb5f37 100644 --- a/Plugins/ProfanityDeterment/ProfanityDeterment.csproj +++ b/Plugins/ProfanityDeterment/ProfanityDeterment.csproj @@ -11,6 +11,7 @@ Profanity Determent for IW4MAdmin Warns and kicks players for using profanity 2018 + Debug;Release;Prerelease diff --git a/Plugins/Stats/Stats.csproj b/Plugins/Stats/Stats.csproj index 8162a3f0..07b08c70 100644 --- a/Plugins/Stats/Stats.csproj +++ b/Plugins/Stats/Stats.csproj @@ -11,6 +11,7 @@ Client Statistics Client Statistics Plugin for IW4MAdmin 2018 + Debug;Release;Prerelease diff --git a/Plugins/Welcome/Welcome.csproj b/Plugins/Welcome/Welcome.csproj index 690e8a34..e59d89cb 100644 --- a/Plugins/Welcome/Welcome.csproj +++ b/Plugins/Welcome/Welcome.csproj @@ -11,6 +11,7 @@ Welcome Plugin for IW4MAdmin Welcome plugin for IW4MAdmin welcomes clients to the server 2018 + Debug;Release;Prerelease diff --git a/SharedLibraryCore/Commands/NativeCommands.cs b/SharedLibraryCore/Commands/NativeCommands.cs index 9f611f6e..0bc343c1 100644 --- a/SharedLibraryCore/Commands/NativeCommands.cs +++ b/SharedLibraryCore/Commands/NativeCommands.cs @@ -314,7 +314,8 @@ namespace SharedLibraryCore.Commands bool found = false; foreach (Command C in E.Owner.Manager.GetCommands()) { - if (C.Name == cmd.ToLower()) + if (C.Name == cmd.ToLower() || + C.Alias == cmd.ToLower()) { await E.Origin.Tell("[^3" + C.Name + "^7] " + C.Description); await E.Origin.Tell(C.Syntax); diff --git a/SharedLibraryCore/Configuration/ApplicationConfiguration.cs b/SharedLibraryCore/Configuration/ApplicationConfiguration.cs index d132abee..75d9509f 100644 --- a/SharedLibraryCore/Configuration/ApplicationConfiguration.cs +++ b/SharedLibraryCore/Configuration/ApplicationConfiguration.cs @@ -16,6 +16,7 @@ namespace SharedLibraryCore.Configuration public string CustomSayName { get; set; } public string DiscordInviteCode { get; set; } public string IPHubAPIKey { get; set; } + public string WebfrontBindUrl { get; set; } public string Id { get; set; } public List Servers { get; set; } public int AutoMessagePeriod { get; set; } @@ -31,6 +32,8 @@ namespace SharedLibraryCore.Configuration EnableSteppedHierarchy = Utilities.PromptBool("Enable stepped privilege hierarchy"); EnableCustomSayName = Utilities.PromptBool("Enable custom say name"); + WebfrontBindUrl = "http://127.0.0.1:1624"; + if (EnableCustomSayName) CustomSayName = Utilities.PromptString("Enter custom say name"); diff --git a/SharedLibraryCore/Configuration/DefaultConfiguration.cs b/SharedLibraryCore/Configuration/DefaultConfiguration.cs new file mode 100644 index 00000000..0dfd3480 --- /dev/null +++ b/SharedLibraryCore/Configuration/DefaultConfiguration.cs @@ -0,0 +1,19 @@ +using SharedLibraryCore.Interfaces; +using System; +using System.Collections.Generic; +using System.Text; + +namespace SharedLibraryCore.Configuration +{ + public class DefaultConfiguration : IBaseConfiguration + { + public int AutoMessagePeriod { get; set; } + public List AutoMessages { get; set; } + public List GlobalRules { get; set; } + public List Maps { get; set; } + + public IBaseConfiguration Generate() => this; + + public string Name() => "DefaultConfiguration"; + } +} diff --git a/SharedLibraryCore/Database/DatabaseContext.cs b/SharedLibraryCore/Database/DatabaseContext.cs index 85e9dc78..c2dc28c0 100644 --- a/SharedLibraryCore/Database/DatabaseContext.cs +++ b/SharedLibraryCore/Database/DatabaseContext.cs @@ -93,7 +93,7 @@ namespace SharedLibraryCore.Database library = Assembly.LoadFrom(dllPath); } - // not a valid assembly, ie plugin files + // not a valid assembly, ie plugin support files catch (Exception) { continue; diff --git a/SharedLibraryCore/SharedLibraryCore.csproj b/SharedLibraryCore/SharedLibraryCore.csproj index 7b19e191..7afb3d95 100644 --- a/SharedLibraryCore/SharedLibraryCore.csproj +++ b/SharedLibraryCore/SharedLibraryCore.csproj @@ -9,6 +9,7 @@ 2.0.0 RaidMax Forever None + Debug;Release;Prerelease diff --git a/WebfrontCore/Program.cs b/WebfrontCore/Program.cs index 46d999ef..05f53739 100644 --- a/WebfrontCore/Program.cs +++ b/WebfrontCore/Program.cs @@ -17,15 +17,12 @@ namespace WebfrontCore public static void Init(IManager mgr) { Manager = mgr; - BuildWebHost().Run(); } public static IWebHost BuildWebHost() { - var config = new ConfigurationBuilder() - .AddJsonFile("WebfrontSettings.json", optional: false, reloadOnChange: false) .AddEnvironmentVariables() .Build(); @@ -35,7 +32,7 @@ namespace WebfrontCore #else .UseContentRoot(Directory.GetCurrentDirectory()) #endif - .UseUrls(config["Web:Address"]) + .UseUrls(Manager.GetApplicationSettings().Configuration().WebfrontBindUrl) .UseKestrel() .UseStartup() .Build(); diff --git a/WebfrontCore/Startup.cs b/WebfrontCore/Startup.cs index a3ef06d7..dcfa163a 100644 --- a/WebfrontCore/Startup.cs +++ b/WebfrontCore/Startup.cs @@ -20,7 +20,6 @@ namespace WebfrontCore { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) - .AddJsonFile("WebfrontSettings.json", optional: false, reloadOnChange: false) .AddEnvironmentVariables(); Configuration = builder.Build(); @@ -42,17 +41,16 @@ namespace WebfrontCore options.AccessDeniedPath = "/"; options.LoginPath = "/"; }); - } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { - loggerFactory.AddConsole(Configuration.GetSection("Logging")); - loggerFactory.AddDebug(); + //loggerFactory.AddConsole(Configuration.GetSection("Logging")); if (env.IsDevelopment()) { + loggerFactory.AddDebug(); app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } diff --git a/WebfrontCore/WebfrontCore.csproj b/WebfrontCore/WebfrontCore.csproj index 9083ed1a..e172f844 100644 --- a/WebfrontCore/WebfrontCore.csproj +++ b/WebfrontCore/WebfrontCore.csproj @@ -19,6 +19,7 @@ Exe + Debug;Release;Prerelease @@ -55,12 +56,6 @@ - - - PreserveNewest - - - - + diff --git a/WebfrontCore/WebfrontSettings.json b/WebfrontCore/WebfrontSettings.json deleted file mode 100644 index 407850b3..00000000 --- a/WebfrontCore/WebfrontSettings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Trace", - "System": "Information", - "Microsoft": "None" - } - }, - "Web": { - "Address": "http://127.0.0.1:5000" - } -} diff --git a/WebfrontCore/wwwroot/js/console.js b/WebfrontCore/wwwroot/js/console.js index f3acf4ca..416751d2 100644 --- a/WebfrontCore/wwwroot/js/console.js +++ b/WebfrontCore/wwwroot/js/console.js @@ -25,6 +25,11 @@ } $(document).ready(function () { + + if ($('#console_command_button').length === 0) { + return false; + } + $('#console_command_button').click(function (e) { executeCommand(); }); diff --git a/WebfrontCore/wwwroot/js/penalty.js b/WebfrontCore/wwwroot/js/penalty.js index 064beeca..bfd4d059 100644 --- a/WebfrontCore/wwwroot/js/penalty.js +++ b/WebfrontCore/wwwroot/js/penalty.js @@ -49,7 +49,7 @@ if ($('#penalty_table').length === 1) { .off('scroll', ScrollHandler) .on('scroll', ScrollHandler); - $('#load_penalties_button').hover(function () { + $('#load_penalties_button').click(function () { loadMorePenalties(); }); }); diff --git a/WebfrontCore/wwwroot/js/profile.js b/WebfrontCore/wwwroot/js/profile.js index bd4cb6fc..310912f7 100644 --- a/WebfrontCore/wwwroot/js/profile.js +++ b/WebfrontCore/wwwroot/js/profile.js @@ -168,7 +168,7 @@ function loadMeta(meta) { // it's a penalty if (meta.class.includes("Penalty")) { if (meta.value.punisherId !== clientInfo.clientId) { - const timeRemaining = meta.value.type == 'TempBan' && meta.value.timeRemaining.length > 0 ? + const timeRemaining = meta.value.type === 'TempBan' && meta.value.timeRemaining.length > 0 ? `(${meta.value.timeRemaining} remaining)` : ''; eventString = `
${penaltyToName(meta.value.type)} by ${meta.value.punisherName} for ${meta.value.offense} ${timeRemaining}
`;