public async Task SaveCharacterSlotAsync(NetUserId userId, ICharacterProfile?profile, int slot) { await using var db = await GetDb(); if (profile is null) { await DeleteCharacterSlot(db.DbContext, userId, slot); await db.DbContext.SaveChangesAsync(); return; } if (profile is not HumanoidCharacterProfile humanoid) { // TODO: Handle other ICharacterProfile implementations properly throw new NotImplementedException(); } var entity = ConvertProfiles(humanoid, slot); var prefs = await db.DbContext .Preference .Include(p => p.Profiles) .SingleAsync(p => p.UserId == userId.UserId); var oldProfile = prefs .Profiles .SingleOrDefault(h => h.Slot == entity.Slot); if (oldProfile is not null) { prefs.Profiles.Remove(oldProfile); } prefs.Profiles.Add(entity); await db.DbContext.SaveChangesAsync(); }
public bool SignalLinkerKeybind(NetUserId id, bool?enable) { if (enable == null) { enable = !_transmitters.ContainsKey(id); } if (enable == true) { if (_transmitters.ContainsKey(id)) { return(true); } if (_transmitters.Count == 0) { CommandBinds.Builder .BindBefore(EngineKeyFunctions.Use, new PointerInputCmdHandler(HandleUse), typeof(InteractionSystem)) .Register <SignalLinkerSystem>(); } _transmitters.Add(id, null); } else if (enable == false) { if (!_transmitters.ContainsKey(id)) { return(false); } _transmitters.Remove(id); if (_transmitters.Count == 0) { CommandBinds.Unregister <SignalLinkerSystem>(); } } return(enable == true); }
public async Task <LocatedPlayerData?> LookupIdAsync(NetUserId userId, CancellationToken cancel = default) { // Check people currently on the server, the easiest case. if (_playerManager.TryGetSessionById(userId, out var session)) { var address = session.ConnectedClient.RemoteEndPoint.Address; var hwId = session.ConnectedClient.UserData.HWId; return(new LocatedPlayerData(userId, address, hwId)); } // Check database for past players. var record = await _db.GetPlayerRecordByUserId(userId, cancel); if (record != null) { return(new LocatedPlayerData(record.UserId, record.LastSeenAddress, record.HWId)); } // If all else fails, ask the auth server. var client = new HttpClient(); var authServer = _configurationManager.GetCVar(CVars.AuthServer); var requestUri = $"{authServer}api/query/userid?userid={WebUtility.UrlEncode(userId.UserId.ToString())}"; using var resp = await client.SendAsync(new HttpRequestMessage (HttpMethod.Head, requestUri), cancel); if (resp.StatusCode == HttpStatusCode.NotFound) { return(null); } if (!resp.IsSuccessStatusCode) { Logger.ErrorS("PlayerLocate", "Auth server returned bad response {StatusCode}!", resp.StatusCode); return(null); } return(new LocatedPlayerData(userId, null, null)); }
public async void Execute(IConsoleShell shell, IPlayerSession?player, string[] args) { var plyMgr = IoCManager.Resolve <IPlayerManager>(); var dbMan = IoCManager.Resolve <IServerDbManager>(); var target = args[0]; var reason = args[1]; var duration = int.Parse(args[2]); NetUserId targetUid; if (plyMgr.TryGetSessionByUsername(target, out var targetSession)) { targetUid = targetSession.UserId; } else if (Guid.TryParse(target, out var targetGuid)) { targetUid = new NetUserId(targetGuid); } else { shell.SendText(player, "Unable to find user with that name."); return; } DateTimeOffset?expires = null; if (duration > 0) { expires = DateTimeOffset.Now + TimeSpan.FromMinutes(duration); } await dbMan.AddServerBanAsync(new ServerBanDef(targetUid, null, DateTimeOffset.Now, expires, reason, player?.UserId)); if (plyMgr.TryGetSessionById(targetUid, out var targetPlayer)) { targetPlayer.ConnectedClient.Disconnect("You've been banned. Tough shit."); } }
private static ServerBanDef?ConvertBan(SqliteServerBan?ban) { if (ban == null) { return(null); } NetUserId?uid = null; if (ban.UserId is {} guid) { uid = new NetUserId(guid); } NetUserId?aUid = null; if (ban.BanningAdmin is {} aGuid) { aUid = new NetUserId(aGuid); } (IPAddress, int)? addrTuple = null; if (ban.Address != null) { var idx = ban.Address.IndexOf('/', StringComparison.Ordinal); addrTuple = (IPAddress.Parse(ban.Address.AsSpan(0, idx)), int.Parse(ban.Address.AsSpan(idx + 1), provider: CultureInfo.InvariantCulture)); } return(new ServerBanDef( uid, addrTuple, ban.BanTime, ban.ExpirationTime, ban.Reason, aUid)); }
public Task SaveSelectedCharacterIndexAsync(NetUserId userId, int index) { return(_db.SaveSelectedCharacterIndexAsync(userId, index)); }
public Task AddConnectionLogAsync(NetUserId userId, string userName, IPAddress address) { return(_db.AddConnectionLogAsync(userId, userName, address)); }
public Task AssignUserIdAsync(string name, NetUserId userId) { return(_db.AssignUserIdAsync(name, userId)); }
public Task DeleteSlotAndSetSelectedIndex(NetUserId userId, int deleteSlot, int newSlot) { return(_db.DeleteSlotAndSetSelectedIndex(userId, deleteSlot, newSlot)); }
public abstract Task <PlayerRecord?> GetPlayerRecordByUserId(NetUserId userId, CancellationToken cancel);
private static async Task SetSelectedCharacterSlotAsync(NetUserId userId, int newSlot, ServerDbContext db) { var prefs = await db.Preference.SingleAsync(p => p.UserId == userId.UserId); prefs.SelectedCharacterSlot = newSlot; }
public bool HasPlayerData(NetUserId userId) { return(_playerData.ContainsKey(userId)); }
public IPlayerData GetPlayerData(NetUserId userId) { return(_playerData[userId]); }
public bool TryGetUserId(string userName, out NetUserId userId) { return(_userIdMap.TryGetValue(userName, out userId)); }
/* * CONNECTION LOG */ public abstract Task <int> AddConnectionLogAsync( NetUserId userId, string userName, IPAddress address, ImmutableArray <byte> hwId, ConnectionDenyReason?denied);
public Task <Admin?> GetAdminDataForAsync(NetUserId userId) { return(_db.GetAdminDataForAsync(userId)); }
public async void Execute(IConsoleShell shell, string argStr, string[] args) { if (args.Length != 1) { shell.WriteLine($"Invalid amount of args. {Help}"); return; } var plyMgr = IoCManager.Resolve <IPlayerManager>(); var dbMan = IoCManager.Resolve <IServerDbManager>(); var target = args[0]; NetUserId targetUid; if (plyMgr.TryGetSessionByUsername(target, out var targetSession)) { targetUid = targetSession.UserId; } else if (Guid.TryParse(target, out var targetGuid)) { targetUid = new NetUserId(targetGuid); } else { shell.WriteLine("Unable to find user with that name."); return; } var bans = await dbMan.GetServerBansAsync(null, targetUid, null); if (bans.Count == 0) { shell.WriteLine("That user has no bans in their record."); return; } var bansString = new StringBuilder("Bans in record:\n"); foreach (var ban in bans) { bansString .Append("Ban ID: ") .Append(ban.Id) .Append("\n") .Append("Banned in ") .Append(ban.BanTime); if (ban.ExpirationTime == null) { bansString.Append("."); } else { bansString .Append(" until ") .Append(ban.ExpirationTime.Value) .Append("."); } bansString.Append("\n"); bansString .Append("Reason: ") .Append(ban.Reason) .Append("\n\n"); } shell.WriteLine(bansString.ToString()); }
public PlayerData(NetUserId userId, string name) { UserId = userId; Name = name; }
public abstract Task UpdatePlayerRecord( NetUserId userId, string userName, IPAddress address, ImmutableArray <byte> hwId);
public BwoinkTextMessage(NetUserId channelId, NetUserId trueSender, string text) { ChannelId = channelId; TrueSender = trueSender; Text = text; }
public abstract Task AddConnectionLogAsync( NetUserId userId, string userName, IPAddress address, ImmutableArray <byte> hwId);
public abstract Task UpdatePlayerRecord(NetUserId userId, string userName, IPAddress address);
public Task <PlayerPreferences?> GetPlayerPreferencesAsync(NetUserId userId) { return(_db.GetPlayerPreferencesAsync(userId)); }
public abstract Task AddConnectionLogAsync(NetUserId userId, string userName, IPAddress address);
public Task UpdatePlayerRecordAsync(NetUserId userId, string userName, IPAddress address) { return(_db.UpdatePlayerRecord(userId, userName, address)); }
public PlayerData(NetUserId userId) { UserId = userId; }
public Task <PlayerPreferences> InitPrefsAsync(NetUserId userId, ICharacterProfile defaultProfile) { return(_db.InitPrefsAsync(userId, defaultProfile)); }
public ConfirmConnectMessage(int assignedUid, NetUserId userId, string assignedName) { AssignedUid = assignedUid; UserId = userId; AssignedName = assignedName; }
public Task SaveCharacterSlotAsync(NetUserId userId, ICharacterProfile?profile, int slot) { return(_db.SaveCharacterSlotAsync(userId, profile, slot)); }
/// <summary> /// Creates the new mind attached to a specific player session. /// </summary> /// <param name="userId">The session ID of the owning player.</param> public Mind(NetUserId userId) { UserId = userId; }