generated from prairir/project-template
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
It includes handling for heartbeat, init, and normal closure. It reads the trigger data from cc-server.yaml.
- Loading branch information
Showing
7 changed files
with
114 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
cc-server/imacry-cc-server |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,6 @@ | ||
package cmd | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/apex/log" | ||
"github.com/spf13/cobra" | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
package handler | ||
|
||
import ( | ||
//"fmt" | ||
|
||
"time" | ||
|
||
"github.com/gorilla/websocket" | ||
"github.com/prairir/imacry/cc-server/pkg/config" | ||
) | ||
|
||
// handler.HeartBeat: heart beat and event trigger logic. It reads from | ||
// config.Config.TriggerTime and config.Config.TriggerLength to determine when to | ||
// trigger the event. If the current time is within the trigger period then respond | ||
// with a trigger bit else respond with non triggered bit | ||
// | ||
// response when triggered: `hb: 1` | ||
// response when not triggered: `hb: 0` | ||
// | ||
// params: takes message and connection | ||
// returns: nothing | ||
func HeartBeat(message []byte, conn *websocket.Conn) { | ||
// get now | ||
now := time.Now() | ||
|
||
// format the start time with todays year, month, and day | ||
// but with the proper hour and minute | ||
startTime := time.Date( | ||
now.Year(), | ||
now.Month(), | ||
now.Day(), | ||
config.Config.TriggerTime.Hour(), | ||
config.Config.TriggerTime.Minute(), | ||
0, 0, now.Location()) | ||
|
||
// end time is start + duration | ||
endTime := startTime.Add(config.Config.TriggerLength) | ||
|
||
// if current time is within trigger period | ||
// trigger | ||
// else dont | ||
if now.After(startTime) && now.Before(endTime) { | ||
conn.WriteMessage(websocket.TextMessage, []byte("hb: 1")) | ||
} else { | ||
conn.WriteMessage(websocket.TextMessage, []byte("hb: 0")) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package handler | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/gorilla/websocket" | ||
"github.com/prairir/imacry/cc-server/pkg/config" | ||
) | ||
|
||
func Init(message []byte, conn *websocket.Conn) error { | ||
err := conn.WriteMessage(websocket.TextMessage, []byte("pass: "+config.Config.Password)) | ||
if err != nil { | ||
return fmt.Errorf("state.Init error: %w", err) | ||
} | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,66 @@ | ||
package web | ||
|
||
import ( | ||
"fmt" | ||
"net/http" | ||
|
||
"github.com/apex/log" | ||
"github.com/gorilla/websocket" | ||
"net/http" | ||
"github.com/prairir/imacry/cc-server/pkg/config" | ||
"github.com/prairir/imacry/cc-server/pkg/handler" | ||
) | ||
|
||
// default options | ||
var upgrader = websocket.Upgrader{} | ||
|
||
func initRoute(w http.ResponseWriter, r *http.Request) { | ||
c, err := upgrader.Upgrade(w, r, nil) | ||
fmt.Println("hello") | ||
func wsHandler(w http.ResponseWriter, r *http.Request) { | ||
conn, err := upgrader.Upgrade(w, r, nil) | ||
if err != nil { | ||
log.Errorf("init error: %s", err) | ||
return | ||
} | ||
log.Infof("New Connection from %s", r.RemoteAddr) | ||
|
||
// ws event loop dispatcher | ||
for { | ||
mt, message, err := conn.ReadMessage() | ||
if err != nil { | ||
log.Errorf("fatal read error: %s", err) | ||
break | ||
} | ||
|
||
// if connection closes | ||
if mt == websocket.CloseNormalClosure { | ||
break | ||
} | ||
|
||
// init handler | ||
if mt == websocket.TextMessage && string(message[:5]) == "init:" { | ||
err = handler.Init(message, conn) | ||
if err != nil { | ||
log.Errorf("fatal init error: %s", err) | ||
break | ||
} | ||
} | ||
|
||
// Heart Beat handler | ||
// Heart Beat doubles as a trigger event | ||
if mt == websocket.TextMessage && string(message[:3]) == "hb:" { | ||
handler.HeartBeat(message, conn) | ||
} | ||
|
||
} | ||
|
||
// closing the websocket | ||
err = conn.Close() | ||
if err != nil { | ||
log.Errorf("fatal closing error: %s", err) | ||
} | ||
defer c.Close() | ||
} | ||
|
||
func Run() { | ||
http.HandleFunc("/init", initRoute) | ||
http.HandleFunc("/", wsHandler) | ||
|
||
log.Fatalf("%s", http.ListenAndServe(":80", nil)) | ||
log.Infof("Listen and Serve on port %s", config.Config.Port) | ||
log.Fatalf("%s", http.ListenAndServe(":"+config.Config.Port, nil)) | ||
|
||
} |