commit f1791d1

Hubert Hirtz  ·  2020-08-16 15:02:22 +0000 UTC
parent 1910dab
Add a /topic command
3 files changed,  +59, -5
M app.go
M app.go
+12, -0
 1@@ -318,6 +318,18 @@ func (app *App) handleInput(buffer, content string) {
 2 		}
 3 
 4 		app.s.Part(args)
 5+	case "TOPIC":
 6+		if buffer == ui.Home {
 7+			return
 8+		}
 9+
10+		if args == "" {
11+			topic := app.s.Topic(buffer)
12+			line := fmt.Sprintf("\x0314Topic: %s", topic)
13+			app.win.AddLine(buffer, ui.NewLineNow("--", line))
14+		} else {
15+			app.s.SetTopic(buffer, args)
16+		}
17 	case "ME":
18 		if buffer == ui.Home {
19 			return
+41, -1
 1@@ -80,6 +80,10 @@ type (
 2 	actionPart struct {
 3 		Channel string
 4 	}
 5+	actionSetTopic struct {
 6+		Channel string
 7+		Topic   string
 8+	}
 9 
10 	actionPrivMsg struct {
11 		Target  string
12@@ -113,6 +117,10 @@ type Channel struct {
13 	Secret    bool
14 }
15 
16+func (c *Channel) SetTopic(topic string) {
17+	c.Topic = topic
18+}
19+
20 type SessionParams struct {
21 	Nickname string
22 	Username string
23@@ -240,6 +248,15 @@ func (s *Session) IsChannel(name string) bool {
24 	return strings.IndexAny(name, "#&") == 0 // TODO compute CHANTYPES
25 }
26 
27+func (s *Session) Topic(channel string) string {
28+	channelCf := strings.ToLower(channel)
29+	if c, ok := s.channels[channelCf]; ok {
30+		return c.Topic
31+	} else {
32+		return ""
33+	}
34+}
35+
36 func (s *Session) SendRaw(raw string) {
37 	s.acts <- actionSendRaw{raw}
38 }
39@@ -267,6 +284,15 @@ func (s *Session) part(act actionPart) (err error) {
40 	return
41 }
42 
43+func (s *Session) SetTopic(channel, topic string) {
44+	s.acts <- actionSetTopic{channel, topic}
45+}
46+
47+func (s *Session) setTopic(act actionSetTopic) (err error) {
48+	err = s.send("TOPIC %s %s\r\n", act.Channel, act.Topic)
49+	return
50+}
51+
52 func (s *Session) PrivMsg(target, content string) {
53 	s.acts <- actionPrivMsg{target, content}
54 }
55@@ -339,6 +365,8 @@ func (s *Session) run() {
56 				err = s.join(act)
57 			case actionPart:
58 				err = s.part(act)
59+			case actionSetTopic:
60+				err = s.setTopic(act)
61 			case actionPrivMsg:
62 				err = s.privMsg(act)
63 			case actionTyping:
64@@ -665,9 +693,21 @@ func (s *Session) handle(msg Message) (err error) {
65 		}
66 	case rplTopic:
67 		channelCf := strings.ToLower(msg.Params[1])
68-
69 		if c, ok := s.channels[channelCf]; ok {
70 			c.Topic = msg.Params[2]
71+			s.channels[channelCf] = c
72+		}
73+	case rplNotopic:
74+		channelCf := strings.ToLower(msg.Params[1])
75+		if c, ok := s.channels[channelCf]; ok {
76+			c.Topic = ""
77+			s.channels[channelCf] = c
78+		}
79+	case "TOPIC":
80+		channelCf := strings.ToLower(msg.Params[0])
81+		if c, ok := s.channels[channelCf]; ok {
82+			c.Topic = msg.Params[1]
83+			s.channels[channelCf] = c
84 		}
85 	case "PRIVMSG", "NOTICE":
86 		s.evts <- s.privmsgToEvent(msg)
+6, -4
 1@@ -297,6 +297,12 @@ func (msg *Message) Validate() (err error) {
 2 		if len(msg.Params) < 3 {
 3 			err = errNotEnoughParams
 4 		}
 5+	case "TOPIC":
 6+		if len(msg.Params) < 2 {
 7+			err = errNotEnoughParams
 8+		} else if msg.Prefix == "" {
 9+			err = errNoPrefix
10+		}
11 	case "PRIVMSG", "NOTICE":
12 		if len(msg.Params) < 2 {
13 			err = errNotEnoughParams
14@@ -309,10 +315,6 @@ func (msg *Message) Validate() (err error) {
15 		} else if msg.Prefix == "" {
16 			err = errNoPrefix
17 		}
18-	case "TOPIC":
19-		if len(msg.Params) < 2 {
20-			err = errNotEnoughParams
21-		}
22 	case "BATCH":
23 		if len(msg.Params) < 1 {
24 			err = errNotEnoughParams