Compare commits

..

12 Commits

Author SHA1 Message Date
115051d463 mode 2025-04-06 13:39:15 +02:00
9a03f3d4c6 up 2025-04-06 13:36:08 +02:00
bd1b8da2f7 update call 2025-04-06 12:10:23 +02:00
a394767832 update 2024-10-09 20:30:23 +03:00
f424633083 up 2024-10-01 11:33:11 +07:00
a39dadce1a Merge branch 'main' of https://git.rouggy.com/rouggy/PushDXCluster 2024-09-15 17:50:24 +07:00
2d392d8033 update 2024-09-15 17:50:08 +07:00
b680af776e Update main.go 2024-09-15 17:42:28 +07:00
6bb76d73a1 Delete database.gp 2024-09-15 17:32:29 +07:00
80a882c411 up 2024-07-03 15:46:24 +07:00
acde3434dd update 2024-07-03 15:44:35 +07:00
45a73d45b9 update 2024-07-03 12:36:38 +07:00
7 changed files with 53 additions and 77 deletions

BIN
PushDXCluster.exe Normal file

Binary file not shown.

View File

@ -17,6 +17,10 @@ type Config struct {
Host string `yaml:"host"`
Call string `yaml:"call"`
} `yaml:"cluster"`
Log struct {
SQLitePath string `yaml:"sqlitePath"`
} `yaml:"log"`
}
func NewConfig(configPath string) (*Config, error) {

View File

@ -3,7 +3,8 @@ gotify:
token: ALaGS4MVMWTEMcP
cluster:
host: ve7cc.net:23
call: XV9Q
host: dxc.k0xm.net:7300
call: F4BPO
#arc.jg1vgx.net:7000
log:
sqlitePath: "C:\\Perso\\Seafile\\Radio\\Logs\\Log4OM\\Vietnam.SQLite"

2
dx.txt
View File

@ -1 +1 @@
8P9CB ZC4GW TM5FI VP2V/W5GI VP9/AB2E 8Q7KR 8Q7KB TF2MSN FW1JG CO8BLY OD5KU 5U5K S21ZI K8K 8Q7EC OX3LX FP/KV1J TO7PX S79/HA8PX JW/WE9G ZC4MK K8R 7E4K E51KEE E51CZZ DT0IP YN2RP VK2/W7BRS K8K
TF2MSN T32AZ DT0IP YN2RP KH8T 9J2AO XT2AW 6O3T 5H1WX 5H3MB CR3W A25AO 5W1SA

117
main.go
View File

@ -66,7 +66,7 @@ func readDXExpeFile(filename string) string {
if err != nil {
fmt.Println("Error while reading the file", err)
}
log.Println("DX Expe file has been loaded properly")
log.Printf("DX Expe file has been loaded properly with following calls: %s", content)
return string(content)
}
@ -112,7 +112,7 @@ func sendToGotify(title string, sMess ClusterMessage, priority int, cfg Config)
}
func SanitizeClusterMessage(message string) ClusterMessage {
r := regexp.MustCompile(`DX\sde\s([A-Z0-9]+)[-#:]+[\s]+([0-9]+.[0-9])[\s]+([^\s]+)[\s]+([A-Z]+[0-9])\s+(.*dB).*(.{4})Z$`)
r := regexp.MustCompile(`DX\sde\s([A-Z0-9]+)[-#:]+[\s]+([0-9]+.[0-9])[\s]+([^\s]+)[\s]+(\bFT8\b|\bFT4\b|\bCW\b)+\s+(.*dB).*(.{4})Z$`)
matches := r.FindStringSubmatch(message)
mes := ClusterMessage{}
@ -134,10 +134,30 @@ func SanitizeClusterMessage(message string) ClusterMessage {
return mes
}
return mes
}
func sendTelnetMessage(conn net.Conn, message string) {
if !strings.HasPrefix(message, "F4BPO") {
time.Sleep(2 * time.Second)
}
_, err := conn.Write([]byte(message + "\n"))
if err != nil {
conn.Close()
time.Sleep(5 * time.Second) // Wait before retrying
}
}
func sendFilters(conn net.Conn) {
go sendTelnetMessage(conn, "set/ft8")
time.Sleep(1 * time.Second)
go sendTelnetMessage(conn, "SET/FILTER DOC/PASS F")
time.Sleep(1 * time.Second)
go sendTelnetMessage(conn, "set/skimmer")
time.Sleep(1 * time.Second)
go sendTelnetMessage(conn, "set/ft4")
}
func main() {
// Generate our config based on the config supplied
@ -151,10 +171,14 @@ func main() {
log.Fatal(err)
}
login := false
filters_sent := false
fmt.Println("PushDXCluster v0.1")
for {
// Connect to the Telnet server
conn, err := net.Dial("tcp", cfg.Cluster.Host)
addr, err := net.ResolveTCPAddr("tcp", cfg.Cluster.Host)
conn, err := net.DialTCP("tcp", nil, addr)
if err != nil {
log.Printf("Failed to connect to Telnet server: %v", err)
time.Sleep(5 * time.Second) // Wait before retrying
@ -166,99 +190,46 @@ func main() {
// Create a buffered reader to read from the Telnet server
reader := bufio.NewReader(conn)
ft8 := 0
filter := 0
skimmer := 0
ft4 := 0
login := false
// Loop to read from the Telnet server
for {
message, err := reader.ReadString('\n')
message, _ = strings.CutSuffix(message, "\n")
message, _ = strings.CutSuffix(message, "\r")
if err != nil {
log.Printf("Error reading from Telnet server: %v", err)
conn.Close()
break
}
// Trim and Sanitize spots messages
message = strings.TrimSpace(message)
sMess := SanitizeClusterMessage(message)
if sMess.DX != "" {
log.Printf("Sanitized message: Reporter: %s, DX: %s, Freq: %s, Report: %s, Time: %s", sMess.From, sMess.DX, sMess.Freq, sMess.Report, sMess.Time)
log.Printf("Sanitized message: Reporter: %s, DX: %s, Freq: %s, Mode: %s, Report: %s, Time: %s", sMess.From, sMess.DX, sMess.Freq, sMess.Mode, sMess.Report, sMess.Time)
} else {
log.Printf("Received message: %s", message)
}
// Send identification message
// Send Call to ID to the Server
if message != "" && strings.Contains("Please enter your call:", message) {
_, err = conn.Write([]byte(cfg.Cluster.Call + "\n"))
if err != nil {
log.Printf("Failed to send identification message: %v", err)
conn.Close()
time.Sleep(5 * time.Second) // Wait before retrying
continue
}
log.Printf("Identification %s message sent", cfg.Cluster.Call)
go sendTelnetMessage(conn, "F4BPO-2")
login = true
}
if ft8 == 0 && login {
time.Sleep(2 * time.Second)
_, err = conn.Write([]byte("set/ft8" + "\n"))
if err != nil {
log.Printf("Failed to send FT8 message: %v", err)
conn.Close()
time.Sleep(5 * time.Second) // Wait before retrying
continue
}
log.Println("Set FT8 message sent")
ft8++
if message != "" && strings.Contains("login:", message) {
go sendTelnetMessage(conn, "F4BPO-2")
login = true
}
if filter == 0 && login && message != "" && strings.Contains("FT8 spots enabled", message) {
_, err = conn.Write([]byte("SET/FILTER DOC/PASS 3W" + "\n"))
//SET/FILTER DXBM/OFF
//SET/FILTER DOC/PASS 3W
if err != nil {
log.Printf("Failed to send Filter message: %v", err)
conn.Close()
time.Sleep(5 * time.Second) // Wait before retrying
continue
}
log.Println("Set filter Vietnam message sent")
filter++
// Set the FT8, CW, FT4 and only spots from Vietnam filters only once
if login && !filters_sent {
go sendFilters(conn)
filters_sent = true
}
if skimmer == 0 && login && message != "" && strings.Contains("FT8 spots enabled", message) {
time.Sleep(1 * time.Second)
_, err = conn.Write([]byte("set/skimmer" + "\n"))
if err != nil {
log.Printf("Failed to send skimmer message: %v", err)
conn.Close()
time.Sleep(5 * time.Second) // Wait before retrying
continue
}
log.Println("Set CW skimmer message sent")
skimmer++
}
if ft4 == 0 && login && message != "" && strings.Contains("Skimmer spots enabled", message) {
time.Sleep(3 * time.Second)
_, err = conn.Write([]byte("set/skimmer" + "\n"))
if err != nil {
log.Printf("Failed to send FT4 message: %v", err)
conn.Close()
time.Sleep(5 * time.Second) // Wait before retrying
continue
}
log.Println("Set FT4 message sent")
ft4++
}
if sMess.DX != "" && sMess.From == "XV9Q" && strings.Contains(DX, sMess.DX) {
// If calls is in the DX List then send a Gotify notification
if sMess.DX != "" && sMess.From == "F4BPO" && strings.Contains(DX, sMess.DX) {
sendToGotify("Spot", sMess, 5, *cfg)
}
}

BIN
rsrc_windows_386.syso Normal file

Binary file not shown.

BIN
rsrc_windows_amd64.syso Normal file

Binary file not shown.