diff options
-rw-r--r-- | app.go | 12 | ||||
-rw-r--r-- | irc/states.go | 42 | ||||
-rw-r--r-- | irc/tokens.go | 10 |
3 files changed, 59 insertions, 5 deletions
@@ -318,6 +318,18 @@ func (app *App) handleInput(buffer, content string) { } app.s.Part(args) + case "TOPIC": + if buffer == ui.Home { + return + } + + if args == "" { + topic := app.s.Topic(buffer) + line := fmt.Sprintf("\x0314Topic: %s", topic) + app.win.AddLine(buffer, ui.NewLineNow("--", line)) + } else { + app.s.SetTopic(buffer, args) + } case "ME": if buffer == ui.Home { return diff --git a/irc/states.go b/irc/states.go index 1405c48..aba6536 100644 --- a/irc/states.go +++ b/irc/states.go @@ -80,6 +80,10 @@ type ( actionPart struct { Channel string } + actionSetTopic struct { + Channel string + Topic string + } actionPrivMsg struct { Target string @@ -113,6 +117,10 @@ type Channel struct { Secret bool } +func (c *Channel) SetTopic(topic string) { + c.Topic = topic +} + type SessionParams struct { Nickname string Username string @@ -240,6 +248,15 @@ func (s *Session) IsChannel(name string) bool { return strings.IndexAny(name, "#&") == 0 // TODO compute CHANTYPES } +func (s *Session) Topic(channel string) string { + channelCf := strings.ToLower(channel) + if c, ok := s.channels[channelCf]; ok { + return c.Topic + } else { + return "" + } +} + func (s *Session) SendRaw(raw string) { s.acts <- actionSendRaw{raw} } @@ -267,6 +284,15 @@ func (s *Session) part(act actionPart) (err error) { return } +func (s *Session) SetTopic(channel, topic string) { + s.acts <- actionSetTopic{channel, topic} +} + +func (s *Session) setTopic(act actionSetTopic) (err error) { + err = s.send("TOPIC %s %s\r\n", act.Channel, act.Topic) + return +} + func (s *Session) PrivMsg(target, content string) { s.acts <- actionPrivMsg{target, content} } @@ -339,6 +365,8 @@ func (s *Session) run() { err = s.join(act) case actionPart: err = s.part(act) + case actionSetTopic: + err = s.setTopic(act) case actionPrivMsg: err = s.privMsg(act) case actionTyping: @@ -665,9 +693,21 @@ func (s *Session) handle(msg Message) (err error) { } case rplTopic: channelCf := strings.ToLower(msg.Params[1]) - if c, ok := s.channels[channelCf]; ok { c.Topic = msg.Params[2] + s.channels[channelCf] = c + } + case rplNotopic: + channelCf := strings.ToLower(msg.Params[1]) + if c, ok := s.channels[channelCf]; ok { + c.Topic = "" + s.channels[channelCf] = c + } + case "TOPIC": + channelCf := strings.ToLower(msg.Params[0]) + if c, ok := s.channels[channelCf]; ok { + c.Topic = msg.Params[1] + s.channels[channelCf] = c } case "PRIVMSG", "NOTICE": s.evts <- s.privmsgToEvent(msg) diff --git a/irc/tokens.go b/irc/tokens.go index 276b4c2..eda8018 100644 --- a/irc/tokens.go +++ b/irc/tokens.go @@ -297,6 +297,12 @@ func (msg *Message) Validate() (err error) { if len(msg.Params) < 3 { err = errNotEnoughParams } + case "TOPIC": + if len(msg.Params) < 2 { + err = errNotEnoughParams + } else if msg.Prefix == "" { + err = errNoPrefix + } case "PRIVMSG", "NOTICE": if len(msg.Params) < 2 { err = errNotEnoughParams @@ -309,10 +315,6 @@ func (msg *Message) Validate() (err error) { } else if msg.Prefix == "" { err = errNoPrefix } - case "TOPIC": - if len(msg.Params) < 2 { - err = errNotEnoughParams - } case "BATCH": if len(msg.Params) < 1 { err = errNotEnoughParams |