Skip to content

Instantly share code, notes, and snippets.

@jonas747
Created August 5, 2017 21:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonas747/02fdd403d6c922e49b4993829bc7af3c to your computer and use it in GitHub Desktop.
Save jonas747/02fdd403d6c922e49b4993829bc7af3c to your computer and use it in GitHub Desktop.
package main
import (
"bufio"
"flag"
"fmt"
"github.com/bwmarrin/discordgo"
"github.com/jonas747/dca"
"log"
"os"
"os/exec"
)
var (
run *exec.Cmd
)
func main() {
// NOTE: All of the below fields are required for this example to work correctly.
var (
Token = flag.String("t", "", "Discord token.")
GuildID = flag.String("g", "", "Guild ID")
ChannelID = flag.String("c", "", "Channel ID")
)
flag.Parse()
if *GuildID == "" {
log.Fatal("No guild specified")
}
if *ChannelID == "" {
log.Println("No channdlid specified, using guildid (default voice channel if not deleted)")
ChannelID = GuildID
}
if *Token == "" {
log.Fatal("No token specified!")
}
log.SetFlags(log.LstdFlags | log.Lshortfile)
// Connect to Discord
discord, err := discordgo.New(*Token)
if err != nil {
log.Fatal(err)
}
discord.LogLevel = discordgo.LogWarning
// Open Websocket
err = discord.Open()
if err != nil {
log.Fatal(err)
}
// Connect to voice channel.
// NOTE: Setting mute to false, deaf to true.
voice, err := discord.ChannelVoiceJoin(*GuildID, *ChannelID, false, true)
if err != nil {
log.Fatal(err)
}
voice.LogLevel = discordgo.LogWarning
// Hacky loop to prevent sending on a nil channel.
// TODO: Find a better way.
// for voice.Ready == false {
// runtime.Gosched()
// }
helpme(voice, "https://www.youtube.com/watch?v=ZBWpER3OwRA")
// Close connections
voice.Close()
discord.Close()
return
}
func helpme(vc *discordgo.VoiceConnection, url string) {
var err error
ytdl := exec.Command("youtube-dl", "-v", "-f", "bestaudio", "-o", "-", url)
ytdl.Stderr = os.Stderr
ytdlout, err := ytdl.StdoutPipe()
if err != nil {
log.Println("ytdl StdoutPipe err:", err)
return
}
ytdlbuf := bufio.NewReaderSize(ytdlout, 16384)
opts := dca.StdEncodeOptions
opts.RawOutput = true
opts.Bitrate = 120
ses, err := dca.EncodeMem(ytdlbuf, opts)
if err != nil {
fmt.Println("dca: " + err.Error())
return
}
// go statusPrinter(ses)
err = ytdl.Start()
if err != nil {
log.Println("ytdl Start err:", err)
return
}
defer func() {
go ytdl.Wait()
}()
// output, err := ioutil.ReadAll(ses)
// if err != nil {
// fmt.Println("Error encoding: ", err)
// }
// fmt.Println("Length:", len(output))
vc.Speaking(true)
defer vc.Speaking(false)
done := make(chan error)
dca.NewStream(ses, vc, done)
err = <-done
if err != nil {
fmt.Println("Error from stream: ", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment