commit aef7703

Hubert Hirtz  ·  2021-11-16 08:34:44 +0000 UTC
parent d40d8dc
Eagerly request capabilities

It simplifies the code and make registration use one less roundtrip
1 files changed,  +6, -45
+6, -45
 1@@ -159,6 +159,9 @@ func NewSession(out chan<- Message, params SessionParams) *Session {
 2 	}
 3 
 4 	s.out <- NewMessage("CAP", "LS", "302")
 5+	for capability := range SupportedCapabilities {
 6+		s.out <- NewMessage("CAP", "REQ", capability)
 7+	}
 8 	s.out <- NewMessage("NICK", s.nick)
 9 	s.out <- NewMessage("USER", s.user, "0", "*", s.real)
10 
11@@ -499,47 +502,6 @@ func (s *Session) handleUnregistered(msg Message) (Event, error) {
12 		s.host = ParsePrefix(userhost).Host
13 	case errNicklocked, errSaslfail, errSasltoolong, errSaslaborted, errSaslalready, rplSaslmechs:
14 		s.endRegistration()
15-	case "CAP":
16-		var subcommand string
17-		if err := msg.ParseParams(nil, &subcommand); err != nil {
18-			return nil, err
19-		}
20-
21-		switch subcommand {
22-		case "LS":
23-			var ls string
24-			if err := msg.ParseParams(nil, nil, &ls); err != nil {
25-				return nil, err
26-			}
27-
28-			willContinue := false
29-			if ls == "*" {
30-				if err := msg.ParseParams(nil, nil, nil, &ls); err != nil {
31-					return nil, err
32-				}
33-				willContinue = true
34-			}
35-
36-			for _, c := range ParseCaps(ls) {
37-				s.availableCaps[c.Name] = c.Value
38-			}
39-
40-			if !willContinue {
41-				for c := range s.availableCaps {
42-					if _, ok := SupportedCapabilities[c]; !ok {
43-						continue
44-					}
45-					s.out <- NewMessage("CAP", "REQ", c)
46-				}
47-
48-				_, ok := s.availableCaps["sasl"]
49-				if s.auth == nil || !ok {
50-					s.endRegistration()
51-				}
52-			}
53-		default:
54-			return s.handleRegistered(msg)
55-		}
56 	case errNicknameinuse:
57 		var nick string
58 		if err := msg.ParseParams(nil, &nick); err != nil {
59@@ -992,11 +954,10 @@ func (s *Session) handleRegistered(msg Message) (Event, error) {
60 		}
61 
62 		if t, ok := msg.Tags["+typing"]; ok {
63-			if t == "active" {
64+			switch t {
65+			case "active":
66 				s.typings.Active(targetCf, nickCf)
67-			} else if t == "paused" {
68-				s.typings.Done(targetCf, nickCf)
69-			} else if t == "done" {
70+			case "paused", "done":
71 				s.typings.Done(targetCf, nickCf)
72 			}
73 		}