0
0
Fork 0
This repository has been archived on 2024-05-09. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
game-server/pkg/games/moose.go
2018-09-18 08:35:41 -05:00

101 lines
2 KiB
Go

package games
import (
"fmt"
"strings"
"sync"
"time"
log "github.com/Sirupsen/logrus"
namesgenerator "github.com/moby/moby/pkg/namesgenerator"
uuid "github.com/satori/go.uuid"
)
type moose struct {
fromGameHandler func(useruuid string, gameuuid string, e interface{})
profilemtx sync.RWMutex
name string
id string
gameEvents chan []byte
}
type gameError struct {
UserID string `json:"gameid"`
Error string `json:"error"`
}
type readyToggled struct {
UserID string `json:"userid"`
}
func (m *moose) ID() string {
m.profilemtx.RLock()
defer m.profilemtx.RUnlock()
return m.id
}
func (m *moose) Name() string {
m.profilemtx.RLock()
defer m.profilemtx.RUnlock()
return m.name
}
func (m *moose) SetFromGameHandler(h func(u string, g string, e interface{})) {
if h != nil {
m.fromGameHandler = h
}
}
func (m *moose) FromUserHandler(u string, p map[string]interface{}) {
log.Debugf("event from %s: %s", u, p)
t, ok := p["type"]
if !ok {
m.fromGameHandler(u, "INVALID_EVENT", &gameError{
Error: "type missing from keys",
})
return
}
log.Warn(t)
switch t {
case "TOGGLE_READY":
m.fromGameHandler(u, "TOGGLED_READY", &readyToggled{
UserID: u,
})
default:
m.fromGameHandler(u, "UNKNOWN_EVENT", &gameError{
Error: fmt.Sprintf("unknown type '%s'", t),
})
}
}
func (m *moose) StartGameLoop() {
timeoutTicker := time.NewTicker(2 * time.Hour)
for {
select {
case e := <-m.gameEvents:
log.Errorf("Whoa, event!? %s", e)
case <-timeoutTicker.C:
log.Error("Game Timed Out")
return
}
}
}
func (m *moose) Shutdown() {
log.Warnf("Received shutdown notification in game %s", m.Name())
}
func NewMoose(name string) *moose {
id := uuid.Must(uuid.NewV4()).String()
if name == "" {
genName := strings.Split(namesgenerator.GetRandomName(0), "_")
name = fmt.Sprintf("%s %s", strings.Title(genName[0]), strings.Title(genName[1]))
}
g := &moose{
name: name,
id: id,
gameEvents: make(chan []byte, 50),
}
go g.StartGameLoop()
return g
}