diff --git a/clientTag.go b/clientTag.go index 50fb802..90bb671 100644 --- a/clientTag.go +++ b/clientTag.go @@ -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 } diff --git a/clientTag_test.go b/clientTag_test.go index 4dae915..cd62ebc 100644 --- a/clientTag_test.go +++ b/clientTag_test.go @@ -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", }, } diff --git a/server.go b/server.go index 10f1497..c80f009 100644 --- a/server.go +++ b/server.go @@ -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