diff options
| author | Hubert Hirtz <hubert@hirtzfr.eu> | 2020-08-05 22:04:50 +0200 |
|---|---|---|
| committer | Hubert Hirtz <hubert@hirtzfr.eu> | 2020-08-05 22:04:50 +0200 |
| commit | e56baed4fc8f53047cbe216347d57171001e0a6e (patch) | |
| tree | 641a3f84fe824681842407801608993b892a0fa1 /irc/tokens.go | |
| parent | Don't request history of the home buffer (diff) | |
Add a -debug flag and show raw messages
Diffstat (limited to 'irc/tokens.go')
| -rw-r--r-- | irc/tokens.go | 83 |
1 files changed, 80 insertions, 3 deletions
diff --git a/irc/tokens.go b/irc/tokens.go index 53deaee..064e4c5 100644 --- a/irc/tokens.go +++ b/irc/tokens.go @@ -38,7 +38,7 @@ func tagEscape(c rune) (escape rune) { return } -func unescapeTagValue(escaped string) (unescaped string) { +func unescapeTagValue(escaped string) string { var builder strings.Builder builder.Grow(len(escaped)) escape := false @@ -60,8 +60,36 @@ func unescapeTagValue(escaped string) (unescaped string) { } } - unescaped = builder.String() - return + return builder.String() +} + +func escapeTagValue(unescaped string) string { + var sb strings.Builder + sb.Grow(len(unescaped) * 2) + + for _, c := range unescaped { + switch c { + case ';': + sb.WriteRune('\\') + sb.WriteRune(':') + case ' ': + sb.WriteRune('\\') + sb.WriteRune('s') + case '\r': + sb.WriteRune('\\') + sb.WriteRune('r') + case '\n': + sb.WriteRune('\\') + sb.WriteRune('n') + case '\\': + sb.WriteRune('\\') + sb.WriteRune('\\') + default: + sb.WriteRune(c) + } + } + + return sb.String() } func parseTags(s string) (tags map[string]string) { @@ -154,6 +182,55 @@ func Tokenize(line string) (msg Message, err error) { return } +func (msg *Message) IsReply() bool { + if len(msg.Command) != 3 { + return false + } + for _, r := range msg.Command { + if !('0' <= r && r <= '9') { + return false + } + } + return true +} + +func (msg *Message) String() string { + var sb strings.Builder + + if msg.Tags != nil { + sb.WriteRune('@') + for k, v := range msg.Tags { + sb.WriteString(k) + if v != "" { + sb.WriteRune('=') + sb.WriteString(escapeTagValue(v)) + } + sb.WriteRune(';') + } + sb.WriteRune(' ') + } + + if msg.Prefix != "" { + sb.WriteRune(':') + sb.WriteString(msg.Prefix) + sb.WriteRune(' ') + } + + sb.WriteString(msg.Command) + + if len(msg.Params) != 0 { + for _, p := range msg.Params[:len(msg.Params)-1] { + sb.WriteRune(' ') + sb.WriteString(p) + } + sb.WriteRune(' ') + sb.WriteRune(':') + sb.WriteString(msg.Params[len(msg.Params)-1]) + } + + return sb.String() +} + func (msg *Message) Validate() (err error) { switch msg.Command { case rplWelcome: |
