From 7ee4fe9b2a3ed2f9f97251a2e3cf2268229a8108 Mon Sep 17 00:00:00 2001
From: zcube <zcubekr@gmail.com>
Date: Fri, 8 Nov 2024 09:28:47 +0900
Subject: [PATCH] fix: add health_for_factorio

---
 cmd/local.go  | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 cmd/remote.go |  2 +-
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/cmd/local.go b/cmd/local.go
index f2c3d51..0d89a4f 100644
--- a/cmd/local.go
+++ b/cmd/local.go
@@ -69,7 +69,59 @@ var localCmd = &cobra.Command{
 
 				addr := net.UDPAddr{IP: net.ParseIP(ip)}
 
-				remote := &net.UDPAddr{Port: int(localPort), IP: net.ParseIP("127.0.0.1")}
+				remote := &net.UDPAddr{Port: int(port), IP: net.ParseIP("127.0.0.1")}
+
+				conn, err := net.ListenUDP("udp", &addr)
+				if err != nil {
+					sugar.Error(err)
+					return c.String(http.StatusInternalServerError, err.Error())
+				}
+
+				pktIndex := uint16(rand.Intn(math.MaxUint16 + 1))
+				resBuffer := &bytes.Buffer{}
+
+				// ping
+				resBuffer.WriteByte(0)
+				pktIndexBytes := make([]byte, 2)
+				binary.LittleEndian.PutUint16(pktIndexBytes, pktIndex)
+				resBuffer.Write(pktIndexBytes)
+
+				cc, wrerr := conn.WriteTo(resBuffer.Bytes(), remote)
+				if wrerr != nil {
+					sugar.Errorf("net.WriteTo() error: %s\n", wrerr)
+				} else {
+					sugar.Debugw("Wrote to socket",
+						"Bytes", cc,
+						"Remote", remote,
+						"RemoteClientIP", remoteClientIp,
+					)
+				}
+
+				b := make([]byte, 2048)
+
+				// pong
+				conn.SetReadDeadline(time.Now().Add(time.Second * 5))
+				cc, remote, rderr := conn.ReadFromUDP(b)
+				if rderr != nil {
+					sugar.Error("net.ReadFromUDP() error: %s", rderr)
+					return c.String(http.StatusInternalServerError, rderr.Error())
+				} else {
+					sugar.Debugw("Read from socket",
+						"Bytes", cc,
+						"Remote", remote)
+				}
+			}
+			return c.String(http.StatusOK, "OK")
+		})
+
+		// factorio server health check : from factorio server to this server
+		e.GET("/health_for_factorio", func(c echo.Context) error {
+			{
+				remoteClientIp := c.RealIP()
+
+				addr := net.UDPAddr{IP: net.ParseIP(ip)}
+
+				remote := &net.UDPAddr{Port: int(remotePort), IP: net.ParseIP(remoteClientIp)}
 
 				conn, err := net.ListenUDP("udp", &addr)
 				if err != nil {
diff --git a/cmd/remote.go b/cmd/remote.go
index 628c0a0..d37ce10 100644
--- a/cmd/remote.go
+++ b/cmd/remote.go
@@ -68,7 +68,7 @@ var remoteCmd = &cobra.Command{
 
 				addr := net.UDPAddr{IP: net.ParseIP(ip)}
 
-				remote := &net.UDPAddr{Port: int(localPort), IP: net.ParseIP("127.0.0.1")}
+				remote := &net.UDPAddr{Port: int(port), IP: net.ParseIP("127.0.0.1")}
 
 				conn, err := net.ListenUDP("udp", &addr)
 				if err != nil {