diff --git a/TCPClient.go b/TCPClient.go index 5862794..fbb2aa6 100644 --- a/TCPClient.go +++ b/TCPClient.go @@ -81,7 +81,7 @@ func (c *TCPClient) StartClient() { go func() { for message := range c.TCPServer.CmdChan { - Log.Infof("Received DX Command: %s", message) + Log.Infof("Received Command: %s", message) message := message + "\n" c.WriteString(message) } @@ -144,7 +144,7 @@ func (c *TCPClient) ReadLine() { c.Write([]byte(c.Login + "\r\n")) c.SetFilters() if Cfg.Cluster.Command != "" { - c.WriteString(Cfg.Cluster.Command) + c.WriteString(Cfg.Cluster.Command + "\n\r") } Log.Info("Start receiving spots") } else if strings.Contains(message, "Error reading from server: read tcp") { diff --git a/config.go b/config.go index 2f01102..25ad805 100644 --- a/config.go +++ b/config.go @@ -44,6 +44,16 @@ type Config struct { Host string `yaml:"host"` Port string `yaml:"port"` } `yaml:"telnetserver"` + + Gotify struct { + Enable bool `yaml:"enable"` + URL string `yaml:"url"` + Token string `yaml:"token"` + NewDXCC bool `yaml:"NewDXCC"` + NewBand bool `yaml:"NewBand"` + NewMode bool `yaml:"NewMode"` + NewBandAndMode bool `yaml:"NewBandAndMode"` + } `yaml:"gotify"` } func NewConfig(configPath string) *Config { diff --git a/config.yml b/config.yml index 5880878..e1ca70b 100644 --- a/config.yml +++ b/config.yml @@ -8,13 +8,13 @@ sqlite: sqlite_path: 'C:\Perso\Seafile\Radio\Logs\Log4OM\F4BPO.SQLite' # SQLite Db oath of Log4OM callsign: F4BPO # Log4OM Callsign used to check if you get spotted by someone cluster: - server: cluster.f4bpo.com # dxc.k0xm.net + server: dxc.k0xm.net # dxc.k0xm.net port: 7300 login: f4bpo skimmer: true ft8: false ft4: false - command: #SET/NOFILTER + command: SET/NOFILTER login_prompt: "Please enter your call:" flex: discovery: true # Radio must be on same LAN than the program @@ -22,4 +22,12 @@ flex: spot_life: 600 #seconds telnetserver: # Log4OM must be connected to this server ie: localhost:7301 if on same machine as this program else ip:7301 host: 0.0.0.0 - port: 7301 \ No newline at end of file + port: 7301 +gotify: + enable: true + url: https://gotify.rouggy.com/message + token: ALaGS4MVMWTEMcP + newDxcc: true + NewBand: false + NewMode: false + NewBandAndMode: true \ No newline at end of file diff --git a/flexradio.go b/flexradio.go index e7a33dc..7d3fdd5 100644 --- a/flexradio.go +++ b/flexradio.go @@ -209,6 +209,9 @@ func (fc *FlexClient) SendSpottoFlex(spot TelnetSpot) { flexSpot.BackgroundColor = "#ff000000" } + // Send notification to Gotify + Gotify(flexSpot) + flexSpot.Comment = strings.ReplaceAll(flexSpot.Comment, " ", "\u00A0") srcFlexSpot, err := fc.Repo.FindDXSameBand(flexSpot) diff --git a/gotify.go b/gotify.go new file mode 100644 index 0000000..a4daa2f --- /dev/null +++ b/gotify.go @@ -0,0 +1,72 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" +) + +type GotifyMessage struct { + Title string `json:"title"` + Message string `json:"message"` + Priority int `json:"priority"` +} + +func Gotify(spot FlexSpot) { + + if Cfg.Gotify.Enable { + + message := fmt.Sprintf("DX: %s\nFrom: %s\nFreq: %s\nMode: %s\n", spot.DX, spot.Source, spot.FrequencyMhz, spot.Mode) + + gotifyMsg := GotifyMessage{ + Title: "", + Message: message, + Priority: 10, + } + + if spot.NewDXCC && Cfg.Gotify.NewDXCC { + title := "FlexDXCluster New DXCC" + gotifyMsg.Title = title + gotifyMsg.Message = message + sendToGotify(gotifyMsg) + } + + if spot.NewBand && spot.NewMode && Cfg.Gotify.NewBandAndMode { + title := "FlexDXCluster New Mode & Band" + gotifyMsg.Title = title + gotifyMsg.Message = message + sendToGotify(gotifyMsg) + } + } +} + +func sendToGotify(mess GotifyMessage) { + jsonData, err := json.Marshal(mess) + if err != nil { + Log.Errorln("Error marshaling JSON:", err) + return + } + + req, err := http.NewRequest("POST", Cfg.Gotify.URL, bytes.NewBuffer(jsonData)) + if err != nil { + Log.Errorln("Error creating request:", err) + return + } + req.Header.Set("Content-Type", "application/json") + req.Header.Add("Authorization", "Bearer "+Cfg.Gotify.Token) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + Log.Errorln("Error sending request:", err) + return + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + Log.Errorln("Gotify server returned non-OK status:", resp.Status) + } else { + Log.Println("Push successfully sent to Gotify") + } +}