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 }