commit 8e01ade

Hubert Hirtz  ·  2020-11-19 16:21:47 +0000 UTC
parent 83e0e82
Basic display of errors
4 files changed,  +80, -5
M app.go
M app.go
+16, -0
 1@@ -143,6 +143,22 @@ func (app *App) handleIRCEvent(ev irc.Event) {
 2 			Head: head,
 3 			Body: ev.Message,
 4 		})
 5+	case irc.ErrorEvent:
 6+		var severity string
 7+		switch ev.Severity {
 8+		case irc.SeverityNote:
 9+			severity = "Note"
10+		case irc.SeverityWarn:
11+			severity = "Warning"
12+		case irc.SeverityFail:
13+			severity = "Error"
14+		}
15+		app.win.AddLine(app.win.CurrentBuffer(), false, ui.Line{
16+			At:        time.Now(),
17+			Head:      "!!",
18+			HeadColor: ui.ColorRed,
19+			Body:      fmt.Sprintf("%s (code %s): %s", severity, ev.Code, ev.Message),
20+		})
21 	case irc.RegisteredEvent:
22 		body := "Connected to the server"
23 		if app.s.Nick() != app.cfg.Nick {
+6, -0
 1@@ -12,6 +12,12 @@ type RawMessageEvent struct {
 2 	IsValid  bool
 3 }
 4 
 5+type ErrorEvent struct {
 6+	Severity Severity
 7+	Code     string
 8+	Message  string
 9+}
10+
11 type RegisteredEvent struct{}
12 
13 type SelfNickEvent struct {
+24, -3
 1@@ -909,9 +909,22 @@ func (s *Session) handle(msg Message) (err error) {
 2 			}
 3 		}
 4 	case "FAIL":
 5-		s.evts <- RawMessageEvent{
 6-			Message: msg.String(),
 7-			IsValid: true,
 8+		s.evts <- ErrorEvent{
 9+			Severity: SeverityFail,
10+			Code:     msg.Params[1],
11+			Message:  msg.Params[len(msg.Params)-1],
12+		}
13+	case "WARN":
14+		s.evts <- ErrorEvent{
15+			Severity: SeverityWarn,
16+			Code:     msg.Params[1],
17+			Message:  msg.Params[len(msg.Params)-1],
18+		}
19+	case "NOTE":
20+		s.evts <- ErrorEvent{
21+			Severity: SeverityNote,
22+			Code:     msg.Params[1],
23+			Message:  msg.Params[len(msg.Params)-1],
24 		}
25 	case "PING":
26 		err = s.send("PONG :%s\r\n", msg.Params[0])
27@@ -925,6 +938,14 @@ func (s *Session) handle(msg Message) (err error) {
28 		}
29 		_ = s.conn.Close()
30 	default:
31+		// reply handling
32+		if ReplySeverity(msg.Command) == SeverityFail {
33+			s.evts <- ErrorEvent{
34+				Severity: SeverityFail,
35+				Code:     msg.Command,
36+				Message:  msg.Params[len(msg.Params)-1],
37+			}
38+		}
39 	}
40 
41 	return
+34, -2
 1@@ -303,7 +303,7 @@ func (msg *Message) IsValid() bool {
 2 		return 1 <= len(msg.Params)
 3 	case rplEndofnames, rplLoggedout, rplMotd, errNicknameinuse, rplNotopic, rplWelcome, rplYourhost:
 4 		return 2 <= len(msg.Params)
 5-	case rplIsupport, rplLoggedin, rplTopic:
 6+	case rplIsupport, rplLoggedin, rplTopic, "FAIL", "WARN", "NOTE":
 7 		return 3 <= len(msg.Params)
 8 	case rplNamreply:
 9 		return 4 <= len(msg.Params)
10@@ -349,7 +349,11 @@ func (msg *Message) IsValid() bool {
11 		}
12 		return msg.Params[0][0] == '-'
13 	default:
14-		return false
15+		if len(msg.Command) != 3 || len(msg.Params) < 2 {
16+			return false
17+		}
18+		_, err := strconv.Atoi(msg.Command)
19+		return err == nil
20 	}
21 }
22 
23@@ -382,6 +386,34 @@ func (msg *Message) TimeOrNow() time.Time {
24 	return time.Now().UTC()
25 }
26 
27+type Severity int
28+
29+const (
30+	SeverityNote Severity = iota
31+	SeverityWarn
32+	SeverityFail
33+)
34+
35+func ReplySeverity(reply string) Severity {
36+	switch reply[0] {
37+	case '4', '5':
38+		if reply == "422" {
39+			return SeverityNote
40+		} else {
41+			return SeverityFail
42+		}
43+	case '9':
44+		switch reply[2] {
45+		case '2', '4', '5', '6', '7':
46+			return SeverityFail
47+		default:
48+			return SeverityNote
49+		}
50+	default:
51+		return SeverityNote
52+	}
53+}
54+
55 type Cap struct {
56 	Name   string
57 	Value  string