|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"github.com/gorilla/websocket"
|
|
|
|
"github.com/jordanorelli/blammo"
|
|
|
|
)
|
|
|
|
|
|
|
|
type server struct {
|
|
|
|
*blammo.Log
|
|
|
|
router *mux.Router
|
|
|
|
players map[int]*player
|
|
|
|
join chan player
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *server) init() {
|
|
|
|
r := mux.NewRouter()
|
|
|
|
r.HandleFunc("/kloam", s.play)
|
|
|
|
|
|
|
|
s.router = r
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *server) handler() http.Handler {
|
|
|
|
return s.router
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *server) play(w http.ResponseWriter, r *http.Request) {
|
|
|
|
u := websocket.Upgrader{}
|
|
|
|
|
|
|
|
conn, err := u.Upgrade(w, r, nil)
|
|
|
|
if err != nil {
|
|
|
|
s.Error("upgrade error: %s", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
s.Info("client connected: %v", conn.RemoteAddr())
|
|
|
|
s.join <- player{
|
|
|
|
conn: conn,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *server) run() {
|
|
|
|
s.players = make(map[int]*player)
|
|
|
|
|
|
|
|
for pc := 0; true; pc++ {
|
|
|
|
s.step(pc)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *server) step(pc int) {
|
|
|
|
select {
|
|
|
|
case p := <-s.join:
|
|
|
|
s.Info("received join: %#v", p)
|
|
|
|
p.id = pc
|
|
|
|
p.Log = s.Child("players").Child(strconv.Itoa(p.id))
|
|
|
|
go p.run()
|
|
|
|
}
|
|
|
|
}
|