cmd/youtubecommand.go   F
last analyzed

Size/Duplication

Total Lines 297
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 62
eloc 221
dl 0
loc 297
rs 3.44
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
B cmd.shortPlay 0 14 6
A cmd.youtubeClear 0 12 3
B cmd.YoutubeCommand 0 19 8
B cmd.youtubePlay 0 26 5
A cmd.youtubeSkip 0 8 2
D cmd.youtubeAdd 0 65 13
A cmd.youtubeStop 0 11 3
B cmd.youtubeList 0 25 6
F cmd.YoutubeShortCommand 0 83 16
1
package cmd
2
3
import (
4
	"fmt"
5
	"strings"
6
7
	"github.com/FlameInTheDark/dtbot/bot"
8
	"github.com/bwmarrin/discordgo"
9
)
10
11
// YoutubeCommand youtube handler
12
func YoutubeCommand(ctx bot.Context) {
13
	sess := ctx.Sessions.GetByGuild(ctx.Guild.ID)
14
	if len(ctx.Args) == 0 {
15
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_no_args"))
16
		return
17
	}
18
	switch ctx.Args[0] {
19
	case "play":
20
		youtubePlay(sess, &ctx)
21
	case "stop":
22
		youtubeStop(sess, &ctx)
23
	case "skip":
24
		youtubeSkip(sess, &ctx)
25
	case "add":
26
		youtubeAdd(sess, &ctx)
27
	case "list":
28
		youtubeList(sess, &ctx)
29
	case "clear":
30
		youtubeClear(sess, &ctx)
31
	}
32
}
33
34
func youtubePlay(sess *bot.Session, ctx *bot.Context) {
35
	ctx.MetricsCommand("youtube_command", "play")
36
	if sess == nil {
37
		vc := ctx.GetVoiceChannel()
38
		if vc == nil {
39
			ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("player")), ctx.Loc("player_must_be_in_voice"))
40
			return
41
		}
42
		nsess, serr := ctx.Sessions.Join(ctx.Discord, ctx.Guild.ID, vc.ID, bot.JoinProperties{
43
			Muted:    false,
44
			Deafened: true,
45
		}, ctx.Guilds.Guilds[ctx.Guild.ID].VoiceVolume)
46
		if serr != nil {
47
			//ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("player")), ctx.Loc("player_error") + " : " + serr.Error())
48
			ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("player error: %v", serr.Error()))
49
			return
50
		}
51
		sess = nsess
52
	}
53
	queue := sess.Queue
54
	if !queue.HasNext() {
55
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_queue_is_empty"))
56
		return
57
	}
58
	msg := ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_starting"))
59
	shortPlay(ctx, sess, msg)
60
}
61
62
func youtubeStop(sess *bot.Session, ctx *bot.Context) {
63
	ctx.MetricsCommand("youtube_command", "stop")
64
	if sess == nil {
65
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("player_not_in_voice"))
66
		return
67
	}
68
	if sess.Queue.HasNext() {
69
		sess.Queue.Clear()
70
	}
71
	sess.Stop()
72
	ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_stopped"))
73
}
74
75
func youtubeSkip(sess *bot.Session, ctx *bot.Context) {
76
	ctx.MetricsCommand("youtube_command", "skip")
77
	if sess == nil {
78
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("player_not_in_voice"))
79
		return
80
	}
81
	sess.Stop()
82
	ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_skipped"))
83
}
84
85
func youtubeAdd(sess *bot.Session, ctx *bot.Context) {
86
	ctx.MetricsCommand("youtube_command", "add")
87
	newargs := ctx.Args[1:]
88
	if len(newargs) == 0 {
89
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_args_missing"))
90
		return
91
	}
92
	if sess == nil {
93
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("player_not_in_voice"))
94
		return
95
	}
96
	msg := ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_adding_song"))
97
	for _, arg := range newargs {
98
		t, inp, err := ctx.Youtube.Get(arg)
99
		if err != nil {
100
			//ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("error"), true)
101
			ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting input: %v", err.Error()))
102
			return
103
		}
104
105
		switch t {
106
		case bot.ERROR_TYPE:
107
			//ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("error"), true)
108
			ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error type: %v", t))
109
			return
110
		case bot.VIDEO_TYPE:
111
			{
112
				video, err := ctx.Youtube.Video(*inp)
113
				if err != nil {
114
					//ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("error"), true)
115
					ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting video1 (VIDEO_TYPE): %v", err.Error()))
116
					return
117
				}
118
				song := bot.NewSong(video.Media, video.Title, arg)
119
				sess.Queue.Add(song)
120
				ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), fmt.Sprintf(ctx.Loc("youtube_added_format"), song.Title), true)
0 ignored issues
show
introduced by
can't check non-constant format in call to Sprintf
Loading history...
121
				break
122
			}
123
		case bot.PLAYLIST_TYPE:
124
			{
125
				videos, err := ctx.Youtube.Playlist(*inp)
126
				if err != nil {
127
					//ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("error"), true)
128
					ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting playlist: %v", err.Error()))
129
					return
130
				}
131
				for _, v := range *videos {
132
					id := v.Id
133
					_, i, err := ctx.Youtube.Get(id)
134
					if err != nil {
135
						//ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("error"), true)
136
						ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting video2: %v", err.Error()))
137
						continue
138
					}
139
					video, err := ctx.Youtube.Video(*i)
140
					if err != nil {
141
						//ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("error"), true)
142
						ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting video3: %v", err.Error()))
143
						return
144
					}
145
					song := bot.NewSong(video.Media, video.Title, arg)
146
					sess.Queue.Add(song)
147
				}
148
				ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_added"), true)
149
				break
150
			}
151
		}
152
	}
153
}
154
155
func youtubeList(sess *bot.Session, ctx *bot.Context) {
156
	ctx.MetricsCommand("youtube_command", "list")
157
	if sess == nil {
158
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("player_not_in_voice"))
159
		return
160
	}
161
	if !sess.Queue.HasNext() {
162
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_queue_is_empty"))
163
		return
164
	}
165
	var songsNames []string
166
	var count = 0
167
	var countMore = 0
168
	for _, val := range sess.Queue.Get() {
169
		count++
170
		if count <= 10 {
171
			songsNames = append(songsNames, fmt.Sprintf("[%v]: %v", count, val.Title))
172
		} else {
173
			countMore++
174
		}
175
	}
176
	if countMore > 0 {
177
		songsNames = append(songsNames, fmt.Sprintf(ctx.Loc("youtube_list_more_format"), countMore))
0 ignored issues
show
introduced by
can't check non-constant format in call to Sprintf
Loading history...
178
	}
179
	ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), fmt.Sprintf(ctx.Loc("youtube_list_format"), strings.Join(songsNames, "\n")))
0 ignored issues
show
introduced by
can't check non-constant format in call to Sprintf
Loading history...
180
}
181
182
func youtubeClear(sess *bot.Session, ctx *bot.Context) {
183
	ctx.MetricsCommand("youtube_command", "clear")
184
	if sess == nil {
185
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("player_not_in_voice"))
186
		return
187
	}
188
	if !sess.Queue.HasNext() {
189
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_queue_is_empty"))
190
		return
191
	}
192
	sess.Queue.Clear()
193
	ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_queue_cleared"))
194
}
195
196
func shortPlay(ctx *bot.Context, sess *bot.Session, msg *discordgo.Message) {
197
	queue := sess.Queue
198
	if !queue.HasNext() {
199
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_queue_is_empty"))
200
		return
201
	}
202
	queue.Start(sess, func(relp string) {
203
		switch relp {
204
		case "stop":
205
			ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_stopped"), true)
206
		case "finish":
207
			ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_finished"), true)
208
		default:
209
			ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), fmt.Sprintf("%v: %v", ctx.Loc("youtube_now_playing"), relp), true)
210
		}
211
	})
212
}
213
214
// YoutubeShortCommand handle short command for playing song from youtube
215
func YoutubeShortCommand(ctx bot.Context) {
216
	ctx.MetricsCommand("youtube_command", "short")
217
	sess := ctx.Sessions.GetByGuild(ctx.Guild.ID)
218
	newargs := ctx.Args
219
	if len(newargs) == 0 {
220
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_args_missing"))
221
		return
222
	}
223
	if sess == nil {
224
		vc := ctx.GetVoiceChannel()
225
		if vc == nil {
226
			ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("player")), ctx.Loc("player_must_be_in_voice"))
227
			return
228
		}
229
		nsess, serr := ctx.Sessions.Join(ctx.Discord, ctx.Guild.ID, vc.ID, bot.JoinProperties{
230
			Muted:    false,
231
			Deafened: true,
232
		}, ctx.Guilds.Guilds[ctx.Guild.ID].VoiceVolume)
233
		sess = nsess
234
		if serr != nil {
235
			ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("session error: %v", serr.Error()))
236
			//ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("player")), ctx.Loc("player_error"))
237
			return
238
		}
239
		ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("player")), fmt.Sprintf("%v <#%v>!", ctx.Loc("player_joined"), sess.ChannelID))
240
	}
241
	msg := ctx.ReplyEmbed(fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_adding_song"))
242
	for _, arg := range newargs {
243
		t, inp, err := ctx.Youtube.Get(arg)
244
245
		if err != nil {
246
			ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting input: %v", err.Error()))
247
			return
248
		}
249
250
		switch t {
251
		case bot.ERROR_TYPE:
252
			ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error type: %v", t))
253
			fmt.Println("error type", t)
254
			return
255
		case bot.VIDEO_TYPE:
256
			{
257
				video, err := ctx.Youtube.Video(*inp)
258
				if err != nil {
259
					ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting video1: %v", err.Error()))
260
					return
261
				}
262
				song := bot.NewSong(video.Media, video.Title, arg)
263
				sess.Queue.Add(song)
264
				ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), fmt.Sprintf(ctx.Loc("youtube_added_format"), song.Title), true)
0 ignored issues
show
introduced by
can't check non-constant format in call to Sprintf
Loading history...
265
				shortPlay(&ctx, sess, msg)
266
				break
267
			}
268
		case bot.PLAYLIST_TYPE:
269
			{
270
				videos, err := ctx.Youtube.Playlist(*inp)
271
				if err != nil {
272
					ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting playlist: %v", err.Error()))
273
					return
274
				}
275
				var isPlaying bool
276
				for _, v := range *videos {
277
					id := v.Id
278
					_, i, err := ctx.Youtube.Get(id)
279
					if err != nil {
280
						ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting video2: %v", err.Error()))
281
						continue
282
					}
283
					video, err := ctx.Youtube.Video(*i)
284
					if err != nil {
285
						ctx.Log("Youtube", ctx.Guild.ID, fmt.Sprintf("error getting video3: %v", err.Error()))
286
						return
287
					}
288
					song := bot.NewSong(video.Media, video.Title, arg)
289
					sess.Queue.Add(song)
290
					ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), fmt.Sprintf(ctx.Loc("youtube_added_format"), song.Title), true)
0 ignored issues
show
introduced by
can't check non-constant format in call to Sprintf
Loading history...
291
					if !isPlaying {
292
						shortPlay(&ctx, sess, msg)
293
						isPlaying = true
294
					}
295
				}
296
				ctx.EditEmbed(msg.ID, fmt.Sprintf("%v:", ctx.Loc("youtube")), ctx.Loc("youtube_added"), true)
297
				break
298
			}
299
		}
300
	}
301
}
302