broadcast/broadcast/main.go

99 lines
2.3 KiB
Go

package main
import (
"bytes"
"os"
"time"
"crypto/tls"
"fmt"
"net"
"log"
"layeh.com/gumble/gumble"
"layeh.com/gumble/gumbleutil"
_ "layeh.com/gumble/opus"
)
type AudioListener struct {
buffer *bytes.Buffer
}
func (listener AudioListener) OnAudioStream(e *gumble.AudioStreamEvent) {
// One AudioStreamEvent for person speaking on the channel
// fmt.Printf("Received AudioStreamEvent from %s\n", e.User.Name) // debug
go func(ch <-chan *gumble.AudioPacket) {
outside:
for {
select {
case packet := <-ch:
fmt.Printf(".")
listener.buffer.Write(UnsafeCastInt16sToBytes(packet.AudioBuffer))
case <-time.After(100 * time.Millisecond):
fmt.Println("timeout")
break outside
}
}
// fmt.Println("\nFinished processing audio packets") // debug
SaveBufToMP3(listener.buffer)
listener.buffer.Reset()
}(e.C)
}
func SaveBufToMP3(buffer *bytes.Buffer) {
outFileName := "recording.mp3"
fmt.Printf("Saving out to %s", outFileName) // debug
// outFile, _ := os.OpenFile(outFileName, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755)
// defer outFile.Close()
PcmToMp3(buffer, outFileName) // TODO: check output, err
}
func main() {
config := gumble.NewConfig()
config.Username = "bon-bot"
config.Attach(gumbleutil.Listener{
TextMessage: func(e *gumble.TextMessageEvent) {
log.Printf("Received text message: %s\n", e.Message)
if e.Message == "/quit" {
e.Client.Disconnect()
}
},
})
var l AudioListener
l.buffer = new(bytes.Buffer)
config.AttachAudio(l)
mumbleServer := os.Getenv("MUMBLE_SERVER")
if len(mumbleServer) == 0 {
mumbleServer = "mumble:64738"
log.Printf("Mumble server not defined, falling back to default value: %s", mumbleServer)
}
client, err := gumble.DialWithDialer(&net.Dialer{}, mumbleServer, config, &tls.Config{InsecureSkipVerify: true}) // TODO: fix cert or make it an option
if err != nil {
panic(err)
}
// Print available channels on the server
fmt.Printf("Channels:\n")
for idx, channel := range client.Channels {
fmt.Printf("\t%d - %s\n", idx, channel.Name)
}
channel := client.Channels.Find("Antro delle Bestemmie")
client.Self.Move(channel)
fmt.Println("Chosen Channel: ", channel.Name)
for {
time.Sleep(1 * time.Second)
if client.State() == gumble.StateDisconnected {
log.Println("Disconnected from server")
break
}
}
}