RAGECOOP-V/Client/Menus/Sub/Servers.cs
Makinolo ee79fe5cc2 Allows sending messages only to a group of users
In some circumstances (like proximity, missions...) we may want
to target messages to only a sub set of all the users connected
to the server. Adding this optional parameter to SendModPacketToAll
and SendChatMessageToAll allows that while being backwards
compatible with the API
Fixes some problems introduced in the non interactive mode
Changes the SetLocalTraffic parameter to make it more readable
so now SetLocalTraffic(true) means to ENABLE local traffic while
SetLocalTraffic(false) means DISABLE local traffic
2021-12-15 11:09:56 -07:00

125 lines
4.2 KiB
C#

using System;
using System.Net;
using System.Collections.Generic;
using Newtonsoft.Json;
using LemonUI.Menus;
namespace CoopClient.Menus.Sub
{
internal class ServerListClass
{
[JsonProperty("address")]
public string Address { get; set; }
[JsonProperty("port")]
public string Port { 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; }
}
/// <summary>
/// Don't use it!
/// </summary>
public class Servers
{
internal NativeMenu MainMenu = new NativeMenu("GTACOOP:R", "Servers", "Go to the server list")
{
UseMouse = false,
Alignment = Main.MainSettings.FlipMenu ? GTA.UI.Alignment.Right : GTA.UI.Alignment.Left
};
internal NativeItem ResultItem = null;
/// <summary>
/// Don't use it!
/// </summary>
public Servers()
{
MainMenu.Opening += (object sender, System.ComponentModel.CancelEventArgs e) =>
{
MainMenu.Add(ResultItem = new NativeItem("Loading..."));
GetAllServer();
};
MainMenu.Closed += (object sender, EventArgs e) =>
{
for (int i = 0; i < MainMenu.Items.Count; i++)
{
MainMenu.Remove(MainMenu.Items[i]);
}
};
}
private void GetAllServer()
{
List<ServerListClass> serverList = null;
try
{
// SSL/TLS
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls13 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
WebClient client = new WebClient();
string data = client.DownloadString(Main.MainSettings.MasterServer);
serverList = JsonConvert.DeserializeObject<List<ServerListClass>>(data);
}
catch (Exception ex)
{
ResultItem.Title = "Download failed!";
ResultItem.Description = ex.Message; // You have to use any key to see this message
}
if (serverList == null)
{
return;
}
if (ResultItem != null)
{
MainMenu.Remove(MainMenu.Items[0]);
ResultItem = null;
}
foreach (ServerListClass server in serverList)
{
string address = $"{server.Address}:{server.Port}";
NativeItem tmpItem = null;
MainMenu.Add(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) =>
{
try
{
MainMenu.Visible = false;
Main.MainNetworking.DisConnectFromServer(address);
#if !NON_INTERACTIVE
Main.MainMenu.ServerIpItem.AltTitle = address;
Main.MainMenu.MainMenu.Visible = true;
#endif
Main.MainSettings.LastServerAddress = address;
Util.SaveSettings();
}
catch (Exception ex)
{
GTA.UI.Notification.Show($"~r~{ex.Message}");
}
};
}
}
}
}