summaryrefslogtreecommitdiff
path: root/irc
diff options
context:
space:
mode:
authorHubert Hirtz <hubert@hirtz.pm>2020-11-19 17:21:47 +0100
committerHubert Hirtz <hubert@hirtz.pm>2020-11-19 17:21:47 +0100
commit8e01ade1ef0e0636eb5093295e6035f70881fb23 (patch)
tree8ebcb38886a696d6b2d83a30cbcc2db83efeef6b /irc
parentAdd completion for /msg (diff)
Basic display of errors
Diffstat (limited to 'irc')
-rw-r--r--irc/events.go6
-rw-r--r--irc/states.go27
-rw-r--r--irc/tokens.go36
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