Skip to content

Commit 200b85b

Browse files
authored
Better DreamConnection.Session disconnect handling (#2503)
1 parent 7efedbe commit 200b85b

File tree

5 files changed

+27
-21
lines changed

5 files changed

+27
-21
lines changed

OpenDreamRuntime/DreamConnection.cs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ public sealed class DreamConnection {
1818
[Dependency] private readonly DreamManager _dreamManager = default!;
1919
[Dependency] private readonly DreamObjectTree _objectTree = default!;
2020
[Dependency] private readonly DreamResourceManager _resourceManager = default!;
21-
[Dependency] private readonly WalkManager _walkManager = default!;
2221
[Dependency] private readonly IEntitySystemManager _entitySystemManager = default!;
2322
[Dependency] private readonly ISharedPlayerManager _playerManager = default!;
2423

@@ -66,10 +65,11 @@ [ViewVariables] public DreamObjectMob? Mob {
6665
}
6766

6867
[ViewVariables] public DreamObjectMovable? Eye {
69-
get => _eye;
68+
get;
7069
set {
71-
_eye = value;
72-
_playerManager.SetAttachedEntity(Session!, _eye?.Entity);
70+
field = value;
71+
if (Session != null)
72+
_playerManager.SetAttachedEntity(Session, field?.Entity);
7373
}
7474
}
7575

@@ -82,7 +82,6 @@ [ViewVariables] public DreamObjectMovable? Eye {
8282
[ViewVariables] private int _nextPromptEvent = 1;
8383
private readonly Dictionary<string, DreamResource> _permittedBrowseRscFiles = new();
8484
private DreamObjectMob? _mob;
85-
private DreamObjectMovable? _eye;
8685

8786
private readonly ISawmill _sawmill = Logger.GetSawmill("opendream.connection");
8887

@@ -119,6 +118,9 @@ public void HandleDisconnection() {
119118
if (Session == null || Client == null) // Already disconnected?
120119
return;
121120

121+
_verbSystem?.RemoveConnectionFromRepeatingVerbs(this);
122+
Session = null;
123+
122124
if (_mob != null) {
123125
// Don't null out the ckey here
124126
_mob.SpawnProc("Logout");
@@ -129,12 +131,8 @@ public void HandleDisconnection() {
129131
}
130132
}
131133

132-
_verbSystem?.RemoveConnectionFromRepeatingVerbs(this);
133-
134134
Client.Delete();
135135
Client = null;
136-
137-
Session = null;
138136
}
139137

140138
public void UpdateStat() {
@@ -391,7 +389,7 @@ public Task<DreamValue> WinGet(string controlId, string queryValue) {
391389
return task;
392390
}
393391

394-
public Task<DreamValue> Alert(String title, String message, String button1, String button2, String button3) {
392+
public Task<DreamValue> Alert(string title, string message, string button1, string button2, string button3) {
395393
var task = MakePromptTask(out var promptId);
396394
var msg = new MsgAlert() {
397395
PromptId = promptId,
@@ -441,7 +439,6 @@ public void HandleBrowseResourceRequest(string filename) {
441439
} else {
442440
_sawmill.Error($"Client({Session}) requested a browse_rsc file they had not been permitted to request ({filename}).");
443441
}
444-
445442
}
446443

447444
public void Browse(string? body, string? options) {

OpenDreamRuntime/Objects/Types/DreamObjectClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ protected override bool TryGetVar(string varName, out DreamValue value) {
7777
value = new(long.Parse(hashStr, System.Globalization.NumberStyles.HexNumber).ToString()); // Converts from hex to decimal. Output is in analogous format to BYOND's.
7878
return true;
7979
case "address":
80+
// TODO: Session could be null if this is gotten from /mob/Logout() or /client/Del()
81+
// BYOND's behavior there needs tested
8082
value = new(Connection.Session!.Channel.RemoteEndPoint.Address.ToString());
8183
return true;
8284
case "inactivity":

OpenDreamRuntime/Rendering/ServerClientImagesSystem.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ public sealed class ServerClientImagesSystem : SharedClientImagesSystem {
99
[Dependency] private readonly PvsOverrideSystem _pvsOverrideSystem = default!;
1010

1111
public void AddImageObject(DreamConnection connection, DreamObjectImage imageObject) {
12-
DreamObject? loc = imageObject.GetAttachedLoc();
13-
if(loc == null)
12+
if (connection.Session == null || imageObject.GetAttachedLoc() is not { } loc)
1413
return;
1514

1615
EntityUid locEntity = EntityUid.Invalid;
@@ -25,13 +24,12 @@ public void AddImageObject(DreamConnection connection, DreamObjectImage imageObj
2524
EntityUid imageObjectEntity = imageObject.Entity;
2625
NetEntity imageObjectNetEntity = GetNetEntity(imageObjectEntity);
2726
if (imageObjectEntity != EntityUid.Invalid)
28-
_pvsOverrideSystem.AddSessionOverride(imageObjectEntity, connection.Session!);
29-
RaiseNetworkEvent(new AddClientImageEvent(ent, turfCoords, imageObjectNetEntity), connection.Session!.Channel);
27+
_pvsOverrideSystem.AddSessionOverride(imageObjectEntity, connection.Session);
28+
RaiseNetworkEvent(new AddClientImageEvent(ent, turfCoords, imageObjectNetEntity), connection.Session.Channel);
3029
}
3130

3231
public void RemoveImageObject(DreamConnection connection, DreamObjectImage imageObject) {
33-
DreamObject? loc = imageObject.GetAttachedLoc();
34-
if (loc == null)
32+
if (connection.Session == null || imageObject.GetAttachedLoc() is not { } loc)
3533
return;
3634

3735
EntityUid locEntity = EntityUid.Invalid;
@@ -45,8 +43,8 @@ public void RemoveImageObject(DreamConnection connection, DreamObjectImage image
4543
NetEntity ent = GetNetEntity(locEntity);
4644
EntityUid imageObjectEntity = imageObject.Entity;
4745
if (imageObjectEntity != EntityUid.Invalid)
48-
_pvsOverrideSystem.RemoveSessionOverride(imageObjectEntity, connection.Session!);
46+
_pvsOverrideSystem.RemoveSessionOverride(imageObjectEntity, connection.Session);
4947
NetEntity imageObjectNetEntity = GetNetEntity(imageObject.Entity);
50-
RaiseNetworkEvent(new RemoveClientImageEvent(ent, turfCoords, imageObjectNetEntity), connection.Session!.Channel);
48+
RaiseNetworkEvent(new RemoveClientImageEvent(ent, turfCoords, imageObjectNetEntity), connection.Session.Channel);
5149
}
5250
}

OpenDreamRuntime/Rendering/ServerScreenOverlaySystem.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,19 @@ public sealed class ServerScreenOverlaySystem : SharedScreenOverlaySystem {
99
[Dependency] private readonly PvsOverrideSystem _pvsOverride = default!;
1010

1111
public void AddScreenObject(DreamConnection connection, DreamObjectMovable screenObject) {
12+
if (connection.Session is null)
13+
return;
14+
1215
_pvsOverride.AddForceSend(screenObject.Entity, connection.Session);
1316

1417
NetEntity ent = _entityManager.GetNetEntity(screenObject.Entity);
1518
RaiseNetworkEvent(new AddScreenObjectEvent(ent), connection.Session.Channel);
1619
}
1720

1821
public void RemoveScreenObject(DreamConnection connection, DreamObjectMovable screenObject) {
22+
if (connection.Session is null)
23+
return;
24+
1925
_pvsOverride.RemoveForceSend(screenObject.Entity, connection.Session);
2026

2127
NetEntity ent = _entityManager.GetNetEntity(screenObject.Entity);

OpenDreamRuntime/ServerVerbSystem.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ public void RegisterVerb(DreamProc verb) {
112112
/// </summary>
113113
/// <param name="client">The client to update</param>
114114
public void UpdateClientVerbs(DreamObjectClient client) {
115+
if (client.Connection.Session == null)
116+
return;
117+
115118
var verbs = client.ClientVerbs.Verbs;
116119
var verbIds = new List<int>(verbs.Count);
117120

@@ -121,7 +124,7 @@ public void UpdateClientVerbs(DreamObjectClient client) {
121124
verbIds.Add(verb.VerbId!.Value);
122125
}
123126

124-
RaiseNetworkEvent(new UpdateClientVerbsEvent(verbIds), client.Connection.Session!);
127+
RaiseNetworkEvent(new UpdateClientVerbsEvent(verbIds), client.Connection.Session);
125128
}
126129

127130
private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e) {
@@ -178,7 +181,7 @@ private void OnRepeatVerbStop(UnregisterRepeatVerbEvent msg, EntitySessionEventA
178181

179182
private void RunVerb(DreamProc verb, string name, DreamObject? src, DreamConnection usr, params DreamValue[] arguments) {
180183
using var _ = Profiler.BeginZone("DM Execution", color: (uint)Color.LightPink.ToArgb());
181-
184+
182185
DreamThread.Run($"Execute {name} by {usr.Session!.Name}", async state => {
183186
await state.Call(verb, src, usr.Mob, arguments);
184187
return DreamValue.Null;

0 commit comments

Comments
 (0)