mirror of https://github.com/velour/catbase.git
talker: add cowsay
This commit is contained in:
parent
f818acc55c
commit
eea4703129
|
@ -4,10 +4,14 @@ package talker
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/velour/catbase/bot"
|
"github.com/velour/catbase/bot"
|
||||||
"github.com/velour/catbase/bot/msg"
|
"github.com/velour/catbase/bot/msg"
|
||||||
|
"github.com/velour/catbase/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
var goatse []string = []string{
|
var goatse []string = []string{
|
||||||
|
@ -40,12 +44,14 @@ var goatse []string = []string{
|
||||||
|
|
||||||
type TalkerPlugin struct {
|
type TalkerPlugin struct {
|
||||||
Bot bot.Bot
|
Bot bot.Bot
|
||||||
|
config *config.Config
|
||||||
sayings []string
|
sayings []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(b bot.Bot) *TalkerPlugin {
|
func New(b bot.Bot) *TalkerPlugin {
|
||||||
tp := &TalkerPlugin{
|
tp := &TalkerPlugin{
|
||||||
Bot: b,
|
Bot: b,
|
||||||
|
config: b.Config(),
|
||||||
}
|
}
|
||||||
b.Register(tp, bot.Message, tp.message)
|
b.Register(tp, bot.Message, tp.message)
|
||||||
b.Register(tp, bot.Help, tp.help)
|
b.Register(tp, bot.Help, tp.help)
|
||||||
|
@ -57,6 +63,17 @@ func (p *TalkerPlugin) message(kind bot.Kind, message msg.Message, args ...inter
|
||||||
body := message.Body
|
body := message.Body
|
||||||
lowermessage := strings.ToLower(body)
|
lowermessage := strings.ToLower(body)
|
||||||
|
|
||||||
|
if message.Command && strings.HasPrefix(lowermessage, "cowsay") {
|
||||||
|
return p.cowSay(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
if message.Command && strings.HasPrefix(lowermessage, "list cows") {
|
||||||
|
cows := p.allCows()
|
||||||
|
m := fmt.Sprintf("Cows: %s", strings.Join(cows, ", "))
|
||||||
|
p.Bot.Send(bot.Message, channel, m)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: This ought to be space split afterwards to remove any punctuation
|
// TODO: This ought to be space split afterwards to remove any punctuation
|
||||||
if message.Command && strings.HasPrefix(lowermessage, "say") {
|
if message.Command && strings.HasPrefix(lowermessage, "say") {
|
||||||
msg := strings.TrimSpace(body[3:])
|
msg := strings.TrimSpace(body[3:])
|
||||||
|
@ -87,3 +104,69 @@ func (p *TalkerPlugin) help(kind bot.Kind, message msg.Message, args ...interfac
|
||||||
p.Bot.Send(bot.Message, message.Channel, "Hi, this is talker. I like to talk about FredFelps!")
|
p.Bot.Send(bot.Message, message.Channel, "Hi, this is talker. I like to talk about FredFelps!")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *TalkerPlugin) cowSay(message msg.Message) bool {
|
||||||
|
fields := strings.Split(message.Body, " ")
|
||||||
|
text := strings.Join(fields[1:], " ")
|
||||||
|
cow := "default"
|
||||||
|
if len(fields) > 1 && p.hasCow(fields[1]) {
|
||||||
|
cow = fields[1]
|
||||||
|
text = strings.Join(fields[2:], " ")
|
||||||
|
}
|
||||||
|
cmd := exec.Command("cowsay", "-f", cow, text)
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if p.checkErr(err, message.Channel) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.checkErr(cmd.Start(), message.Channel) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
output, err := ioutil.ReadAll(stdout)
|
||||||
|
if p.checkErr(err, message.Channel) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
p.Bot.Send(bot.Message, message.Channel, fmt.Sprintf("```%s```", output))
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *TalkerPlugin) checkErr(err error, ch string) bool {
|
||||||
|
if err != nil {
|
||||||
|
p.Bot.Send(bot.Message, ch, "Error running cowsay: %s", err)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *TalkerPlugin) hasCow(cow string) bool {
|
||||||
|
cows := p.allCows()
|
||||||
|
for _, c := range cows {
|
||||||
|
if strings.ToLower(cow) == c {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *TalkerPlugin) allCows() []string {
|
||||||
|
f, err := os.Open(p.config.Get("talker.cowpath", "/usr/local/share/cows"))
|
||||||
|
if err != nil {
|
||||||
|
return []string{"default"}
|
||||||
|
}
|
||||||
|
|
||||||
|
files, err := f.Readdir(0)
|
||||||
|
if err != nil {
|
||||||
|
return []string{"default"}
|
||||||
|
}
|
||||||
|
|
||||||
|
cows := []string{}
|
||||||
|
for _, f := range files {
|
||||||
|
if strings.HasSuffix(f.Name(), ".cow") {
|
||||||
|
cows = append(cows, strings.TrimSuffix(f.Name(), ".cow"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cows
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue