private RolePermissions VanillaApplyMappings(DiscordRole Role)
        {
            PermissionMapping mapping = PermissionMapping.Deserialize("complete");

            foreach (KeyValuePair <Int64, String[]> v in mapping.Mappings)
            {
                if (Role.CheckPermission((DSharpPlus.Permissions)v.Key) == PermissionLevel.Allowed)
                {
                    GrantRolePermissions(Role.Id, v.Value);
                }
            }

            return(RolePermissions.Deserialize(Role.Id));
        }
        private static Boolean ShouldUpdateMappings()
        {
            if (!File.Exists("./config/permissions/mappings.json"))
            {
                File.Create("./config/permissions/mappings.json").Close();
                return(true);
            }

            if (!File.Exists("./cache/permissions/intermediate/mappings"))
            {
                File.Create("./cache/permissions/intermediate/mappings").Close();
                return(true);
            }

            StreamReader      reader   = new("./config/permissions/vanilla.mappings.json");
            PermissionMapping mappings = JsonConvert.DeserializeObject <PermissionMapping>(reader.ReadToEnd());

            reader.Close();

            IEnumerable <String> modFiles = from x in Directory.GetFiles("./mod-data/permissions/mappings")
                                            where x.EndsWith(".mappings.json")
                                            select x;

            foreach (String v in modFiles)
            {
                reader    = new(v);
                mappings += JsonConvert.DeserializeObject <PermissionMapping>(reader.ReadToEnd());
                reader.Close();
            }

            reader = new("./config/permissions/mappings.json");

            if (mappings != JsonConvert.DeserializeObject <PermissionMapping>(reader.ReadToEnd()))
            {
                reader.Close();
                return(true);
            }

            return(false);
        }
        private static void UpdateMappings()
        {
            StreamReader      reader   = new("./config/permissions/vanilla.mappings.json");
            PermissionMapping mappings = JsonConvert.DeserializeObject <PermissionMapping>(reader.ReadToEnd());

            reader.Close();

            IEnumerable <String> modFiles = from x in Directory.GetFiles("./mod-data/permissions/mappings")
                                            where x.EndsWith(".mappings.json")
                                            select x;

            foreach (String v in modFiles)
            {
                reader    = new(v);
                mappings += JsonConvert.DeserializeObject <PermissionMapping>(reader.ReadToEnd());
                reader.Close();
            }

            StreamWriter writer = new($"./config/permissions/mappings.json");

            writer.Write(JsonConvert.SerializeObject(mappings));
            writer.Close();

            List <String> checksums = new();

            checksums.Add("./config/permissions/vanilla.mappings.json".GetSHA512Checksum());

            foreach (String v in modFiles)
            {
                checksums.Add(v.GetSHA512Checksum());
            }

            writer = new("./cache/permissions/intermediate/mappings");
            writer.Write(JsonConvert.SerializeObject(checksums));
            writer.Flush();
            writer.Close();
        }
        private static PermissionMapping LoadMappings()
        {
            PermissionMapping mapping = PermissionMapping.Deserialize("complete");

            return(mapping + PermissionMappingOverrides.Deserialize());
        }
        private static void Initialize()
        {
            if (!Directory.Exists("./config/permissions"))
            {
                Console.WriteLine("Missing permission configuration, aborting startup. Please contact the InsanityBot team immediately" +
                                  "\nPress any key to continue...");
                Console.ReadKey();
                Process.GetCurrentProcess().Kill();
            }

            // check for default mappings and declarations
            if (!File.Exists("./config/permissions/vanilla.mappings.json"))
            {
                Console.WriteLine("Missing vanilla permission mappings, aborting startup. Please contact the InsanityBot team immediately" +
                                  "\nPress any key to continue...");
                Console.ReadKey();
                Process.GetCurrentProcess().Kill();
            }

            if (!File.Exists("./config/permissions/vanilla.pdecl.json"))
            {
                Console.WriteLine("Missing vanilla permission declaration, aborting startup. Please contact the InsanityBot team immediately" +
                                  "\nPress any key to continue...");
                Console.ReadKey();
                Process.GetCurrentProcess().Kill();
            }

            // create role directory
            if (!Directory.Exists(DefaultPermissionFileSpecifications.Role.Path))
            {
                Directory.CreateDirectory(DefaultPermissionFileSpecifications.Role.Path);
            }

            // create script directory
            if (!Directory.Exists(DefaultPermissionFileSpecifications.Script.Path))
            {
                Directory.CreateDirectory(DefaultPermissionFileSpecifications.Script.Path);
            }

            // create mapping directory
            if (!Directory.Exists("./mod-data/permissions/mappings"))
            {
                Directory.CreateDirectory("./mod-data/permissions/mappings");
            }

            // create declaration directory
            if (!Directory.Exists("./mod-data/permissions/declarations"))
            {
                Directory.CreateDirectory("./mod-data/permissions/declarations");
            }

            // create intermediary directory
            if (!Directory.Exists("./cache/permissions/intermediate"))
            {
                Directory.CreateDirectory("./cache/permissions/intermediate");
            }

            // check whether default permissions are up-to-date
            if (ShouldUpdateDefaultPermissions())
            {
                UpdateDefaultPermissions();
            }

            // check whether mappings are up-to-date
            if (ShouldUpdateMappings())
            {
                UpdateMappings();
            }

            // apply overrides to default and mappings
            DefaultPermissions.Serialize(LoadDefaultPermissions());

            PermissionMapping toSerialize = LoadMappings();
            StreamWriter      writer      = new("./config/permissions/mappings.json");

            writer.Write(JsonConvert.SerializeObject(toSerialize));
            writer.Close();
        }