package main import ( "errors" "fmt" "strconv" "strings" ) type IRCFileURL struct { Network string Channel string UserName string Slot int } type IRCBot struct { Network string Channel string Name string } const ircFileURLFields = 4 func parseSlot(slotStr string) (int, error) { if strings.HasPrefix(slotStr, "#") { strconv.Atoi(strings.TrimPrefix(slotStr, "#")) } return strconv.Atoi(slotStr) } // url has the following format: irc://network/channel/bot/#slot func parseIRCFileURl(url string) (*IRCFileURL, error) { if !strings.HasPrefix(url, "irc://") { return nil, errors.New("not an IRC url") } fields := strings.Split(strings.TrimPrefix(url, "irc://"), "/") if len(fields) != ircFileURLFields { return nil, errors.New("invalid IRC url") } slot, err := parseSlot(fields[3]) if err != nil { return nil, err } fileUrl := &IRCFileURL{ Network: fields[0], Channel: fields[1], UserName: fields[2], Slot: slot, } if !strings.HasPrefix(fileUrl.Channel, "#") { fileUrl.Channel = "#" + fileUrl.Channel } return fileUrl, nil } func (url *IRCFileURL) GetBot() IRCBot { return IRCBot{Network: url.Network, Channel: url.Channel, Name: url.UserName} } func (url *IRCFileURL) String() string { return fmt.Sprintf("irc://%s/%s/%s/#%d", url.Network, url.Channel, url.UserName, url.Slot) }