2023-05-12 13:59:20 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2023-06-13 19:29:54 +02:00
|
|
|
"fmt"
|
2023-05-16 20:07:05 +02:00
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
|
2023-05-17 19:51:45 +02:00
|
|
|
"ewintr.nl/matrix-bots/bot"
|
2023-06-09 14:28:32 +02:00
|
|
|
"github.com/BurntSushi/toml"
|
2023-05-15 12:28:12 +02:00
|
|
|
_ "github.com/mattn/go-sqlite3"
|
2023-05-12 13:59:20 +02:00
|
|
|
"golang.org/x/exp/slog"
|
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
2023-05-15 12:28:12 +02:00
|
|
|
logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
|
|
|
|
|
2023-06-09 14:28:32 +02:00
|
|
|
var config bot.Config
|
|
|
|
if _, err := toml.DecodeFile(getParam("CONFIG_PATH", "conf.toml"), &config); err != nil {
|
|
|
|
logger.Error(err.Error())
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
2023-06-13 19:29:54 +02:00
|
|
|
type Credentials struct {
|
|
|
|
Password string
|
|
|
|
AccessKey string
|
|
|
|
}
|
|
|
|
credentials := make(map[string]Credentials)
|
|
|
|
for i := 0; i < len(config.Bots); i++ {
|
|
|
|
user := getParam(fmt.Sprintf("MATRIX_BOT%d_ID", i), "")
|
|
|
|
if user == "" {
|
|
|
|
logger.Error("missing user id", slog.Int("user", i))
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
credentials[user] = Credentials{
|
|
|
|
Password: getParam(fmt.Sprintf("MATRIX_BOT%d_PASSWORD", i), ""),
|
|
|
|
AccessKey: getParam(fmt.Sprintf("MATRIX_BOT%d_ACCESSKEY", i), ""),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for i, bc := range config.Bots {
|
|
|
|
creds, ok := credentials[bc.UserID]
|
|
|
|
if !ok {
|
|
|
|
logger.Error("missing credentials", slog.Int("user", i))
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
config.Bots[i].UserPassword = creds.Password
|
|
|
|
config.Bots[i].UserAccessKey = creds.AccessKey
|
|
|
|
}
|
|
|
|
|
|
|
|
config.OpenAI = bot.ConfigOpenAI{
|
|
|
|
APIKey: getParam("OPENAI_API_KEY", ""),
|
|
|
|
}
|
2023-06-14 15:19:24 +02:00
|
|
|
|
|
|
|
var acceptInvites bool
|
|
|
|
if getParam("MATRIX_ACCEPT_INVITES", "false") == "true" {
|
|
|
|
acceptInvites = true
|
|
|
|
}
|
|
|
|
|
2023-06-09 14:28:32 +02:00
|
|
|
logger.Info("loaded config", slog.Int("bots", len(config.Bots)))
|
|
|
|
|
|
|
|
for _, bc := range config.Bots {
|
|
|
|
b := bot.New(config.OpenAI.APIKey, bc, logger)
|
2023-06-14 15:19:24 +02:00
|
|
|
if err := b.Init(acceptInvites); err != nil {
|
2023-06-08 19:18:38 +02:00
|
|
|
logger.Error(err.Error())
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
go b.Run()
|
2023-06-09 14:28:32 +02:00
|
|
|
logger.Info("started bot", slog.String("name", bc.UserDisplayName))
|
2023-05-15 12:28:12 +02:00
|
|
|
}
|
2023-05-12 15:07:16 +02:00
|
|
|
|
|
|
|
done := make(chan os.Signal)
|
|
|
|
signal.Notify(done, os.Interrupt)
|
|
|
|
<-done
|
|
|
|
|
2023-06-09 14:28:32 +02:00
|
|
|
logger.Info("service stopped")
|
2023-05-16 20:07:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func getParam(name, def string) string {
|
|
|
|
val, ok := os.LookupEnv(name)
|
|
|
|
if !ok {
|
|
|
|
return def
|
2023-05-15 12:28:12 +02:00
|
|
|
}
|
2023-05-16 20:07:05 +02:00
|
|
|
return val
|
2023-05-12 13:59:20 +02:00
|
|
|
}
|