BareRTC/client/rivescript_macros.go

161 lines
4.2 KiB
Go

package client
import (
"fmt"
"strconv"
"strings"
"time"
"git.kirsle.net/apps/barertc/pkg/log"
"git.kirsle.net/apps/barertc/pkg/messages"
"github.com/aichaos/rivescript-go"
"github.com/aichaos/rivescript-go/lang/javascript"
)
// Set up object macros for RiveScript.
func (h *BotHandlers) setObjectMacros() {
// Reload the bot's RiveScript brain.
h.rs.SetSubroutine("reload", func(rs *rivescript.RiveScript, args []string) string {
var bot = rivescript.New(&rivescript.Config{
UTF8: true,
Debug: rs.Debug,
})
bot.SetHandler("javascript", javascript.New(bot))
if err := bot.LoadDirectory("brain"); err != nil {
return fmt.Sprintf("Error on LoadDirectory: %s", err)
}
if err := bot.SortReplies(); err != nil {
return fmt.Sprintf("Error on SortReplies: %s", err)
}
// Install the new bot and set object macros on it.
h.rs = bot
h.setObjectMacros()
return "The RiveScript brain has been reloaded!"
})
// React to a message.
h.rs.SetSubroutine("react", func(rs *rivescript.RiveScript, args []string) string {
if len(args) >= 2 {
if msgID, err := strconv.Atoi(args[0]); err == nil {
// With a small delay.
go func() {
time.Sleep(2500 * time.Millisecond)
h.client.Send(messages.Message{
Action: messages.ActionReact,
MessageID: int64(msgID),
Message: args[1],
})
}()
} else {
return fmt.Sprintf("[react: %s]", err)
}
return ""
}
return "[react: invalid number of parameters]"
})
// Mark a camera NSFW for a username.
h.rs.SetSubroutine("nsfw", func(rs *rivescript.RiveScript, args []string) string {
if len(args) >= 1 {
var username = strings.TrimPrefix(args[0], "@")
h.client.Send(messages.Message{
Action: messages.ActionMessage,
Message: fmt.Sprintf("/nsfw %s", username),
})
return ""
}
return "[nsfw: invalid number of parameters]"
})
// Takeback a message (admin action especially)
h.rs.SetSubroutine("takeback", func(rs *rivescript.RiveScript, args []string) string {
if len(args) >= 1 {
if msgID, err := strconv.Atoi(args[0]); err == nil {
// Take it back.
h.client.Send(messages.Message{
Action: messages.ActionTakeback,
MessageID: int64(msgID),
})
} else {
return fmt.Sprintf("[takeback: %s]", err)
}
return ""
}
return "[takeback: invalid number of parameters]"
})
// Flag (report) a message on chat.
h.rs.SetSubroutine("report", func(rs *rivescript.RiveScript, args []string) string {
if len(args) >= 2 {
if msgID, err := strconv.Atoi(args[0]); err == nil {
var comment = strings.Join(args[1:], " ")
// Look up this message.
if msg, ok := h.getMessageByID(int64(msgID)); ok {
// Report it with the custom comment.
h.client.Send(messages.Message{
Action: messages.ActionReport,
Channel: msg.Channel,
Username: msg.Username,
Timestamp: "not recorded",
Reason: "Automated chatbot flag",
Message: msg.Message,
Comment: comment,
})
return ""
}
return "[msgID not found]"
} else {
return fmt.Sprintf("[report: %s]", err)
}
}
return "[report: invalid number of parameters]"
})
// Send a user a Direct Message.
h.rs.SetSubroutine("dm", func(rs *rivescript.RiveScript, args []string) string {
if len(args) >= 2 {
var (
username = args[0]
message = strings.Join(args[1:], " ")
)
// Slide into their DMs.
log.Error("Send DM to [%s]: %s", username, message)
h.client.Send(messages.Message{
Action: messages.ActionMessage,
Channel: "@" + username,
Message: message,
})
} else {
return "[dm: invalid number of parameters]"
}
return ""
})
// Send a public chat message to a channel name.
h.rs.SetSubroutine("send-message", func(rs *rivescript.RiveScript, args []string) string {
if len(args) >= 2 {
var (
channel = args[0]
message = strings.Join(args[1:], " ")
)
// Slide into their DMs.
log.Error("Send chat to [%s]: %s", channel, message)
h.client.Send(messages.Message{
Action: messages.ActionMessage,
Channel: channel,
Message: message,
})
} else {
return "[send-message: invalid number of parameters]"
}
return ""
})
}