111 lines
2.4 KiB
Go
111 lines
2.4 KiB
Go
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
|
|
}
|
|
|
|
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),
|
|
}
|
|
}
|
|
|
|
func (d *draftBot) onMessage(msg room.ServerMessage) {
|
|
switch msg.Type {
|
|
case room.MsgMessage:
|
|
if *logAll {
|
|
logger.Log("event", "message",
|
|
"roomid", msg.RoomID,
|
|
"from", msg.Message.From,
|
|
"to", msg.Message.To,
|
|
"content", msg.Message.Message)
|
|
}
|
|
// Only consider messages that speak directly to me
|
|
if msg.Message.To == d.Name {
|
|
d.handleMessage(msg.RoomID, *msg.Message)
|
|
}
|
|
case room.MsgEvent:
|
|
if *logAll {
|
|
logger.Log("event", "event",
|
|
"roomid", msg.RoomID,
|
|
"content", msg.Event.Message)
|
|
}
|
|
}
|
|
}
|
|
|
|
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),
|
|
})
|
|
}
|
|
}
|