78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
package furcadia
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// GetShortName returns a "shortname" derived from a given Furcadia display name
|
|
func GetShortName(displayName string) string {
|
|
sb := &strings.Builder{}
|
|
for _, r := range displayName {
|
|
if unicode.IsLetter(r) || unicode.IsNumber(r) {
|
|
sb.WriteRune(unicode.ToLower(r))
|
|
}
|
|
}
|
|
return sb.String()
|
|
}
|
|
|
|
// GetShortDreamURL converts a regular "furc://uploader:name/" dream url into
|
|
// a "short" form that can be used as a hash key (e.g., "uploader:name").
|
|
//
|
|
// ErrInvalidDreamURL is returned if the given url is not a valid dream URL.
|
|
func GetShortDreamURL(url string) (string, error) {
|
|
// cut prefix
|
|
u, found := strings.CutPrefix(strings.ToLower(url), "furc://")
|
|
if !found {
|
|
return "", ErrInvalidDreamURL
|
|
}
|
|
|
|
// cut suffix
|
|
u = strings.SplitN(u, "/", 2)[0]
|
|
|
|
// split uploader name and dream name
|
|
var uploaderName string
|
|
var dreamName string
|
|
|
|
elements := strings.Split(u, ":")
|
|
switch len(elements) {
|
|
case 0:
|
|
panic(fmt.Sprintf("len(%v) == 0", elements))
|
|
case 1:
|
|
uploaderName = elements[0]
|
|
dreamName = ""
|
|
case 2:
|
|
uploaderName = elements[0]
|
|
dreamName = elements[1]
|
|
default:
|
|
return "", ErrInvalidDreamURL
|
|
}
|
|
|
|
short := GetShortDreamURLFromName(uploaderName, dreamName)
|
|
if short == "" || short[0] == ':' {
|
|
// furc://
|
|
// furc:///
|
|
// furc://:/
|
|
// furc://:something/
|
|
return "", ErrInvalidDreamURL
|
|
}
|
|
|
|
return short, nil
|
|
}
|
|
|
|
func GetShortDreamURLFromName(uploaderName, dreamName string) (short string) {
|
|
shortName := GetShortName(uploaderName)
|
|
shortDream := GetShortName(dreamName)
|
|
if shortDream == "" {
|
|
short = shortName
|
|
} else {
|
|
short = shortName + ":" + shortDream
|
|
}
|
|
return
|
|
}
|