diff --git a/Client/COOPAPI.cs b/Client/COOPAPI.cs index f0b8ea1..ce0c57a 100644 --- a/Client/COOPAPI.cs +++ b/Client/COOPAPI.cs @@ -91,7 +91,7 @@ namespace RageCoop.Client /// The server address to connect. Example: 127.0.0.1:4499 public static void Connect(string serverAddress) { - Networking.DisconnectFromServer(serverAddress); + Networking.ToggleConnection(serverAddress); } /// @@ -99,7 +99,7 @@ namespace RageCoop.Client /// public static void Disconnect() { - Networking.DisconnectFromServer(null); + Networking.ToggleConnection(null); } /// diff --git a/Client/Menus/CoopMenu.cs b/Client/Menus/CoopMenu.cs index 5821f5a..4133cae 100644 --- a/Client/Menus/CoopMenu.cs +++ b/Client/Menus/CoopMenu.cs @@ -41,9 +41,11 @@ namespace RageCoop.Client.Menus _usernameItem.Activated += UsernameActivated; ServerIpItem.Activated += ServerIpActivated; - _serverConnectItem.Activated += (sender, item) => { Networking.DisconnectFromServer(Main.Settings.LastServerAddress); }; + _serverConnectItem.Activated += (sender, item) => { Networking.ToggleConnection(Main.Settings.LastServerAddress); }; + Menu.AddSubMenu(ServersMenu.Menu); + Menu.Add(_usernameItem); Menu.Add(ServerIpItem); Menu.Add(_serverConnectItem); @@ -58,6 +60,7 @@ namespace RageCoop.Client.Menus MenuPool.Add(DevToolMenu.Menu); MenuPool.Add(DebugMenu.Menu); MenuPool.Add(DebugMenu.DiagnosticMenu); + MenuPool.Add(ServersMenu.Menu); Menu.Add(_aboutItem); } diff --git a/Client/Menus/Sub/ServersMenu.cs b/Client/Menus/Sub/ServersMenu.cs index 84746bc..08a691f 100644 --- a/Client/Menus/Sub/ServersMenu.cs +++ b/Client/Menus/Sub/ServersMenu.cs @@ -4,71 +4,72 @@ using System.Drawing; using System.Collections.Generic; using Newtonsoft.Json; using LemonUI.Menus; +using System.Threading; namespace RageCoop.Client.Menus { internal class ServerListClass { - [JsonProperty("address")] - public string Address { get; set; } - [JsonProperty("port")] - public string Port { get; set; } + [JsonProperty("ip")] + public string IP { get; set; } + [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("version")] public string Version { get; set; } + [JsonProperty("players")] public int Players { get; set; } + [JsonProperty("maxPlayers")] public int MaxPlayers { get; set; } - [JsonProperty("allowlist")] - public bool AllowList { get; set; } - [JsonProperty("mods")] - public bool Mods { get; set; } - [JsonProperty("npcs")] - public bool NPCs { get; set; } - [JsonProperty("country")] - public string Country { get; set; } } /// /// Don't use it! /// - internal class Servers + internal static class ServersMenu { - internal NativeMenu MainMenu = new NativeMenu("RAGECOOP", "Servers", "Go to the server list") + private static Thread GetServersThread; + internal static NativeMenu Menu = new NativeMenu("RAGECOOP", "Servers", "Go to the server list") { UseMouse = false, Alignment = Main.Settings.FlipMenu ? GTA.UI.Alignment.Right : GTA.UI.Alignment.Left }; - internal NativeItem ResultItem = null; + internal static NativeItem ResultItem = null; /// /// Don't use it! /// - public Servers() + static ServersMenu() { - MainMenu.Banner.Color = Color.FromArgb(225, 0, 0, 0); - MainMenu.Title.Color = Color.FromArgb(255, 165, 0); + Menu.Banner.Color = Color.FromArgb(225, 0, 0, 0); + Menu.Title.Color = Color.FromArgb(255, 165, 0); - MainMenu.Opening += (object sender, System.ComponentModel.CancelEventArgs e) => + Menu.Opening += (object sender, System.ComponentModel.CancelEventArgs e) => { - MainMenu.Add(ResultItem = new NativeItem("Loading...")); - GetAllServer(); + CleanUpList(); + Menu.Add(ResultItem = new NativeItem("Loading...")); + + // Prevent freezing + if (GetServersThread!=null && GetServersThread.IsAlive) { GetServersThread?.Abort(); } + GetServersThread=new Thread(()=> GetAllServers()); + GetServersThread.Start(); }; - MainMenu.Closing += (object sender, System.ComponentModel.CancelEventArgs e) => + Menu.Closing += (object sender, System.ComponentModel.CancelEventArgs e) => { CleanUpList(); }; } - private void CleanUpList() + private static void CleanUpList() { - MainMenu.Clear(); + Menu.Clear(); ResultItem = null; } - private void GetAllServer() + private static void GetAllServers() { List serverList = null; try @@ -100,34 +101,39 @@ namespace RageCoop.Client.Menus return; } - CleanUpList(); - foreach (ServerListClass server in serverList) + // Need to be processed in main thread + Main.QueueAction(() => { - string address = $"{server.Address}:{server.Port}"; - NativeItem tmpItem = new NativeItem($"[{server.Country}] {server.Name}", $"~b~{address}~s~~n~~g~Version {server.Version}.x~s~~n~Mods = {server.Mods}~n~NPCs = {server.NPCs}") { AltTitle = $"[{server.Players}/{server.MaxPlayers}][{(server.AllowList ? "~r~X~s~" : "~g~O~s~")}]" }; - tmpItem.Activated += (object sender, EventArgs e) => + + CleanUpList(); + foreach (ServerListClass server in serverList) { - try + string address = server.IP; + NativeItem tmpItem = new NativeItem($"{server.Name}", $"~b~{address}~s~~n~~g~Version {server.Version}.x~s~") { AltTitle = $"[{server.Players}/{server.MaxPlayers}]" }; + tmpItem.Activated += (object sender, EventArgs e) => { - MainMenu.Visible = false; + try + { + Menu.Visible = false; - Networking.DisconnectFromServer(address); + Networking.ToggleConnection(address); #if !NON_INTERACTIVE - CoopMenu.ServerIpItem.AltTitle = address; + CoopMenu.ServerIpItem.AltTitle = address; - CoopMenu.Menu.Visible = true; + CoopMenu.Menu.Visible = true; #endif - Main.Settings.LastServerAddress = address; - Util.SaveSettings(); - } - catch (Exception ex) - { - GTA.UI.Notification.Show($"~r~{ex.Message}"); - } - }; - MainMenu.Add(tmpItem); - } + Main.Settings.LastServerAddress = address; + Util.SaveSettings(); + } + catch (Exception ex) + { + GTA.UI.Notification.Show($"~r~{ex.Message}"); + } + }; + Menu.Add(tmpItem); + } + }); } } } \ No newline at end of file diff --git a/Client/Networking/Networking.cs b/Client/Networking/Networking.cs index 6343a75..f6ac8a7 100644 --- a/Client/Networking/Networking.cs +++ b/Client/Networking/Networking.cs @@ -20,7 +20,7 @@ namespace RageCoop.Client public static int BytesSend = 0; private static Thread ReceiveThread; - public static void DisconnectFromServer(string address) + public static void ToggleConnection(string address) { if (IsOnServer) { diff --git a/Client/Settings.cs b/Client/Settings.cs index fadd534..12c8030 100644 --- a/Client/Settings.cs +++ b/Client/Settings.cs @@ -18,7 +18,7 @@ namespace RageCoop.Client /// /// Don't use it! /// - public string MasterServer { get; set; } = "https://ragecoop.online/gtav/servers"; + public string MasterServer { get; set; } = "https://ragecoop.000webhostapp.com/master.php"; /// /// Don't use it! /// diff --git a/Server/Allowlist.cs b/Server/Allowlist.cs index e3ef508..56e9caa 100644 --- a/Server/Allowlist.cs +++ b/Server/Allowlist.cs @@ -1,9 +1 @@ using System.Collections.Generic; - -namespace RageCoop.Server -{ - public class Allowlist - { - public List Username { get; set; } = new(); - } -} diff --git a/Server/Server.cs b/Server/Server.cs index 93040f3..f4885e7 100644 --- a/Server/Server.cs +++ b/Server/Server.cs @@ -27,8 +27,6 @@ namespace RageCoop.Server public static readonly Settings MainSettings = Util.Read("Settings.xml"); private readonly Blocklist _mainBlocklist = Util.Read("Blocklist.xml"); - private readonly Allowlist _mainAllowlist = Util.Read("Allowlist.xml"); - public static NetServer MainNetServer; public static Resource RunningResource = null; @@ -104,6 +102,7 @@ namespace RageCoop.Server string content = await response.Content.ReadAsStringAsync(); info = JsonConvert.DeserializeObject(content); + Program.Logger.Info($"Your public IP is {info.Address}"); } catch (Exception ex) { @@ -120,10 +119,8 @@ namespace RageCoop.Server "\"name\": \"" + MainSettings.Name + "\", " + "\"version\": \"" + _compatibleVersion.Replace("_", ".") + "\", " + "\"players\": \"" + MainNetServer.ConnectionsCount + "\", " + - "\"maxPlayers\": \"" + MainSettings.MaxPlayers + "\", " + - "\"allowlist\": \"" + _mainAllowlist.Username.Any() + "\", " + + "\"maxPlayers\": \"" + MainSettings.MaxPlayers + "\"" + " }"; - HttpResponseMessage response = null; try { @@ -152,6 +149,7 @@ namespace RageCoop.Server else { Program.Logger.Error($"MasterServer: [{(int)response.StatusCode}]"); + Program.Logger.Error($"MasterServer: [{await response.Content.ReadAsStringAsync()}]"); } } @@ -644,11 +642,6 @@ namespace RageCoop.Server local.Deny("Username contains special chars!"); return; } - if (_mainAllowlist.Username.Any() && !_mainAllowlist.Username.Contains(packet.Username.ToLower())) - { - local.Deny("This Username is not on the allow list!"); - return; - } if (_mainBlocklist.Username.Contains(packet.Username.ToLower())) { local.Deny("This Username has been blocked by this server!"); diff --git a/Server/Settings.cs b/Server/Settings.cs index a922e65..1a22740 100644 --- a/Server/Settings.cs +++ b/Server/Settings.cs @@ -10,7 +10,7 @@ public string Resource { get; set; } = ""; public bool UPnP { get; set; } = true; public bool AnnounceSelf { get; set; } = false; - public string MasterServer { get; set; } = "https://ragecoop.online/gtav/servers"; + public string MasterServer { get; set; } = "https://ragecoop.000webhostapp.com/master.php"; public bool DebugMode { get; set; } = false; /// /// NPC data won't be sent to a player if their distance is greater than this value. -1 for unlimited.