コード例 #1
0
        public virtual async Task <bool> AddGrantedPermissionAsync(IPermissionActor actor, string permission)
        {
            if (actor is IPermissionRole)
            {
                var roleData = m_PermissionRolesDataStore.Roles.First(d => d.Id?.Equals(actor.Id, StringComparison.OrdinalIgnoreCase) ?? false);
                if (roleData == null)
                {
                    return(false);
                }

                roleData.Permissions ??= new ();
                roleData.Permissions.Add(permission);
                await m_PermissionRolesDataStore.SaveChangesAsync();

                return(true);
            }

            var userData = await m_UserDataStore.GetUserDataAsync(actor.Id, actor.Type);

            if (userData == null)
            {
                return(false);
            }

            userData.Permissions ??= new();
            userData.Permissions.Add(permission);
            await m_UserDataStore.SetUserDataAsync(userData);

            return(true);
        }
コード例 #2
0
        public virtual async Task <bool> AddRoleToActorAsync(IPermissionActor actor, string roleId)
        {
            if (actor == null)
            {
                throw new ArgumentNullException(nameof(actor));
            }

            if (string.IsNullOrEmpty(roleId))
            {
                throw new ArgumentNullException(nameof(roleId));
            }

            var userData = await m_UserDataStore.GetUserDataAsync(actor.Id, actor.Type);

            if (userData == null)
            {
                return(false);
            }

            userData.Roles ??= new HashSet <string>();
            if (userData.Roles.Contains(roleId))
            {
                return(true);
            }

            userData.Roles.Add(roleId);

            await m_UserDataStore.SetUserDataAsync(userData);

            await m_EventBus.EmitAsync(m_Runtime, this, new PermissionActorRoleAddedEvent(actor, roleId));

            return(true);
        }
コード例 #3
0
        protected virtual void OnPlayerDisconnected(SteamPlayer steamPlayer)
        {
            var user = GetUser(steamPlayer);

            if (user == null)
            {
                return;
            }

            if (user.Session is UnturnedUserSession session)
            {
                session.OnSessionEnd();
            }

            AsyncHelper.RunSync(async() =>
            {
                var disconnectedEvent = new UserDisconnectedEvent(user);
                await m_EventBus.EmitAsync(m_Runtime, this, disconnectedEvent);

                m_Users.Remove(user);

                var userData = await m_UserDataStore.GetUserDataAsync(user.Id, user.Type);
                if (userData == null)
                {
                    return;
                }

                userData.LastSeen = DateTime.Now;
                await m_UserDataStore.SetUserDataAsync(userData);
            });
        }
コード例 #4
0
        public virtual async Task <bool> AddRoleToActorAsync(IPermissionActor actor, string roleId)
        {
            var userData = await m_UserDataStore.GetUserDataAsync(actor.Id, actor.Type);

            if (userData.Roles.Contains(roleId))
            {
                return(true);
            }

            userData.Roles.Add(roleId);
            await m_UserDataStore.SetUserDataAsync(userData);

            return(true);
        }
コード例 #5
0
        private void UpdateLastSeen(string id, string type)
        {
            UniTask.RunOnThreadPool(async() =>
            {
                var userData = await m_UserDataStore.GetUserDataAsync(id, type);
                if (userData == null)
                {
                    return;
                }

                userData.LastSeen = DateTime.Now;
                await m_UserDataStore.SetUserDataAsync(userData);
            }).Forget();
        }
コード例 #6
0
ファイル: UserDataSeeder.cs プロジェクト: nuage00/openmod
        public async Task SeedUserDataAsync(string actorId, string actorType, string displayName, Dictionary <string, object> data = null)
        {
            var userData = await m_UserDataStore.GetUserDataAsync(actorId, actorType);

            if (userData != null)
            {
                return; // no seeding
            }

            var autoAssignRoles = new HashSet <string>(await m_PermissionRoleStore.GetAutoAssignedRolesAsync(actorId, actorType));

            userData = new UserData
            {
                Data            = data ?? new Dictionary <string, object>(),
                Id              = actorId,
                Type            = actorType,
                LastSeen        = DateTime.Now,
                FirstSeen       = DateTime.Now,
                Permissions     = new HashSet <string>(),
                Roles           = autoAssignRoles,
                LastDisplayName = displayName
            };

            await m_UserDataStore.SetUserDataAsync(userData);
        }
コード例 #7
0
ファイル: UserDataSeeder.cs プロジェクト: Pustalorc/openmod
        public async Task SeedUserDataAsync(string actorId, string actorType, string?displayName, Dictionary <string, object?>?data = null)
        {
            if (string.IsNullOrEmpty(actorId))
            {
                throw new ArgumentException(nameof(actorId));
            }

            if (string.IsNullOrEmpty(actorType))
            {
                throw new ArgumentException(nameof(actorType));
            }

            var userData = await m_UserDataStore.GetUserDataAsync(actorId, actorType);

            if (userData != null)
            {
                return; // no seeding
            }

            var autoAssignRoles = new HashSet <string>(await m_PermissionRoleStore.GetAutoAssignedRolesAsync(actorId, actorType));

            userData = new UserData
            {
                Data            = data ?? new Dictionary <string, object?>(),
                Id              = actorId,
                Type            = actorType,
                LastSeen        = DateTime.Now,
                FirstSeen       = DateTime.Now,
                Permissions     = new HashSet <string>(),
                Roles           = autoAssignRoles,
                LastDisplayName = displayName
            };

            await m_UserDataStore.SetUserDataAsync(userData);
        }
コード例 #8
0
        private async void SaveDeathLocation(PlayerLife sender, EDeathCause cause, ELimb limb, CSteamID instigator)
        {
            var userData = await m_UserDataStore.GetUserDataAsync(sender.player.channel.owner.playerID.steamID.ToString(), "player");

            userData.Data["deathLocation"] = sender.transform.position.ToSerializableVector3();
            await m_UserDataStore.SetUserDataAsync(userData);
        }
コード例 #9
0
        public override Task <decimal> UpdateBalanceAsync(string ownerId, string ownerType, decimal amount, string _)
        {
            return(m_Dispatcher.EnqueueV2(async() =>
            {
                var balance = await m_UserDataStore.GetUserDataAsync <decimal?>(ownerId, ownerType, TableName) ??
                              DefaultBalance;

                var newBalance = balance + amount;
                if (newBalance < 0)
                {
                    throw new NotEnoughBalanceException(
                        m_StringLocalizer["economy:fail:not_enough_balance",
                                          new { Amount = amount, Balance = balance, EconomyProvider = (IEconomyProvider)this }],
                        balance);
                }

                await m_UserDataStore.SetUserDataAsync(ownerId, ownerType, TableName, balance);
                return balance;
            }));
        }
コード例 #10
0
 private Task SaveConfigAsync(ITargetConfig config, CancellationToken cancellationToken = default)
 {
     if (config is GroupConfig groupConfig)
     {
         return(_groupConfigStore.SetGroupConfigAsync(groupConfig, cancellationToken));
     }
     else if (config is UserData userData)
     {
         return(_userDataStore.SetUserDataAsync(userData, cancellationToken));
     }
     return(Task.CompletedTask);
 }
コード例 #11
0
        private async Task <bool> SaveUserDataAsync(CommandContext context, UserData data, CancellationToken cancellationToken = default)
        {
            try
            {
                await _userDataStore.SetUserDataAsync(data, false, cancellationToken).ConfigureAwait(false);

                return(true);
            }
            catch (Exception ex) when(ex.LogAsError(_log, "Failed saving notes for user {UserID} in the database", data.ID))
            {
                await context.ReplyTextAsync("/alert Failed saving notes in the database.", cancellationToken).ConfigureAwait(false);

                return(false);
            }
        }
コード例 #12
0
        public override Task <decimal> UpdateBalanceAsync(string ownerId, string ownerType, decimal amount, string _)
        {
            var tcs = new TaskCompletionSource <decimal>();

            m_EconomyDispatcher.Enqueue(async() =>
            {
                var balance = await m_UserDataStore.GetUserDataAsync <decimal?>(ownerId, ownerType, TableName) ??
                              DefaultBalance;

                var newBalance = balance + amount;
                if (newBalance < 0)
                {
                    throw new NotEnoughBalanceException(
                        StringLocalizer["economy:fail:not_enough_balance",
                                        new { Balance = balance - amount, CurrencySymbol }], balance);
                }

                await m_UserDataStore.SetUserDataAsync(ownerId, ownerType, TableName, balance);

                tcs.SetResult(balance);
            });

            return(tcs.Task);
        }
コード例 #13
0
ファイル: CDeleteHome.cs プロジェクト: Kr4ken-9/NewEssentials
        protected override async UniTask OnExecuteAsync()
        {
            if (Context.Parameters.Length < 1 || Context.Parameters.Length > 2)
            {
                throw new CommandWrongUsageException(Context);
            }

            if (Context.Parameters.Length == 1 && Context.Actor.Type != KnownActorTypes.Player)
            {
                throw new CommandWrongUsageException(Context);
            }

            if (Context.Parameters.Length == 2 && await CheckPermissionAsync("others") == PermissionGrantResult.Deny)
            {
                throw new NotEnoughPermissionException(Context, "others");
            }

            var uPlayer = Context.Parameters.Length == 1
                 ? (UnturnedUser)Context.Actor
                 : await Context.Parameters.GetAsync <UnturnedUser>(0);

            if (uPlayer == null)
            {
                throw new UserFriendlyException(m_StringLocalizer["commands:failed_player", new { Player = Context.Parameters[0] }]);
            }

            UserData userData = await m_UserDataStore.GetUserDataAsync(uPlayer.Id, uPlayer.Type);

            if (!userData.Data.ContainsKey("homes"))
            {
                throw new UserFriendlyException(m_StringLocalizer["home:no_home"]);
            }

            var    homes    = (Dictionary <object, object>)userData.Data["homes"];
            string homeName = Context.Parameters[0];

            if (!homes.ContainsKey(homeName))
            {
                throw new UserFriendlyException(m_StringLocalizer["home:invalid_home", new { Home = homeName }]);
            }

            homes.Remove(homeName);
            userData.Data["homes"] = homes;

            await m_UserDataStore.SetUserDataAsync(userData);

            await uPlayer.PrintMessageAsync(m_StringLocalizer["home:delete", new { Home = homeName }]);
        }
コード例 #14
0
        public async Task SavePersistentDataAsync <T>(string key, T data)
        {
            var userData = await m_UserDataStore.GetUserDataAsync(Id, Type);

            userData.Data ??= new Dictionary <string, object>();
            if (userData.Data.ContainsKey(key))
            {
                userData.Data[key] = data;
            }
            else
            {
                userData.Data.Add(key, data);
            }

            await m_UserDataStore.SetUserDataAsync(userData);
        }
コード例 #15
0
        public async Task SavePersistentDataAsync <T>(string key, T?data)
        {
            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentException(nameof(key));
            }

            var userData = await m_UserDataStore.GetUserDataAsync(Id, Type) ?? new UserData();

            userData.Data ??= new Dictionary <string, object?>();
            if (userData.Data.ContainsKey(key))
            {
                userData.Data[key] = data;
            }
            else
            {
                userData.Data.Add(key, data);
            }

            await m_UserDataStore.SetUserDataAsync(userData);
        }
コード例 #16
0
        public async Task <bool> BanAsync(IUser user, IUser?instigator = null, string?reason = null, DateTime?expireDate = null)
        {
            if (expireDate.HasValue && expireDate.Value < DateTime.Now)
            {
                return(false);
            }

            var data = await m_UserDataStore.GetUserDataAsync(user.Id, user.Type);

            if (data == null)
            {
                return(false);
            }

            expireDate ??= DateTime.MaxValue;
            reason ??= m_StringLocalizer["ban_default"];
            data.BanInfo = new BanData(reason, instigator, expireDate);

            await m_UserDataStore.SetUserDataAsync(data);

            return(true);
        }
コード例 #17
0
        public async Task HandleEventAsync(object sender, UnturnedPlayerDeathEvent @event)
        {
            await UniTask.SwitchToMainThread();

            var id       = @event.Player.EntityInstanceId;
            var position = @event.Player.Transform.Position.ToSerializableVector();

            UniTask.RunOnThreadPool(async() =>
            {
                var userData = await m_UserDataStore.GetUserDataAsync(id, KnownActorTypes.Player);
                if (userData == null)
                {
                    var displayName = @event.Player.SteamPlayer.playerID.characterName;

                    await m_UserDataSeeder.SeedUserDataAsync(id, KnownActorTypes.Player, displayName,
                                                             new() { { "deathLocation", position } });

                    return;
                }

                userData.Data["deathLocation"] = position;
                await m_UserDataStore.SetUserDataAsync(userData);
            }).Forget();
        }
コード例 #18
0
        protected override async UniTask OnExecuteAsync()
        {
            if (Context.Parameters.Length > 1)
            {
                throw new CommandWrongUsageException(Context);
            }

            UnturnedUser uPlayer  = (UnturnedUser)Context.Actor;
            UserData     userData = await m_UserDataStore.GetUserDataAsync(uPlayer.Id, uPlayer.Type);

            if (!userData.Data.ContainsKey("homes"))
            {
                userData.Data.Add("homes", new Dictionary <string, SerializableVector3>());
            }

            var homes         = (Dictionary <object, object>)userData.Data["homes"];
            int amountOfHomes = homes.Count;

            // If this is the user's first home, or they have permission to make infinite homes, then skip the check
            if (amountOfHomes != 0 && await CheckPermissionAsync("infinite") == PermissionGrantResult.Deny)
            {
                bool any = false;
                for (int i = amountOfHomes; i < 11; i++)
                {
                    // No logic unless it finds a permission with a number to limit homes
                    if (await CheckPermissionAsync(i.ToString()) == PermissionGrantResult.Deny)
                    {
                        continue;
                    }

                    any = true;

                    if (i > amountOfHomes)
                    {
                        break;
                    }

                    throw new UserFriendlyException(m_StringLocalizer["home:too_many"]);
                }

                // If there is no permission, only allow 1 home
                if (!any)
                {
                    throw new UserFriendlyException(m_StringLocalizer["home:too_many"]);
                }
            }

            if (Context.Parameters.Length == 0)
            {
                homes["home"]          = uPlayer.Player.Player.transform.position.ToSerializableVector();
                userData.Data["homes"] = homes;

                await m_UserDataStore.SetUserDataAsync(userData);

                await uPlayer.PrintMessageAsync(m_StringLocalizer["home:set", new { Home = "home" }]);
            }
            else
            {
                string home = Context.Parameters[0];
                homes[home]            = uPlayer.Player.Player.transform.position.ToSerializableVector();
                userData.Data["homes"] = homes;

                await m_UserDataStore.SetUserDataAsync(userData);

                await uPlayer.PrintMessageAsync(m_StringLocalizer["home:set", new { Home = home }]);
            }
        }
コード例 #19
0
 public static Task SetUserDataAsync(this IUserDataStore store, UserData data, CancellationToken cancellationToken = default)
 => store.SetUserDataAsync(data, true, cancellationToken);