Created
August 5, 2017 21:01
-
-
Save jonas747/02fdd403d6c922e49b4993829bc7af3c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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