Skip to content

Instantly share code, notes, and snippets.

@davidchua
Created February 28, 2026 01:45
Show Gist options
  • Select an option

  • Save davidchua/034899bbf87df17fb838cd1fca2e614a to your computer and use it in GitHub Desktop.

Select an option

Save davidchua/034899bbf87df17fb838cd1fca2e614a to your computer and use it in GitHub Desktop.
package main
import (
"bufio"
"crypto/tls"
"fmt"
"log"
"os/exec"
"strings"
"time"
)
func getMetadata(field string) string {
out, err := exec.Command("playerctl", "-p", "qmmp", "metadata", field).Output()
if err != nil {
return ""
}
return strings.TrimSpace(string(out))
}
func main() {
server := "irc.kaopeh.com:6697" // TLS port
channel := "#kaopeh"
nick := "QMMPBot"
conn, err := tls.Dial("tcp", server, &tls.Config{})
if err != nil {
log.Fatal(err)
}
defer conn.Close()
writer := bufio.NewWriter(conn)
reader := bufio.NewReader(conn)
// Register bot
fmt.Fprintf(writer, "NICK %s\r\n", nick)
fmt.Fprintf(writer, "USER %s 0 * :QMMP Now Playing Bot\r\n", nick)
fmt.Fprintf(writer, "JOIN %s\r\n", channel)
writer.Flush()
lastTrack := ""
for {
track := getMetadata("title")
artist := getMetadata("artist")
if track != "" && track != lastTrack {
msg := fmt.Sprintf("PRIVMSG %s :Now playing: %s - %s\r\n", channel, artist, track)
fmt.Fprint(writer, msg)
writer.Flush()
lastTrack = track
}
// Handle PING/PONG to stay connected
conn.SetReadDeadline(time.Now().Add(1 * time.Second))
for {
line, err := reader.ReadString('\n')
if err != nil {
break
}
line = strings.TrimSpace(line)
if strings.HasPrefix(line, "PING") {
fmt.Fprintf(writer, "PONG %s\r\n", line[5:])
writer.Flush()
}
}
time.Sleep(5 * time.Second)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment