┌─ GO ───────────────────────────────────────────────────────────────────────┐
│ package blizzard │
│ │
│ import ( │
│ "fmt" │
│ "strconv" │
│ "strings" │
│ ) │
│ │
│ // GetHardcodedPeriodAndDungeons returns the primary period ID and dungeon list │
│ // hardcoded values since the index endpoint is broken - most records are in perio │
│ d 1026 │
│ func GetHardcodedPeriodAndDungeons() (string, []DungeonInfo) { │
│ periodID := "1036" │
│ │
│ dungeons := []DungeonInfo{ │
│ {ID: 2, Name: "Temple of the Jade Serpent", Slug: "temple-of-the-jade-serpent"}, │
│ {ID: 56, Name: "Stormstout Brewery", Slug: "stormstout-brewery"}, │
│ {ID: 57, Name: "Gate of the Setting Sun", Slug: "gate-of-the-setting-sun"}, │
│ {ID: 58, Name: "Shado-Pan Monastery", Slug: "shado-pan-monastery"}, │
│ {ID: 59, Name: "Siege of Niuzao Temple", Slug: "siege-of-niuzao-temple"}, │
│ {ID: 60, Name: "Mogu'shan Palace", Slug: "mogu-shan-palace"}, │
│ {ID: 76, Name: "Scholomance", Slug: "scholomance"}, │
│ {ID: 77, Name: "Scarlet Halls", Slug: "scarlet-halls"}, │
│ {ID: 78, Name: "Scarlet Monastery", Slug: "scarlet-monastery"}, │
│ } │
│ │
│ return periodID, dungeons │
│ } │
│ │
│ // GetAllRealms returns the complete realm configuration │
│ // this data comes from nix/api/realm.nix │
│ func GetAllRealms() map[string]RealmInfo { │
│ return map[string]RealmInfo{ │
│ // us realms │
│ "atiesh": {ID: 4372, Region: "us", Name: "Atiesh", Slug: "atiesh"} │
│ , │
│ "myzrael": {ID: 4373, Region: "us", Name: "Myzrael", Slug: "myzrael │
│ "}, │
│ "old-blanchy": {ID: 4374, Region: "us", Name: "Old Blanchy", Slug: "old │
│ -blanchy"}, │
│ "azuresong": {ID: 4376, Region: "us", Name: "Azuresong", Slug: "azure │
│ song"}, │
│ "mankrik": {ID: 4384, Region: "us", Name: "Mankrik", Slug: "mankrik │
│ "}, │
│ "pagle": {ID: 4385, Region: "us", Name: "Pagle", Slug: "pagle"}, │
│ "ashkandi": {ID: 4387, Region: "us", Name: "Ashkandi", Slug: "ashkan │
│ di"}, │
│ "westfall": {ID: 4388, Region: "us", Name: "Westfall", Slug: "westfa │
│ ll"}, │
│ "whitemane": {ID: 4395, Region: "us", Name: "Whitemane", Slug: "white │
│ mane"}, │
│ "faerlina": {ID: 4408, Region: "us", Name: "Faerlina", Slug: "faerli │
│ na"}, │
│ "grobbulus": {ID: 4647, Region: "us", Name: "Grobbulus", Slug: "grobb │
│ ulus"}, │
│ "bloodsail-buccaneers": {ID: 4648, Region: "us", Name: "Bloodsail Buccaneers", S │
│ lug: "bloodsail-buccaneers"}, │
│ // OCE realms are served under US region with -au slug suffix │
│ "remulos-au": {ID: 4667, Region: "us", Name: "Remulos (AU)", Slug: "remulos-au" │
│ }, │
│ "arugal-au": {ID: 4669, Region: "us", Name: "Arugal (AU)", Slug: "arugal-au"}, │
│ "yojamba-au": {ID: 4670, Region: "us", Name: "Yojamba (AU)", Slug: "yojamba-au" │
│ }, │
│ "skyfury": {ID: 4725, Region: "us", Name: "Skyfury", Slug: "skyfury"}, │
│ "sulfuras": {ID: 4726, Region: "us", Name: "Sulfuras", Slug: "sulfuras"}, │
│ "windseeker": {ID: 4727, Region: "us", Name: "Windseeker", Slug: "windseeker"}, │
│ "benediction": {ID: 4728, Region: "us", Name: "Benediction", Slug: "benediction" │
│ }, │
│ "earthfury": {ID: 4731, Region: "us", Name: "Earthfury", Slug: "earthfury"}, │
│ "maladath": {ID: 4738, Region: "us", Name: "Maladath", Slug: "maladath"}, │
│ "angerforge": {ID: 4795, Region: "us", Name: "Angerforge", Slug: "angerforge"}, │
│ "eranikus": {ID: 4800, Region: "us", Name: "Eranikus", Slug: "eranikus"}, │
│ // New US realms (MoP Classic launch wave) - child realms connecting to Pagle │
│ "nazgrim": {ID: 6359, Region: "us", Name: "Nazgrim", Slug: "nazgrim", ParentRe │
│ almSlug: "pagle"}, │
│ "galakras": {ID: 6360, Region: "us", Name: "Galakras", Slug: "galakras", Parent │
│ RealmSlug: "pagle"}, │
│ "raden": {ID: 6361, Region: "us", Name: "Ra-den", Slug: "raden", ParentRealm │
│ Slug: "pagle"}, │
│ "lei-shen": {ID: 6362, Region: "us", Name: "Lei Shen", Slug: "lei-shen", Parent │
│ RealmSlug: "pagle"}, │
│ "immerseus": {ID: 6363, Region: "us", Name: "Immerseus", Slug: "immerseus", Pare │
│ ntRealmSlug: "pagle"}, │
│ │
│ // eu realms │
│ "everlook": {ID: 4440, Region: "eu", Name: "Everlook", Slug: "everlo │
│ ok"}, │
│ "auberdine": {ID: 4441, Region: "eu", Name: "Auberdine", Slug: "auber │
│ dine"}, │
│ "lakeshire": {ID: 4442, Region: "eu", Name: "Lakeshire", Slug: "lakes │
│ hire"}, │
│ "chromie": {ID: 4452, Region: "eu", Name: "Chromie", Slug: "chromie │
│ "}, │
│ "pyrewood-village": {ID: 4453, Region: "eu", Name: "Pyrewood Village", Slug: │
│ "pyrewood-village"}, │
│ "mirage-raceway": {ID: 4454, Region: "eu", Name: "Mirage Raceway", Slug: " │
│ mirage-raceway"}, │
│ "razorfen": {ID: 4455, Region: "eu", Name: "Razorfen", Slug: "razorf │
│ en"}, │
│ "nethergarde-keep": {ID: 4456, Region: "eu", Name: "Nethergarde Keep", Slug: │
│ "nethergarde-keep"}, │
│ "sulfuron": {ID: 4464, Region: "eu", Name: "Sulfuron", Slug: "sulfur │
│ on"}, │
│ "golemagg": {ID: 4465, Region: "eu", Name: "Golemagg", Slug: "golema │
│ gg"}, │
│ "patchwerk": {ID: 4466, Region: "eu", Name: "Patchwerk", Slug: "patch │
│ werk"}, │
│ "firemaw": {ID: 4467, Region: "eu", Name: "Firemaw", Slug: "firemaw │
│ "}, │
│ "flamegor": {ID: 4474, Region: "eu", Name: "Flamegor", Slug: "flameg │
│ or"}, │
│ "gehennas": {ID: 4476, Region: "eu", Name: "Gehennas", Slug: "gehenn │
│ as"}, │
│ "venoxis": {ID: 4477, Region: "eu", Name: "Venoxis", Slug: "venoxis │
│ "}, │
│ "hydraxian-waterlords": {ID: 4678, Region: "eu", Name: "Hydraxian Waterlords", S │
│ lug: "hydraxian-waterlords"}, │
│ "mograine": {ID: 4701, Region: "eu", Name: "Mograine", Slug: "mograi │
│ ne"}, │
│ "amnennar": {ID: 4703, Region: "eu", Name: "Amnennar", Slug: "amnenn │
│ ar"}, │
│ "ashbringer": {ID: 4742, Region: "eu", Name: "Ashbringer", Slug: "ashb │
│ ringer"}, │
│ "transcendence": {ID: 4745, Region: "eu", Name: "Transcendence", Slug: "t │
│ ranscendence"}, │
│ "earthshaker": {ID: 4749, Region: "eu", Name: "Earthshaker", Slug: "ear │
│ thshaker"}, │
│ "giantstalker": {ID: 4811, Region: "eu", Name: "Giantstalker", Slug: "gi │
│ antstalker"}, │
│ "mandokir": {ID: 4813, Region: "eu", Name: "Mandokir", Slug: "mandok │
│ ir"}, │
│ "thekal": {ID: 4815, Region: "eu", Name: "Thekal", Slug: "thekal"} │
│ , │
│ "jindo": {ID: 4816, Region: "eu", Name: "Jin'do", Slug: "jindo"}, │
│ // New EU realms (MoP Classic launch wave) - child realms connecting to Mirage R │
│ aceway and Everlook │
│ "shekzeer": {ID: 6364, Region: "eu", Name: "Shek'zeer", Slug: "shekzeer", Paren │
│ tRealmSlug: "mirage-raceway"}, │
│ "garalon": {ID: 6365, Region: "eu", Name: "Garalon", Slug: "garalon", ParentRe │
│ almSlug: "mirage-raceway"}, │
│ "norushen": {ID: 6366, Region: "eu", Name: "Norushen", Slug: "norushen", Parent │
│ RealmSlug: "mirage-raceway"}, │
│ "hoptallus": {ID: 6367, Region: "eu", Name: "Hoptallus", Slug: "hoptallus", Pare │
│ ntRealmSlug: "mirage-raceway"}, │
│ "ook-ook": {ID: 6368, Region: "eu", Name: "Ook Ook", Slug: "ook-ook", ParentRe │
│ almSlug: "everlook"}, │
│ │
│ // kr realms │
│ "shimmering-flats": {ID: 4417, Region: "kr", Name: "Shimmering Flats", Slug: "sh │
│ immering-flats"}, │
│ "lokholar": {ID: 4419, Region: "kr", Name: "Lokholar", Slug: "lokholar"} │
│ , │
│ "iceblood": {ID: 4420, Region: "kr", Name: "Iceblood", Slug: "iceblood"} │
│ , │
│ "ragnaros": {ID: 4421, Region: "kr", Name: "Ragnaros", Slug: "ragnaros"} │
│ , │
│ "frostmourne": {ID: 4840, Region: "kr", Name: "Frostmourne", Slug: "frostmo │
│ urne"}, │
│ │
│ // tw realms (exclude PTR realms TW4 CWOW GMSS 1/2) │
│ "maraudon": {ID: 4485, Region: "tw", Name: "Maraudon", Slug: "maraudon"}, │
│ "ivus": {ID: 4487, Region: "tw", Name: "Ivus", Slug: "ivus"}, │
│ "wushoolay": {ID: 4488, Region: "tw", Name: "Wushoolay", Slug: "wushoolay"}, │
│ "zeliek": {ID: 4489, Region: "tw", Name: "Zeliek", Slug: "zeliek"}, │
│ "arathi-basin": {ID: 5740, Region: "tw", Name: "Arathi Basin", Slug: "arathi-bas │
│ in"}, │
│ "murloc": {ID: 5741, Region: "tw", Name: "Murloc", Slug: "murloc"}, │
│ // Use disambiguated map keys for slugs colliding across regions; Slug field rem │
│ ains the Blizzard slug. │
│ "golemagg-tw": {ID: 5742, Region: "tw", Name: "Golemagg", Slug: "golemagg"}, │
│ "windseeker-tw": {ID: 5743, Region: "tw", Name: "Windseeker", Slug: "windseeker" │
│ }, │
│ } │
│ } │
│ │
│ // NormalizeRealmSlug applies known region-specific realm slug renames. │
│ // Example: US OCE realms moved to -au slugs (e.g., arugal -> arugal-au). │
│ func NormalizeRealmSlug(region, slug string) string { │
│ if region == "us" { │
│ switch slug { │
│ case "arugal": │
│ return "arugal-au" │
│ case "remulos": │
│ return "remulos-au" │
│ case "yojamba": │
│ return "yojamba-au" │
│ } │
│ } │
│ return slug │
│ } │
│ │
│ // ParsePeriods parses a period specification string that can contain: │
│ // - comma-separated list: "1020,1021,1025" │
│ // - ranges: "1020-1036" │
│ // - mixed: "1020,1025-1030,1036" │
│ func ParsePeriods(periodsSpec string) ([]string, error) { │
│ if strings.TrimSpace(periodsSpec) == "" { │
│ return nil, nil │
│ } │
│ │
│ var periods []string │
│ parts := strings.Split(periodsSpec, ",") │
│ │
│ for _, part := range parts { │
│ part = strings.TrimSpace(part) │
│ if part == "" { │
│ continue │
│ } │
│ │
│ // check if it's a range │
│ if strings.Contains(part, "-") { │
│ rangeParts := strings.Split(part, "-") │
│ if len(rangeParts) != 2 { │
│ return nil, fmt.Errorf("invalid range format: %s (expected START-END)", part) │
│ } │
│ start, err := strconv.Atoi(strings.TrimSpace(rangeParts[0])) │
│ if err != nil { │
│ return nil, fmt.Errorf("invalid start period in range %s: %w", part, err) │
│ } │
│ end, err := strconv.Atoi(strings.TrimSpace(rangeParts[1])) │
│ if err != nil { │
│ return nil, fmt.Errorf("invalid end period in range %s: %w", part, err) │
│ } │
│ if start > end { │
│ return nil, fmt.Errorf("invalid range %s: start > end", part) │
│ } │
│ // add all periods in range │
│ for i := start; i <= end; i++ { │
│ periods = append(periods, fmt.Sprintf("%d", i)) │
│ } │
│ } else { │
│ // single period │
│ periods = append(periods, part) │
│ } │
│ } │
│ │
│ return periods, nil │
│ } │
└────────────────────────────────────────────────────────────────────────────────────┘
┌─ GO ─────────────────────────────────┐
│ package blizzard │
│ │
│ import ( │
│ "fmt" │
│ "strconv" │
│ "strings" │
│ ) │
│ │
│ // GetHardcodedPeriodAndDungeons returns the │
│ primary period ID and dungeon list │
│ // hardcoded values since the index endpoint │
│ is broken - most records are in period 1026 │
│ func GetHardcodedPeriodAndDungeons() (string │
│ , []DungeonInfo) { │
│ periodID := "1036" │
│ │
│ dungeons := []DungeonInfo{ │
│ {ID: 2, Name: "Temple of the Jade Serpent" │
│ , Slug: "temple-of-the-jade-serpent"}, │
│ {ID: 56, Name: "Stormstout Brewery", Slug: │
│ "stormstout-brewery"}, │
│ {ID: 57, Name: "Gate of the Setting Sun", │
│ Slug: "gate-of-the-setting-sun"}, │
│ {ID: 58, Name: "Shado-Pan Monastery", Slug │
│ : "shado-pan-monastery"}, │
│ {ID: 59, Name: "Siege of Niuzao Temple", S │
│ lug: "siege-of-niuzao-temple"}, │
│ {ID: 60, Name: "Mogu'shan Palace", Slug: " │
│ mogu-shan-palace"}, │
│ {ID: 76, Name: "Scholomance", Slug: "schol │
│ omance"}, │
│ {ID: 77, Name: "Scarlet Halls", Slug: "sca │
│ rlet-halls"}, │
│ {ID: 78, Name: "Scarlet Monastery", Slug: │
│ "scarlet-monastery"}, │
│ } │
│ │
│ return periodID, dungeons │
│ } │
│ │
│ // GetAllRealms returns the complete realm c │
│ onfiguration │
│ // this data comes from nix/api/realm.nix │
│ func GetAllRealms() map[string]RealmInfo { │
│ return map[string]RealmInfo{ │
│ // us realms │
│ "atiesh": {ID: 4372, Region: │
│ "us", Name: "Atiesh", Slug: "atiesh"}, │
│ "myzrael": {ID: 4373, Region: │
│ "us", Name: "Myzrael", Slug: "myzrael"}, │
│ "old-blanchy": {ID: 4374, Region: │
│ "us", Name: "Old Blanchy", Slug: "old-blanc │
│ hy"}, │
│ "azuresong": {ID: 4376, Region: │
│ "us", Name: "Azuresong", Slug: "azuresong"} │
│ , │
│ "mankrik": {ID: 4384, Region: │
│ "us", Name: "Mankrik", Slug: "mankrik"}, │
│ "pagle": {ID: 4385, Region: │
│ "us", Name: "Pagle", Slug: "pagle"}, │
│ "ashkandi": {ID: 4387, Region: │
│ "us", Name: "Ashkandi", Slug: "ashkandi"}, │
│ "westfall": {ID: 4388, Region: │
│ "us", Name: "Westfall", Slug: "westfall"}, │
│ "whitemane": {ID: 4395, Region: │
│ "us", Name: "Whitemane", Slug: "whitemane"} │
│ , │
│ "faerlina": {ID: 4408, Region: │
│ "us", Name: "Faerlina", Slug: "faerlina"}, │
│ "grobbulus": {ID: 4647, Region: │
│ "us", Name: "Grobbulus", Slug: "grobbulus"} │
│ , │
│ "bloodsail-buccaneers": {ID: 4648, Region: │
│ "us", Name: "Bloodsail Buccaneers", Slug: " │
│ bloodsail-buccaneers"}, │
│ // OCE realms are served under US region w │
│ ith -au slug suffix │
│ "remulos-au": {ID: 4667, Region: "us", Na │
│ me: "Remulos (AU)", Slug: "remulos-au"}, │
│ "arugal-au": {ID: 4669, Region: "us", Na │
│ me: "Arugal (AU)", Slug: "arugal-au"}, │
│ "yojamba-au": {ID: 4670, Region: "us", Na │
│ me: "Yojamba (AU)", Slug: "yojamba-au"}, │
│ "skyfury": {ID: 4725, Region: "us", Na │
│ me: "Skyfury", Slug: "skyfury"}, │
│ "sulfuras": {ID: 4726, Region: "us", Na │
│ me: "Sulfuras", Slug: "sulfuras"}, │
│ "windseeker": {ID: 4727, Region: "us", Na │
│ me: "Windseeker", Slug: "windseeker"}, │
│ "benediction": {ID: 4728, Region: "us", Na │
│ me: "Benediction", Slug: "benediction"}, │
│ "earthfury": {ID: 4731, Region: "us", Na │
│ me: "Earthfury", Slug: "earthfury"}, │
│ "maladath": {ID: 4738, Region: "us", Na │
│ me: "Maladath", Slug: "maladath"}, │
│ "angerforge": {ID: 4795, Region: "us", Na │
│ me: "Angerforge", Slug: "angerforge"}, │
│ "eranikus": {ID: 4800, Region: "us", Na │
│ me: "Eranikus", Slug: "eranikus"}, │
│ // New US realms (MoP Classic launch wave) │
│ - child realms connecting to Pagle │
│ "nazgrim": {ID: 6359, Region: "us", Name │
│ : "Nazgrim", Slug: "nazgrim", ParentRealmSlu │
│ g: "pagle"}, │
│ "galakras": {ID: 6360, Region: "us", Name │
│ : "Galakras", Slug: "galakras", ParentRealmS │
│ lug: "pagle"}, │
│ "raden": {ID: 6361, Region: "us", Name │
│ : "Ra-den", Slug: "raden", ParentRealmSlug: │
│ "pagle"}, │
│ "lei-shen": {ID: 6362, Region: "us", Name │
│ : "Lei Shen", Slug: "lei-shen", ParentRealmS │
│ lug: "pagle"}, │
│ "immerseus": {ID: 6363, Region: "us", Name │
│ : "Immerseus", Slug: "immerseus", ParentReal │
│ mSlug: "pagle"}, │
│ │
│ // eu realms │
│ "everlook": {ID: 4440, Region: │
│ "eu", Name: "Everlook", Slug: "everlook"}, │
│ "auberdine": {ID: 4441, Region: │
│ "eu", Name: "Auberdine", Slug: "auberdine"} │
│ , │
│ "lakeshire": {ID: 4442, Region: │
│ "eu", Name: "Lakeshire", Slug: "lakeshire"} │
│ , │
│ "chromie": {ID: 4452, Region: │
│ "eu", Name: "Chromie", Slug: "chromie"}, │
│ "pyrewood-village": {ID: 4453, Region: │
│ "eu", Name: "Pyrewood Village", Slug: "pyre │
│ wood-village"}, │
│ "mirage-raceway": {ID: 4454, Region: │
│ "eu", Name: "Mirage Raceway", Slug: "mirage │
│ -raceway"}, │
│ "razorfen": {ID: 4455, Region: │
│ "eu", Name: "Razorfen", Slug: "razorfen"}, │
│ "nethergarde-keep": {ID: 4456, Region: │
│ "eu", Name: "Nethergarde Keep", Slug: "neth │
│ ergarde-keep"}, │
│ "sulfuron": {ID: 4464, Region: │
│ "eu", Name: "Sulfuron", Slug: "sulfuron"}, │
│ "golemagg": {ID: 4465, Region: │
│ "eu", Name: "Golemagg", Slug: "golemagg"}, │
│ "patchwerk": {ID: 4466, Region: │
│ "eu", Name: "Patchwerk", Slug: "patchwerk"} │
│ , │
│ "firemaw": {ID: 4467, Region: │
│ "eu", Name: "Firemaw", Slug: "firemaw"}, │
│ "flamegor": {ID: 4474, Region: │
│ "eu", Name: "Flamegor", Slug: "flamegor"}, │
│ "gehennas": {ID: 4476, Region: │
│ "eu", Name: "Gehennas", Slug: "gehennas"}, │
│ "venoxis": {ID: 4477, Region: │
│ "eu", Name: "Venoxis", Slug: "venoxis"}, │
│ "hydraxian-waterlords": {ID: 4678, Region: │
│ "eu", Name: "Hydraxian Waterlords", Slug: " │
│ hydraxian-waterlords"}, │
│ "mograine": {ID: 4701, Region: │
│ "eu", Name: "Mograine", Slug: "mograine"}, │
│ "amnennar": {ID: 4703, Region: │
│ "eu", Name: "Amnennar", Slug: "amnennar"}, │
│ "ashbringer": {ID: 4742, Region: │
│ "eu", Name: "Ashbringer", Slug: "ashbringer │
│ "}, │
│ "transcendence": {ID: 4745, Region: │
│ "eu", Name: "Transcendence", Slug: "transce │
│ ndence"}, │
│ "earthshaker": {ID: 4749, Region: │
│ "eu", Name: "Earthshaker", Slug: "earthshak │
│ er"}, │
│ "giantstalker": {ID: 4811, Region: │
│ "eu", Name: "Giantstalker", Slug: "giantsta │
│ lker"}, │
│ "mandokir": {ID: 4813, Region: │
│ "eu", Name: "Mandokir", Slug: "mandokir"}, │
│ "thekal": {ID: 4815, Region: │
│ "eu", Name: "Thekal", Slug: "thekal"}, │
│ "jindo": {ID: 4816, Region: │
│ "eu", Name: "Jin'do", Slug: "jindo"}, │
│ // New EU realms (MoP Classic launch wave) │
│ - child realms connecting to Mirage Raceway │
│ and Everlook │
│ "shekzeer": {ID: 6364, Region: "eu", Name │
│ : "Shek'zeer", Slug: "shekzeer", ParentRealm │
│ Slug: "mirage-raceway"}, │
│ "garalon": {ID: 6365, Region: "eu", Name │
│ : "Garalon", Slug: "garalon", ParentRealmSlu │
│ g: "mirage-raceway"}, │
│ "norushen": {ID: 6366, Region: "eu", Name │
│ : "Norushen", Slug: "norushen", ParentRealmS │
│ lug: "mirage-raceway"}, │
│ "hoptallus": {ID: 6367, Region: "eu", Name │
│ : "Hoptallus", Slug: "hoptallus", ParentReal │
│ mSlug: "mirage-raceway"}, │
│ "ook-ook": {ID: 6368, Region: "eu", Name │
│ : "Ook Ook", Slug: "ook-ook", ParentRealmSlu │
│ g: "everlook"}, │
│ │
│ // kr realms │
│ "shimmering-flats": {ID: 4417, Region: "kr │
│ ", Name: "Shimmering Flats", Slug: "shimmeri │
│ ng-flats"}, │
│ "lokholar": {ID: 4419, Region: "kr │
│ ", Name: "Lokholar", Slug: "lokholar"}, │
│ "iceblood": {ID: 4420, Region: "kr │
│ ", Name: "Iceblood", Slug: "iceblood"}, │
│ "ragnaros": {ID: 4421, Region: "kr │
│ ", Name: "Ragnaros", Slug: "ragnaros"}, │
│ "frostmourne": {ID: 4840, Region: "kr │
│ ", Name: "Frostmourne", Slug: "frostmourne"} │
│ , │
│ │
│ // tw realms (exclude PTR realms TW4 CWOW │
│ GMSS 1/2) │
│ "maraudon": {ID: 4485, Region: "tw", N │
│ ame: "Maraudon", Slug: "maraudon"}, │
│ "ivus": {ID: 4487, Region: "tw", N │
│ ame: "Ivus", Slug: "ivus"}, │
│ "wushoolay": {ID: 4488, Region: "tw", N │
│ ame: "Wushoolay", Slug: "wushoolay"}, │
│ "zeliek": {ID: 4489, Region: "tw", N │
│ ame: "Zeliek", Slug: "zeliek"}, │
│ "arathi-basin": {ID: 5740, Region: "tw", N │
│ ame: "Arathi Basin", Slug: "arathi-basin"}, │
│ "murloc": {ID: 5741, Region: "tw", N │
│ ame: "Murloc", Slug: "murloc"}, │
│ // Use disambiguated map keys for slugs co │
│ lliding across regions; Slug field remains t │
│ he Blizzard slug. │
│ "golemagg-tw": {ID: 5742, Region: "tw", │
│ Name: "Golemagg", Slug: "golemagg"}, │
│ "windseeker-tw": {ID: 5743, Region: "tw", │
│ Name: "Windseeker", Slug: "windseeker"}, │
│ } │
│ } │
│ │
│ // NormalizeRealmSlug applies known region-s │
│ pecific realm slug renames. │
│ // Example: US OCE realms moved to -au slugs │
│ (e.g., arugal -> arugal-au). │
│ func NormalizeRealmSlug(region, slug string) │
│ string { │
│ if region == "us" { │
│ switch slug { │
│ case "arugal": │
│ return "arugal-au" │
│ case "remulos": │
│ return "remulos-au" │
│ case "yojamba": │
│ return "yojamba-au" │
│ } │
│ } │
│ return slug │
│ } │
│ │
│ // ParsePeriods parses a period specificatio │
│ n string that can contain: │
│ // - comma-separated list: "1020,1021,1025" │
│ // - ranges: "1020-1036" │
│ // - mixed: "1020,1025-1030,1036" │
│ func ParsePeriods(periodsSpec string) ([]str │
│ ing, error) { │
│ if strings.TrimSpace(periodsSpec) == "" { │
│ return nil, nil │
│ } │
│ │
│ var periods []string │
│ parts := strings.Split(periodsSpec, ",") │
│ │
│ for _, part := range parts { │
│ part = strings.TrimSpace(part) │
│ if part == "" { │
│ continue │
│ } │
│ │
│ // check if it's a range │
│ if strings.Contains(part, "-") { │
│ rangeParts := strings.Split(part, "-") │
│ if len(rangeParts) != 2 { │
│ return nil, fmt.Errorf("invalid range fo │
│ rmat: %s (expected START-END)", part) │
│ } │
│ start, err := strconv.Atoi(strings.TrimSp │
│ ace(rangeParts[0])) │
│ if err != nil { │
│ return nil, fmt.Errorf("invalid start pe │
│ riod in range %s: %w", part, err) │
│ } │
│ end, err := strconv.Atoi(strings.TrimSpac │
│ e(rangeParts[1])) │
│ if err != nil { │
│ return nil, fmt.Errorf("invalid end peri │
│ od in range %s: %w", part, err) │
│ } │
│ if start > end { │
│ return nil, fmt.Errorf("invalid range %s │
│ : start > end", part) │
│ } │
│ // add all periods in range │
│ for i := start; i <= end; i++ { │
│ periods = append(periods, fmt.Sprintf("% │
│ d", i)) │
│ } │
│ } else { │
│ // single period │
│ periods = append(periods, part) │
│ } │
│ } │
│ │
│ return periods, nil │
│ } │
└──────────────────────────────────────────────┘