Skip to content
This repository was archived by the owner on Dec 16, 2021. It is now read-only.

Commit 1701b8d

Browse files
committed
* Move non-GUI code of sendMessageAsFile into message.go
* Move non-GUI / offline code of `insertQuoteOfMessage` into message.go and write unit test
1 parent 6d67c34 commit 1701b8d

File tree

3 files changed

+199
-34
lines changed

3 files changed

+199
-34
lines changed

discordutil/message.go

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package discordutil
22

3-
import "github.com/Bios-Marcel/discordgo"
3+
import (
4+
"bytes"
5+
"fmt"
6+
"github.com/Bios-Marcel/cordless/times"
7+
"github.com/Bios-Marcel/discordgo"
8+
"strings"
9+
)
410

511
// MentionsCurrentUserExplicitly checks whether the message contains any
612
// explicit mentions for the user associated with the currently logged in user.
@@ -94,3 +100,46 @@ func (l *MessageLoader) LoadMessages(channel *discordgo.Channel) ([]*discordgo.M
94100

95101
return messages, nil
96102
}
103+
104+
// SendMessageAsFile sends the given message into the given channel using the
105+
// passed discord Session. If an error occurs, onFailure gets called.
106+
func SendMessageAsFile(session *discordgo.Session, message string, channel string, onFailure func(error)) {
107+
reader := bytes.NewBufferString(message)
108+
messageAsFile := &discordgo.File{
109+
Name: "message.txt",
110+
ContentType: "text",
111+
Reader: reader,
112+
}
113+
complexMessage := &discordgo.MessageSend{
114+
Content: "The message was too long, therefore, you get a file:",
115+
Embed: nil,
116+
Tts: false,
117+
Files: nil,
118+
File: messageAsFile,
119+
}
120+
_, sendError := session.ChannelMessageSendComplex(channel, complexMessage)
121+
if sendError != nil {
122+
onFailure(sendError)
123+
}
124+
}
125+
126+
// Generates a Quote using the given Input. The `messageAfterQuote` will be
127+
// appended after the quote in case it is not empty.
128+
func GenerateQuote(message, author string, time discordgo.Timestamp, messageAfterQuote string) (string, error) {
129+
messageTime, parseError := time.Parse()
130+
if parseError != nil {
131+
return "", parseError
132+
}
133+
134+
// All quotes should be UTC.
135+
messageTimeUTC := messageTime.UTC()
136+
137+
quotedMessage := strings.ReplaceAll(message, "\n", "\n> ")
138+
quotedMessage = fmt.Sprintf("> **%s** %s UTC:\n> %s\n", author, times.TimeToString(&messageTimeUTC), quotedMessage)
139+
currentContent := strings.TrimSpace(messageAfterQuote)
140+
if currentContent != "" {
141+
quotedMessage = quotedMessage + currentContent
142+
}
143+
144+
return quotedMessage, nil
145+
}

discordutil/message_test.go

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,3 +193,142 @@ func Test_LoadMessages_CacheAccess(t *testing.T) {
193193

194194
})
195195
}
196+
197+
func TestGenerateQuote(t *testing.T) {
198+
type args struct {
199+
message string
200+
author string
201+
time discordgo.Timestamp
202+
messageAfterQuote string
203+
}
204+
tests := []struct {
205+
name string
206+
args args
207+
want string
208+
wantErr bool
209+
}{
210+
{
211+
name: "simple line",
212+
args: args{
213+
message: "Hello World",
214+
author: "humaN",
215+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000+00:00"),
216+
messageAfterQuote: "",
217+
},
218+
want: "> **humaN** 21:30:57 UTC:\n> Hello World\n",
219+
wantErr: false,
220+
}, {
221+
name: "simple line; non UTC - positive",
222+
args: args{
223+
message: "Hello World",
224+
author: "humaN",
225+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000+03:00"),
226+
messageAfterQuote: "",
227+
},
228+
want: "> **humaN** 18:30:57 UTC:\n> Hello World\n",
229+
wantErr: false,
230+
}, {
231+
name: "simple line; non UTC - negative",
232+
args: args{
233+
message: "Hello World",
234+
author: "humaN",
235+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000-02:00"),
236+
messageAfterQuote: "",
237+
},
238+
want: "> **humaN** 23:30:57 UTC:\n> Hello World\n",
239+
wantErr: false,
240+
}, {
241+
name: "multi line",
242+
args: args{
243+
message: "Hello World\nBye World",
244+
author: "humaN",
245+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000+00:00"),
246+
messageAfterQuote: "",
247+
},
248+
want: "> **humaN** 21:30:57 UTC:\n> Hello World\n> Bye World\n",
249+
wantErr: false,
250+
}, {
251+
name: "simple line with message after quote",
252+
args: args{
253+
message: "Hello World",
254+
author: "humaN",
255+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000+00:00"),
256+
messageAfterQuote: "Hei",
257+
},
258+
want: "> **humaN** 21:30:57 UTC:\n> Hello World\nHei",
259+
wantErr: false,
260+
}, {
261+
name: "simple line with multline message after quote",
262+
args: args{
263+
message: "Hello World",
264+
author: "humaN",
265+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000+00:00"),
266+
messageAfterQuote: "Hei\nHo",
267+
},
268+
want: "> **humaN** 21:30:57 UTC:\n> Hello World\nHei\nHo",
269+
wantErr: false,
270+
}, {
271+
name: "simple line with whitespace message after quote",
272+
args: args{
273+
message: "Hello World",
274+
author: "humaN",
275+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000+00:00"),
276+
messageAfterQuote: " \t ",
277+
},
278+
want: "> **humaN** 21:30:57 UTC:\n> Hello World\n",
279+
wantErr: false,
280+
}, {
281+
name: "simple line with surrounding whitespace message after quote",
282+
args: args{
283+
message: "Hello World",
284+
author: "humaN",
285+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000+00:00"),
286+
messageAfterQuote: " \t hei",
287+
},
288+
want: "> **humaN** 21:30:57 UTC:\n> Hello World\nhei",
289+
wantErr: false,
290+
}, {
291+
name: "empty author; we won't handle this, but still specify expected behaviour",
292+
args: args{
293+
message: "Hello World\nBye World",
294+
author: "",
295+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000+00:00"),
296+
messageAfterQuote: "",
297+
},
298+
want: "> **** 21:30:57 UTC:\n> Hello World\n> Bye World\n",
299+
wantErr: false,
300+
}, {
301+
name: "empty message; we won't handle this, but still specify expected behaviour",
302+
args: args{
303+
message: "",
304+
author: "author",
305+
time: discordgo.Timestamp("2019-10-28T21:30:57.003000+00:00"),
306+
messageAfterQuote: "",
307+
},
308+
want: "> **author** 21:30:57 UTC:\n> \n",
309+
wantErr: false,
310+
}, {
311+
name: "Invalid timestamps should cause an error",
312+
args: args{
313+
message: "",
314+
author: "",
315+
time: discordgo.Timestamp("OwO, an invalid timestamp"),
316+
messageAfterQuote: "",
317+
},
318+
want: "",
319+
wantErr: true,
320+
},
321+
}
322+
for _, tt := range tests {
323+
t.Run(tt.name, func(t *testing.T) {
324+
got, err := GenerateQuote(tt.args.message, tt.args.author, tt.args.time, tt.args.messageAfterQuote)
325+
if (err != nil) != tt.wantErr {
326+
t.Errorf("GenerateQuote() error = %v, wantErr %v", err, tt.wantErr)
327+
return
328+
}
329+
if got != tt.want {
330+
t.Errorf("GenerateQuote() got = %v, want %v", got, tt.want)
331+
}
332+
})
333+
}
334+
}

ui/window.go

Lines changed: 10 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"github.com/Bios-Marcel/cordless/scripting"
2121
"github.com/Bios-Marcel/cordless/scripting/js"
2222
"github.com/Bios-Marcel/cordless/shortcuts"
23-
"github.com/Bios-Marcel/cordless/times"
2423
"github.com/Bios-Marcel/cordless/ui/tviewutil"
2524
"github.com/Bios-Marcel/cordless/util/fuzzy"
2625
"github.com/Bios-Marcel/cordless/util/maths"
@@ -978,17 +977,10 @@ func (window *Window) IsCursorInsideCodeBlock() bool {
978977
}
979978

980979
func (window *Window) insertQuoteOfMessage(message *discordgo.Message) {
981-
messageTime, parseError := message.Timestamp.Parse()
982-
if parseError != nil {
983-
return
984-
}
985-
986-
// All quotes should be UTC.
987-
messageTimeUTC := messageTime.UTC()
988-
989-
currentContent := strings.TrimSpace(window.messageInput.GetText())
990980
username := message.Author.Username
991981
if message.GuildID != "" {
982+
//The error handling here is rather lax, since not being able to show
983+
// a nickname isn't really a gamerbreaker.
992984
guild, stateError := window.session.State.Guild(message.GuildID)
993985
if stateError == nil {
994986
member, stateError := window.session.State.Member(guild.ID, message.Author.ID)
@@ -998,13 +990,13 @@ func (window *Window) insertQuoteOfMessage(message *discordgo.Message) {
998990
}
999991
}
1000992

1001-
quotedMessage := strings.ReplaceAll(message.ContentWithMentionsReplaced(), "\n", "\n> ")
1002-
quotedMessage = fmt.Sprintf("> **%s** %s UTC:\n> %s\n", username, times.TimeToString(&messageTimeUTC), quotedMessage)
1003-
if currentContent != "" {
1004-
quotedMessage = quotedMessage + currentContent
993+
quotedMessage, generateError := discordutil.GenerateQuote(message.ContentWithMentionsReplaced(), username, message.Timestamp, window.messageInput.GetText())
994+
if generateError == nil {
995+
window.messageInput.SetText(quotedMessage)
996+
window.app.SetFocus(window.messageInput.GetPrimitive())
997+
} else {
998+
window.ShowErrorDialog(fmt.Sprintf("Error quoting message:\n\t%s", generateError.Error()))
1005999
}
1006-
window.messageInput.SetText(quotedMessage)
1007-
window.app.SetFocus(window.messageInput.GetPrimitive())
10081000
}
10091001

10101002
func (window *Window) TrySendMessage(targetChannel *discordgo.Channel, message string) {
@@ -1052,21 +1044,7 @@ func (window *Window) TrySendMessage(targetChannel *discordgo.Channel, message s
10521044
}
10531045

10541046
func (window *Window) sendMessageAsFile(message string, channel string) {
1055-
reader := bytes.NewBufferString(message)
1056-
messageAsFile := &discordgo.File{
1057-
Name: "message.txt",
1058-
ContentType: "text",
1059-
Reader: reader,
1060-
}
1061-
complexMessage := &discordgo.MessageSend{
1062-
Content: "The message was too long, therefore, you get a file:",
1063-
Embed: nil,
1064-
Tts: false,
1065-
Files: nil,
1066-
File: messageAsFile,
1067-
}
1068-
_, sendError := window.session.ChannelMessageSendComplex(channel, complexMessage)
1069-
if sendError != nil {
1047+
discordutil.SendMessageAsFile(window.session, message, channel, func(sendError error) {
10701048
retry := "Retry sending"
10711049
edit := "Edit"
10721050
window.app.QueueUpdateDraw(func() {
@@ -1081,7 +1059,7 @@ func (window *Window) sendMessageAsFile(message string, channel string) {
10811059
}
10821060
}, retry, edit, "Cancel")
10831061
})
1084-
}
1062+
})
10851063
}
10861064

10871065
func (window *Window) sendMessage(targetChannelID, message string) {
@@ -1192,7 +1170,6 @@ func (window *Window) PopulateMentionWindowFromCurrentGuild(mentionWindow *tview
11921170
}
11931171
window.addNodeToMentionWindow(mentionWindow, displayName, userMentionReference)
11941172
}
1195-
11961173
}
11971174

11981175
func (window *Window) addNodeToMentionWindow(mentionWindow *tview.TreeView, name string, reference interface{}) {

0 commit comments

Comments
 (0)