2020-10-22 00:11:59 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2020-10-23 22:08:06 +02:00
|
|
|
"bytes"
|
2020-10-22 00:11:59 +02:00
|
|
|
"os"
|
|
|
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"crypto/tls"
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
|
2020-10-22 18:54:37 +02:00
|
|
|
"log"
|
|
|
|
|
2020-10-22 00:11:59 +02:00
|
|
|
"layeh.com/gumble/gumble"
|
|
|
|
"layeh.com/gumble/gumbleutil"
|
2020-10-22 22:51:48 +02:00
|
|
|
_ "layeh.com/gumble/opus"
|
2020-10-22 00:11:59 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
type AudioListener struct {
|
2020-10-23 22:08:06 +02:00
|
|
|
buffer *bytes.Buffer
|
2020-10-22 00:11:59 +02:00
|
|
|
}
|
|
|
|
|
2020-10-23 22:08:06 +02:00
|
|
|
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)
|
2020-10-22 00:11:59 +02:00
|
|
|
}
|
|
|
|
|
2020-10-23 22:08:06 +02:00
|
|
|
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()
|
2020-10-22 22:51:48 +02:00
|
|
|
|
2020-10-23 22:08:06 +02:00
|
|
|
PcmToMp3(buffer, outFileName) // TODO: check output, err
|
2020-10-22 00:11:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
|
|
|
config := gumble.NewConfig()
|
|
|
|
config.Username = "bon-bot"
|
|
|
|
|
|
|
|
config.Attach(gumbleutil.Listener{
|
|
|
|
TextMessage: func(e *gumble.TextMessageEvent) {
|
2020-10-23 22:08:06 +02:00
|
|
|
log.Printf("Received text message: %s\n", e.Message)
|
2020-10-22 00:11:59 +02:00
|
|
|
|
2020-10-23 22:08:06 +02:00
|
|
|
if e.Message == "/quit" {
|
|
|
|
e.Client.Disconnect()
|
|
|
|
}
|
2020-10-22 00:11:59 +02:00
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2020-10-23 22:08:06 +02:00
|
|
|
var l AudioListener
|
|
|
|
l.buffer = new(bytes.Buffer)
|
2020-10-22 00:11:59 +02:00
|
|
|
config.AttachAudio(l)
|
2020-10-22 18:54:37 +02:00
|
|
|
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
|
2020-10-22 00:11:59 +02:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2020-10-22 22:51:48 +02:00
|
|
|
// Print available channels on the server
|
2020-10-22 00:11:59 +02:00
|
|
|
fmt.Printf("Channels:\n")
|
|
|
|
for idx, channel := range client.Channels {
|
|
|
|
fmt.Printf("\t%d - %s\n", idx, channel.Name)
|
|
|
|
}
|
|
|
|
|
2020-10-23 22:08:36 +02:00
|
|
|
channel := client.Channels.Find("Antro delle Bestemmie")
|
|
|
|
client.Self.Move(channel)
|
|
|
|
fmt.Println("Chosen Channel: ", channel.Name)
|
2020-10-22 00:11:59 +02:00
|
|
|
for {
|
|
|
|
time.Sleep(1 * time.Second)
|
2020-10-23 22:08:36 +02:00
|
|
|
if client.State() == gumble.StateDisconnected {
|
|
|
|
log.Println("Disconnected from server")
|
|
|
|
break
|
|
|
|
}
|
2020-10-22 00:11:59 +02:00
|
|
|
}
|
|
|
|
}
|