Add session creation and start commands
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Hamcha 2019-06-28 12:54:58 +02:00
parent dbc7e7e0ba
commit 5158ab539a
4 changed files with 83 additions and 12 deletions

View File

@ -9,7 +9,7 @@ type DraftBot struct {
API BotInterface
Name string
Rooms map[string]roomInfo
Sessions map[string]session
Sessions map[string]*session
}
type roomInfo struct {
@ -29,7 +29,7 @@ func NewDraftBot(botAPI BotInterface, name string) *DraftBot {
return &DraftBot{
API: botAPI,
Name: name,
Sessions: make(map[string]session),
Sessions: make(map[string]*session),
}
}
@ -85,6 +85,8 @@ func (d *DraftBot) handleMessage(roomid string, msg room.Message) {
d.commands(commandMap{
// Player wants to join the session
"join": d.cmdJoinSession,
// Owner wants to start the session (but not partecipate)
"start": d.cmdfnOnlyOwner(d.cmdStartSession),
})(roomid, msg)
return
}
@ -93,7 +95,6 @@ func (d *DraftBot) handleMessage(roomid string, msg room.Message) {
d.commands(commandMap{
// Player has picked a card
"pick": d.cmdPickCard,
// Owner wants to start the session
"start": d.cmdfnOnlyOwner(d.cmdStartSession),
})(roomid, msg)
@ -124,3 +125,9 @@ func (d *DraftBot) handleEvent(roomid string, evt room.Event) {
delete(d.Rooms, roomid)
}
}
func (d *DraftBot) handleSessionMessages(roomid string, s *session) {
for msg := range s.messages {
d.sendMessage(roomid, msg)
}
}

View File

@ -3,6 +3,8 @@ package main
import (
"fmt"
"github.com/mitchellh/mapstructure"
room "git.fromouter.space/mcg/cardgage/room/api"
"git.fromouter.space/mcg/draft"
)
@ -100,11 +102,70 @@ func (d *DraftBot) cmdPickCard(roomid string, msg room.Message) {
}
func (d *DraftBot) cmdCreateSession(roomid string, msg room.Message) {
//TODO
// Get session options from data
type sessionOptions struct {
players int
options draftOptions
}
var opt sessionOptions
err := mapstructure.Decode(msg.Data, &opt)
if err != nil {
d.sendMessage(roomid, room.Message{
To: msg.From,
Type: "invalid-data",
Message: "Error parsing session options: " + err.Error(),
})
return
}
sess, err := newSession(opt.players, opt.options)
if err != nil {
d.sendMessage(roomid, room.Message{
To: msg.From,
Type: "session-create-error",
Data: err.Error(),
Message: "Error creating session: " + err.Error(),
})
return
}
// All ok, assign session
d.Sessions[roomid] = sess
// Start handling messages for the session
go d.handleSessionMessages(roomid, sess)
// Tell everyone about the new session
d.sendMessage(roomid, room.Message{
Channel: "draft",
Type: "session-open",
Data: opt,
Message: fmt.Sprintf("Created a new draft session for %d players, type: %s", opt.players, opt.options.Type),
})
}
func (d *DraftBot) cmdStartSession(roomid string, msg room.Message) {
//TODO
// Get session
session, _ := d.Sessions[roomid]
// Try starting the session
err := session.Start()
if err != nil {
d.sendMessage(roomid, room.Message{
To: msg.From,
Type: "session-start-error",
Data: err.Error(),
Message: "Could not start session: " + err.Error(),
})
return
}
// Tell everyone about the new session
d.sendMessage(roomid, room.Message{
Channel: "draft",
Type: "session-start",
Message: "Session started, get drafting!",
})
}
func (d *DraftBot) cmdfnOnlyOwner(wrapped commandHandler) commandHandler {
@ -121,8 +182,8 @@ func (d *DraftBot) cmdfnOnlyOwner(wrapped commandHandler) commandHandler {
if msg.From != roomData.Owner {
d.sendMessage(roomid, room.Message{
To: msg.From,
Type: "no-session",
Message: "Sorry, only the owner can speak to me when no session is active",
Type: "must-be-owner",
Message: "Sorry, only the room's owner can tell me to do that",
})
return
}

View File

@ -7,4 +7,5 @@ require (
git.fromouter.space/mcg/cardgage v0.0.4
git.fromouter.space/mcg/draft v0.0.3
github.com/go-kit/kit v0.8.0
github.com/mitchellh/mapstructure v1.1.2
)

View File

@ -29,7 +29,7 @@ type session struct {
started bool // Has the draft started already?
// Channels for communication while the session is running
messages chan<- room.Message
messages chan room.Message
exit chan bool
}
@ -67,7 +67,6 @@ type draftOptions struct {
// Shared
PackCount int `json:"pack_count,omitempty"` // Set and Cube
}
func (do draftOptions) getProvider() (draft.PackProvider, error) {
@ -108,9 +107,10 @@ func newSession(playerCount int, opt draftOptions) (*session, error) {
}
return &session{
Options: opt,
Pod: draft.MakePod(playerCount, provider),
exit: make(chan bool),
Options: opt,
Pod: draft.MakePod(playerCount, provider),
messages: make(chan room.Message),
exit: make(chan bool),
}, nil
}
@ -250,6 +250,8 @@ func (s *session) handlePicks() {
break
case <-s.exit:
// Room closed, exit early
close(s.messages)
close(s.exit)
return
}
}