diff options
author | Hubert Hirtz <hubert@hirtz.pm> | 2020-11-19 17:21:47 +0100 |
---|---|---|
committer | Hubert Hirtz <hubert@hirtz.pm> | 2020-11-19 17:21:47 +0100 |
commit | 8e01ade1ef0e0636eb5093295e6035f70881fb23 (patch) | |
tree | 8ebcb38886a696d6b2d83a30cbcc2db83efeef6b /irc | |
parent | Add completion for /msg (diff) |
Basic display of errors
Diffstat (limited to 'irc')
-rw-r--r-- | irc/events.go | 6 | ||||
-rw-r--r-- | irc/states.go | 27 | ||||
-rw-r--r-- | irc/tokens.go | 36 |
3 files changed, 64 insertions, 5 deletions
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 |