From 5ff5809260c75de2ca7134390d8d57904d387c82 Mon Sep 17 00:00:00 2001 From: BigETI Date: Sat, 15 Dec 2018 21:53:51 +0100 Subject: [PATCH] Improvements in how servers are shown. --- .vs/SAMPLauncherNET/v15/.suo | Bin 331776 -> 312832 bytes SAMPLauncherNET/Properties/AssemblyInfo.cs | 4 +-- SAMPLauncherNET/SAMPLauncherNET.csproj | 4 +-- .../SAMPLauncherNET/Core/FavouriteServer.cs | 2 -- ...MPAPIServer.cs => SAMPServersAPIServer.cs} | 10 +++--- ...cs => SAMPServersAPIServerDataContract.cs} | 4 +-- .../Core/SAMPVersionDataContract.cs | 24 ------------- .../Source/SAMPLauncherNET/Core/Server.cs | 22 +++--------- .../Core/ServerListConnector.cs | 9 ++--- .../SAMPLauncherNET/Core/ServerListEntry.cs | 33 ++++++++++++++++++ .../SAMPLauncherNET/UI/Forms/MainForm.cs | 19 ++++++++-- .../DesignTimeResolveAssemblyReferences.cache | Bin 84897 -> 84695 bytes 12 files changed, 70 insertions(+), 61 deletions(-) rename SAMPLauncherNET/Source/SAMPLauncherNET/Core/{SAMPAPIServer.cs => SAMPServersAPIServer.cs} (67%) rename SAMPLauncherNET/Source/SAMPLauncherNET/Core/{SAMPAPIServerDataContract.cs => SAMPServersAPIServerDataContract.cs} (97%) diff --git a/.vs/SAMPLauncherNET/v15/.suo b/.vs/SAMPLauncherNET/v15/.suo index a39a7cba5ed35d359d7f67177083a721d932e4e7..01cef5d10c4143af3091db732ee59197dc7ebd65 100644 GIT binary patch delta 8933 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 beZ@QLvHAGXdSB(r%$rO`$=DG9SyM2CV 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 diff --git a/SAMPLauncherNET/Properties/AssemblyInfo.cs b/SAMPLauncherNET/Properties/AssemblyInfo.cs index 83f898c..89104ed 100644 --- a/SAMPLauncherNET/Properties/AssemblyInfo.cs +++ b/SAMPLauncherNET/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.6.5")] -[assembly: AssemblyFileVersion("1.0.6.5")] +[assembly: AssemblyVersion("1.0.6.6")] +[assembly: AssemblyFileVersion("1.0.6.6")] diff --git a/SAMPLauncherNET/SAMPLauncherNET.csproj b/SAMPLauncherNET/SAMPLauncherNET.csproj index f69dcff..de007f8 100644 --- a/SAMPLauncherNET/SAMPLauncherNET.csproj +++ b/SAMPLauncherNET/SAMPLauncherNET.csproj @@ -142,8 +142,8 @@ - - + + diff --git a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/FavouriteServer.cs b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/FavouriteServer.cs index e2a8411..7688f76 100644 --- a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/FavouriteServer.cs +++ b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/FavouriteServer.cs @@ -50,7 +50,6 @@ public string RCONPassword /// RCON password public FavouriteServer(string ipAddressAndPortString, string cachedHostname, string cachedGamemode, string serverPassword, string rconPassword) : base(ipAddressAndPortString, false) { - //requestsRequired[ERequestType.Information] = false; if (cachedHostname != null) { if (cachedHostname.Trim().Length > 0) @@ -71,7 +70,6 @@ public FavouriteServer(string ipAddressAndPortString, string cachedHostname, str /// Favorite data contract public FavouriteServer(FavouriteDataContract fdc) : base(fdc.Host, false) { - //requestsRequired[ERequestType.Information] = false; if (fdc.Hostname.Trim().Length > 0) { hostname = fdc.Hostname; diff --git a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPAPIServer.cs b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPServersAPIServer.cs similarity index 67% rename from SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPAPIServer.cs rename to SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPServersAPIServer.cs index 7721b2c..5d89e4d 100644 --- a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPAPIServer.cs +++ b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPServersAPIServer.cs @@ -4,17 +4,16 @@ namespace SAMPLauncherNET { /// - /// Backend restful API server class + /// SA:MP servers API server class /// - public class SAMPAPIServer : Server + public class SAMPServersAPIServer : Server { /// /// Constructor /// /// Server data - public SAMPAPIServer(SAMPAPIServerDataContract serverData) : base(serverData.Host, false) + public SAMPServersAPIServer(SAMPServersAPIServerDataContract serverData) : base(serverData.Host, false) { - requestsRequired.Lock(ERequestResponseType.Information); if (serverData.Hostname.Trim().Length > 0) { hostname = serverData.Hostname; @@ -24,7 +23,8 @@ public SAMPAPIServer(SAMPAPIServerDataContract serverData) : base(serverData.Hos maxPlayers = serverData.MaxPlayers; hasPassword = serverData.HasPassword; language = serverData.Language; - //FetchDataAsync(ERequestType.Ping); + FetchDataAsync(ERequestResponseType.Ping); + FetchDataAsync(ERequestResponseType.Information); } } } diff --git a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPAPIServerDataContract.cs b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPServersAPIServerDataContract.cs similarity index 97% rename from SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPAPIServerDataContract.cs rename to SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPServersAPIServerDataContract.cs index 93ffb27..70da62b 100644 --- a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPAPIServerDataContract.cs +++ b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPServersAPIServerDataContract.cs @@ -6,10 +6,10 @@ namespace SAMPLauncherNET { /// - /// SA:MP API server data contract class + /// SA:MP servers API server data contract class /// [DataContract] - public class SAMPAPIServerDataContract + public class SAMPServersAPIServerDataContract { /// /// Host diff --git a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPVersionDataContract.cs b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPVersionDataContract.cs index 8083e54..b5cca43 100644 --- a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPVersionDataContract.cs +++ b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/SAMPVersionDataContract.cs @@ -201,30 +201,6 @@ public int CompareTo(SAMPVersionDataContract other) if (ret == 0) { ret = string.Compare(other.name, name, StringComparison.InvariantCulture); - /*if (ret == 0) - { - ret = string.Compare(other.internetTabURI, internetTabURI, StringComparison.InvariantCulture); - if (ret == 0) - { - ret = string.Compare(other.hostedTabURI, hostedTabURI, StringComparison.InvariantCulture); - if (ret == 0) - { - ret = string.Compare(other.userAgent, userAgent, StringComparison.InvariantCulture); - if (ret == 0) - { - ret = string.Compare(other.zipURI, zipURI, StringComparison.InvariantCulture); - if (ret == 0) - { - ret = string.Compare(other.installationURI, installationURI, StringComparison.InvariantCulture); - if (ret == 0) - { - ret = string.Compare(other.sampDLLSHA512, sampDLLSHA512, StringComparison.InvariantCulture); - } - } - } - } - } - }*/ } } return ret; diff --git a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/Server.cs b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/Server.cs index ec397bf..7856c86 100644 --- a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/Server.cs +++ b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/Server.cs @@ -632,33 +632,21 @@ private void SendQueryAsync(ERequestResponseType requestType) threads[index].Start(); } - /// - /// Send query when required - /// - /// Request type - /// Success - private bool SendQueryWhenRequired(ERequestResponseType requestType) - { - bool ret = true; - if (requestsRequired[requestType]) - { - ret = SendQuery(requestType); - } - return ret; - } - /// /// Send query when expired /// /// Request type /// Milliseconds - public void SendQueryWhenExpired(ERequestResponseType requestType, uint milliseconds) + /// "true" if attempted sending query, othewrwise "false" + public bool SendQueryWhenExpiredAsync(ERequestResponseType requestType, uint milliseconds) { uint t = (uint)(DateTime.Now.Subtract(requestsRequired.GetLastRequestTime(requestType)).TotalMilliseconds); - if (t >= milliseconds) + bool ret = (t >= milliseconds); + if (ret) { SendQueryAsync(requestType); } + return ret; } /// diff --git a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/ServerListConnector.cs b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/ServerListConnector.cs index 0929a42..5e62ceb 100644 --- a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/ServerListConnector.cs +++ b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/ServerListConnector.cs @@ -19,7 +19,7 @@ public class ServerListConnector : ITranslatable /// /// Server list JSON serializer /// - private static DataContractJsonSerializer serverListJSONSerializer = new DataContractJsonSerializer(typeof(SAMPAPIServerDataContract[])); + private static DataContractJsonSerializer serverListJSONSerializer = new DataContractJsonSerializer(typeof(SAMPServersAPIServerDataContract[])); /// /// Favourites list JSON serializer @@ -199,14 +199,15 @@ public Dictionary ServerListIO wc.Headers.Set(HttpRequestHeader.ContentType, APIHTTPContentType); wc.Headers.Set(HttpRequestHeader.Accept, APIHTTPAccept); wc.Headers.Set(HttpRequestHeader.UserAgent, /* User agent of Firefox */ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" /*SAMPProvider.UserAgent*/); + //wc.Headers.Set(HttpRequestHeader.UserAgent, SAMPProvider.UserAgent); using (MemoryStream stream = new MemoryStream(wc.DownloadData(Endpoint))) { - SAMPAPIServerDataContract[] servers = serverListJSONSerializer.ReadObject(stream) as SAMPAPIServerDataContract[]; + SAMPServersAPIServerDataContract[] servers = serverListJSONSerializer.ReadObject(stream) as SAMPServersAPIServerDataContract[]; if (servers != null) { - foreach (SAMPAPIServerDataContract sdc in servers) + foreach (SAMPServersAPIServerDataContract sdc in servers) { - SAMPAPIServer server = new SAMPAPIServer(sdc); + SAMPServersAPIServer server = new SAMPServersAPIServer(sdc); if (server.IsValid) { if (!(ret.ContainsKey(server.IPPortString))) diff --git a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/ServerListEntry.cs b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/ServerListEntry.cs index 44beb96..f66c6da 100644 --- a/SAMPLauncherNET/Source/SAMPLauncherNET/Core/ServerListEntry.cs +++ b/SAMPLauncherNET/Source/SAMPLauncherNET/Core/ServerListEntry.cs @@ -20,6 +20,11 @@ public class ServerListEntry : IComparable, IComparable, IDispo /// private readonly int serverListIndex; + /// + /// Tries + /// + private uint tries; + /// /// Server /// @@ -30,6 +35,11 @@ public class ServerListEntry : IComparable, IComparable, IDispo /// public int ServerListIndex { get => serverListIndex; } + /// + /// Tries + /// + public uint Tries { get => tries; } + /// /// Constructor /// @@ -41,6 +51,29 @@ public ServerListEntry(Server server, int serverListIndex) this.serverListIndex = serverListIndex; } + /// + /// Try send query + /// + public void TrySendQuery() + { + if (server != null) + { + bool tried = false; + if (server.SendQueryWhenExpiredAsync(ERequestResponseType.Ping, 5000U)) + { + tried = true; + } + if (server.SendQueryWhenExpiredAsync(ERequestResponseType.Information, 5000U)) + { + tried = true; + } + if (tried) + { + ++tries; + } + } + } + /// /// Compare to /// diff --git a/SAMPLauncherNET/Source/SAMPLauncherNET/UI/Forms/MainForm.cs b/SAMPLauncherNET/Source/SAMPLauncherNET/UI/Forms/MainForm.cs index 6644070..8396b5a 100644 --- a/SAMPLauncherNET/Source/SAMPLauncherNET/UI/Forms/MainForm.cs +++ b/SAMPLauncherNET/Source/SAMPLauncherNET/UI/Forms/MainForm.cs @@ -260,11 +260,12 @@ public MainForm() while (keepRunning) { List server_list_entries = new List(); + List remove_server_list_entries = new List(); lock (loadServers) { foreach (ServerListEntry server_list_entry in loadServers) { - if ((server_list_entry.Server is FavouriteServer) || (server_list_entry.Server is SAMPAPIServer)) + if (server_list_entry.Server is FavouriteServer) { server_list_entries.Add(server_list_entry); } @@ -276,8 +277,14 @@ public MainForm() } else { - server_list_entry.Server.SendQueryWhenExpired(ERequestResponseType.Ping, 5000U); - server_list_entry.Server.SendQueryWhenExpired(ERequestResponseType.Information, 5000U); + if (server_list_entry.Tries > 2U) + { + remove_server_list_entries.Add(server_list_entry); + } + else + { + server_list_entry.TrySendQuery(); + } } } } @@ -285,12 +292,18 @@ public MainForm() { loadServers.Remove(server_list_entry); } + foreach (ServerListEntry server_list_entry in remove_server_list_entries) + { + loadServers.Remove(server_list_entry); + server_list_entry.Dispose(); + } } lock (loadedServers) { loadedServers.AddRange(server_list_entries); } server_list_entries.Clear(); + remove_server_list_entries.Clear(); Thread.Sleep(50); } }); diff --git a/SAMPLauncherNET/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/SAMPLauncherNET/obj/Debug/DesignTimeResolveAssemblyReferences.cache index a43c6ada0295c64a097ff1af15a7aa01e0711243..5767ddf5429c7c9a631f329a0b33d430d5c540af 100644 GIT binary patch literal 84695 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