From 290da20da7208cf2bf7ac47e0621cea04959bc9e Mon Sep 17 00:00:00 2001 From: Chris Rhodes Date: Mon, 25 Apr 2016 16:28:22 -0700 Subject: [PATCH] Add a new example that acts like airhorn.solutions --- examples/airhorn/README.md | 41 ++++++++ examples/airhorn/airhorn.dca | Bin 0 -> 16300 bytes examples/airhorn/main.go | 186 +++++++++++++++++++++++++++++++++++ examples/new_basic/main.go | 1 + 4 files changed, 228 insertions(+) create mode 100644 examples/airhorn/README.md create mode 100644 examples/airhorn/airhorn.dca create mode 100644 examples/airhorn/main.go diff --git a/examples/airhorn/README.md b/examples/airhorn/README.md new file mode 100644 index 0000000..e9e49e1 --- /dev/null +++ b/examples/airhorn/README.md @@ -0,0 +1,41 @@ + +Airhorn Example +==== + +This example demonstrates how to utilize DiscordGo to listen to an !airhorn +command in a channel and play a sound to that users current voice channel. + +### Build + +This assumes you already have a working Go environment setup and that +DiscordGo is correctly installed on your system. + +```sh +go install github.com/bwmarrin/discordgo/examples/airhorn +cd $GOPATH/bin +cp ../src/github.com/bwmarrin/discordgo/examples/airhorn/airhorn.dca . +``` + +### Usage + +``` +Usage of ./airhorn: + -t string + Account Token +``` + +The below example shows how to start the bot. + +```sh +./airhorn -t +``` + +### Creating sounds + +Airhorn bot uses DCA files that are pre-computed files that are easy to send to Discord. + +If you would like to create your own DCA files, please use [https://github.com/bwmarrin/dca/tree/master/cmd/dca](DCA). + +```sh +./dca -i -raw > +``` diff --git a/examples/airhorn/airhorn.dca b/examples/airhorn/airhorn.dca new file mode 100644 index 0000000000000000000000000000000000000000..39e71679b6929f719c34c781cc18d4af7b6035a8 GIT binary patch literal 16300 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 aPjNH!bVqBavyr*{Ae$2&ixuGcRsRoaXu)Ox literal 0 HcmV?d00001 diff --git a/examples/airhorn/main.go b/examples/airhorn/main.go new file mode 100644 index 0000000..ba0312e --- /dev/null +++ b/examples/airhorn/main.go @@ -0,0 +1,186 @@ +package main + +import ( + "encoding/binary" + "flag" + "fmt" + "io" + "os" + "strings" + "time" + + "github.com/bwmarrin/discordgo" +) + +func init() { + flag.StringVar(&token, "t", "", "Account Token") + flag.Parse() +} + +var token string +var buffer = make([][]byte, 0) + +func main() { + if token == "" { + fmt.Println("No token provided. Please run: airhorn -t ") + return + } + + // Load the sound file. + err := loadSound() + if err != nil { + fmt.Println("Error loading sound: ", err) + fmt.Println("Please copy $GOPATH/src/github.com/bwmarrin/examples/airhorn/airhorn.dca to this directory.") + return + } + + // Create a new Discord session using the provided token. + dg, err := discordgo.New(token) + if err != nil { + fmt.Println("Error creating Discord session: ", err) + return + } + + // Register ready as a callback for the ready events. + dg.AddHandler(ready) + + // Register messageCreate as a callback for the messageCreate events. + dg.AddHandler(messageCreate) + + // Register guildCreate as a callback for the guildCreate events. + dg.AddHandler(guildCreate) + + // Open the websocket and begin listening. + err = dg.Open() + if err != nil { + fmt.Println("Error opening Discord session: ", err) + } + + fmt.Println("Airhorn is now running. Press CTRL-C to exit.") + // Simple way to keep program running until CTRL-C is pressed. + <-make(chan struct{}) + return +} + +func ready(s *discordgo.Session, event *discordgo.Ready) { + // Set the playing status. + s.UpdateStatus(0, "!airhorn") +} + +// This function will be called (due to AddHandler above) every time a new +// message is created on any channel that the autenticated bot has access to. +func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { + if strings.HasPrefix(m.Content, "!airhorn") { + // Find the channel that the message came from. + c, err := s.State.Channel(m.ChannelID) + if err != nil { + // Could not find channel. + return + } + + // Find the guild for that channel. + g, err := s.State.Guild(c.GuildID) + if err != nil { + // Could not find guild. + return + } + + // Look for the message sender in that guilds current voice states. + for _, vs := range g.VoiceStates { + if vs.UserID == m.Author.ID { + err = playSound(s, g.ID, vs.ChannelID) + if err != nil { + fmt.Println("Error playing sound:", err) + } + + return + } + } + } +} + +// This function will be called (due to AddHandler above) every time a new +// guild is joined. +func guildCreate(s *discordgo.Session, event *discordgo.GuildCreate) { + if event.Guild.Unavailable != nil { + return + } + + for _, channel := range event.Guild.Channels { + if channel.ID == event.Guild.ID { + s.ChannelMessageSend(channel.ID, "Airhorn is ready! Type !airhorn while in a voice channel to play a sound.") + return + } + } +} + +// loadSound attempts to load an encoded sound file from disk. +func loadSound() error { + file, err := os.Open("airhorn.dca") + + if err != nil { + fmt.Println("Error opening dca file :", err) + return err + } + + var opuslen int16 + + for { + // Read opus frame length from dca file. + err = binary.Read(file, binary.LittleEndian, &opuslen) + + // If this is the end of the file, just return. + if err == io.EOF || err == io.ErrUnexpectedEOF { + return nil + } + + if err != nil { + fmt.Println("Error reading from dca file :", err) + return err + } + + // Read encoded pcm from dca file. + InBuf := make([]byte, opuslen) + err = binary.Read(file, binary.LittleEndian, &InBuf) + + // Should not be any end of file errors + if err != nil { + fmt.Println("Error reading from dca file :", err) + return err + } + + // Append encoded pcm data to the buffer. + buffer = append(buffer, InBuf) + } +} + +// playSound plays the current buffer to the provided channel. +func playSound(s *discordgo.Session, guildID, channelID string) (err error) { + // Join the provided voice channel. + vc, err := s.ChannelVoiceJoin(guildID, channelID, false, false) + if err != nil { + return err + } + + // Sleep for a specified amount of time before playing the sound + time.Sleep(250 * time.Millisecond) + + // Start speaking. + vc.Speaking(true) + + // Send the buffer data. + for _, buff := range buffer { + vc.OpusSend <- buff + } + + // Stop speaking + vc.Speaking(false) + + // Sleep for a specificed amount of time before ending. + time.Sleep(250 * time.Millisecond) + + // Disconnect from the provided voice channel. + vc.Disconnect() + + return nil +} diff --git a/examples/new_basic/main.go b/examples/new_basic/main.go index 3d2fb97..7b2dc73 100644 --- a/examples/new_basic/main.go +++ b/examples/new_basic/main.go @@ -26,6 +26,7 @@ func init() { func main() { // Create a new Discord session using the provided login information. + // Use discordgo.New(Token) to just use a token for login. dg, err := discordgo.New(Email, Password, Token) if err != nil { fmt.Println("error creating Discord session,", err)