client tags: better detection for Revolution IRC and HoloIRC

--HG--
branch : nmdc-ircfrontend
This commit is contained in:
mappu 2018-03-24 15:16:22 +13:00
parent 458ab0a054
commit ef36fc0c24
3 changed files with 35 additions and 14 deletions

View File

@ -10,23 +10,32 @@ type clientTag struct {
}
func parseVersion(ver string) clientTag {
// A bit long and unwieldy.
// Heuristic: keep the first word, and the the first word containing digits
// Try our best to turn the supplied text into a structured version
ret := clientTag{
AppName: APP_NAME,
Version: APP_VERSION,
}
ver = strings.Trim(strings.Replace(ver, ":", " ", -1), " ")
// 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]
words := strings.Split(ver, " ")
} else {
for _, word := range words[1:] {
if strings.ContainsAny(word, "0123456789") {
ret.AppName = words[0]
ret.Version = strings.Replace(word, "(", "", -1) // AndroIRC
break
// 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), " ")
words := strings.Split(ver, " ")
for _, word := range words[1:] {
if strings.ContainsAny(word, "0123456789") {
ret.AppName = words[0]
ret.Version = strings.Replace(word, "(", "", -1) // AndroIRC
break
}
}
}
@ -35,5 +44,11 @@ func parseVersion(ver string) clientTag {
ret.Version = ret.Version[1:]
}
// Special case: "Relay" means "HoloIRC"
if ret.AppName == "Relay" && ret.Version == "1.0" && strings.Contains(ver, "Android") {
ret.AppName = "HoloIRC"
ret.Version = "4"
}
return ret
}

View File

@ -29,8 +29,13 @@ func TestParseVersion(t *testing.T) {
},
[3]string{
":Relay:1.0:Android",
"Relay", "1.0",
":Relay:1.0:Android", // HoloIRC before 4.1.0
"HoloIRC", "4",
},
[3]string{
"Relay:1.0:Android", // HoloIRC after 4.1.0
"HoloIRC", "4",
},
[3]string{
@ -40,7 +45,7 @@ func TestParseVersion(t *testing.T) {
[3]string{
"Revolution IRC:0.3.2:Android",
"Revolution", "0.3.2",
"Revolution IRC", "0.3.2",
},
}

View File

@ -413,7 +413,8 @@ func (s *Server) handleRegisteredCommand(command string, args []string) {
return
}
message := strings.Join(args[1:], " ")[1:] // strip leading colon
// Strip leading colon (work around a bug in HoloIRC 4.1.0 and older)
message := strings.Join(args[1:], " ")[1:]
if strings.HasPrefix(message, "\x01VERSION ") {
// Not a real message - a reply to our internal request. Change the user's tag to match the actual client software