mirror of https://github.com/velour/catbase.git
fact: add reaction type facts
If a user creates a fact with the verb <react>, catbase will try to react with the emojy that the user specifies. It filters things with spaces and fixes colons, but does not check if the emojy actually exists. There will be no feedback in this case, which should probably get fixed but meh. * Updated mock bot to check reactions, and do filtering correctly. * Added a couple tests of the react functionality.
This commit is contained in:
parent
0d730ee08a
commit
3a7651d184
|
@ -23,6 +23,7 @@ type MockBot struct {
|
||||||
|
|
||||||
Messages []string
|
Messages []string
|
||||||
Actions []string
|
Actions []string
|
||||||
|
Reactions []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mb *MockBot) Config() *config.Config { return &mb.Cfg }
|
func (mb *MockBot) Config() *config.Config { return &mb.Cfg }
|
||||||
|
@ -47,11 +48,14 @@ func (mb *MockBot) ReplyToMessage(channel, message string, replyTo msg.Message)
|
||||||
}
|
}
|
||||||
func (mb *MockBot) MsgReceived(msg msg.Message) {}
|
func (mb *MockBot) MsgReceived(msg msg.Message) {}
|
||||||
func (mb *MockBot) EventReceived(msg msg.Message) {}
|
func (mb *MockBot) EventReceived(msg msg.Message) {}
|
||||||
func (mb *MockBot) Filter(msg msg.Message, s string) string { return "" }
|
func (mb *MockBot) Filter(msg msg.Message, s string) string { return s }
|
||||||
func (mb *MockBot) LastMessage(ch string) (msg.Message, error) { return msg.Message{}, nil }
|
func (mb *MockBot) LastMessage(ch string) (msg.Message, error) { return msg.Message{}, nil }
|
||||||
func (mb *MockBot) CheckAdmin(nick string) bool { return false }
|
func (mb *MockBot) CheckAdmin(nick string) bool { return false }
|
||||||
|
|
||||||
func (mb *MockBot) React(channel, reaction string, message msg.Message) bool { return false }
|
func (mb *MockBot) React(channel, reaction string, message msg.Message) bool {
|
||||||
|
mb.Reactions = append(mb.Reactions, reaction)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (mb *MockBot) Edit(channel, newMessage, identifier string) bool {
|
func (mb *MockBot) Edit(channel, newMessage, identifier string) bool {
|
||||||
isMessage := identifier[0] == 'm'
|
isMessage := identifier[0] == 'm'
|
||||||
|
|
|
@ -338,8 +338,16 @@ func findAction(message string) string {
|
||||||
|
|
||||||
// learnFact assumes we have a learning situation and inserts a new fact
|
// learnFact assumes we have a learning situation and inserts a new fact
|
||||||
// into the database
|
// into the database
|
||||||
func (p *Factoid) learnFact(message msg.Message, fact, verb, tidbit string) bool {
|
func (p *Factoid) learnFact(message msg.Message, fact, verb, tidbit string) error {
|
||||||
verb = strings.ToLower(verb)
|
verb = strings.ToLower(verb)
|
||||||
|
if verb == "react" {
|
||||||
|
// This would be a great place to check against the API for valid emojy
|
||||||
|
// I'm too lazy for that
|
||||||
|
tidbit = strings.Replace(tidbit, ":", "", -1)
|
||||||
|
if len(strings.Split(tidbit, " ")) > 1 {
|
||||||
|
return fmt.Errorf("That's not a valid emojy.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var count sql.NullInt64
|
var count sql.NullInt64
|
||||||
err := p.db.QueryRow(`select count(*) from factoid
|
err := p.db.QueryRow(`select count(*) from factoid
|
||||||
|
@ -347,10 +355,10 @@ func (p *Factoid) learnFact(message msg.Message, fact, verb, tidbit string) bool
|
||||||
fact, verb, tidbit).Scan(&count)
|
fact, verb, tidbit).Scan(&count)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Error counting facts: ", err)
|
log.Println("Error counting facts: ", err)
|
||||||
return false
|
return fmt.Errorf("What?")
|
||||||
} else if count.Valid && count.Int64 != 0 {
|
} else if count.Valid && count.Int64 != 0 {
|
||||||
log.Println("User tried to relearn a fact.")
|
log.Println("User tried to relearn a fact.")
|
||||||
return false
|
return fmt.Errorf("Look, I already know that.")
|
||||||
}
|
}
|
||||||
|
|
||||||
n := factoid{
|
n := factoid{
|
||||||
|
@ -366,10 +374,10 @@ func (p *Factoid) learnFact(message msg.Message, fact, verb, tidbit string) bool
|
||||||
err = n.save(p.db)
|
err = n.save(p.db)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Error inserting fact: ", err)
|
log.Println("Error inserting fact: ", err)
|
||||||
return false
|
return fmt.Errorf("My brain is overheating.")
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// findTrigger checks to see if a given string is a trigger or not
|
// findTrigger checks to see if a given string is a trigger or not
|
||||||
|
@ -398,6 +406,8 @@ func (p *Factoid) sayFact(message msg.Message, fact factoid) {
|
||||||
|
|
||||||
if fact.Verb == "action" {
|
if fact.Verb == "action" {
|
||||||
p.Bot.SendAction(message.Channel, msg)
|
p.Bot.SendAction(message.Channel, msg)
|
||||||
|
} else if fact.Verb == "react" {
|
||||||
|
p.Bot.React(message.Channel, msg, message)
|
||||||
} else if fact.Verb == "reply" {
|
} else if fact.Verb == "reply" {
|
||||||
p.Bot.SendMessage(message.Channel, msg)
|
p.Bot.SendMessage(message.Channel, msg)
|
||||||
} else {
|
} else {
|
||||||
|
@ -476,10 +486,10 @@ func (p *Factoid) learnAction(message msg.Message, action string) bool {
|
||||||
|
|
||||||
strippedaction := strings.Replace(strings.Replace(action, "<", "", 1), ">", "", 1)
|
strippedaction := strings.Replace(strings.Replace(action, "<", "", 1), ">", "", 1)
|
||||||
|
|
||||||
if p.learnFact(message, trigger, strippedaction, fact) {
|
if err := p.learnFact(message, trigger, strippedaction, fact); err != nil {
|
||||||
p.Bot.SendMessage(message.Channel, fmt.Sprintf("Okay, %s.", message.User.Name))
|
p.Bot.SendMessage(message.Channel, err.Error())
|
||||||
} else {
|
} else {
|
||||||
p.Bot.SendMessage(message.Channel, "I already know that.")
|
p.Bot.SendMessage(message.Channel, fmt.Sprintf("Okay, %s.", message.User.Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -50,3 +50,30 @@ func TestCornerCaseBug(t *testing.T) {
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Contains(t, q.Tidbit, "horse dick")
|
assert.Contains(t, q.Tidbit, "horse dick")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReact(t *testing.T) {
|
||||||
|
msgs := []msg.Message{
|
||||||
|
makeMessage("user1", "!testing123 <react> jesus"),
|
||||||
|
makeMessage("user2", "testing123"),
|
||||||
|
}
|
||||||
|
_, p, mb := makePlugin(t)
|
||||||
|
|
||||||
|
for _, m := range msgs {
|
||||||
|
p.Message(m)
|
||||||
|
}
|
||||||
|
assert.Len(t, mb.Reactions, 1)
|
||||||
|
assert.Contains(t, mb.Reactions[0], "jesus")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReactCantLearnSpaces(t *testing.T) {
|
||||||
|
msgs := []msg.Message{
|
||||||
|
makeMessage("user1", "!test <react> jesus christ"),
|
||||||
|
}
|
||||||
|
_, p, mb := makePlugin(t)
|
||||||
|
|
||||||
|
for _, m := range msgs {
|
||||||
|
p.Message(m)
|
||||||
|
}
|
||||||
|
assert.Len(t, mb.Messages, 1)
|
||||||
|
assert.Contains(t, mb.Messages[0], "not a valid")
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue