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
+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