2018-03-24 01:24:28 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type clientTag struct {
|
|
|
|
AppName string
|
|
|
|
Version string
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseVersion(ver string) clientTag {
|
2018-03-24 02:16:22 +00:00
|
|
|
// Try our best to turn the supplied text into a structured version
|
2018-03-24 01:24:28 +00:00
|
|
|
ret := clientTag{
|
|
|
|
AppName: APP_NAME,
|
|
|
|
Version: APP_VERSION,
|
|
|
|
}
|
|
|
|
|
2018-03-24 02:16:22 +00:00
|
|
|
// Special case: Some clients use a structured version AppName:Version:Metadata
|
|
|
|
// If we check for that, we can support clients with spaces in the name
|
|
|
|
if cParts := strings.Split(ver, ":"); len(cParts) == 3 {
|
|
|
|
ret.AppName = cParts[0]
|
|
|
|
ret.Version = cParts[1]
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// Special cases all failed, time for heuristics
|
|
|
|
// Turn colons to spaces; keep the first word, and the the first word containing digits
|
|
|
|
ver = strings.Trim(strings.Replace(ver, ":", " ", -1), " ")
|
2018-03-24 01:24:28 +00:00
|
|
|
|
2018-03-24 02:16:22 +00:00
|
|
|
words := strings.Split(ver, " ")
|
2018-03-24 01:24:28 +00:00
|
|
|
|
2018-03-24 02:16:22 +00:00
|
|
|
for _, word := range words[1:] {
|
|
|
|
if strings.ContainsAny(word, "0123456789") {
|
|
|
|
ret.AppName = words[0]
|
|
|
|
ret.Version = strings.Replace(word, "(", "", -1) // AndroIRC
|
|
|
|
break
|
|
|
|
}
|
2018-03-24 01:24:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Strip leading v from mIRC
|
|
|
|
if len(ret.Version) >= 2 && (ret.Version[0] == 'v' || ret.Version[0] == 'V') && strings.ContainsAny(string(ret.Version[1]), "0123456789") {
|
|
|
|
ret.Version = ret.Version[1:]
|
|
|
|
}
|
|
|
|
|
2018-03-24 02:16:22 +00:00
|
|
|
// Special case: "Relay" means "HoloIRC"
|
|
|
|
if ret.AppName == "Relay" && ret.Version == "1.0" && strings.Contains(ver, "Android") {
|
|
|
|
ret.AppName = "HoloIRC"
|
|
|
|
ret.Version = "4"
|
|
|
|
}
|
|
|
|
|
2018-03-24 01:24:28 +00:00
|
|
|
return ret
|
|
|
|
}
|