diff --git a/UserInfo.go b/UserInfo.go index c6786af..7c3caff 100644 --- a/UserInfo.go +++ b/UserInfo.go @@ -6,6 +6,7 @@ import ( "fmt" "regexp" "strconv" + "strings" ) type UserFlag byte @@ -37,6 +38,7 @@ type UserInfo struct { Nick string Description string ClientTag string + ClientVersion string Email string ShareSize uint64 ConnectionMode ConnectionMode @@ -54,7 +56,7 @@ var rx_myinfo_notag *regexp.Regexp func init() { // $ALL $ $$$$ - rx_myinfo = regexp.MustCompile("(?ms)^\\$ALL ([^ ]+) ([^<]*)<([^,]*),M:(.),H:([0-9]+)/([0-9]+)/([0-9]+),S:([0-9]+)>\\$.\\$(.+?)(.)\\$([^$]*)\\$([0-9]*)\\$$") + rx_myinfo = regexp.MustCompile("(?ms)^\\$ALL ([^ ]+) ([^<]*)<([^,]*)V:([^,]+),M:(.),H:([0-9]+)/([0-9]+)/([0-9]+),S:([0-9]+)>\\$.\\$(.+?)(.)\\$([^$]*)\\$([0-9]*)\\$$") rx_myinfo_notag = regexp.MustCompile("(?ms)^\\$ALL ([^ ]+) ([^$]*)\\$.\\$(.*)(.)\\$([^$]*)\\$([0-9]*)\\$$") // Fallback for no tag /* @@ -91,21 +93,22 @@ func maybeParse(str string, dest *uint64, default_val uint64) { } func (this *UserInfo) fromMyINFO(protomsg string) error { - // Normal format (with tag in exact M/H/S order) + // Normal format (with tag in exact V/M/H/S order) matches := rx_myinfo.FindStringSubmatch(protomsg) if matches != nil { this.Nick = matches[1] this.Description = NMDCUnescape(matches[2]) this.ClientTag = NMDCUnescape(matches[3]) + this.ClientVersion = matches[4] this.ConnectionMode = ConnectionMode(matches[4][0]) - maybeParse(matches[5], &this.HubsUnregistered, 0) - maybeParse(matches[6], &this.HubsRegistered, 0) - maybeParse(matches[7], &this.HubsOperator, 0) - maybeParse(matches[8], &this.Slots, 0) - this.Speed = matches[9] - this.Flag = UserFlag(matches[10][0]) - this.Email = NMDCUnescape(matches[11]) - maybeParse(matches[12], &this.ShareSize, 0) + maybeParse(matches[6], &this.HubsUnregistered, 0) + maybeParse(matches[7], &this.HubsRegistered, 0) + maybeParse(matches[8], &this.HubsOperator, 0) + maybeParse(matches[9], &this.Slots, 0) + this.Speed = matches[10] + this.Flag = UserFlag(matches[11][0]) + this.Email = NMDCUnescape(matches[12]) + maybeParse(matches[13], &this.ShareSize, 0) return nil } @@ -116,6 +119,7 @@ func (this *UserInfo) fromMyINFO(protomsg string) error { this.Nick = matches[1] this.Description = NMDCUnescape(matches[2]) this.ClientTag = "" + this.ClientVersion = "0" this.ConnectionMode = CONNECTIONMODE_PASSIVE this.HubsUnregistered = 0 this.HubsRegistered = 0 @@ -136,10 +140,11 @@ func (this *UserInfo) fromMyINFO(protomsg string) error { // Returns the MyINFO command, WITH leading $MyINFO, and WITHOUT trailing pipe func (this *UserInfo) toMyINFO() string { return fmt.Sprintf( - "$MyINFO $ALL %s %s<%s,M:%c,H:%d/%d/%d,S:%d>$ $%s%c$%s$%d$", + "$MyINFO $ALL %s %s<%s V:%s,M:%c,H:%d/%d/%d,S:%d>$ $%s%c$%s$%d$", this.Nick, this.Description, this.ClientTag, + strings.Replace(this.ClientVersion, ",", "-", -1), // just in case this.ConnectionMode, this.HubsUnregistered, this.HubsRegistered,