catbase/plugins/velouremon/interaction.go

231 lines
6.2 KiB
Go
Raw Normal View History

2019-07-07 01:56:26 +00:00
package velouremon
import (
"fmt"
2019-07-08 00:28:06 +00:00
"strings"
2019-07-07 01:56:26 +00:00
"math/rand"
"time"
"github.com/velour/catbase/bot"
)
type Interaction struct {
2019-07-08 00:28:06 +00:00
id string
2019-07-07 01:56:26 +00:00
players []*Player
creatures []*Creature
2019-07-08 01:35:31 +00:00
lastUpdate time.Time
2019-07-07 01:56:26 +00:00
}
func randomInteraction(c bot.Connector, vp *VelouremonPlugin) {
for {
<-vp.timer.C
2019-07-08 01:35:31 +00:00
fifteenMinutesAgo := time.Now().Add(-15 * time.Minute)
remove := []string{}
for _, i := range vp.threads {
if i.lastUpdate.Before(fifteenMinutesAgo) {
vp.bot.Send(c, bot.Reply, vp.channel, "Cleaning up the bodies.", i.id)
remove = append(remove, i.id)
}
}
for _, id := range remove {
delete(vp.threads, id)
}
2019-07-07 01:56:26 +00:00
if vp.channel != "" {
creature := vp.creatures[rand.Intn(len(vp.creatures))]
message := fmt.Sprintf("A wild %s appeared.", creature.Name)
2019-07-08 00:28:06 +00:00
id, _ := vp.bot.Send(c, bot.Message, vp.channel, message)
vp.threads[id] = &Interaction {
id: id,
players: []*Player{},
creatures: []*Creature{
vp.buildOutCreature(creature),
},
2019-07-08 01:35:31 +00:00
lastUpdate: time.Now(),
2019-07-08 00:28:06 +00:00
}
2019-07-08 01:35:31 +00:00
vp.bot.Send(c, bot.Reply, vp.channel, message, id)
2019-07-08 00:28:06 +00:00
}
2019-07-08 01:35:31 +00:00
vp.timer.Reset(time.Duration(15 + rand.Intn(30)) * time.Minute)
2019-07-08 00:28:06 +00:00
}
}
func (i *Interaction) handleMessage(vp *VelouremonPlugin, c bot.Connector, player *Player, tokens []string) bool {
2019-07-08 01:35:31 +00:00
i.lastUpdate = time.Now()
2019-07-08 00:28:06 +00:00
if len(tokens) > 0 {
2019-07-08 01:35:31 +00:00
if len(tokens) == 1 {
command := strings.ToLower(tokens[0])
if command == "status" {
vp.bot.Send(c, bot.Reply, vp.channel, player.string(), i.id)
} else if command == "join" {
return i.handleJoin(vp, c, player)
} else if command == "run" {
return i.handleRun(vp, c, player)
} else if command == "flail" {
return i.handleFlail(vp, c, player)
}
} else if len(tokens) == 3 {
src := strings.ToLower(tokens[0])
ability := strings.ToLower(tokens[1])
target := strings.ToLower(tokens[2])
return i.handleAbilityUseCreature(vp, c, player, src, ability, target)
} else if len(tokens) == 4 {
src := strings.ToLower(tokens[0])
ability := strings.ToLower(tokens[1])
targetPlayer := strings.ToLower(tokens[2])
target := strings.ToLower(tokens[3])
return i.handleAbilityUsePlayer(vp, c, player, src, ability, targetPlayer, target)
2019-07-07 01:56:26 +00:00
}
2019-07-08 00:28:06 +00:00
}
return false
}
2019-07-07 01:56:26 +00:00
2019-07-08 00:28:06 +00:00
func (i *Interaction) handleJoin(vp *VelouremonPlugin, c bot.Connector, player *Player) bool {
for _, p := range i.players {
if player == p {
vp.bot.Send(c, bot.Reply, vp.channel, player.Name + " is already in the party.", i.id)
return true
}
}
i.players = append(i.players, player)
vp.bot.Send(c, bot.Reply, vp.channel, player.Name + " has just joined the party.", i.id)
return true
}
func (i *Interaction) handleRun(vp *VelouremonPlugin, c bot.Connector, player *Player) bool {
for index, p := range i.players {
if player == p {
i.players = append(i.players[:index], i.players[index+1:]...)
vp.bot.Send(c, bot.Reply, vp.channel, player.Name + " has just left the party.", i.id)
return true
}
2019-07-07 01:56:26 +00:00
}
2019-07-08 00:28:06 +00:00
vp.bot.Send(c, bot.Reply, vp.channel, player.Name + " is not currently in the party.", i.id)
return true
2019-07-07 01:56:26 +00:00
}
2019-07-08 01:35:31 +00:00
func (i *Interaction) handleFlail(vp *VelouremonPlugin, c bot.Connector, player *Player) bool {
return true
}
func (i *Interaction) handleAbilityUseCreature(vp *VelouremonPlugin, c bot.Connector, player *Player, src, ab, target string) bool {
var creature *Creature
for _, c := range player.Creatures {
if strings.ToLower(c.Name) == src {
creature = c
break
}
}
if creature == nil {
vp.bot.Send(c, bot.Reply, vp.channel, "Unrecognized creature source: " + src, i.id)
return true
}
var ability *Ability
for _, a := range creature.Abilities {
if strings.ToLower(a.Name) == ab {
ability = a
break
}
}
if ability == nil {
vp.bot.Send(c, bot.Reply, vp.channel, "Unrecognized creature ability: " + ab, i.id)
return true
}
var targetCreature *Creature
for _, c := range i.creatures {
if strings.ToLower(c.Name) == target {
targetCreature = c
break
}
}
var targetPlayer *Player
for _, p := range i.players {
if strings.ToLower(p.Name) == target {
targetPlayer = p
break
}
}
if targetCreature == nil && targetPlayer == nil {
vp.bot.Send(c, bot.Reply, vp.channel, "Unrecognized creature/player target: " + target, i.id)
return true
}
if targetCreature != nil {
vp.bot.Send(c, bot.Reply, vp.channel, fmt.Sprintf("%s's %s used %s on %s", player.Name, creature.Name, ability.Name, targetCreature.Name), i.id)
status := ability.applyCreature(creature, targetCreature)
vp.bot.Send(c, bot.Reply, vp.channel, status, i.id)
} else {
vp.bot.Send(c, bot.Reply, vp.channel, fmt.Sprintf("%s's %s used %s on %s", player.Name, creature.Name, ability.Name, targetPlayer.Name), i.id)
status := ability.applyPlayer(creature, targetPlayer)
vp.bot.Send(c, bot.Reply, vp.channel, status, i.id)
}
return true
}
func (i *Interaction) handleAbilityUsePlayer(vp *VelouremonPlugin, c bot.Connector, player *Player, src, ab, tPlayer, target string) bool {
var creature *Creature
for _, c := range player.Creatures {
if strings.ToLower(c.Name) == src {
creature = c
break
}
}
if creature == nil {
vp.bot.Send(c, bot.Reply, vp.channel, "Unrecognized creature source: " + src, i.id)
return true
}
var ability *Ability
for _, a := range creature.Abilities {
if strings.ToLower(a.Name) == ab {
ability = a
break
}
}
if ability == nil {
vp.bot.Send(c, bot.Reply, vp.channel, "Unrecognized creature ability: " + ab, i.id)
return true
}
var targetPlayer *Player
for _, p := range i.players {
if strings.ToLower(p.Name) == tPlayer {
targetPlayer = p
break
}
}
if targetPlayer == nil {
vp.bot.Send(c, bot.Reply, vp.channel, "Unrecognized player target: " + tPlayer, i.id)
return true
}
var targetCreature *Creature
for _, c := range targetPlayer.Creatures {
if strings.ToLower(c.Name) == target {
targetCreature = c
break
}
}
if targetCreature == nil {
vp.bot.Send(c, bot.Reply, vp.channel, "Unrecognized creature target: " + target, i.id)
return true
}
vp.bot.Send(c, bot.Reply, vp.channel, fmt.Sprintf("%s's %s used %s on %s's %s", player.Name, creature.Name, ability.Name, targetPlayer.Name, targetCreature.Name), i.id)
status := ability.applyCreature(creature, targetCreature)
vp.bot.Send(c, bot.Reply, vp.channel, status, i.id)
return true
}