Files
RAGECOOP-V/Server/Networking/Server.Background.cs

199 lines
7.4 KiB
C#
Raw Normal View History

2022-10-23 19:02:39 +08:00
using System;
2022-09-08 12:41:56 -07:00
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.InteropServices;
2022-09-08 12:41:56 -07:00
using System.Text;
using System.Threading;
2022-10-23 19:02:39 +08:00
using ICSharpCode.SharpZipLib.Zip;
using Lidgren.Network;
using Newtonsoft.Json;
using RageCoop.Core;
namespace RageCoop.Server;
2022-10-23 19:02:39 +08:00
public partial class Server
{
2022-10-23 19:02:39 +08:00
private bool CanAnnounce;
private IpInfo IpInfo;
private void SendPlayerUpdate()
{
2022-10-23 19:02:39 +08:00
foreach (var c in ClientsByNetHandle.Values.ToArray())
try
{
2022-10-23 19:02:39 +08:00
var outgoingMessage = MainNetServer.CreateMessage();
new Packets.PlayerInfoUpdate
{
2022-10-23 19:02:39 +08:00
PedID = c.Player.ID,
Username = c.Username,
Latency = c.Latency,
Position = c.Player.Position,
IsHost = c == _hostClient
}.Pack(outgoingMessage);
MainNetServer.SendToAll(outgoingMessage, NetDeliveryMethod.ReliableSequenced,
(byte)ConnectionChannel.Default);
}
2022-10-23 19:02:39 +08:00
catch (Exception ex)
{
2022-10-23 19:02:39 +08:00
Logger?.Error(ex);
}
}
2022-10-23 19:02:39 +08:00
private void Announce()
{
HttpResponseMessage response = null;
HttpClient httpClient = new();
if (IpInfo == null)
try
{
// TLS only
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13 |
SecurityProtocolType.Tls12 |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
try
{
2022-10-23 19:02:39 +08:00
IpInfo = CoreUtils.GetIPInfo();
Logger?.Info($"Your public IP is {IpInfo.Address}, announcing to master server...");
}
catch (Exception ex)
{
2022-10-23 19:02:39 +08:00
Logger?.Error(ex.InnerException?.Message ?? ex.Message);
return;
}
}
2022-10-23 19:02:39 +08:00
catch (HttpRequestException ex)
{
2022-10-23 19:02:39 +08:00
Logger?.Error($"MasterServer: {ex.InnerException.Message}");
}
catch (Exception ex)
{
Logger?.Error($"MasterServer: {ex.Message}");
}
2022-10-23 19:02:39 +08:00
if (!CanAnnounce)
{
var existing = JsonConvert
.DeserializeObject<List<ServerInfo>>(
HttpHelper.DownloadString(Util.GetFinalRedirect(Settings.MasterServer)))
.Where(x => x.address == IpInfo.Address).FirstOrDefault();
if (existing != null)
{
2022-10-23 19:02:39 +08:00
Logger.Warning("Server info already present in master server, waiting for 10 seconds...");
return;
}
2022-10-23 19:02:39 +08:00
CanAnnounce = true;
}
2022-10-23 19:02:39 +08:00
try
{
2022-10-23 19:02:39 +08:00
Security.GetPublicKey(out var pModulus, out var pExpoenet);
var serverInfo = new ServerInfo
{
2022-10-23 19:02:39 +08:00
address = IpInfo.Address,
port = Settings.Port.ToString(),
country = IpInfo.Country,
name = Settings.Name,
version = Version.ToString(),
players = MainNetServer.ConnectionsCount.ToString(),
maxPlayers = Settings.MaxPlayers.ToString(),
description = Settings.Description,
website = Settings.Website,
gameMode = Settings.GameMode,
language = Settings.Language,
useP2P = Settings.UseP2P,
useZT = Settings.UseZeroTier,
ztID = Settings.UseZeroTier ? Settings.ZeroTierNetworkID : "",
ztAddress = Settings.UseZeroTier
? ZeroTierHelper.Networks[Settings.ZeroTierNetworkID].Addresses.Where(x => !x.Contains(":")).First()
: "0.0.0.0",
publicKeyModulus = Convert.ToBase64String(pModulus),
publicKeyExponent = Convert.ToBase64String(pExpoenet)
};
var msg = JsonConvert.SerializeObject(serverInfo);
2022-09-08 12:41:56 -07:00
2022-10-23 19:02:39 +08:00
var realUrl = Util.GetFinalRedirect(Settings.MasterServer);
response = httpClient.PostAsync(realUrl, new StringContent(msg, Encoding.UTF8, "application/json"))
.GetAwaiter().GetResult();
}
catch (Exception ex)
{
Logger?.Error($"MasterServer: {ex.Message}");
return;
}
2022-09-08 12:41:56 -07:00
2022-10-23 19:02:39 +08:00
if (response == null)
{
Logger?.Error("MasterServer: Something went wrong!");
}
else if (response.StatusCode != HttpStatusCode.OK)
{
if (response.StatusCode == HttpStatusCode.BadRequest)
{
var requestContent = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
Logger?.Error($"MasterServer: [{(int)response.StatusCode}], {requestContent}");
}
2022-10-23 19:02:39 +08:00
else
{
2022-10-23 19:02:39 +08:00
Logger?.Error($"MasterServer: [{(int)response.StatusCode}]");
Logger?.Error($"MasterServer: [{response.Content.ReadAsStringAsync().GetAwaiter().GetResult()}]");
}
}
2022-10-23 19:02:39 +08:00
}
2022-09-05 13:02:09 +02:00
2022-10-23 19:02:39 +08:00
private void CheckUpdate()
{
try
2022-08-22 00:23:46 +08:00
{
2022-10-23 19:02:39 +08:00
var latest = CoreUtils.GetLatestVersion();
if (latest <= Version) return;
// wait ten minutes for the build to complete
API.SendChatMessage($"New server version found: {latest}, server will update in 10 minutes");
Thread.Sleep(10 * 60 * 1000);
API.SendChatMessage("downloading update...");
var downloadURL =
$"https://github.com/RAGECOOP/RAGECOOP-V/releases/download/nightly/RageCoop.Server-{CoreUtils.GetInvariantRID()}.zip";
if (Directory.Exists("Update")) Directory.Delete("Update", true);
HttpHelper.DownloadFile(downloadURL, "Update.zip");
Logger?.Info("Installing update");
Directory.CreateDirectory("Update");
new FastZip().ExtractZip("Update.zip", "Update", FastZip.Overwrite.Always, null, null, null, true);
MainNetServer.Shutdown("Server updating");
Logger.Info("Server shutting down!");
Logger.Flush();
Process.Start(
Path.Combine("Update",
RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "RageCoop.Server.exe" : "RageCoop.Server"),
"update \"" + AppDomain.CurrentDomain.BaseDirectory[..^1] + "\"");
Environment.Exit(0);
}
catch (Exception ex)
{
Logger?.Error("Update", ex);
}
}
private void KickAssholes()
{
foreach (var c in ClientsByNetHandle.Values.ToArray())
if (c.EntitiesCount > Settings.SpamLimit && Settings.KickSpamming)
2022-08-22 00:23:46 +08:00
{
2022-10-23 19:02:39 +08:00
c.Kick("Bye bye asshole: spamming");
API.SendChatMessage($"Asshole {c.Username} was kicked: Spamming");
}
else if (Settings.KickGodMode && c.Player.IsInvincible)
{
c.Kick("Bye bye asshole: godmode");
API.SendChatMessage($"Asshole {c.Username} was kicked: GodMode");
2022-08-22 00:23:46 +08:00
}
}
2022-10-23 19:02:39 +08:00
}