bot: switch plugins to matching instance

instead of string
This commit is contained in:
Chris Sexton 2019-02-05 13:58:12 -05:00
parent 82dcf410f2
commit 933e514ddd
5 changed files with 30 additions and 38 deletions

View File

@ -248,13 +248,12 @@ func (b *bot) RegisterFilter(name string, f func(string) string) {
}
// Register a callback
func (b *bot) Register(name string, kind Kind, cb Callback) {
name = strings.ToLower(name)
if _, ok := b.callbacks[name]; !ok {
b.callbacks[name] = make(map[Kind][]Callback)
func (b *bot) Register(p Plugin, kind Kind, cb Callback) {
if _, ok := b.callbacks[p]; !ok {
b.callbacks[p] = make(map[Kind][]Callback)
}
if _, ok := b.callbacks[name][kind]; !ok {
b.callbacks[name][kind] = []Callback{}
if _, ok := b.callbacks[p][kind]; !ok {
b.callbacks[p][kind] = []Callback{}
}
b.callbacks[name][kind] = append(b.callbacks[name][kind], cb)
b.callbacks[p][kind] = append(b.callbacks[p][kind], cb)
}

View File

@ -28,7 +28,7 @@ func (b *bot) Receive(kind Kind, msg msg.Message, args ...interface{}) {
}
for _, name := range b.pluginOrdering {
if b.runCallback(name, kind, msg, args) {
if b.runCallback(b.plugins[name], kind, msg, args) {
goto RET
}
}
@ -38,7 +38,7 @@ RET:
return
}
func (b *bot) runCallback(plugin string, evt Kind, message msg.Message, args ...interface{}) bool {
func (b *bot) runCallback(plugin Plugin, evt Kind, message msg.Message, args ...interface{}) bool {
for _, cb := range b.callbacks[plugin][evt] {
if cb(evt, message, args) {
return true
@ -75,10 +75,9 @@ func (b *bot) checkHelp(channel string, parts []string) {
b.listVars(channel, parts)
return
}
plugin := b.plugins[parts[1]]
if plugin != nil {
// TODO: Maybe broke
b.runCallback(parts[1], Help, msg.Message{Channel: channel}, channel, parts)
plugin, ok := b.plugins[parts[1]]
if ok {
b.runCallback(plugin, Help, msg.Message{Channel: channel}, channel, parts)
} else {
msg := fmt.Sprintf("I'm sorry, I don't know what %s is!", parts[1])
b.Send(Message, channel, msg)
@ -201,7 +200,7 @@ func (b *bot) selfSaid(channel, message string, action bool) {
}
for _, name := range b.pluginOrdering {
if b.runCallback(name, SelfMessage, msg) {
if b.runCallback(b.plugins[name], SelfMessage, msg) {
return
}
}

View File

@ -32,7 +32,7 @@ const (
type Kind int
type Callback func(Kind, msg.Message, ...interface{}) bool
type CallbackMap map[string]map[Kind][]Callback
type CallbackMap map[Plugin]map[Kind][]Callback
// Bot interface serves to allow mocking of the actual bot
type Bot interface {
@ -49,7 +49,7 @@ type Bot interface {
// First arg should be one of bot.Message/Reply/Action/etc
Receive(Kind, msg.Message, ...interface{})
// Register a callback
Register(string, Kind, Callback)
Register(Plugin, Kind, Callback)
Filter(msg.Message, string) string
LastMessage(string) (msg.Message, error)

View File

@ -31,8 +31,8 @@ func New(b bot.Bot) *AdminPlugin {
db: b.DB(),
cfg: b.Config(),
}
b.Register("admin", bot.Message, p.message)
b.Register("admin", bot.Help, p.help)
b.Register(p, bot.Message, p.message)
b.Register(p, bot.Help, p.help)
return p
}

View File

@ -52,24 +52,24 @@ type BabblerArc struct {
Frequency int64 `db:"frequency"`
}
func New(bot bot.Bot) *BabblerPlugin {
func New(b bot.Bot) *BabblerPlugin {
log.SetFlags(log.LstdFlags | log.Lshortfile)
if _, err := bot.DB().Exec(`create table if not exists babblers (
if _, err := b.DB().Exec(`create table if not exists babblers (
id integer primary key,
babbler string
);`); err != nil {
log.Fatal(err)
}
if _, err := bot.DB().Exec(`create table if not exists babblerWords (
if _, err := b.DB().Exec(`create table if not exists babblerWords (
id integer primary key,
word string
);`); err != nil {
log.Fatal(err)
}
if _, err := bot.DB().Exec(`create table if not exists babblerNodes (
if _, err := b.DB().Exec(`create table if not exists babblerNodes (
id integer primary key,
babblerId integer,
wordId integer,
@ -79,7 +79,7 @@ func New(bot bot.Bot) *BabblerPlugin {
log.Fatal(err)
}
if _, err := bot.DB().Exec(`create table if not exists babblerArcs (
if _, err := b.DB().Exec(`create table if not exists babblerArcs (
id integer primary key,
fromNodeId integer,
toNodeId interger,
@ -89,17 +89,20 @@ func New(bot bot.Bot) *BabblerPlugin {
}
plugin := &BabblerPlugin{
Bot: bot,
db: bot.DB(),
Bot: b,
db: b.DB(),
WithGoRoutines: true,
}
plugin.createNewWord("")
b.Register(plugin, bot.Message, plugin.message)
b.Register(plugin, bot.Help, plugin.help)
return plugin
}
func (p *BabblerPlugin) Message(message msg.Message) bool {
func (p *BabblerPlugin) message(kind bot.Kind, message msg.Message, args ...interface{}) bool {
lowercase := strings.ToLower(message.Body)
tokens := strings.Fields(lowercase)
numTokens := len(tokens)
@ -146,7 +149,7 @@ func (p *BabblerPlugin) Message(message msg.Message) bool {
return saidSomething
}
func (p *BabblerPlugin) Help(channel string, parts []string) {
func (p *BabblerPlugin) help(kind bot.Kind, msg msg.Message, args ...interface{}) bool {
commands := []string{
"initialize babbler for seabass",
"merge babbler drseabass into seabass",
@ -155,15 +158,8 @@ func (p *BabblerPlugin) Help(channel string, parts []string) {
"seabass says-middle-out ...",
"seabass says-bridge ... | ...",
}
p.Bot.Send(bot.Message, channel, strings.Join(commands, "\n\n"))
}
func (p *BabblerPlugin) Event(kind string, message msg.Message) bool {
return false
}
func (p *BabblerPlugin) BotMessage(message msg.Message) bool {
return false
p.Bot.Send(bot.Message, msg.Channel, strings.Join(commands, "\n\n"))
return true
}
func (p *BabblerPlugin) RegisterWeb() *string {
@ -934,5 +930,3 @@ func (p *BabblerPlugin) babbleSeedBookends(babblerName string, start, end []stri
return strings.Join(words, " "), nil
}
func (p *BabblerPlugin) ReplyMessage(message msg.Message, identifier string) bool { return false }