private void LoadOrCreatePermissionFile()
        {
            if (!MyAPIGateway.Utilities.FileExistsInLocalStorage(PermissionFileName, typeof(ServerConfig)))
            {
                Permissions = new Permissions()
                {
                    Commands = new List<CommandStruct>(),
                    Groups = new List<PermissionGroup>(),
                    Players = new List<PlayerPermission>()
                };

                foreach (ChatCommand command in ChatCommands)
                {
                    Permissions.Commands.Add(new CommandStruct()
                    {
                        Name = command.Name,
                        NeededLevel = command.Security
                    });
                }

                SavePermissionFile();
                Logger.Debug("Permission File created.");
                return;
            }

            TextReader reader = MyAPIGateway.Utilities.ReadFileInLocalStorage(PermissionFileName, typeof(ServerConfig));
            var text = reader.ReadToEnd();
            reader.Close();

            Permissions = MyAPIGateway.Utilities.SerializeFromXML<Permissions>(text);

            //create a copy of the commands in the file
            var invalidCommands = new List<CommandStruct>(Permissions.Commands);

            foreach (ChatCommand command in ChatCommands)
            {
                if (!Permissions.Commands.Any(c => c.Name.Equals(command.Name)))
                {
                    //add a command if it does not exist
                    Permissions.Commands.Add(new CommandStruct()
                    {
                        Name = command.Name,
                        NeededLevel = command.Security
                    });
                }
                else
                {
                    //remove all commands from the list, that are valid
                    invalidCommands.Remove(Permissions.Commands.First(c => c.Name.Equals(command.Name)));
                }
            }

            foreach (CommandStruct cmdStruct in invalidCommands)
            {
                // remove all invalid commands
                Permissions.Commands.Remove(cmdStruct);

                // clean up the player permissions
                var extentions = new List<PlayerPermission>(Permissions.Players.Where(p => p.Extensions.Any(c => c.Equals(cmdStruct.Name))));
                var restrictions = new List<PlayerPermission>(Permissions.Players.Where(p => p.Restrictions.Any(c => c.Equals(cmdStruct.Name))));

                foreach (PlayerPermission playerPermission in extentions)
                {
                    var i = Permissions.Players.IndexOf(playerPermission);
                    var player = Permissions.Players[i];
                    Permissions.Players.RemoveAt(i);
                    player.Extensions.Remove(cmdStruct.Name);
                    Permissions.Players.Insert(i, playerPermission);
                }

                foreach (PlayerPermission playerPermission in restrictions)
                {
                    var i = Permissions.Players.IndexOf(playerPermission);
                    var player = Permissions.Players[i];
                    Permissions.Players.RemoveAt(i);
                    player.Restrictions.Remove(cmdStruct.Name);
                    Permissions.Players.Insert(i, player);
                }

                // if the struct used an alias, we add it again properly while keeping the previous level
                // this might be because we changed the name of an command and keep the old as an alias to not confuse the users
                if (ChatCommands.Any(c => c.Commands.Any(s => s.Substring(1).Equals(cmdStruct.Name))))
                {
                    var command = ChatCommands.First(c => c.Commands.Any(s => s.Substring(1).Equals(cmdStruct.Name)));

                    // remove all commands with the same name as we might have added it already asuming it is new
                    Permissions.Commands.RemoveAll(c => c.Name.Equals(command.Name));

                    Permissions.Commands.Add(new CommandStruct()
                    {
                        Name = command.Name,
                        NeededLevel = cmdStruct.NeededLevel
                    });

                    foreach (PlayerPermission playerPermission in extentions)
                    {
                        var i = Permissions.Players.IndexOf(Permissions.Players.First(p => p.Player.SteamId == playerPermission.Player.SteamId));
                        var player = Permissions.Players[i];
                        Permissions.Players.RemoveAt(i);
                        player.Extensions.Add(command.Name);
                        Permissions.Players.Insert(i, player);
                    }

                    foreach (PlayerPermission playerPermission in restrictions)
                    {
                        var i = Permissions.Players.IndexOf(Permissions.Players.First(p => p.Player.SteamId == playerPermission.Player.SteamId));
                        var player = Permissions.Players[i];
                        Permissions.Players.RemoveAt(i);
                        player.Restrictions.Add(command.Name);
                        Permissions.Players.Insert(i, player);
                    }
                }
            }

            Logger.Debug("Permission File loaded {0} commands.", Permissions.Commands.Count);

            // for better readability we sort it, first by level then by name
            Permissions.Commands = new List<CommandStruct>(Permissions.Commands.OrderByDescending(c => c.NeededLevel).ThenBy(c => c.Name));

            SavePermissionFile();
            return;
        }
        private void LoadOrCreatePermissionFile()
        {
            if (!MyAPIGateway.Utilities.FileExistsInLocalStorage(PermissionFileName, typeof(ServerConfig)))
            {
                Permissions = new Permissions()
                {
                    Commands = new List<CommandStruct>(),
                    Groups = new List<PermissionGroup>(),
                    Players = new List<PlayerPermission>()
                };

                foreach (ChatCommand command in ChatCommands)
                {
                    Permissions.Commands.Add(new CommandStruct()
                    {
                        Name = command.Name,
                        NeededLevel = command.Security
                    });
                }

                SavePermissionFile();
                return;
            }

            TextReader reader = MyAPIGateway.Utilities.ReadFileInLocalStorage(PermissionFileName, typeof(ServerConfig));
            var text = reader.ReadToEnd();
            reader.Close();

            Permissions = MyAPIGateway.Utilities.SerializeFromXML<Permissions>(text);

            //create a copy of the commands in the file
            var invalidCommands = new List<CommandStruct>(Permissions.Commands);

            foreach (ChatCommand command in ChatCommands)
            {
                if (!Permissions.Commands.Any(c => c.Name.Equals(command.Name)))
                {
                    //add a command if it does not exist
                    Permissions.Commands.Add(new CommandStruct()
                    {
                        Name = command.Name,
                        NeededLevel = command.Security
                    });
                }
                else
                {
                    //remove all commands from the list, that are valid
                    invalidCommands.Remove(Permissions.Commands.First(c => c.Name.Equals(command.Name)));
                }
            }

            foreach (CommandStruct cmdStruct in invalidCommands)
            {
                //remove all invalid commands
                Permissions.Commands.Remove(cmdStruct);
            }

            SavePermissionFile();
            return;
        }