OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
 
master @ 181 LINES
 
[ HISTORY ]  [ UP ]
 

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
}

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
}
 
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET