Skip to content

Commit ea86983

Browse files
committed
Music Bot functionality
1 parent 6eeb5d9 commit ea86983

File tree

15 files changed

+440
-30
lines changed

15 files changed

+440
-30
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ replace | Hidden. Sends `Hello` then after a short while replaces the text with
3535

3636
## Roadmap
3737
- [ ] Documentation
38-
- [ ] Errors that are sent to the user
38+
- [x] Errors that are sent to the user
3939
- [x] Menu system with Reactions
40-
- [ ] Music Bot
40+
- [x] Music Bot

commands/module.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package commands
22

33
import (
44
"fmt"
5+
"github.com/bela333/Vigne/errors"
56
"github.com/bela333/Vigne/messages"
67
"github.com/bela333/Vigne/server"
78
"github.com/bwmarrin/discordgo"
89
"regexp"
910
"strings"
11+
"time"
1012
)
1113

1214
type CommandsModule struct {
@@ -78,7 +80,21 @@ func (module *CommandsModule) handleCommands(s *discordgo.Session, m *discordgo.
7880
err = commandHandler.Action(m, args, c)
7981
//Handle command error
8082
if err != nil {
81-
fmt.Printf("%s (%s) has failed to execute %s. Reason: %s\n", m.Author.Username, m.Author.ID, m.Content, err)
83+
//Check if err is Public error
84+
publicErr, ok := err.(*errors.PublicError)
85+
if ok {
86+
c := messenger.NewMessageCreator(m.ChannelID)
87+
msg := c.NewMessage()
88+
msg.SetContent(fmt.Sprintf("<@%s>, %s", m.Author.ID, publicErr.PublicPart))
89+
msg.SetExpiry(time.Second*10)
90+
c.Send()
91+
private := publicErr.Error()
92+
if private != "" {
93+
fmt.Printf("%s (%s) has failed to execute %s. Reason: %s\n", m.Author.Username, m.Author.ID, m.Content, private)
94+
}
95+
}else {
96+
fmt.Printf("%s (%s) has failed to execute %s. Reason: %s\n", m.Author.Username, m.Author.ID, m.Content, err)
97+
}
8298
return
8399
}
84100
err = c.Send()

database/Music.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package database
2+
3+
import (
4+
"github.com/bela333/Vigne/errors"
5+
)
6+
7+
type MusicDatabase struct {
8+
d *Database
9+
}
10+
11+
func (d *Database) Music() (*MusicDatabase, error) {
12+
if !d.Redis.HExists(d.Decorate("config"), "musicChannel").Val() {
13+
return nil, errors.NoMusic
14+
}
15+
if !d.Redis.HExists(d.Decorate("config"), "musicVoiceChannel").Val() {
16+
return nil, errors.NoMusic
17+
}
18+
return &MusicDatabase{d}, nil
19+
}
20+
21+
func (d MusicDatabase) GetChannel() string {
22+
return d.d.Redis.HGet(d.d.Decorate("config"), "musicChannel").Val()
23+
}
24+
25+
func (d MusicDatabase) PopNext() string {
26+
return d.d.Redis.LPop(d.d.Decorate("musicQueue")).Val()
27+
}
28+
29+
func (d MusicDatabase) AddSong(data []byte) error {
30+
return d.d.Redis.RPush(d.d.Decorate("musicQueue"), string(data)).Err()
31+
}
32+
33+
func (d MusicDatabase) IsValidExtractor(extractor string) bool {
34+
if d.d.Redis.Exists(d.d.Decorate("validExtractors")).Val() == 0 {
35+
//If validExtractors doesn't exist, we accept the extractor anyway
36+
return true
37+
}
38+
return d.d.Redis.SIsMember(d.d.Decorate("validExtractors"), extractor).Val()
39+
}
40+
41+
func (d MusicDatabase) GetVoiceChannel() string {
42+
return d.d.Redis.HGet(d.d.Decorate("config"), "musicVoiceChannel").Val()
43+
}

errors/errors.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,9 @@ var NoRoles = errors.New("couldn't find role command configuration in the databa
77
var CreatedConfig = errors.New("couldn't find configuration in the database. Created default one")
88
var NoModule = errors.New("couldn't find registered module")
99
var MessageNotSent = errors.New("couldn't replace message, since it doesn't exist")
10-
var NoWelcomer = errors.New("couldn't find welcomer:main, welcomer:text:after or welcomer:text:before in the database")
10+
var NoWelcomer = errors.New("couldn't find welcomer:main, welcomer:text:after or welcomer:text:before in the database")
11+
var InvalidExtractor = errors.New("music can't be played from this site")
12+
13+
//Public errors
14+
var NoCommand = New("", "Couldn't find this command")
15+
var NoMusic = New("couldn't find musicChannel and musicVoiceChannel in the config. Music bot functionality will be unavailable", "The Music Bot is unavailable")

errors/publicError.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package errors
2+
3+
import "errors"
4+
5+
type PublicError struct {
6+
PublicPart string
7+
error
8+
}
9+
10+
11+
//Returns a new error
12+
func New(private string, public string) error {
13+
e := PublicError{}
14+
e.error = errors.New(private)
15+
e.PublicPart = public
16+
return &e
17+
}

messages/MessageBuilder.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ type MessageBuilder struct {
1212
content string
1313
expiry time.Duration
1414

15-
module *MessagesModule
15+
Module *MessagesModule
1616

1717
embedBuilder *EmbedBuilder
1818

@@ -56,14 +56,14 @@ func (b *MessageBuilder) afterSend(message *discordgo.Message) {
5656
if b.reactions != nil {
5757
//Run this in another thread as adding reactions can take some time
5858
go func() {
59-
handlers, ok := b.module.Callbacks[message.ID]
59+
handlers, ok := b.Module.Callbacks[message.ID]
6060
if !ok {
61-
b.module.Callbacks[message.ID] = map[string]*ReactionObject{}
62-
handlers = b.module.Callbacks[message.ID]
61+
b.Module.Callbacks[message.ID] = map[string]*ReactionObject{}
62+
handlers = b.Module.Callbacks[message.ID]
6363
}
6464
for name, handler := range b.reactions {
6565
handlers[name] = handler
66-
err := b.module.server.Session.MessageReactionAdd(message.ChannelID, message.ID, name)
66+
err := b.Module.server.Session.MessageReactionAdd(message.ChannelID, message.ID, name)
6767
if err != nil {
6868
fmt.Printf("Error in Reactions thread: %s.\n", err)
6969
return
@@ -84,7 +84,7 @@ func (b *MessageBuilder) afterSend(message *discordgo.Message) {
8484
func (b *MessageBuilder) Send() error {
8585
if !b.deleted {
8686
m := b.getMessageSend()
87-
msg, err := b.module.server.Session.ChannelMessageSendComplex(b.ChannelID, m)
87+
msg, err := b.Module.server.Session.ChannelMessageSendComplex(b.ChannelID, m)
8888
if err != nil {
8989
return err
9090
}
@@ -112,10 +112,10 @@ func (b *MessageBuilder) Delete() error{
112112
b.deleted = true
113113
if b.sent {
114114
//Remove message from the reaction callback map
115-
delete(b.module.Callbacks, b.message.ID)
115+
delete(b.Module.Callbacks, b.message.ID)
116116
if b.afterBuilder != nil {
117117
//Remove all reactions from message
118-
err := b.module.server.Session.MessageReactionsRemoveAll(b.message.ChannelID, b.message.ID)
118+
err := b.Module.server.Session.MessageReactionsRemoveAll(b.message.ChannelID, b.message.ID)
119119
if err != nil {
120120
return err
121121
}
@@ -125,7 +125,7 @@ func (b *MessageBuilder) Delete() error{
125125
return err
126126
}
127127
}else {
128-
err := b.module.server.Session.ChannelMessageDelete(b.message.ChannelID, b.message.ID)
128+
err := b.Module.server.Session.ChannelMessageDelete(b.message.ChannelID, b.message.ID)
129129
if err != nil {
130130
return err
131131
}
@@ -139,7 +139,7 @@ func (b *MessageBuilder) Delete() error{
139139
//Replaces the content of the MessageBuilder with message
140140
func (b *MessageBuilder) ReplaceMessage(message *MessageBuilder) error {
141141
if b.sent {
142-
msg, err := b.module.server.Session.ChannelMessageEditComplex(message.getMessageEdit(b.message.ChannelID, b.message.ID))
142+
msg, err := b.Module.server.Session.ChannelMessageEditComplex(message.getMessageEdit(b.message.ChannelID, b.message.ID))
143143
if err != nil {
144144
return err
145145
}
@@ -156,7 +156,7 @@ func (b *MessageBuilder) GetAfter() *MessageBuilder {
156156
if b.afterBuilder == nil {
157157
ba := MessageBuilder{}
158158
ba.ChannelID = b.ChannelID
159-
ba.module = b.module
159+
ba.Module = b.Module
160160
b.afterBuilder = &ba
161161
return &ba
162162
}else{

messages/MessageCreator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ type MessageCreator struct {
99
func (c *MessageCreator) NewMessage() *MessageBuilder {
1010
b := &MessageBuilder{}
1111
b.ChannelID = c.ChannelID
12-
b.module = c.module
12+
b.Module = c.module
1313
c.Builders = append(c.Builders, b)
1414
return b
1515
}

modules/help/helpCommand.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package help
33
import (
44
"fmt"
55
"github.com/bela333/Vigne/commands"
6+
"github.com/bela333/Vigne/errors"
67
"github.com/bela333/Vigne/messages"
78
"github.com/bwmarrin/discordgo"
89
"time"
@@ -29,10 +30,7 @@ func (c *HelpCommand) Action(m *discordgo.MessageCreate, args []string, creator
2930
}
3031
}
3132
if cmd == nil {
32-
//TODO: Public error
33-
msg.SetContent("Couldn't find this command")
34-
msg.SetExpiry(time.Second*10)
35-
return nil
33+
return errors.NoCommand
3634
}
3735
entry := cmd.GetHelpPageEntry()
3836
embed := msg.GetEmbedBuilder()

modules/music/embedGenerator.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package music
2+
3+
import (
4+
"fmt"
5+
"github.com/bela333/Vigne/messages"
6+
"github.com/bwmarrin/discordgo"
7+
)
8+
9+
func EmbedGenerator(embed *messages.EmbedBuilder, info *Music, author *discordgo.User, title string, color int) {
10+
embed.SetTitle("**" + title + "**")
11+
nameField := embed.NewField()
12+
nameField.SetName("Title")
13+
nameField.SetValue(info.Title)
14+
embed.SetURL(info.URL)
15+
if info.Uploader != "" {
16+
uploaderField := embed.NewField()
17+
uploaderField.SetName("By")
18+
uploaderField.SetValue(info.Uploader)
19+
}
20+
timeField := embed.NewField()
21+
timeField.SetName("Length")
22+
timeField.SetValue(FormatTime(info.Duration))
23+
embed.SetColor(color)
24+
embed.SetImage(info.Thumbnail)
25+
embed.SetAuthor(fmt.Sprintf("Requested by %s#%s", author.Username, author.Discriminator),
26+
"",
27+
fmt.Sprintf("https://cdn.discordapp.com/avatars/%s/%s.png", author.ID, author.Avatar))
28+
}

modules/music/module.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
11
package music
22

3-
import "github.com/bela333/Vigne/server"
3+
import (
4+
"github.com/bela333/Vigne/commands"
5+
"github.com/bela333/Vigne/server"
6+
)
47

58
type MusicModule struct {
6-
9+
Player *MusicPlayer
710
}
811

912
func (MusicModule) GetName() string {
1013
return "music"
1114
}
1215

13-
func (MusicModule) Init(server *server.Server) error {
16+
func (m *MusicModule) Init(server *server.Server) error {
17+
m.Player = &MusicPlayer{server:server}
18+
//Get command handler module
19+
cmdInterface, err := server.GetModuleByName("Commands")
20+
if err != nil {
21+
return err
22+
}
23+
cmd := (cmdInterface).(*commands.CommandsModule)
24+
cmd.RegisterCommand(&PlayCommand{server:server, module:m})
1425
return nil
1526
}
1627

0 commit comments

Comments
 (0)