summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app.go12
-rw-r--r--irc/states.go42
-rw-r--r--irc/tokens.go10
3 files changed, 59 insertions, 5 deletions
diff --git a/app.go b/app.go
index f0ad553..3031bcd 100644
--- a/app.go
+++ b/app.go
@@ -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