/// <summary>
 /// Global method that is triggered for any <see cref="ServerAccessor"/> inherited classes once a client leaves the server
 /// </summary>
 /// <param name="playerSession"></param>
 /// <param name="reason"></param>
 public void OnPlayerDisconnect(Session.Session playerSession, string reason)
 {
     var playerJob = stringToJob(playerSession.GetGlobalData("Character.Job", "Civillian"));
     //if (playerJob == JobType.EMS || playerJob == JobType.Police || playerJob == JobType.Mechanic)
     {
         ACEWrappers.RemovePrivellagedUser($"{Server.CurrentIdentifier}:{playerSession.GetLocalData<string>("User.SteamID")}", playerJob);
     }
 }
        /// <summary>
        /// Sets a players job
        /// </summary>
        /// <param name="playerSession">Session of the target player</param>
        /// <param name="jobType">New job of the specified player</param>
        public void SetPlayerJob(Session.Session playerSession, JobType jobType)
        {
            var previousJob = GetPlayerJob(playerSession);

            //if (previousJob == JobType.Police || previousJob == JobType.EMS)
            {
                ACEWrappers.RemovePrivellagedUser($"{Server.CurrentIdentifier}:{playerSession.SteamIdentifier}", previousJob);
            }

            //if (jobType == JobType.Police || jobType == JobType.EMS)
            {
                ACEWrappers.AddPrivellagedUser($"{Server.CurrentIdentifier}:{playerSession.SteamIdentifier}", jobType);
            }

            playerSession.SetGlobalData("Character.Job", jobType.ToString());
            Log.Verbose($"Set the job type of {playerSession.PlayerName} to {jobType.ToString()}");
        }
        // Used for remote job setting from client (not really for emergency services however appropiate permission levels can use this way)
        private void OnRemoteJobSet([FromSource] Player source, string jobType)
        {
            var playerSession = Sessions.GetPlayer(source);

            if (playerSession == null)
            {
                return;
            }

            var newJobType      = stringToJob(jobType);
            var previousJobType = stringToJob(playerSession.GetGlobalData("Character.Job", "Civillian"));

            if (newJobType == JobType.EMS || newJobType == JobType.Police)
            {
                if (playerSession.GetLocalData("User.PermissionLevel", AdminLevel.User) >= AdminLevel.Moderator)
                {
                    playerSession.SetGlobalData("Character.Job", newJobType.ToString());
                    ACEWrappers.RemovePrivellagedUser($"{Server.CurrentIdentifier}:{playerSession.SteamIdentifier}", previousJobType);
                    ACEWrappers.AddPrivellagedUser($"{Server.CurrentIdentifier}:{playerSession.SteamIdentifier}", newJobType);
                    Log.Verbose($"Set the job type of {source.Name} to {newJobType.ToString()}");
                }
                else
                {
                    Log.Verbose($"{source.Name} tried to set their job to {newJobType.ToString()} but didn't have the correct permission level to do so");
                }
                return;
            }

            if (previousJobType == JobType.EMS || previousJobType == JobType.Police)
            {
                playerSession.SetGlobalData("Character.Temp.Job", newJobType.ToString());
                if (newJobType == JobType.Civillian)
                {
                    playerSession.SetGlobalData("Character.Temp.Job", previousJobType.ToString());
                    newJobType = previousJobType;
                }
            }
            else
            {
                playerSession.SetGlobalData("Character.Job", newJobType.ToString());
            }

            ACEWrappers.RemovePrivellagedUser($"{Server.CurrentIdentifier}:{playerSession.SteamIdentifier}", previousJobType);
            ACEWrappers.AddPrivellagedUser($"{Server.CurrentIdentifier}:{playerSession.SteamIdentifier}", newJobType);
            Log.Verbose($"Set the job type of {source.Name} to {newJobType.ToString()}");
        }
        public static void RegisterJobCommand(string commandName, Action <Command> commandFunc, JobType requiredLevel, bool skipDutyCheck = false)
        {
            var jobTypes = Enum.GetValues(typeof(JobType)).Cast <JobType>().ToList();

            jobTypes.ForEach(o =>
            {
                if (requiredLevel.ToString().Contains(o.ToString()))
                {
                    var dutyFunc = new Action <Command>(cmd =>
                    {
                        if (Server.Server.Instance.Get <JobHandler>().OnDutyAs(cmd.Session, requiredLevel) || skipDutyCheck)
                        {
                            commandFunc(cmd);
                        }
                    });
                    ACEWrappers.CreateRestrictedCommand(commandName, dutyFunc, o, true);
                }
            });
        }
        private void SetPermissionLevel(Command cmd)
        {
            var player      = cmd.GetArgAs <int>(0);
            var targetLevel = cmd.GetArgAs(1, AdminLevel.User);

            if (player == cmd.Source)
            {
                return;
            }

            var playerSession = Sessions.GetPlayer(player);

            if (playerSession == null)
            {
                return;
            }

            var currentLevel = playerSession.GetLocalData("User.PermissionLevel", AdminLevel.User);

            playerSession.SetLocalData("User.PermissionLevel", targetLevel);
            ACEWrappers.RemovePrivellagedUser($"steam:{playerSession.SteamIdentifier}", currentLevel);
            ACEWrappers.AddPrivellagedUser($"steam:{playerSession.SteamIdentifier}", targetLevel);
            Log.Info($"Set the permission level of {playerSession.Source.Name} from {currentLevel.ToString().AddSpacesToCamelCase()} to {targetLevel.ToString().AddSpacesToCamelCase()}");
        }
 public static void RegisterAdminCommand(string commandName, Action <Command> commandFunc, AdminLevel requiredLevel)
 {
     ACEWrappers.CreateRestrictedCommand(commandName, commandFunc, requiredLevel);
 }