gosl/cmd/server.go

123 lines
2.8 KiB
Go
Raw Normal View History

2016-01-18 23:19:51 +01:00
package cmd // code.bitsetter.de/fun/gosl/cmd
import (
2016-02-05 16:19:43 +01:00
"encoding/gob"
2016-01-19 16:51:50 +01:00
"log"
"net"
"sort"
"time"
2016-01-18 23:19:51 +01:00
"github.com/spf13/cobra"
"code.bitsetter.de/fun/gosl/data"
2016-01-18 23:19:51 +01:00
)
var cmdServer = &cobra.Command{
Use: "server",
Short: "Runs Gosl as a server",
2016-02-05 16:19:43 +01:00
Long: `Runs Gosl as a server
[TODO:]
gosl.json for configuration (Port/Address, Level)
2016-02-05 16:19:43 +01:00
`,
2016-01-18 23:19:51 +01:00
// Run:
}
type goslClient struct {
con *net.TCPConn
id int
w int
h int
}
/* GLOBAL SERVER STATE */
2016-02-06 01:48:29 +01:00
var (
LevelFile string
level *data.Level
2016-02-06 01:48:29 +01:00
ServerPort int
TotalWidth int = 0
clients map[int]goslClient = make(map[int]goslClient)
clientKeys []int = make([]int, 100)
2016-02-06 01:48:29 +01:00
)
2016-01-19 16:51:50 +01:00
func handleConn(conn *net.TCPConn) {
2016-02-06 15:18:07 +01:00
var hs data.Handshake
2016-01-19 16:51:50 +01:00
log.Println("Got a connection!")
2016-02-06 21:47:06 +01:00
dec := gob.NewDecoder(conn)
dec.Decode(&hs) // decode handshake
log.Println("Got client! ID:", hs.ID, "dimensions:", hs.W, hs.H)
clientKeys = append(clientKeys, hs.ID)
sort.Ints(clientKeys)
clients[hs.ID] = goslClient{con: conn, id: hs.ID, w: hs.W, h: hs.H}
TotalWidth += hs.W
// conn.Close()
}
func serveClients() {
level = data.LoadLevel(LevelFile)
log.Println("canvas X:", canvasX())
2016-02-07 12:16:58 +01:00
fCounter := 0
for { // while true
for _, k := range clientKeys {
id, client := k, clients[k]
if id > 0 {
oFrame := level.GetFrame(0, client.w, fCounter)
enc := gob.NewEncoder(client.con)
2016-02-06 21:47:06 +01:00
err := enc.Encode(oFrame)
if err != nil {
// client disconnected
//log.Println("BEFORE remove: clients:", clients, " clientKeys:", clientKeys)
// delete client
delete(clients, client.id)
// delete client key
// ugly as fuck in go to remove from a slice
// it *should* work though
idInKeys := sort.SearchInts(clientKeys, client.id)
clientKeys = append(clientKeys[:idInKeys], clientKeys[idInKeys+1:]...)
//log.Println("AFTER remove: clients:", clients, " clientKeys:", clientKeys)
}
2016-02-06 11:11:09 +01:00
//log.Println("ID:", id, "Client:", client)
}
}
2016-02-07 16:29:35 +01:00
fCounter++
time.Sleep(time.Second / time.Duration(level.FPS))
}
2016-01-19 16:51:50 +01:00
}
2016-01-18 23:19:51 +01:00
func runServer(cmd *cobra.Command, args []string) {
2016-02-06 01:48:29 +01:00
log.Println("running server on port", ServerPort)
listener, err := net.ListenTCP("tcp", &net.TCPAddr{Port: ServerPort})
2016-01-19 16:51:50 +01:00
if err != nil {
log.Fatal(err)
panic("Could not open Listener")
}
defer listener.Close()
go serveClients()
2016-01-19 16:51:50 +01:00
for {
conn, err := listener.AcceptTCP()
if err != nil {
log.Fatal(err)
panic("Listener could not accept connection!")
}
go handleConn(conn)
}
2016-01-18 23:19:51 +01:00
}
func init() {
2016-02-06 01:48:29 +01:00
CmdGosl.AddCommand(cmdServer)
2016-01-18 23:19:51 +01:00
cmdServer.Run = runServer
2016-02-06 01:48:29 +01:00
2016-02-06 13:26:01 +01:00
cmdServer.Flags().StringVarP(&LevelFile, "level", "l", "default.lvl", "Use specific levelfile")
2016-02-06 01:48:29 +01:00
cmdServer.Flags().IntVarP(&ServerPort, "port", "p", 8090, "Run server on this port")
2016-01-18 23:19:51 +01:00
}
func canvasX() (x int) {
x = 0
for _, k := range clientKeys {
_, client := k, clients[k]
x += client.w
}
x += level.Width()
return
}