Compare commits

..

No commits in common. "main" and "v1.0.4" have entirely different histories.
main ... v1.0.4

3 changed files with 32 additions and 129 deletions

View file

@ -38,3 +38,18 @@ jobs:
run: |
echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
echo "version is: ${{ env.VERSION }}"
- name: Update Helm chart version
shell: bash
run: |
v="$(echo '${{ env.VERSION }}' | cut -d 'v' -f2)"
sed -i "s/0\.0\.0/$v/g" helm/ts-activity/Chart.yaml
- name: Build and push Helm chart
uses: goodsmileduck/helm-push-action@ec9f29cbf16a4773438b3ea98790aa5b5ca3e749
env:
SOURCE_DIR: './helm'
CHART_FOLDER: 'ts-activity'
CHARTMUSEUM_URL: 'https://charts.momoperes.ca'
CHARTMUSEUM_USER: '${{ secrets.CHARTMUSEUM_USER }}'
CHARTMUSEUM_PASSWORD: ${{ secrets.CHARTMUSEUM_PASSWORD }}

View file

@ -43,6 +43,9 @@ docker run --rm --name ts-activity \
There is also a Helm chart. You can create a `Secret` containing `username`, `password`, and `discord`, and then:
```sh
helm repo add momoperes https://charts.momoperes.ca
helm repo update
helm upgrade --install ts-activity momoperes/ts-activity \
--set config.serverQueryAddr=teamspeak:10011 \
--set config.discordUsername=Jeff \

143
cmd.go
View file

@ -5,9 +5,7 @@ import (
"fmt"
"log"
"os"
"slices"
"strconv"
"strings"
"github.com/gtuk/discordwebhook"
"github.com/multiplay/go-ts3"
@ -15,15 +13,13 @@ import (
// App holds the configuration
type App struct {
discordURL string
discordUsername string
discordAvatarURL *string
tsQueryAddr string
tsQueryUser string
tsQueryPass string
tsQueryServerID int
spotLightGfxFormat string
spotLightIDMap map[string]int
discordURL string
discordUsername string
discordAvatarURL *string
tsQueryAddr string
tsQueryUser string
tsQueryPass string
tsQueryServerID int
}
func appFromEnv() (*App, error) {
@ -62,33 +58,15 @@ func appFromEnv() (*App, error) {
return nil, errors.New("invalid TS_QUERY_SERVER_ID, must be int")
}
}
spotLightGfxFormat := os.Getenv("TS_SPOTLIGHT_GFX_FMT")
// TODO: Load from environment variable
spotLightIDMap := make(map[string]int)
spotLightIDMap["rb+mT/4bh37gHzQYqTgBiEHG2IA="] = 0
spotLightIDMap["sA3fHhvqmlSuFYtMoVYseRQI2DE="] = 0
spotLightIDMap["9K6JV7kWaRU+4HFRkXrBZNjSmRA="] = 1
spotLightIDMap["pFclzBx0w2UmwPd91VvaXJjYCYA="] = 2
spotLightIDMap["tvjlpKqvcyQSCCVkT0TJ28uwdaQ="] = 3
spotLightIDMap["SLLvtjVBmSoIzpMhlxnLa9CWoOU="] = 4
spotLightIDMap["7EU/Up++D9+8SQk0sNchEuKPufw="] = 5
spotLightIDMap["SyldxnLYWHJOUj3HnEsXGF6B0T4="] = 5
spotLightIDMap["Mc/TdoNhddKdGtB55DSZrYk3NWc="] = 6
spotLightIDMap["xOWMWG/TpkbV8XjahqqoQLsHHpA="] = 7
spotLightIDMap["G4kg1LKJElM5LIpoeA6gN7DMl0c="] = 7
spotLightIDMap["wuQ907NtzqL4uxhLk3P/TCpkXF0="] = 8
return &App{
discordURL: discordURL,
discordUsername: discordUsername,
discordAvatarURL: discordAvatarURL,
tsQueryAddr: tsQueryAddr,
tsQueryUser: tsQueryUser,
tsQueryPass: tsQueryPass,
tsQueryServerID: tsQueryServerID,
spotLightGfxFormat: spotLightGfxFormat,
spotLightIDMap: spotLightIDMap,
discordURL: discordURL,
discordUsername: discordUsername,
discordAvatarURL: discordAvatarURL,
tsQueryAddr: tsQueryAddr,
tsQueryUser: tsQueryUser,
tsQueryPass: tsQueryPass,
tsQueryServerID: tsQueryServerID,
}, nil
}
@ -131,8 +109,6 @@ func main() {
}
clientMap := make(map[string]string)
clientDatabaseIDs := make(map[string]string)
clientUniqueIDs := make(map[string]string)
log.Println("Online clients:")
for _, client := range cl {
@ -141,20 +117,8 @@ func main() {
}
log.Println("-", client)
clientMap[strconv.Itoa(client.ID)] = client.Nickname
clientDatabaseIDs[strconv.Itoa(client.ID)] = strconv.Itoa(client.DatabaseID)
uid, err := getClientUniqueId(c, strconv.Itoa(client.DatabaseID))
if err != nil {
log.Fatal(err)
}
clientUniqueIDs[strconv.Itoa(client.ID)] = uid
log.Println(" - UID:", uid)
}
// Update the banner on startup with the currently online users.
app.updateSpotLight(c, mapValues(clientUniqueIDs))
// Listen for client updates
notifs := c.Notifications()
@ -172,12 +136,6 @@ func main() {
continue
}
clientDBID, ok := event.Data["client_database_id"]
if !ok {
log.Println("User has no client database id", event.Data)
continue
}
clientNick, ok := event.Data["client_nickname"]
if !ok {
log.Println("User has no nickname:", clientID)
@ -189,16 +147,6 @@ func main() {
if !previous {
app.clientConnected(clientNick)
clientDatabaseIDs[clientID] = clientDBID
uid, err := getClientUniqueId(c, clientDBID)
if err != nil {
log.Fatal(err)
}
clientUniqueIDs[clientID] = uid
app.updateSpotLight(c, mapValues(clientUniqueIDs))
}
} else if event.Type == "clientleftview" {
clientID, ok := event.Data["clid"]
@ -214,9 +162,6 @@ func main() {
}
delete(clientMap, clientID)
delete(clientDatabaseIDs, clientID)
delete(clientUniqueIDs, clientID)
app.updateSpotLight(c, mapValues(clientUniqueIDs))
app.clientDisconnected(clientNick)
}
}
@ -243,63 +188,3 @@ func (app *App) clientDisconnected(nick string) {
content := fmt.Sprintf("Client disconnected: %s", nick)
app.sendWebhook(content)
}
func (app *App) updateSpotLight(c *ts3.Client, connectedUIDs []string) {
if app.spotLightGfxFormat == "" {
return
}
spotLightIDs := make([]int, 0)
for _, uid := range connectedUIDs {
spotLightID, ok := app.spotLightIDMap[uid]
if ok {
spotLightIDs = append(spotLightIDs, spotLightID)
}
}
if len(spotLightIDs) == 0 {
updateBanner(c, fmt.Sprintf(app.spotLightGfxFormat, "empty"))
return
}
slices.Sort(spotLightIDs)
slices.Compact(spotLightIDs)
spotLightIDStrings := make([]string, len(spotLightIDs))
for idx, id := range spotLightIDs {
spotLightIDStrings[idx] = strconv.Itoa(id)
}
joined := strings.Join(spotLightIDStrings, "_")
updateBanner(c, fmt.Sprintf(app.spotLightGfxFormat, joined))
}
func updateBanner(c *ts3.Client, gfx string) {
err := c.Server.Edit(ts3.NewArg("virtualserver_hostbanner_gfx_url", gfx))
if err != nil {
log.Println("Failed to update banner:", gfx, err)
} else {
log.Println("Updated banner:", gfx)
}
}
func getClientUniqueId(c *ts3.Client, dbID string) (string, error) {
var uid = struct {
UID string `ms:"cluid"`
}{}
_, err := c.ExecCmd(ts3.NewCmd("clientgetnamefromdbid").WithArgs(ts3.NewArg("cldbid", dbID)).WithResponse(&uid))
if err != nil {
return "", err
}
return uid.UID, nil
}
func mapValues(m map[string]string) []string {
v := make([]string, 0, len(m))
for _, val := range m {
v = append(v, val)
}
return v
}