From 19c4b42bf41940fbcfcaec049da9b79cc51708eb Mon Sep 17 00:00:00 2001 From: Hamcha Date: Thu, 27 Jun 2019 16:59:52 +0200 Subject: [PATCH] Start handling commands from players --- draftbot/draftbot.go | 75 +++++++++++++++++++++++++++++++++++++++++--- draftbot/main.go | 2 +- draftbot/session.go | 4 +++ 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/draftbot/draftbot.go b/draftbot/draftbot.go index c7224e5..c1f2529 100644 --- a/draftbot/draftbot.go +++ b/draftbot/draftbot.go @@ -1,15 +1,31 @@ package main import ( + "fmt" + room "git.fromouter.space/mcg/cardgage/room/api" + "git.fromouter.space/mcg/draft" ) type draftBot struct { + API BotInterface Name string + Rooms map[string]roomInfo Sessions map[string]session } -func newDraftBot(name string) *draftBot { +type roomInfo struct { + Name string + Owner string +} + +// BotInterface is the interface needed by draftbot for working in cardgage +// This exists so that draftbot can be attached to a mocked API for testing +type BotInterface interface { + Send(room.BotMessage) +} + +func newDraftBot(botAPI BotInterface, name string) *draftBot { return &draftBot{ Name: name, Sessions: make(map[string]session), @@ -28,7 +44,7 @@ func (d *draftBot) onMessage(msg room.ServerMessage) { } // Only consider messages that speak directly to me if msg.Message.To == d.Name { - d.handleMessage(*msg.Message) + d.handleMessage(msg.RoomID, *msg.Message) } case room.MsgEvent: if *logAll { @@ -39,6 +55,57 @@ func (d *draftBot) onMessage(msg room.ServerMessage) { } } -func (d *draftBot) handleMessage(msg room.Message) { - //TODO +func (d *draftBot) sendMessage(roomid string, msg room.Message) { + d.API.Send(room.BotMessage{ + RoomID: roomid, + Type: room.MsgMessage, + Message: &msg, + }) +} + +func (d *draftBot) handleMessage(roomid string, msg room.Message) { + // Get session in room + session, ok := d.Sessions[roomid] + if !ok { + // Room does not have a currently running session, ignore unless it's the owner asking for specific stuff + //TODO + } + + // Check if player is in the draft + player, ok := session.Players[msg.From] + if !ok { + // Player not in draft, are they asking to join? + //TODO + } + + switch msg.Type { + // Player has picked a card + case "pick": + // Get picked card + picked := msg.Data.(string) + + // Try to pick on player struct + err := player.Pick(draft.Card{ID: picked}) + if err != nil { + if err == draft.ErrNotInPack { + d.sendMessage(roomid, room.Message{ + To: msg.From, + Type: "invalid-pick", + }) + } else { + // Technically not needed, as Pick can only throw ErrNotInPack right now + } + return + } + d.sendMessage(roomid, room.Message{ + Channel: "draft", + Type: "card-picked", + Data: struct { + Player string + }{ + msg.From, + }, + Message: fmt.Sprintf("%s picked a card from his pack", msg.From), + }) + } } diff --git a/draftbot/main.go b/draftbot/main.go index 7c3183d..29accc1 100644 --- a/draftbot/main.go +++ b/draftbot/main.go @@ -81,7 +81,7 @@ func runBot(name string, games, tags []string) error { return err } - draftbot := newDraftBot(name) + draftbot := newDraftBot(wsbot, name) wsbot.Listen(draftbot.onMessage) return errors.New("eof") diff --git a/draftbot/session.go b/draftbot/session.go index 4e37bb1..33eea2d 100644 --- a/draftbot/session.go +++ b/draftbot/session.go @@ -25,6 +25,9 @@ type session struct { Bots []*bot.Bot Pod *draft.Pod + // State management variables + started bool // Has the draft started already? + // Channels for communication while the session is running messages chan<- room.Message exit chan bool @@ -173,6 +176,7 @@ func (s *session) Start() error { } // Start handling packs + s.started = true go s.handlePicks() return nil }