default bot for unaddressed questions
This commit is contained in:
parent
bfcba9a464
commit
fbc6aef783
46
bot/bot.go
46
bot/bot.go
|
@ -1,8 +1,8 @@
|
||||||
package bot
|
package bot
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/sashabaranov/go-openai"
|
"github.com/sashabaranov/go-openai"
|
||||||
"golang.org/x/exp/slog"
|
"golang.org/x/exp/slog"
|
||||||
|
@ -13,6 +13,30 @@ import (
|
||||||
"maunium.net/go/mautrix/id"
|
"maunium.net/go/mautrix/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
botNames = []string{}
|
||||||
|
mu = &sync.Mutex{}
|
||||||
|
)
|
||||||
|
|
||||||
|
func BotNameAppend(name string) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
|
botNames = append(botNames, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func BotNameRegistered(want string) bool {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
for _, got := range botNames {
|
||||||
|
if strings.ToLower(want) == strings.ToLower(got) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
type ConfigOpenAI struct {
|
type ConfigOpenAI struct {
|
||||||
APIKey string
|
APIKey string
|
||||||
}
|
}
|
||||||
|
@ -26,6 +50,7 @@ type ConfigBot struct {
|
||||||
UserPassword string
|
UserPassword string
|
||||||
UserDisplayName string
|
UserDisplayName string
|
||||||
SystemPrompt string
|
SystemPrompt string
|
||||||
|
AnswerUnaddressed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
@ -78,6 +103,9 @@ func (m *Bot) Init() error {
|
||||||
m.AddEventHandler(m.InviteHandler())
|
m.AddEventHandler(m.InviteHandler())
|
||||||
m.AddEventHandler(m.ResponseHandler())
|
m.AddEventHandler(m.ResponseHandler())
|
||||||
|
|
||||||
|
m.config.UserDisplayName = strings.ToLower(m.config.UserDisplayName)
|
||||||
|
BotNameAppend(m.config.UserDisplayName)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,13 +184,25 @@ func (m *Bot) ResponseHandler() (event.Type, mautrix.EventHandler) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// find out if message is a new question addressed to the bot
|
|
||||||
m.logger.Info(content.Body)
|
m.logger.Info(content.Body)
|
||||||
if conv == nil && strings.HasPrefix(strings.ToLower(content.Body), strings.ToLower(fmt.Sprintf("%s: ", m.config.UserDisplayName))) {
|
addressedTo, _, isAddressed := strings.Cut(content.Body, ": ")
|
||||||
|
addressedTo = strings.TrimSpace(strings.ToLower(addressedTo))
|
||||||
|
if strings.Contains(addressedTo, " ") {
|
||||||
|
isAddressed = false // only display names without spaces, otherwise no way to know if it's a name or not
|
||||||
|
}
|
||||||
|
|
||||||
|
// find out if message is a new question addressed to the bot
|
||||||
|
if conv == nil && isAddressed && addressedTo == m.config.UserDisplayName {
|
||||||
m.logger.Info("message is addressed to bot", slog.String("event_id", eventID.String()))
|
m.logger.Info("message is addressed to bot", slog.String("event_id", eventID.String()))
|
||||||
conv = NewConversation(eventID, m.config.SystemPrompt, content.Body)
|
conv = NewConversation(eventID, m.config.SystemPrompt, content.Body)
|
||||||
m.conversations = append(m.conversations, conv)
|
m.conversations = append(m.conversations, conv)
|
||||||
}
|
}
|
||||||
|
// find out if the message is addressed to no-one and this bot answers those
|
||||||
|
if conv == nil && !isAddressed && m.config.AnswerUnaddressed {
|
||||||
|
m.logger.Info("message is addressed to no-one", slog.String("event_id", eventID.String()))
|
||||||
|
conv = NewConversation(eventID, m.config.SystemPrompt, content.Body)
|
||||||
|
m.conversations = append(m.conversations, conv)
|
||||||
|
}
|
||||||
|
|
||||||
if conv == nil {
|
if conv == nil {
|
||||||
m.logger.Info("apparently not for us, ignoring", slog.String("event_id", eventID.String()))
|
m.logger.Info("apparently not for us, ignoring", slog.String("event_id", eventID.String()))
|
||||||
|
|
Loading…
Reference in New Issue