Files
VRCWT-OSC/internal/app/self_monitor.go
messypy dd165d9301
Some checks failed
build-windows-exe / build (push) Failing after 1m13s
Clean project layout and fix release workflow
2026-07-27 23:01:24 +09:00

72 lines
1.8 KiB
Go

package app
import (
"log"
"regexp"
"strings"
"time"
"vrc_osc_go/internal/config"
)
var (
selfJoinPattern = regexp.MustCompile(`OnPlayerJoined\s+(.+?)\s+\(usr_[0-9a-fA-F-]+\)`)
selfLeftPattern = regexp.MustCompile(`OnPlayerLeft\s+(.+?)\s+\(usr_[0-9a-fA-F-]+\)`)
)
func startSelfMonitor(cfg *config.Config, state *discordMuteState) {
if cfg.VrcLog.SelfName == "" {
return
}
go func() {
lastState := ""
for {
path, err := findLatestVrchatLog()
if err != nil {
time.Sleep(currentGUIRefreshInterval())
continue
}
text, err := readFileTail(path, vrchatLogTailBytes)
if err != nil {
time.Sleep(currentGUIRefreshInterval())
continue
}
liveCfg := cfg
if loaded, err := config.Load(""); err == nil && loaded != nil {
liveCfg = loaded
}
nextState := extractLatestSelfLogState(DecodeVRChatLog(text), liveCfg.VrcLog.SelfName)
if nextState != "" && nextState != lastState {
if nextState == "left" && liveCfg.GUI.AutoUnmuteOnSelfLeave {
if err := unmuteDiscordIfMuted(state, "self_leave"); err != nil {
log.Printf("self monitor discord unmute failed: %v", err)
SetDiscordSource("self_monitor_error")
}
} else if nextState == "left" {
log.Printf("self monitor detected leave; auto unmute disabled")
}
SetDiscordSource("self_monitor")
lastState = nextState
}
time.Sleep(guiRefreshIntervalFromConfig(liveCfg))
}
}()
}
func extractLatestSelfLogState(text, selfName string) string {
if selfName == "" {
return ""
}
state := ""
for _, rawLine := range strings.Split(text, "\n") {
if m := selfJoinPattern.FindStringSubmatch(rawLine); len(m) == 2 && strings.TrimSpace(m[1]) == selfName {
state = "joined"
continue
}
if m := selfLeftPattern.FindStringSubmatch(rawLine); len(m) == 2 && strings.TrimSpace(m[1]) == selfName {
state = "left"
}
}
return state
}