Initial commit

This commit is contained in:
2026-01-19 01:51:08 +02:00
commit 2dbb7e5d7e
18 changed files with 1475 additions and 0 deletions

77
furcadia/util.go Normal file
View File

@@ -0,0 +1,77 @@
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
}