This commit is contained in:
Gregory Salaun 2024-09-26 15:23:05 +07:00
parent eef2b4b938
commit c57258cc3a
13 changed files with 78799 additions and 131085 deletions

BIN
FlexDXCluster.exe Normal file

Binary file not shown.

View File

@ -1,6 +1,7 @@
package main
import (
"fmt"
"html/template"
"net/http"
@ -9,15 +10,22 @@ import (
)
var tmpl *template.Template
var listNew = []New{}
type New struct {
DX string
Status string
}
type HTTPServer struct {
router *mux.Router
Log4OMRepo Log4OMContactsRepository
Repo FlexDXClusterRepository
Log *log.Logger
FlexClient FlexClient
}
func NewHTTPServer(cRepo Log4OMContactsRepository, fRepo FlexDXClusterRepository, log *log.Logger) *HTTPServer {
func NewHTTPServer(cRepo Log4OMContactsRepository, fRepo FlexDXClusterRepository, fClient FlexClient, log *log.Logger) *HTTPServer {
gRouter := mux.NewRouter()
@ -26,6 +34,7 @@ func NewHTTPServer(cRepo Log4OMContactsRepository, fRepo FlexDXClusterRepository
Log4OMRepo: cRepo,
Repo: fRepo,
Log: log,
FlexClient: fClient,
}
}
@ -34,9 +43,17 @@ func (s *HTTPServer) SetRoutes() {
s.router.HandleFunc("/spots", s.GetSpots).Methods("GET")
s.router.HandleFunc("/spotscount", s.GetSpotsCount).Methods("GET")
s.router.HandleFunc("/spotters", s.GetSpotters).Methods("GET")
s.router.HandleFunc("/new", s.GetNew).Methods("GET")
}
func (s *HTTPServer) StartHTTPServer() {
go func() {
for spot := range s.FlexClient.FlexSpotChan {
s.GetListofNew(spot)
}
}()
tmpl, _ = template.ParseGlob("templates/*.html")
s.SetRoutes()
s.Log.Infof("starting HTTP server on %s:%s", Cfg.HTTPServer.Host, Cfg.HTTPServer.Port)
@ -54,7 +71,7 @@ func (s *HTTPServer) Homepage(w http.ResponseWriter, r *http.Request) {
}
func (s *HTTPServer) GetSpots(w http.ResponseWriter, r *http.Request) {
spots := s.Repo.GetAllSpots("25")
spots := s.Repo.GetAllSpots("20")
tmpl.ExecuteTemplate(w, "spot", spots)
}
@ -68,3 +85,28 @@ func (s *HTTPServer) GetSpotters(w http.ResponseWriter, r *http.Request) {
spotters := s.Repo.GetSpotters()
tmpl.ExecuteTemplate(w, "spotters", spotters)
}
func (s *HTTPServer) GetNew(w http.ResponseWriter, r *http.Request) {
tmpl.ExecuteTemplate(w, "new", listNew)
}
func (s *HTTPServer) GetListofNew(spot FlexSpot) {
new := New{}
new.DX = spot.DX
if spot.NewDXCC {
new.Status = fmt.Sprintf("New DXCC (%s) (%s)", spot.Band, spot.Mode)
} else if !spot.NewBand && spot.NewMode && spot.Mode != "" {
new.Status = fmt.Sprintf("New Mode (%s)", spot.Mode)
} else if spot.NewBand && spot.NewMode && spot.Mode != "" {
new.Status = fmt.Sprintf("New Band (%s) & Mode (%s)", spot.Band, spot.Mode)
}
if new.Status != "" {
if len(listNew) > 3 {
listNew = append(listNew[:0], listNew[1:]...)
}
listNew = append(listNew, new)
}
}

View File

@ -80,8 +80,8 @@ func (c *TCPClient) StartClient() {
go func() {
for message := range c.TCPServer.CmdChan {
message := message + "\n"
c.Log.Infof("Received DX Command: %s", message)
message := message + "\n"
c.WriteString(message)
}
}()

View File

@ -122,7 +122,7 @@ func (s *TCPServer) broadcastMessage(message string) {
for client := range s.Clients {
_, err := client.Write([]byte(message))
if err != nil {
fmt.Println("Erreur lors de l'envoi du message au client:", client.RemoteAddr())
fmt.Println("error while sending message to clients:", client.RemoteAddr())
}
}
}

View File

@ -8,7 +8,7 @@ cluster:
port: 7300
login: xv9q-2
skimmer: true
ft8: true
ft8: false
flex:
ip: 10.10.10.120
spot_life: 600

View File

@ -112,12 +112,9 @@ func (r *Log4OMContactsRepository) ListByCountry(countryID string) ([]*Contact,
func (r *Log4OMContactsRepository) ListByCountryMode(countryID string, mode string) ([]*Contact, error) {
modeUSB := "USB"
modeLSB := "LSB"
if mode == "USB" || mode == "LSB" {
rows, err := r.db.Query("SELECT callsign, band, mode, dxcc, stationcallsign, country FROM log WHERE dxcc = ? AND (mode = ? OR mode = ?)", countryID, modeLSB, modeUSB)
rows, err := r.db.Query("SELECT callsign, band, mode, dxcc, stationcallsign, country FROM log WHERE dxcc = ? AND (mode = ? OR mode = ?)", countryID, "USB", "LSB")
if err != nil {
log.Error("could not query database", err)
return nil, err
@ -241,7 +238,7 @@ func (r *FlexDXClusterRepository) GetSpotters() []Spotter {
sList := []Spotter{}
rows, err := r.db.Query("select spotter, count(*) as occurences from spots group by spotter order by occurences desc, spotter limit 3")
rows, err := r.db.Query("select spotter, count(*) as occurences from spots group by spotter order by occurences desc, spotter limit 5")
if err != nil {
r.Log.Error(err)

Binary file not shown.

View File

@ -33,32 +33,38 @@ type FlexSpot struct {
Comment string
Color string
BackgroundColor string
NewDXCC bool
NewBand bool
NewMode bool
Worked bool
}
type FlexClient struct {
Address string
Port string
Timeout time.Duration
LogWriter *bufio.Writer
Reader *bufio.Reader
Writer *bufio.Writer
Conn *net.TCPConn
SpotChan chan TelnetSpot
MsgChan chan string
Repo FlexDXClusterRepository
Log *log.Logger
TCPServer TCPServer
Address string
Port string
Timeout time.Duration
LogWriter *bufio.Writer
Reader *bufio.Reader
Writer *bufio.Writer
Conn *net.TCPConn
SpotChan chan TelnetSpot
MsgChan chan string
FlexSpotChan chan FlexSpot
Repo FlexDXClusterRepository
Log *log.Logger
TCPServer TCPServer
}
func NewFlexClient(repo FlexDXClusterRepository, TCPServer TCPServer, log *log.Logger) *FlexClient {
return &FlexClient{
Address: Cfg.Flex.IP,
Port: "4992",
SpotChan: make(chan TelnetSpot),
MsgChan: TCPServer.MsgChan,
Repo: repo,
TCPServer: TCPServer,
Log: log,
Address: Cfg.Flex.IP,
Port: "4992",
SpotChan: make(chan TelnetSpot),
FlexSpotChan: make(chan FlexSpot),
MsgChan: TCPServer.MsgChan,
Repo: repo,
TCPServer: TCPServer,
Log: log,
}
}
@ -127,26 +133,41 @@ func (fc *FlexClient) SendSpottoFlex(spot TelnetSpot) {
Color: "#eaeaea",
BackgroundColor: "#000000",
Priority: "5",
NewDXCC: spot.NewDXCC,
NewBand: spot.NewBand,
NewMode: spot.NewMode,
Worked: spot.CallsignWorked,
}
// If new DXCC
if spot.NewDXCC {
flexSpot.Color = "#3bf908"
flexSpot.Priority = "1"
flexSpot.BackgroundColor = "#000000"
}
if spot.NewBand || spot.NewMode && spot.Mode != "" {
// if New Band
if spot.NewBand {
flexSpot.Color = "#f9f508"
flexSpot.Priority = "2"
flexSpot.BackgroundColor = "#000000"
}
// if New Mode
if spot.NewMode {
flexSpot.Color = "#f9a908"
flexSpot.Priority = "2"
flexSpot.BackgroundColor = "#000000"
}
// If not New DXCC nor Mode nor Band and never worked
if !spot.NewBand && !spot.NewMode && !spot.NewDXCC && !spot.CallsignWorked {
flexSpot.Color = "#eaeaea"
flexSpot.Priority = "5"
flexSpot.BackgroundColor = "#000000"
}
// If station worked already
if spot.CallsignWorked {
flexSpot.Color = "#000000"
flexSpot.BackgroundColor = "#00c0c0"
@ -167,6 +188,9 @@ func (fc *FlexClient) SendSpottoFlex(spot TelnetSpot) {
fc.Log.Error("could not find the DX in the database: ", err)
}
// send FlexSpot to HTTP Server
fc.FlexSpotChan <- flexSpot
if srcFlexSpot.DX == "" {
fc.Repo.CreateSpot(flexSpot)
stringSpot := fmt.Sprintf("C%v|spot add rx_freq=%v callsign=%s mode=%s source=%s spotter_callsign=%s timestamp=%v lifetime_seconds=%s comment=%s color=%s background_color=%s priority=%s", flexSpot.CommandNumber, flexSpot.FrequencyMhz,

209733
flexradio.log

File diff suppressed because it is too large Load Diff

View File

@ -60,7 +60,7 @@ func main() {
TCPServer := NewTCPServer(Cfg.Telnet.Host, Cfg.Telnet.Port, log)
FlexClient := NewFlexClient(*fRepo, *TCPServer, log)
TCPClient := NewTCPClient(*Cfg, TCPServer, FlexClient, log)
HTTPServer := NewHTTPServer(*cRepo, *fRepo, log)
HTTPServer := NewHTTPServer(*cRepo, *fRepo, *FlexClient, log)
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)

BIN
resources/background.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -17,9 +17,15 @@
flex-wrap: wrap;
align-items: stretch;
}
body {
background: grey;
}
</style>
</head>
<body>
<br>
<br>
<div class="container" style="width:1000px; margin: 0 auto;">
<div class="card-deck">
<div class="card shadow p-3 mb-5 bg-body rounded" style="width: 18rem;">
@ -32,12 +38,19 @@
<div class="card shadow p-3 mb-5 bg-body rounded" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title">Top Spotters</h5>
<div id="spotters" hx-get="/spotters" hx-trigger="every 1s" hx-swap="innerHTML"><p class="card-text"></p></div>
<div class="card-text" id="spotters" hx-get="/spotters" hx-trigger="every 1s" hx-swap="innerHTML"></div>
</div>
</div>
<div class="card shadow p-3 mb-5 bg-body rounded" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title">To Work</h5>
<h6 class="card-subtitle mb-2 text-muted">New DXCC, Band or Mode</h6>
<div class="card-text" id="new" hx-get="/new" hx-trigger="every 1s" hx-swap="innerHTML"></div>
</div>
</div>
</div>
</div>
<div id="spot" style="width:1000px; margin:0 auto;" hx-get="/spots" hx-trigger="every 1s" hx-swap="innerHTML"></div>
<div class="container" id="spot" style="width:1000px; margin:0 auto;" hx-get="/spots" hx-trigger="every 1s" hx-swap="innerHTML"></div>
</div>
</body>
</html>

9
templates/new.html Normal file
View File

@ -0,0 +1,9 @@
{{ define "new" }}
{{ range.}}
<span class="fw-bold">{{ .DX }}</span>: <span>{{ .Status }}</span><br>
{{ end }}
{{ end }}