Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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));
 }
Esempio n. 10
0
 public abstract Task <PlayerRecord?> GetPlayerRecordByUserId(NetUserId userId, CancellationToken cancel);
Esempio n. 11
0
        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;
        }
Esempio n. 12
0
 public bool HasPlayerData(NetUserId userId)
 {
     return(_playerData.ContainsKey(userId));
 }
Esempio n. 13
0
 public IPlayerData GetPlayerData(NetUserId userId)
 {
     return(_playerData[userId]);
 }
Esempio n. 14
0
 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);
Esempio n. 16
0
 public Task <Admin?> GetAdminDataForAsync(NetUserId userId)
 {
     return(_db.GetAdminDataForAsync(userId));
 }
Esempio n. 17
0
        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());
        }
Esempio n. 18
0
 public PlayerData(NetUserId userId, string name)
 {
     UserId = userId;
     Name   = name;
 }
Esempio n. 19
0
 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;
 }
Esempio n. 21
0
 public abstract Task AddConnectionLogAsync(
     NetUserId userId,
     string userName,
     IPAddress address,
     ImmutableArray <byte> hwId);
Esempio n. 22
0
 public abstract Task UpdatePlayerRecord(NetUserId userId, string userName, IPAddress address);
 public Task <PlayerPreferences?> GetPlayerPreferencesAsync(NetUserId userId)
 {
     return(_db.GetPlayerPreferencesAsync(userId));
 }
Esempio n. 24
0
 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));
 }
Esempio n. 26
0
 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));
 }
Esempio n. 30
0
 /// <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;
 }