120 lines
2.9 KiB
Go
120 lines
2.9 KiB
Go
package autocorrect
|
|
|
|
import (
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
const maxNickLength = 25
|
|
|
|
var fixNickRegex = regexp.MustCompile(`[\W\s\d]`)
|
|
|
|
var accountNickRegexes = []*regexp.Regexp{
|
|
regexp.MustCompile(`anilist.co/user/(.*)`),
|
|
regexp.MustCompile(`anilist.co/animelist/(.*)`),
|
|
regexp.MustCompile(`kitsu.io/users/(.*?)/library`),
|
|
regexp.MustCompile(`kitsu.io/users/(.*)`),
|
|
regexp.MustCompile(`anime-planet.com/users/(.*?)/anime`),
|
|
regexp.MustCompile(`anime-planet.com/users/(.*)`),
|
|
regexp.MustCompile(`myanimelist.net/profile/(.*)`),
|
|
regexp.MustCompile(`myanimelist.net/animelist/(.*?)\?`),
|
|
regexp.MustCompile(`myanimelist.net/animelist/(.*)`),
|
|
regexp.MustCompile(`myanimelist.net/(.*)`),
|
|
regexp.MustCompile(`myanimelist.com/(.*)`),
|
|
regexp.MustCompile(`twitter.com/(.*)`),
|
|
regexp.MustCompile(`osu.ppy.sh/u/(.*)`),
|
|
}
|
|
|
|
var animeLinkRegex = regexp.MustCompile(`notify.moe/anime/(\d+)`)
|
|
var osuBeatmapRegex = regexp.MustCompile(`osu.ppy.sh/s/(\d+)`)
|
|
|
|
// Tag converts links to correct tags automatically.
|
|
func Tag(tag string) string {
|
|
tag = strings.TrimSpace(tag)
|
|
tag = strings.TrimSuffix(tag, "/")
|
|
|
|
// Anime
|
|
matches := animeLinkRegex.FindStringSubmatch(tag)
|
|
|
|
if len(matches) > 1 {
|
|
return "anime:" + matches[1]
|
|
}
|
|
|
|
// Osu beatmap
|
|
matches = osuBeatmapRegex.FindStringSubmatch(tag)
|
|
|
|
if len(matches) > 1 {
|
|
return "osu-beatmap:" + matches[1]
|
|
}
|
|
|
|
return tag
|
|
}
|
|
|
|
// UserNick automatically corrects a username.
|
|
func UserNick(nick string) string {
|
|
nick = fixNickRegex.ReplaceAllString(nick, "")
|
|
|
|
if nick == "" {
|
|
return nick
|
|
}
|
|
|
|
nick = strings.Trim(nick, "_")
|
|
|
|
if nick == "" {
|
|
return ""
|
|
}
|
|
|
|
if len(nick) > maxNickLength {
|
|
nick = nick[:maxNickLength]
|
|
}
|
|
|
|
return strings.ToUpper(string(nick[0])) + nick[1:]
|
|
}
|
|
|
|
// AccountNick automatically corrects the username/nick of an account.
|
|
func AccountNick(nick string) string {
|
|
for _, regex := range accountNickRegexes {
|
|
matches := regex.FindStringSubmatch(nick)
|
|
|
|
if len(matches) > 1 {
|
|
nick = matches[1]
|
|
return nick
|
|
}
|
|
}
|
|
|
|
return nick
|
|
}
|
|
|
|
// PostText fixes common mistakes in post texts.
|
|
func PostText(text string) string {
|
|
text = strings.ReplaceAll(text, "http://", "https://")
|
|
text = strings.TrimSpace(text)
|
|
return text
|
|
}
|
|
|
|
// ThreadTitle fixes a thread title by trimming spaces.
|
|
func ThreadTitle(title string) string {
|
|
return strings.TrimSpace(title)
|
|
}
|
|
|
|
// Website fixed common website mistakes.
|
|
func Website(url string) string {
|
|
// Disallow links that aren't actual websites,
|
|
// just tracker links.
|
|
if IsTrackerLink(url) {
|
|
return ""
|
|
}
|
|
|
|
url = strings.TrimSpace(url)
|
|
url = strings.TrimPrefix(url, "http://")
|
|
url = strings.TrimPrefix(url, "https://")
|
|
url = strings.TrimSuffix(url, "/")
|
|
|
|
return url
|
|
}
|
|
|
|
// IsTrackerLink returns true if the URL is a tracker link.
|
|
func IsTrackerLink(url string) bool {
|
|
return strings.Contains(url, "myanimelist.net/") || strings.Contains(url, "anilist.co/") || strings.Contains(url, "kitsu.io/") || strings.Contains(url, "kissanime.")
|
|
}
|