Skip to content

Commit b6d1e14

Browse files
authored
Merge pull request #282 from Arkaeriit/plugins-can-send-commands
Plugins can send commands
2 parents 8df6743 + 665ff31 commit b6d1e14

7 files changed

Lines changed: 129 additions & 101 deletions

File tree

commands.go

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -101,64 +101,64 @@ func init() {
101101
// required, running any commands the User may have called.
102102
// It also accepts a boolean indicating if the line of input is from slack, in
103103
// which case some commands will not be run (such as ./tz and ./exit)
104-
func runCommands(line string, u *User) {
105-
line = rmBadWords(line)
104+
func runCommands(msg Message) {
105+
msg.text = rmBadWords(msg.text)
106106

107-
if u.IsMuted {
108-
u.writeln(NewMessage(u.Name, line))
107+
if msg.sender.IsMuted {
108+
msg.sender.writeln(NewMessage(msg.sender, msg.text))
109109
return
110110
}
111111

112-
if line == "" {
112+
if msg.text == "" {
113113
return
114114
}
115115
defer protectFromPanic()
116-
currCmd := strings.Fields(line)[0]
117-
if u.messaging != nil && currCmd != "=" && currCmd != "cd" && currCmd != "exit" && currCmd != "pwd" { // the commands allowed in a private dm room
118-
dmRoomCMD(line, u)
116+
currCmd := strings.Fields(msg.text)[0]
117+
if msg.sender.messaging != nil && currCmd != "=" && currCmd != "cd" && currCmd != "exit" && currCmd != "pwd" { // the commands allowed in a private dm room
118+
dmRoomCMD(msg.text, msg.sender)
119119
return
120120
}
121-
if strings.HasPrefix(line, "=") && !u.isBridge {
122-
dmCMD(strings.TrimSpace(strings.TrimPrefix(line, "=")), u)
121+
if strings.HasPrefix(msg.text, "=") && !msg.sender.isBridge {
122+
dmCMD(strings.TrimSpace(strings.TrimPrefix(msg.text, "=")), msg.sender)
123123
return
124124
}
125125

126126
switch currCmd {
127127
case "hang":
128-
hangCMD(strings.TrimSpace(strings.TrimPrefix(line, "hang")), u)
128+
hangCMD(strings.TrimSpace(strings.TrimPrefix(msg.text, "hang")), msg.sender)
129129
return
130130
case "cd":
131-
cdCMD(strings.TrimSpace(strings.TrimPrefix(line, "cd")), u)
131+
cdCMD(strings.TrimSpace(strings.TrimPrefix(msg.text, "cd")), msg.sender)
132132
return
133133
case "shrug":
134-
shrugCMD(strings.TrimSpace(strings.TrimPrefix(line, "shrug")), u)
134+
shrugCMD(strings.TrimSpace(strings.TrimPrefix(msg.text, "shrug")), msg.sender)
135135
return
136136
case "mute":
137-
muteCMD(strings.TrimSpace(strings.TrimPrefix(line, "mute")), u)
137+
muteCMD(strings.TrimSpace(strings.TrimPrefix(msg.text, "mute")), msg.sender)
138138
return
139139
case "clear":
140-
if clear_if_rest_empty(strings.TrimSpace(strings.TrimPrefix(line, "clear")), u) {
140+
if clear_if_rest_empty(strings.TrimSpace(strings.TrimPrefix(msg.text, "clear")), msg.sender) {
141141
return
142142
}
143143
}
144144

145-
if u.isBridge {
146-
u.room.broadcastNoBridges(NewMessage(u.Name, line))
145+
if msg.sender.isBridge {
146+
msg.sender.room.broadcastNoBridges(msg)
147147
} else {
148-
u.room.broadcast(NewMessage(u.Name, line))
148+
msg.sender.room.broadcast(msg)
149149
}
150150

151-
devbotChat(u.room, line)
151+
devbotChat(msg.sender.room, msg.text)
152152

153-
args := strings.TrimSpace(strings.TrimPrefix(line, currCmd))
153+
args := strings.TrimSpace(strings.TrimPrefix(msg.text, currCmd))
154154

155-
if runPluginCMDs(u, currCmd, args) {
155+
if runPluginCMDs(msg.sender, currCmd, args) {
156156
return
157157
}
158158

159159
if cmd, ok := getCMD(currCmd); ok {
160160
if cmd.argsInfo != "" || args == "" {
161-
cmd.run(args, u)
161+
cmd.run(args, msg.sender)
162162
}
163163
}
164164
}
@@ -175,21 +175,21 @@ func dmCMD(rest string, u *User) {
175175
return
176176
}
177177
msg := strings.TrimSpace(strings.TrimPrefix(rest, restSplit[0]))
178-
u.writeln(NewPrivateMessage(peer.Name, msg, true))
178+
u.writeln(NewPrivateMessage(peer, msg, true))
179179
if u == peer {
180180
devbotRespond(u.room, []string{"You must be really lonely, DMing yourself.",
181181
"Don't worry, I won't judge :wink:",
182182
"srsly?",
183183
"what an idiot"}, 30)
184184
return
185185
}
186-
peer.writeln(NewPrivateMessage(u.Name, msg, false))
186+
peer.writeln(NewPrivateMessage(u, msg, false))
187187
}
188188

189189
func hangCMD(rest string, u *User) {
190190
if len([]rune(rest)) > 1 {
191191
if !u.isBridge {
192-
u.writeln(NewMessage(u.Name, "hang "+rest))
192+
u.writeln(NewMessage(u, "hang "+rest))
193193
u.writeln(NewDevbotMessage("(that word won't show dw)"))
194194
}
195195
hangGame = &hangman{rest, 15, " "} // default value of guesses so empty space is given away
@@ -198,7 +198,7 @@ func hangCMD(rest string, u *User) {
198198
return
199199
}
200200
if !u.isBridge {
201-
u.room.broadcast(NewMessage(u.Name, "hang "+rest))
201+
u.room.broadcast(NewMessage(u, "hang "+rest))
202202
}
203203
if strings.Trim(hangGame.word, hangGame.guesses) == "" {
204204
u.room.broadcast(NewDevbotMessage("The game has ended. Start a new game with hang <word>"))
@@ -248,15 +248,15 @@ func usersCMD(_ string, u *User) {
248248
}
249249

250250
func dmRoomCMD(line string, u *User) {
251-
u.writeln(NewPrivateMessage(u.messaging.Name, line, true))
251+
u.writeln(NewPrivateMessage(u.messaging, line, true))
252252
if u == u.messaging {
253253
devbotRespond(u.room, []string{"You must be really lonely, DMing yourself.",
254254
"Don't worry, I won't judge :wink:",
255255
"srsly?",
256256
"what an idiot"}, 30)
257257
return
258258
}
259-
u.messaging.writeln(NewPrivateMessage(u.Name, line, false))
259+
u.messaging.writeln(NewPrivateMessage(u, line, false))
260260
}
261261

262262
// named devmonk at the request of a certain ced
@@ -382,14 +382,14 @@ func cdCMD(rest string, u *User) {
382382
}
383383
}
384384
if rest == ".." { // cd back into the main room
385-
u.room.broadcast(NewMessage(u.Name, "cd "+rest))
385+
u.room.broadcast(NewMessage(u, "cd "+rest))
386386
if u.room != MainRoom {
387387
u.changeRoom(MainRoom)
388388
}
389389
return
390390
}
391391
if strings.HasPrefix(rest, "#") {
392-
u.room.broadcast(NewMessage(u.Name, "cd "+rest))
392+
u.room.broadcast(NewMessage(u, "cd "+rest))
393393
if len(rest) > MaxRoomNameLen {
394394
rest = rest[0:MaxRoomNameLen]
395395
u.room.broadcast(NewDevbotMessage("Room name lengths are limited, so I'm shortening it to " + rest + "."))
@@ -403,7 +403,7 @@ func cdCMD(rest string, u *User) {
403403
return
404404
}
405405
if rest == "" {
406-
u.room.broadcast(NewMessage(u.Name, "cd "+rest))
406+
u.room.broadcast(NewMessage(u, "cd "+rest))
407407
type kv struct {
408408
roomName string
409409
numOfUsers int
@@ -756,7 +756,7 @@ func pwdCMD(_ string, u *User) {
756756
}
757757

758758
func shrugCMD(line string, u *User) {
759-
u.room.broadcast(NewMessage(u.Name, line+` ¯\\_(ツ)_/¯`))
759+
u.room.broadcast(NewMessage(u, line+` ¯\\_(ツ)_/¯`))
760760
}
761761

762762
func pronounsCMD(line string, u *User) {
@@ -949,7 +949,7 @@ func eightBallCMD(_ string, u *User) {
949949
}
950950
go func() {
951951
time.Sleep(time.Second * time.Duration(rand.Intn(10)))
952-
u.room.broadcast(NewMessage("8ball", responses[rand.Intn(len(responses))]+u.Name))
952+
u.room.broadcast(NewFakeUserMessage("8ball", responses[rand.Intn(len(responses))]+u.Name, u.room))
953953
}()
954954
}
955955

devzat_test.go

Lines changed: 5 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,26 @@
44
package main
55

66
import (
7-
"io"
8-
"net"
97
"strings"
108
"sync"
119
"testing"
1210

1311
"github.com/acarl005/stripansi"
14-
"github.com/gliderlabs/ssh"
15-
terminal "github.com/quackduck/term"
1612
)
1713

18-
type dummyRW struct{}
19-
20-
func (rw dummyRW) Read(p []byte) (n int, err error) { return 0, nil }
21-
func (rw dummyRW) Write(p []byte) (n int, err error) { return 0, nil }
22-
23-
type dummySession struct{}
24-
25-
func (s dummySession) User() string { return "" }
26-
func (s dummySession) RemoteAddr() net.Addr { return nil }
27-
func (s dummySession) LocalAddr() net.Addr { return nil }
28-
func (s dummySession) Environ() []string { return make([]string, 0) }
29-
func (s dummySession) Exit(code int) error { return nil }
30-
func (s dummySession) Command() []string { return make([]string, 0) }
31-
func (s dummySession) RawCommand() string { return "" }
32-
func (s dummySession) Subsystem() string { return "" }
33-
func (s dummySession) PublicKey() ssh.PublicKey { return nil }
34-
func (s dummySession) Context() ssh.Context { return nil }
35-
func (s dummySession) Permissions() ssh.Permissions { return ssh.Permissions{} }
36-
func (s dummySession) Pty() (ssh.Pty, <-chan ssh.Window, bool) { return ssh.Pty{}, nil, true }
37-
func (s dummySession) Signals(c chan<- ssh.Signal) {}
38-
func (s dummySession) Break(c chan<- bool) {}
39-
func (s dummySession) Close() error { return nil }
40-
func (s dummySession) CloseWrite() error { return nil }
41-
func (s dummySession) Read(data []byte) (int, error) { return 0, nil }
42-
func (s dummySession) SendRequest(name string, wantReply bool, payload []byte) (bool, error) {
43-
return false, nil
44-
}
45-
func (s dummySession) Stderr() io.ReadWriter { return nil }
46-
func (s dummySession) Write(data []byte) (int, error) { return 0, nil }
47-
4814
func makeDummyRoom() *Room {
49-
drw := dummyRW{}
50-
dummyTerm := terminal.NewTerminal(drw, "")
5115
ret := &Room{name: "DummyRoom", users: []*User{}, usersMutex: sync.RWMutex{}}
5216

53-
tim := &User{Name: "tim", term: dummyTerm, ColorBG: "bg-off", room: ret, session: dummySession{}}
17+
tim := makeDummyUser("tim", ret)
5418
_ = tim.changeColor("green")
55-
tom := &User{Name: "tom", term: dummyTerm, ColorBG: "bg-off", room: ret, session: dummySession{}}
19+
tom := makeDummyUser("tom", ret)
5620
_ = tom.changeColor("blue")
57-
timtom := &User{Name: "timtom", term: dummyTerm, ColorBG: "bg-off", room: ret, session: dummySession{}}
21+
timtom := makeDummyUser("timtom", ret)
5822
_ = timtom.changeColor("sky")
59-
timt := &User{Name: "timt", term: dummyTerm, ColorBG: "bg-off", room: ret, session: dummySession{}}
23+
timt := makeDummyUser("timt", ret)
6024
_ = timt.changeColor("coral")
6125

62-
ret.users = append(ret.users, tim, tom, timtom, timt)
26+
ret.users = append(ret.users, &tim, &tom, &timtom, &timt)
6327
return ret
6428
}
6529

discord.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ func discordMessageHandler(_ *discordgo.Session, m *discordgo.MessageCreate) {
154154
Log.Println("Overflow in Slack channel")
155155
}
156156
}
157-
runCommands(msgContent, DiscordUser)
157+
runCommands(NewMessage(DiscordUser, msgContent))
158158
}
159159

160160
var cacheSize = 20

main.go

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,9 @@ func (r *Room) broadcast(msg Message) {
225225

226226
if Integrations.Slack != nil || Integrations.Discord != nil {
227227
var toSendS string
228-
if msg.senderName != "" {
228+
if msg.getMessageSenderName() != "" {
229229
if Integrations.Slack != nil {
230-
toSendS = "[" + r.name + "] *" + msg.senderName + "*: " + msg.text
230+
toSendS = "[" + r.name + "] *" + msg.getMessageSenderName() + "*: " + msg.text
231231
}
232232
} else {
233233
toSendS = "[" + r.name + "] " + msg.text
@@ -242,7 +242,7 @@ func (r *Room) broadcast(msg Message) {
242242
if Integrations.Discord != nil {
243243
select {
244244
case DiscordChan <- DiscordMsg{
245-
senderName: msg.senderName,
245+
senderName: msg.getMessageSenderName(),
246246
msg: msg.text,
247247
channel: r.name,
248248
}:
@@ -646,38 +646,58 @@ func (u *User) ban(banMsg string, useTime bool, unbanTime time.Time) {
646646
}
647647

648648
type Message struct {
649-
senderName string
650-
text string
649+
sender *User
650+
text string
651651

652652
messageType MessageType
653653
sentFromPluginId string
654654
}
655655

656-
func NewMessage(senderName, text string) Message {
657-
return Message{senderName, text, DefaultMessage, ""}
656+
func NewMessage(sender *User, text string) Message {
657+
return Message{sender, text, DefaultMessage, ""}
658+
}
659+
660+
func NewFakeUserMessage(sender string, text string, room *Room) Message {
661+
senderUser := makeDummyUser(sender, room)
662+
return NewMessage(&senderUser, text)
663+
}
664+
665+
func NewFakeUserPrivateMessage(sender string, text string) Message {
666+
senderUser := User{Name: sender}
667+
return NewPrivateMessage(&senderUser, text, false)
658668
}
659669

660670
func NewDevbotMessage(text string) Message {
661-
return Message{Devbot, text, DefaultMessage, ""}
671+
return NewFakeUserMessage(Devbot, text, MainRoom) // As devbot messages are either directly broadcasted to a room or unicasted to an user, the room argument is kinda irrelevant
662672
}
663673

664674
func NewNoSenderMessage(text string) Message {
665-
return Message{"", text, NoSenderMessage, ""}
675+
return Message{nil, text, NoSenderMessage, ""}
666676
}
667677

668-
func NewPrivateMessage(senderName, text string, isSender bool) Message {
678+
func NewPrivateMessage(sender *User, text string, isSender bool) Message {
669679
messageType := PrivateMessageReceive
670680
if isSender {
671681
messageType = PrivateMessageSend
672682
}
673-
return Message{senderName, text, messageType, ""}
683+
return Message{sender, text, messageType, ""}
674684
}
675685

676686
func (msg Message) dontSendToPlugin(pluginId string) Message {
677687
msg.sentFromPluginId = pluginId
678688
return msg
679689
}
680690

691+
func (msg Message) getMessageSenderName() string {
692+
if msg.sender == nil {
693+
return ""
694+
} else {
695+
return msg.sender.Name
696+
}
697+
}
698+
699+
700+
681701
type MessageType int
682702

683703
const (
@@ -698,23 +718,23 @@ func (u *User) writelnWithImageCache(msg Message, cache map[string]image.Image)
698718
thisUserIsDMSender := msg.messageType == PrivateMessageSend
699719
switch msg.messageType {
700720
case PrivateMessageSend:
701-
msg.text = strings.TrimSpace(mdRender(msg.text, lenString(msg.senderName), u.winWidth, cache))
702-
msg.text = msg.senderName + " <- " + msg.text
721+
msg.text = strings.TrimSpace(mdRender(msg.text, lenString(msg.getMessageSenderName()), u.winWidth, cache))
722+
msg.text = msg.getMessageSenderName() + " <- " + msg.text
703723
case PrivateMessageReceive:
704-
msg.text = strings.TrimSpace(mdRender(msg.text, lenString(msg.senderName), u.winWidth, cache))
705-
msg.text = msg.senderName + " -> " + msg.text
724+
msg.text = strings.TrimSpace(mdRender(msg.text, lenString(msg.getMessageSenderName()), u.winWidth, cache))
725+
msg.text = msg.getMessageSenderName() + " -> " + msg.text
706726
msg.text += "\a"
707727
case DefaultMessage:
708-
msg.text = strings.TrimSpace(mdRender(msg.text, lenString(msg.senderName)+2, u.winWidth, cache))
709-
msg.text = msg.senderName + ": " + msg.text
728+
msg.text = strings.TrimSpace(mdRender(msg.text, lenString(msg.getMessageSenderName())+2, u.winWidth, cache))
729+
msg.text = msg.getMessageSenderName() + ": " + msg.text
710730
case NoSenderMessage:
711731
msg.text = strings.TrimSpace(mdRender(msg.text, 0, u.winWidth, cache)) // No sender
712732
}
713733
if time.Since(u.lastTimestamp) > time.Minute {
714734
u.lastTimestamp = time.Now()
715735
u.rWriteln(fmtTime(u, u.lastTimestamp))
716736
}
717-
if u.PingEverytime && msg.senderName != u.Name && !thisUserIsDMSender {
737+
if u.PingEverytime && msg.getMessageSenderName() != u.Name && !thisUserIsDMSender {
718738
msg.text += "\a"
719739
}
720740
if !u.Bell {
@@ -966,7 +986,7 @@ func (u *User) repl() {
966986
u.close(Red.Paint(u.Name + " has been banned for spamming"))
967987
return
968988
}
969-
runCommands(line, u)
989+
runCommands(NewMessage(u, line))
970990
}
971991
}
972992

0 commit comments

Comments
 (0)