mirror of https://github.com/velour/catbase.git
talklikeapirate: add controls
This commit is contained in:
parent
624258a794
commit
c20df2d659
|
@ -179,6 +179,10 @@ func (c *Config) Set(key, value string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Config) SetBool(key string, value bool) error {
|
||||||
|
return c.Set(key, fmt.Sprintf("%v", value))
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Config) RefreshSecrets() error {
|
func (c *Config) RefreshSecrets() error {
|
||||||
q := `select key, value from secrets`
|
q := `select key, value from secrets`
|
||||||
var secrets []Secret
|
var secrets []Secret
|
||||||
|
|
|
@ -35,7 +35,7 @@ type Discord struct {
|
||||||
|
|
||||||
guildID string
|
guildID string
|
||||||
|
|
||||||
Pirate *talklikeapirate.TalkLikeAPiratePlugin
|
Pirate *talklikeapirate.TalkLikeAPirateFilter
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(config *config.Config) *Discord {
|
func New(config *config.Config) *Discord {
|
||||||
|
|
2
main.go
2
main.go
|
@ -73,7 +73,7 @@ func main() {
|
||||||
client = slackapp.New(c)
|
client = slackapp.New(c)
|
||||||
case "discord":
|
case "discord":
|
||||||
d := discord.New(c)
|
d := discord.New(c)
|
||||||
d.Pirate = talklikeapirate.New(c)
|
d.Pirate = talklikeapirate.NewFilter(c)
|
||||||
client = d
|
client = d
|
||||||
default:
|
default:
|
||||||
log.Fatal().Msgf("Unknown connection type: %s", c.Get("type", "UNSET"))
|
log.Fatal().Msgf("Unknown connection type: %s", c.Get("type", "UNSET"))
|
||||||
|
|
|
@ -45,6 +45,7 @@ import (
|
||||||
"github.com/velour/catbase/plugins/sms"
|
"github.com/velour/catbase/plugins/sms"
|
||||||
"github.com/velour/catbase/plugins/stock"
|
"github.com/velour/catbase/plugins/stock"
|
||||||
"github.com/velour/catbase/plugins/talker"
|
"github.com/velour/catbase/plugins/talker"
|
||||||
|
"github.com/velour/catbase/plugins/talklikeapirate"
|
||||||
"github.com/velour/catbase/plugins/tappd"
|
"github.com/velour/catbase/plugins/tappd"
|
||||||
"github.com/velour/catbase/plugins/tell"
|
"github.com/velour/catbase/plugins/tell"
|
||||||
"github.com/velour/catbase/plugins/tldr"
|
"github.com/velour/catbase/plugins/tldr"
|
||||||
|
@ -102,6 +103,7 @@ func Register(b bot.Bot) {
|
||||||
b.AddPlugin(talker.New(b))
|
b.AddPlugin(talker.New(b))
|
||||||
b.AddPlugin(fact.New(b))
|
b.AddPlugin(fact.New(b))
|
||||||
b.AddPlugin(llm.New(b))
|
b.AddPlugin(llm.New(b))
|
||||||
|
b.AddPlugin(talklikeapirate.New(b))
|
||||||
// catches anything left, will always return true
|
// catches anything left, will always return true
|
||||||
b.AddPlugin(deadend.New(b))
|
b.AddPlugin(deadend.New(b))
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,9 @@ import (
|
||||||
"google.golang.org/api/option"
|
"google.golang.org/api/option"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TalkLikeAPiratePlugin reimplements the send function
|
// TalkLikeAPirateFilter reimplements the send function
|
||||||
// with an AI intermediate.
|
// with an AI intermediate.
|
||||||
type TalkLikeAPiratePlugin struct {
|
type TalkLikeAPirateFilter struct {
|
||||||
client *genai.Client
|
client *genai.Client
|
||||||
prompt string
|
prompt string
|
||||||
|
|
||||||
|
@ -21,15 +21,15 @@ type TalkLikeAPiratePlugin struct {
|
||||||
c *config.Config
|
c *config.Config
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(c *config.Config) *TalkLikeAPiratePlugin {
|
func NewFilter(c *config.Config) *TalkLikeAPirateFilter {
|
||||||
p := &TalkLikeAPiratePlugin{
|
p := &TalkLikeAPirateFilter{
|
||||||
c: c,
|
c: c,
|
||||||
}
|
}
|
||||||
|
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *TalkLikeAPiratePlugin) Filter(input string) (string, error) {
|
func (p *TalkLikeAPirateFilter) Filter(input string) (string, error) {
|
||||||
if !p.c.GetBool("talklikeapirate.enabled", false) {
|
if !p.c.GetBool("talklikeapirate.enabled", false) {
|
||||||
return input, nil
|
return input, nil
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ func (p *TalkLikeAPiratePlugin) Filter(input string) (string, error) {
|
||||||
return completion, nil
|
return completion, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *TalkLikeAPiratePlugin) GetModel() (*genai.GenerativeModel, error) {
|
func (p *TalkLikeAPirateFilter) GetModel() (*genai.GenerativeModel, error) {
|
||||||
model := p.client.GenerativeModel(p.c.Get("gemini.model", "gemini-1.5-flash"))
|
model := p.client.GenerativeModel(p.c.Get("gemini.model", "gemini-1.5-flash"))
|
||||||
model.SetMaxOutputTokens(int32(p.c.GetInt("gemini.maxtokens", 100)))
|
model.SetMaxOutputTokens(int32(p.c.GetInt("gemini.maxtokens", 100)))
|
||||||
model.SetTopP(float32(p.c.GetFloat64("gemini.topp", 0.95)))
|
model.SetTopP(float32(p.c.GetFloat64("gemini.topp", 0.95)))
|
||||||
|
@ -94,7 +94,7 @@ func (p *TalkLikeAPiratePlugin) GetModel() (*genai.GenerativeModel, error) {
|
||||||
return model, nil
|
return model, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *TalkLikeAPiratePlugin) getClient() (*genai.Client, error) {
|
func (p *TalkLikeAPirateFilter) getClient() (*genai.Client, error) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
key := p.c.Get("GEMINI_API_KEY", "")
|
key := p.c.Get("GEMINI_API_KEY", "")
|
||||||
if key == "" {
|
if key == "" {
|
|
@ -0,0 +1,84 @@
|
||||||
|
package talklikeapirate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/velour/catbase/bot"
|
||||||
|
"github.com/velour/catbase/config"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TalkLikeAPiratePlugin allows admin of the filter
|
||||||
|
type TalkLikeAPiratePlugin struct {
|
||||||
|
b bot.Bot
|
||||||
|
c *config.Config
|
||||||
|
handlers bot.HandlerTable
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(b bot.Bot) *TalkLikeAPiratePlugin {
|
||||||
|
p := &TalkLikeAPiratePlugin{
|
||||||
|
b: b,
|
||||||
|
c: b.Config(),
|
||||||
|
}
|
||||||
|
|
||||||
|
p.register()
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *TalkLikeAPiratePlugin) register() {
|
||||||
|
p.handlers = bot.HandlerTable{
|
||||||
|
{
|
||||||
|
Kind: bot.Message, IsCmd: true,
|
||||||
|
Regex: regexp.MustCompile(`^enable pirate$`),
|
||||||
|
HelpText: "Enable message filter",
|
||||||
|
Handler: p.setEnabled(true),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Kind: bot.Message, IsCmd: true,
|
||||||
|
Regex: regexp.MustCompile(`^disable pirate$`),
|
||||||
|
HelpText: "Disable message filter",
|
||||||
|
Handler: p.setEnabled(false),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Kind: bot.Message, IsCmd: true,
|
||||||
|
Regex: regexp.MustCompile(`^pirate-prompt:? (?P<text>.*)$`),
|
||||||
|
HelpText: "Set message filter prompt",
|
||||||
|
Handler: p.setPrompt,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Kind: bot.Help, IsCmd: false,
|
||||||
|
Regex: regexp.MustCompile(`.*`),
|
||||||
|
Handler: p.help,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
p.b.RegisterTable(p, p.handlers)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *TalkLikeAPiratePlugin) setEnabled(isEnabled bool) bot.ResponseHandler {
|
||||||
|
return func(r bot.Request) bool {
|
||||||
|
p.c.SetBool("talklikeapirate.enabled", isEnabled)
|
||||||
|
p.b.Send(r.Conn, bot.Message, r.Msg.Channel, fmt.Sprintf("I just set the message filter status to: %v", isEnabled))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *TalkLikeAPiratePlugin) setPrompt(r bot.Request) bool {
|
||||||
|
prompt := r.Values["text"]
|
||||||
|
p.c.Set("talklikeapirate.systemprompt", prompt)
|
||||||
|
p.b.Send(r.Conn, bot.Message, r.Msg.Channel, fmt.Sprintf("I set the message filter prompt to: %s", prompt))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *TalkLikeAPiratePlugin) help(r bot.Request) bool {
|
||||||
|
out := "Talk like a pirate commands:\n"
|
||||||
|
for _, h := range p.handlers {
|
||||||
|
if h.HelpText == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out += fmt.Sprintf("```%s```\t%s", h.Regex.String(), h.HelpText)
|
||||||
|
}
|
||||||
|
out = strings.TrimSpace(out)
|
||||||
|
p.b.Send(r.Conn, bot.Message, r.Msg.Channel, out)
|
||||||
|
return true
|
||||||
|
}
|
Loading…
Reference in New Issue