jmap/main.go
dasha_uwu a0086b5d31 1.0
2024-06-26 08:05:27 +05:00

96 lines
2.2 KiB
Go

package main
import (
"context"
"errors"
"flag"
"fmt"
"net/http"
"strings"
"maunium.net/go/mautrix"
"maunium.net/go/mautrix/id"
)
func main() {
address := flag.String("address", "127.0.0.1:8080", "address:port to listen on")
username := flag.String("username", "", "matrix username")
password := flag.String("password", "", "matrix password")
homeserver := flag.String("homeserver", "", "matrix homeserver URL")
flag.Parse()
if *username == "" {
fmt.Println("empty username")
return
}
if *password == "" {
fmt.Println("empty password")
return
}
if *homeserver == "" {
fmt.Println("empty homeserver")
return
}
fmt.Printf("logging in as %s on %s\n", *username, *homeserver)
client, err := loginMatrix(*username, *password, *homeserver)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("starting jmap on %s\n", *address)
http.HandleFunc("/avatar/{mxId}", func(w http.ResponseWriter, r *http.Request) {
mxId := r.PathValue("mxId")
if !strings.HasPrefix(mxId, "@") {
mxId = "@" + mxId
}
avatar, err := getMatrixUserAvatar(r.Context(), client, mxId)
if err != nil {
fmt.Printf("bad request for %s error %s\n", mxId, err)
w.WriteHeader(http.StatusInternalServerError)
return
}
fmt.Printf("ok request for %s\n", mxId)
w.Write(avatar)
})
http.ListenAndServe(*address, nil)
}
func loginMatrix(mxId string, password string, homeserverURL string) (client *mautrix.Client, err error) {
client, err = mautrix.NewClient(homeserverURL, id.UserID(mxId), "")
if err != nil {
return nil, err
}
_, err = client.Login(context.Background(), &mautrix.ReqLogin{
Type: mautrix.AuthTypePassword,
Identifier: mautrix.UserIdentifier{
Type: mautrix.IdentifierTypeUser,
User: mxId,
},
Password: password,
StoreCredentials: true,
})
if err != nil {
return nil, err
}
return client, nil
}
func getMatrixUserAvatar(ctx context.Context, client *mautrix.Client, mxId string) (avatar []byte, err error) {
profile, err := client.GetProfile(ctx, id.UserID(mxId))
if err != nil {
return nil, err
}
if profile.AvatarURL.IsEmpty() {
return nil, errors.New("no avatar")
}
avatar, err = client.DownloadBytes(ctx, profile.AvatarURL)
if err != nil {
return nil, err
}
return avatar, nil
}