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 } } }