96 lines
2.2 KiB
Go
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
|
|
}
|