summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app.go16
-rw-r--r--irc/events.go6
-rw-r--r--irc/states.go27
-rw-r--r--irc/tokens.go36
4 files changed, 80 insertions, 5 deletions
diff --git a/app.go b/app.go
index fb992bd..22f3b6a 100644
--- a/app.go
+++ b/app.go
@@ -143,6 +143,22 @@ func (app *App) handleIRCEvent(ev irc.Event) {
Head: head,
Body: ev.Message,
})
+ case irc.ErrorEvent:
+ var severity string
+ switch ev.Severity {
+ case irc.SeverityNote:
+ severity = "Note"
+ case irc.SeverityWarn:
+ severity = "Warning"
+ case irc.SeverityFail:
+ severity = "Error"
+ }
+ app.win.AddLine(app.win.CurrentBuffer(), false, ui.Line{
+ At: time.Now(),
+ Head: "!!",
+ HeadColor: ui.ColorRed,
+ Body: fmt.Sprintf("%s (code %s): %s", severity, ev.Code, ev.Message),
+ })
case irc.RegisteredEvent:
body := "Connected to the server"
if app.s.Nick() != app.cfg.Nick {
diff --git a/irc/events.go b/irc/events.go
index 9bb4c79..a241232 100644
--- a/irc/events.go
+++ b/irc/events.go
@@ -12,6 +12,12 @@ type RawMessageEvent struct {
IsValid bool
}
+type ErrorEvent struct {
+ Severity Severity
+ Code string
+ Message string
+}
+
type RegisteredEvent struct{}
type SelfNickEvent struct {
diff --git a/irc/states.go b/irc/states.go
index 98b05d4..44d88ac 100644
--- a/irc/states.go
+++ b/irc/states.go
@@ -909,9 +909,22 @@ func (s *Session) handle(msg Message) (err error) {
}
}
case "FAIL":
- s.evts <- RawMessageEvent{
- Message: msg.String(),
- IsValid: true,
+ s.evts <- ErrorEvent{
+ Severity: SeverityFail,
+ Code: msg.Params[1],
+ Message: msg.Params[len(msg.Params)-1],
+ }
+ case "WARN":
+ s.evts <- ErrorEvent{
+ Severity: SeverityWarn,
+ Code: msg.Params[1],
+ Message: msg.Params[len(msg.Params)-1],
+ }
+ case "NOTE":
+ s.evts <- ErrorEvent{
+ Severity: SeverityNote,
+ Code: msg.Params[1],
+ Message: msg.Params[len(msg.Params)-1],
}
case "PING":
err = s.send("PONG :%s\r\n", msg.Params[0])
@@ -925,6 +938,14 @@ func (s *Session) handle(msg Message) (err error) {
}
_ = s.conn.Close()
default:
+ // reply handling
+ if ReplySeverity(msg.Command) == SeverityFail {
+ s.evts <- ErrorEvent{
+ Severity: SeverityFail,
+ Code: msg.Command,
+ Message: msg.Params[len(msg.Params)-1],
+ }
+ }
}
return
diff --git a/irc/tokens.go b/irc/tokens.go
index 1a4067e..7ad5738 100644
--- a/irc/tokens.go
+++ b/irc/tokens.go
@@ -303,7 +303,7 @@ func (msg *Message) IsValid() bool {
return 1 <= len(msg.Params)
case rplEndofnames, rplLoggedout, rplMotd, errNicknameinuse, rplNotopic, rplWelcome, rplYourhost:
return 2 <= len(msg.Params)
- case rplIsupport, rplLoggedin, rplTopic:
+ case rplIsupport, rplLoggedin, rplTopic, "FAIL", "WARN", "NOTE":
return 3 <= len(msg.Params)
case rplNamreply:
return 4 <= len(msg.Params)
@@ -349,7 +349,11 @@ func (msg *Message) IsValid() bool {
}
return msg.Params[0][0] == '-'
default:
- return false
+ if len(msg.Command) != 3 || len(msg.Params) < 2 {
+ return false
+ }
+ _, err := strconv.Atoi(msg.Command)
+ return err == nil
}
}
@@ -382,6 +386,34 @@ func (msg *Message) TimeOrNow() time.Time {
return time.Now().UTC()
}
+type Severity int
+
+const (
+ SeverityNote Severity = iota
+ SeverityWarn
+ SeverityFail
+)
+
+func ReplySeverity(reply string) Severity {
+ switch reply[0] {
+ case '4', '5':
+ if reply == "422" {
+ return SeverityNote
+ } else {
+ return SeverityFail
+ }
+ case '9':
+ switch reply[2] {
+ case '2', '4', '5', '6', '7':
+ return SeverityFail
+ default:
+ return SeverityNote
+ }
+ default:
+ return SeverityNote
+ }
+}
+
type Cap struct {
Name string
Value string