Holy crap auth works (#2099)

* Holy crap auth works

* Fix some usages of UserID instead of UserName

* Refactor preferences.

They be non-async now. Also faster.

* Rename DbContext.

* Guest username assignment.

* Fix saving of profiles.

* Don't store data for guests.

* Fix generating invalid random colors.

* Don't allow dumb garbage for char preferences.

* Bans.

* Lol forgot to fill out the command description.

* Connection log.

* Rename all the tables and columns to be snake_case.

* Re-do migrations.

* Fixing tests and warnings.

* Update submodule
This commit is contained in:
Pieter-Jan Briers
2020-09-29 14:26:00 +02:00
committed by GitHub
parent 8a33e0a9bd
commit 66c8a68891
72 changed files with 4144 additions and 2642 deletions

View File

@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Content.Server.GameObjects.Components.Access;
using Content.Server.GameObjects.Components.GUI;
using Content.Server.GameObjects.Components.Items.Storage;
@@ -34,7 +33,6 @@ using Robust.Server.Interfaces.Maps;
using Robust.Server.Interfaces.Player;
using Robust.Server.Player;
using Robust.Server.ServerStatus;
using Robust.Shared.Configuration;
using Robust.Shared.Enums;
using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Systems;
@@ -222,7 +220,7 @@ namespace Content.Server.GameTicking
}
}
public async void StartRound(bool force = false)
public void StartRound(bool force = false)
{
DebugTools.Assert(RunLevel == GameRunLevel.PreRoundLobby);
Logger.InfoS("ticker", "Starting round!");
@@ -244,16 +242,16 @@ namespace Content.Server.GameTicking
RoundLengthMetric.Set(0);
// Get the profiles for each player for easier lookup.
var profiles = (await _prefsManager.GetSelectedProfilesForPlayersAsync(
var profiles = _prefsManager.GetSelectedProfilesForPlayers(
readyPlayers
.Select(p => p.Name).ToList()))
.Select(p => p.UserId).ToList())
.ToDictionary(p => p.Key, p => (HumanoidCharacterProfile) p.Value);
foreach (var readyPlayer in readyPlayers)
{
if (!profiles.ContainsKey(readyPlayer.Name))
if (!profiles.ContainsKey(readyPlayer.UserId))
{
profiles.Add(readyPlayer.Name, HumanoidCharacterProfile.Default());
profiles.Add(readyPlayer.UserId, HumanoidCharacterProfile.Default());
}
}
@@ -267,7 +265,7 @@ namespace Content.Server.GameTicking
continue;
}
var profile = profiles[player.Name];
var profile = profiles[player.UserId];
if (profile.PreferenceUnavailable == PreferenceUnavailableMode.SpawnAsOverflow)
{
assignedJobs.Add(player, OverflowJob);
@@ -277,7 +275,7 @@ namespace Content.Server.GameTicking
// Spawn everybody in!
foreach (var (player, job) in assignedJobs)
{
SpawnPlayer(player, profiles[player.Name], job, false);
SpawnPlayer(player, profiles[player.UserId], job, false);
}
// Time to start the preset.
@@ -320,9 +318,10 @@ namespace Content.Server.GameTicking
IoCManager.Resolve<IServerNetManager>().ServerSendToAll(msg);
}
private async Task<HumanoidCharacterProfile> GetPlayerProfileAsync(IPlayerSession p) =>
(HumanoidCharacterProfile) (await _prefsManager.GetPreferencesAsync(p.SessionId.Username))
.SelectedCharacter;
private HumanoidCharacterProfile GetPlayerProfile(IPlayerSession p)
{
return (HumanoidCharacterProfile) _prefsManager.GetPreferences(p.UserId).SelectedCharacter;
}
public void EndRound(string roundEndText = "")
{
@@ -373,7 +372,7 @@ namespace Content.Server.GameTicking
if (LobbyEnabled)
_playerJoinLobby(targetPlayer);
else
SpawnPlayerAsync(targetPlayer);
SpawnPlayer(targetPlayer);
}
public void MakeObserve(IPlayerSession player)
@@ -389,13 +388,23 @@ namespace Content.Server.GameTicking
{
if (!_playersInLobby.ContainsKey(player)) return;
SpawnPlayerAsync(player, jobId);
if (!_prefsManager.HavePreferencesLoaded(player))
{
return;
}
SpawnPlayer(player, jobId);
}
public void ToggleReady(IPlayerSession player, bool ready)
{
if (!_playersInLobby.ContainsKey(player)) return;
if (!_prefsManager.HavePreferencesLoaded(player))
{
return;
}
var status = ready ? PlayerStatus.Ready : PlayerStatus.NotReady;
_playersInLobby[player] = ready ? PlayerStatus.Ready : PlayerStatus.NotReady;
_netManager.ServerSendMessage(_getStatusMsg(player), player.ConnectedClient);
@@ -703,7 +712,7 @@ namespace Content.Server.GameTicking
case SessionStatus.Connected:
{
_chatManager.DispatchServerAnnouncement($"Player {args.Session.SessionId} joined server!");
_chatManager.DispatchServerAnnouncement($"Player {args.Session.Name} joined server!");
if (LobbyEnabled && _roundStartCountdownHasNotStartedYetDueToNoPlayers)
{
@@ -716,6 +725,8 @@ namespace Content.Server.GameTicking
case SessionStatus.InGame:
{
_prefsManager.OnClientConnected(session);
var data = session.ContentData();
if (data.Mind == null)
{
@@ -725,13 +736,14 @@ namespace Content.Server.GameTicking
return;
}
SpawnPlayerAsync(session);
SpawnWaitPrefs();
}
else
{
if (data.Mind.CurrentEntity == null)
{
SpawnPlayerAsync(session);
SpawnWaitPrefs();
}
else
{
@@ -747,11 +759,18 @@ namespace Content.Server.GameTicking
{
if (_playersInLobby.ContainsKey(session)) _playersInLobby.Remove(session);
_chatManager.DispatchServerAnnouncement($"Player {args.Session.SessionId} left server!");
_chatManager.DispatchServerAnnouncement($"Player {args.Session} left server!");
ServerEmptyUpdateRestartCheck();
_prefsManager.OnClientDisconnected(session);
break;
}
}
async void SpawnWaitPrefs()
{
await _prefsManager.WaitPreferencesLoaded(session);
SpawnPlayer(session);
}
}
/// <summary>
@@ -785,11 +804,9 @@ namespace Content.Server.GameTicking
}, _updateShutdownCts.Token);
}
private async void SpawnPlayerAsync(IPlayerSession session, string jobId = null, bool lateJoin = true)
private void SpawnPlayer(IPlayerSession session, string jobId = null, bool lateJoin = true)
{
var character = (HumanoidCharacterProfile) (await _prefsManager
.GetPreferencesAsync(session.SessionId.Username))
.SelectedCharacter;
var character = GetPlayerProfile(session);
SpawnPlayer(session, character, jobId, lateJoin);
}
@@ -809,7 +826,7 @@ namespace Content.Server.GameTicking
var data = session.ContentData();
data.WipeMind();
data.Mind = new Mind(session.SessionId)
data.Mind = new Mind(session.UserId)
{
CharacterName = character.Name
};
@@ -866,17 +883,15 @@ namespace Content.Server.GameTicking
_manifest.Add(new ManifestEntry(characterName, jobId));
}
private async void _spawnObserver(IPlayerSession session)
private void _spawnObserver(IPlayerSession session)
{
_playerJoinGame(session);
var name = (await _prefsManager
.GetPreferencesAsync(session.SessionId.Username))
.SelectedCharacter.Name;
var name = GetPlayerProfile(session).Name;
var data = session.ContentData();
data.WipeMind();
data.Mind = new Mind(session.SessionId);
data.Mind = new Mind(session.UserId);
var mob = _spawnObserverMob();
mob.Name = name;
@@ -888,7 +903,6 @@ namespace Content.Server.GameTicking
{
_playersInLobby.Add(session, PlayerStatus.NotReady);
_prefsManager.OnClientConnected(session);
_netManager.ServerSendMessage(_netManager.CreateNetMessage<MsgTickerJoinLobby>(), session.ConnectedClient);
_netManager.ServerSendMessage(_getStatusMsg(session), session.ConnectedClient);
_netManager.ServerSendMessage(GetInfoMsg(), session.ConnectedClient);
@@ -907,11 +921,11 @@ namespace Content.Server.GameTicking
private MsgTickerLobbyReady GetPlayerStatus()
{
var msg = _netManager.CreateNetMessage<MsgTickerLobbyReady>();
msg.PlayerStatus = new Dictionary<NetSessionId, PlayerStatus>();
msg.PlayerStatus = new Dictionary<NetUserId, PlayerStatus>();
foreach (var player in _playersInLobby.Keys)
{
_playersInLobby.TryGetValue(player, out var status);
msg.PlayerStatus.Add(player.SessionId, status);
msg.PlayerStatus.Add(player.UserId, status);
}
return msg;
}
@@ -919,9 +933,9 @@ namespace Content.Server.GameTicking
private MsgTickerLobbyReady GetStatusSingle(IPlayerSession player, PlayerStatus status)
{
var msg = _netManager.CreateNetMessage<MsgTickerLobbyReady>();
msg.PlayerStatus = new Dictionary<NetSessionId, PlayerStatus>
msg.PlayerStatus = new Dictionary<NetUserId, PlayerStatus>
{
{ player.SessionId, status }
{ player.UserId, status }
};
return msg;
}
@@ -967,7 +981,7 @@ The current game mode is: [color=white]{0}[/color].
_netManager.ServerSendToMany(infoMsg, _playersInLobby.Keys.Select(p => p.ConnectedClient).ToList());
}
private GamePreset MakeGamePreset(Dictionary<string, HumanoidCharacterProfile> readyProfiles)
private GamePreset MakeGamePreset(Dictionary<NetUserId, HumanoidCharacterProfile> readyProfiles)
{
var preset = _dynamicTypeFactory.CreateInstance<GamePreset>(_presetType ?? typeof(PresetSandbox));
preset.readyProfiles = readyProfiles;