From 1b929572373338cd2465ca9522727216086e3a64 Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Thu, 18 Aug 2022 19:56:52 -0500 Subject: [PATCH 1/3] Implements several world networking meta-vars world.address world.port world.url world.internet_address EDIT: Does some various tweaking as per Wixoa's review --- DMCompiler/DMStandard/Types/World.dm | 4 +- OpenDreamRuntime/DreamManager.Connections.cs | 2 + OpenDreamRuntime/IDreamManager.cs | 5 +- .../MetaObjects/DreamMetaObjectWorld.cs | 68 +++++++++++++++++-- 4 files changed, 70 insertions(+), 9 deletions(-) diff --git a/DMCompiler/DMStandard/Types/World.dm b/DMCompiler/DMStandard/Types/World.dm index 9a6d5cc177..51a941c9de 100644 --- a/DMCompiler/DMStandard/Types/World.dm +++ b/DMCompiler/DMStandard/Types/World.dm @@ -29,8 +29,8 @@ var/version = 0 as opendream_unimplemented var/address - var/port - var/internet_address = "127.0.0.1" as opendream_unimplemented + var/port = 0 + var/internet_address = "127.0.0.1" var/url var/status as opendream_unimplemented var/list/params = list() as opendream_unimplemented diff --git a/OpenDreamRuntime/DreamManager.Connections.cs b/OpenDreamRuntime/DreamManager.Connections.cs index bce45723e5..75898e618c 100644 --- a/OpenDreamRuntime/DreamManager.Connections.cs +++ b/OpenDreamRuntime/DreamManager.Connections.cs @@ -5,6 +5,8 @@ using Robust.Server.Player; using Robust.Shared.Enums; using Robust.Shared.Network; +using System.Net; +using System.Net.Sockets; namespace OpenDreamRuntime { diff --git a/OpenDreamRuntime/IDreamManager.cs b/OpenDreamRuntime/IDreamManager.cs index 39cbdb0eb3..d748d4c0cd 100644 --- a/OpenDreamRuntime/IDreamManager.cs +++ b/OpenDreamRuntime/IDreamManager.cs @@ -1,4 +1,7 @@ -using OpenDreamRuntime.Objects; +using System.Linq; +using System.Threading.Tasks; +using System.Net; +using OpenDreamRuntime.Objects; using Robust.Server.Player; namespace OpenDreamRuntime { diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs index 1f44bd74f1..d38603cc52 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs @@ -4,6 +4,9 @@ using Robust.Shared; using Robust.Shared.Configuration; using Robust.Shared.Timing; +using Robust.Shared.Network; +using System.Net; +using System.Net.Sockets; namespace OpenDreamRuntime.Objects.MetaObjects { sealed class DreamMetaObjectWorld : IDreamMetaObject { @@ -11,6 +14,7 @@ sealed class DreamMetaObjectWorld : IDreamMetaObject { public IDreamMetaObject? ParentType { get; set; } [Dependency] private readonly IDreamManager _dreamManager = default!; + [Dependency] private readonly IServerNetManager _netManager = default!; [Dependency] private readonly DreamResourceManager _dreamRscMan = default!; [Dependency] private readonly IDreamMapManager _dreamMapManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; @@ -19,6 +23,40 @@ sealed class DreamMetaObjectWorld : IDreamMetaObject { private ViewRange _viewRange; private double TickLag => _gameTiming.TickPeriod.TotalMilliseconds / 100; + /// Determines whether we try to show IPv6 or IPv4 to the user during .address and .internet_address queries. + private bool DisplayIPv6 + { + get + { + var binds = _cfg.GetCVar(CVars.NetBindTo).Split(','); + foreach (var bindAddress in binds) + { + if (!IPAddress.TryParse(bindAddress.Trim(), out var address)) // EXTREMELY unlikely since RT does this same check on network startup + { + continue; + } + + if (address.AddressFamily == AddressFamily.InterNetworkV6) + { + return true; + } + } + return false; + } + } + /// Tries to return the address of the server, as it appears over the internet. May return null. + private IPAddress? InternetAddress + { + get + { + NetManager? net = (NetManager?)_netManager; + if(net == null) // This may be the case if we're on IntegrationNetManager instead of NetManager. + { // If so, I don't really know how to force RT to fess up about what our IP is, since it's all hidden behind privates at time of writing. + return null; + } + return net.ServerChannel?.RemoteEndPoint.Address; + } + } public DreamMetaObjectWorld() { IoCManager.InjectDependencies(this); @@ -100,12 +138,30 @@ public DreamValue OnVariableGet(DreamObject dreamObject, string varName, DreamVa return new DreamValue(_dreamMapManager.Size.Y); case "maxz": return new DreamValue(_dreamMapManager.Levels); - //case "address": - // return new(Runtime.Server.Address.ToString()); - //case "port": - // return new(Runtime.Server.Port); - //case "url": - // return new("opendream://" + Runtime.Server.Address + ":" + Runtime.Server.Port); + case "address": // By address they mean, the local address we have on the network, not on the internet. + var host = Dns.GetHostEntry(Dns.GetHostName()); + var ipType = DisplayIPv6 ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork; + foreach (var ip in host.AddressList) + { + if (ip.AddressFamily == ipType) + { + return new DreamValue(ip.ToString()); + } + } + return DreamValue.Null; + case "port": + return new DreamValue(_netManager.Port); + case "url": + if (InternetAddress == null) + return DreamValue.Null; + return new(InternetAddress + ":" + _netManager.Port); // RIP "opendream://" + case "internet_address": + IPAddress? address = InternetAddress; + // We don't need to do any logic with DisplayIPv6 since whatever this address is, + // ought to be the address that the boolean's getter is searching for anyways. + if (address == null) + return DreamValue.Null; + return new(address.ToString()); case "system_type": { //system_type value should match the defines in Defines.dm if (Environment.OSVersion.Platform is PlatformID.Unix or PlatformID.MacOSX or PlatformID.Other) { From b28faeda9ae4787f8c3f3aed1bfbce3c63e3c5b8 Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Thu, 18 Aug 2022 19:57:40 -0500 Subject: [PATCH 2/3] Adds several more world unimplemented vars, defines This should improve compile-ability, especially movement_mode. EDIT: MOVEMENT_MODE macros now start at 0 instead of 1, as per parity EDIT: Forgot to add cache_lifespan, lol EDIT: Removing cache_lifespan since it now exists on master apparently --- DMCompiler/DMStandard/Defines.dm | 5 +++++ DMCompiler/DMStandard/Types/World.dm | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/DMCompiler/DMStandard/Defines.dm b/DMCompiler/DMStandard/Defines.dm index 03e8fa2db6..2fd5dcd819 100644 --- a/DMCompiler/DMStandard/Defines.dm +++ b/DMCompiler/DMStandard/Defines.dm @@ -197,6 +197,11 @@ #define SIDE_MAP 2 #define TILED_ICON_MAP 32768 +//world.movement_mode +#define LEGACY_MOVEMENT_MODE 0 +#define TILE_MOVEMENT_MODE 1 +#define PIXEL_MOVEMENT_MODE 2 + //generator() distributions #define UNIFORM_RAND 0 #define NORMAL_RAND 1 diff --git a/DMCompiler/DMStandard/Types/World.dm b/DMCompiler/DMStandard/Types/World.dm index 51a941c9de..613f5400fb 100644 --- a/DMCompiler/DMStandard/Types/World.dm +++ b/DMCompiler/DMStandard/Types/World.dm @@ -16,12 +16,14 @@ var/cpu = 0 as opendream_unimplemented var/fps = null var/tick_usage + var/loop_checks = 0 as opendream_unimplemented var/maxx = 0 var/maxy = 0 var/maxz = 0 var/icon_size = 32 var/view = 5 + var/movement_mode = LEGACY_MOVEMENT_MODE as opendream_unimplemented var/byond_version = DM_VERSION var/byond_build = DM_BUILD @@ -32,6 +34,7 @@ var/port = 0 var/internet_address = "127.0.0.1" var/url + var/visibility = 0 as opendream_unimplemented var/status as opendream_unimplemented var/list/params = list() as opendream_unimplemented @@ -59,6 +62,9 @@ set opendream_unimplemented = TRUE proc/IsSubscribed(player, type) set opendream_unimplemented = TRUE + proc/IsBanned(key,address,computer_id,type) + set opendream_unimplemented = TRUE + return FALSE; proc/Reboot() set opendream_unimplemented = TRUE @@ -67,6 +73,8 @@ set opendream_unimplemented = TRUE proc/Export(Addr, File, Persist, Clients) + proc/Import() + set opendream_unimplemented = TRUE proc/SetScores() set opendream_unimplemented = TRUE From 9d31a827450ffa0cf42d3d468b36458101725bb6 Mon Sep 17 00:00:00 2001 From: Gary Lafortune Date: Tue, 25 Oct 2022 13:16:23 -0500 Subject: [PATCH 3/3] Dials PR back a bit, TODO'd internet_address & url EDIT: also does Wixoa's new review --- DMCompiler/DMStandard/Types/World.dm | 6 +++--- OpenDreamRuntime/IDreamManager.cs | 3 --- .../Objects/MetaObjects/DreamMetaObjectWorld.cs | 7 +------ 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/DMCompiler/DMStandard/Types/World.dm b/DMCompiler/DMStandard/Types/World.dm index 613f5400fb..b5b1b71e05 100644 --- a/DMCompiler/DMStandard/Types/World.dm +++ b/DMCompiler/DMStandard/Types/World.dm @@ -31,9 +31,9 @@ var/version = 0 as opendream_unimplemented var/address - var/port = 0 - var/internet_address = "127.0.0.1" - var/url + var/port = 0 as opendream_compiletimereadonly + var/internet_address = "127.0.0.1" as opendream_unimplemented + var/url as opendream_unimplemented var/visibility = 0 as opendream_unimplemented var/status as opendream_unimplemented var/list/params = list() as opendream_unimplemented diff --git a/OpenDreamRuntime/IDreamManager.cs b/OpenDreamRuntime/IDreamManager.cs index d748d4c0cd..483884837d 100644 --- a/OpenDreamRuntime/IDreamManager.cs +++ b/OpenDreamRuntime/IDreamManager.cs @@ -1,6 +1,3 @@ -using System.Linq; -using System.Threading.Tasks; -using System.Net; using OpenDreamRuntime.Objects; using Robust.Server.Player; diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs index d38603cc52..dde677e1e2 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectWorld.cs @@ -49,12 +49,7 @@ private IPAddress? InternetAddress { get { - NetManager? net = (NetManager?)_netManager; - if(net == null) // This may be the case if we're on IntegrationNetManager instead of NetManager. - { // If so, I don't really know how to force RT to fess up about what our IP is, since it's all hidden behind privates at time of writing. - return null; - } - return net.ServerChannel?.RemoteEndPoint.Address; + return null; //TODO: Implement this! } }