gomatrix example

This commit is contained in:
Erik Winter 2023-05-12 13:59:20 +02:00
parent 0021a0b55e
commit 363d72c560
3 changed files with 107 additions and 0 deletions

10
go.mod Normal file
View File

@ -0,0 +1,10 @@
module ewintr.nl/matrix-bots
go 1.20
require (
github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530
github.com/russross/blackfriday/v2 v2.1.0
github.com/sashabaranov/go-openai v1.9.4
golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea
)

8
go.sum Normal file
View File

@ -0,0 +1,8 @@
github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530 h1:kHKxCOLcHH8r4Fzarl4+Y3K5hjothkVW5z7T1dUM11U=
github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530/go.mod h1:/gBX06Kw0exX1HrwmoBibFA98yBk/jxKpGVeyQbff+s=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sashabaranov/go-openai v1.9.4 h1:KanoCEoowAI45jVXlenMCckutSRr39qOmSi9MyPBfZM=
github.com/sashabaranov/go-openai v1.9.4/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4=
golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=

89
main.go Normal file
View File

@ -0,0 +1,89 @@
package main
import (
"context"
"fmt"
"github.com/matrix-org/gomatrix"
"github.com/russross/blackfriday/v2"
"github.com/sashabaranov/go-openai"
"golang.org/x/exp/slog"
"os"
)
func main() {
MatrixHomeserver, ok := os.LookupEnv("MATRIX_HOMESERVER")
if !ok {
slog.Error("MATRIX_HOME_SERVER is not set")
os.Exit(1)
}
MatrixUserID, ok := os.LookupEnv("MATRIX_USER_ID")
if !ok {
slog.Error("MATRIX_USER_ID is not set")
os.Exit(1)
}
MatrixAccessKey, ok := os.LookupEnv("MATRIX_ACCESS_KEY")
if !ok {
slog.Error("MATRIX_ACCESS_KEY is not set")
os.Exit(1)
}
OpenaiAPIKey, ok := os.LookupEnv("OPENAI_API_KEY")
if !ok {
slog.Error("OPENAI_API_KEY is not set")
os.Exit(1)
}
// Create new OpenAI client
openaiClient := openai.NewClient(OpenaiAPIKey)
matrixClient, _ := gomatrix.NewClient(MatrixHomeserver, MatrixUserID, MatrixAccessKey)
syncer := matrixClient.Syncer.(*gomatrix.DefaultSyncer)
syncer.OnEventType("m.room.member", func(ev *gomatrix.Event) {
if ev.Content["membership"] == "invite" && *ev.StateKey == MatrixUserID {
_, err := matrixClient.JoinRoom(ev.RoomID, "", nil)
if err != nil {
fmt.Println("Failed to join room:", err)
}
}
})
syncer.OnEventType("m.room.message", func(ev *gomatrix.Event) {
if ev.Sender != MatrixUserID {
msgBody, _ := ev.Body()
// Generate a message with OpenAI API
openAiResp, err := openaiClient.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT4,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: "You are a chatbot that helps people by responding to their questions with short messages.",
},
{
Role: openai.ChatMessageRoleUser,
Content: msgBody,
},
},
})
if err != nil {
fmt.Println("OpenAI API returned with ", err)
return
}
// Send the OpenAI response back to the chat
responseText := openAiResp.Choices[len(openAiResp.Choices)-1].Message.Content
formattedResponse := blackfriday.Run([]byte(responseText))
_, _ = matrixClient.SendFormattedText(ev.RoomID, responseText, string(formattedResponse))
}
})
for {
if err := matrixClient.Sync(); err != nil {
fmt.Println("Sync() returned with ", err)
}
}
}