public void AddGroup(string group, DateTime expireDate)
            {
                ExpiringAccessValue existingAccess = _groups.FirstOrDefault(g => g.Value == group);

                if (existingAccess != null)
                {
                    Interface.CallHook("OnTimedGroupExtended", Id, group, existingAccess.ExpireDate - DateTime.UtcNow);

                    existingAccess.ExpireDate += expireDate - DateTime.UtcNow;

                    _plugin.Puts($"{Name} ({Id}) - Group time extended: {group} to {existingAccess.ExpireDate - DateTime.UtcNow}");
                }
                else
                {
                    Interface.CallHook("OnTimedGroupAdded", Id, group, expireDate - DateTime.UtcNow);

                    _groups.Add(new ExpiringAccessValue(group, expireDate));

                    _plugin.permission.AddUserGroup(Id, group);

                    _plugin.Puts($"{Name} ({Id}) - Added to group: {group} for {expireDate - DateTime.UtcNow}");
                }

                SaveData(_playerInformationCollection);
            }
            public void AddPermission(string permission, DateTime expireDate)
            {
                ExpiringAccessValue existingAccess = _permissions.FirstOrDefault(p => p.Value == permission);

                if (existingAccess != null)
                {
                    Interface.CallHook("OnTimedPermissionExtended", Id, permission, existingAccess.ExpireDate - DateTime.UtcNow);

                    existingAccess.ExpireDate += expireDate - DateTime.UtcNow;

                    _plugin.Puts($"{Name} ({Id}) - Permission time extended: {permission} to {existingAccess.ExpireDate - DateTime.UtcNow}");
                }
                else
                {
                    Interface.CallHook("OnTimedPermissionGranted", Id, permission, expireDate - DateTime.UtcNow);

                    _permissions.Add(new ExpiringAccessValue(permission, expireDate));

                    _plugin.permission.GrantUserPermission(Id, permission, null);

                    _plugin.Puts($"{Name} ({Id}) - Permission granted: {permission} for {expireDate - DateTime.UtcNow}");
                }

                SaveData(_playerInformationCollection);
            }
            public void RemovePermission(string permission)
            {
                ExpiringAccessValue accessValue = _permissions.FirstOrDefault(p => p.Value == permission);

                if (accessValue == null)
                {
                    throw new ArgumentException("Player does not have access to the given permission", nameof(permission));
                }

                _permissions.Remove(accessValue);
                _plugin.permission.RevokeUserPermission(Id, accessValue.Value);

                _plugin.Puts($"{Name} ({Id}) - Permission removed: {accessValue.Value}");

                if (_groups.Count == 0 && _permissions.Count == 0)
                {
                    _playerInformationCollection.Remove(this);
                }

                SaveData(_playerInformationCollection);
            }