xdcc-cli/url.go

68 lines
1.3 KiB
Go

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)
}