730e415dc1
SetAvatar hacia dos cosas: subir la imagen y establecerla como avatar. Ahora son tres funciones separadas: - UploadMedia: solo sube, devuelve mxc:// URI - SetAvatarURL: solo establece avatar con un mxc:// URI existente - SetAvatar: convenience wrapper que llama a ambas Permite subir imagenes sin activar el avatar, o reusar imagenes ya subidas. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
79 lines
2.0 KiB
Go
79 lines
2.0 KiB
Go
package matrix
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"mime"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"maunium.net/go/mautrix"
|
|
"maunium.net/go/mautrix/id"
|
|
)
|
|
|
|
// UploadMedia uploads the file at filePath to the Matrix media repository
|
|
// and returns its mxc:// URI. Does NOT set the avatar — use SetAvatarURL
|
|
// or SetAvatar for that.
|
|
func (c *Client) UploadMedia(ctx context.Context, filePath string) (string, error) {
|
|
f, err := os.Open(filePath)
|
|
if err != nil {
|
|
return "", fmt.Errorf("open %s: %w", filePath, err)
|
|
}
|
|
defer f.Close()
|
|
|
|
info, err := f.Stat()
|
|
if err != nil {
|
|
return "", fmt.Errorf("stat %s: %w", filePath, err)
|
|
}
|
|
|
|
mimeType := mime.TypeByExtension(filepath.Ext(filePath))
|
|
if mimeType == "" {
|
|
mimeType = "application/octet-stream"
|
|
}
|
|
|
|
resp, err := c.raw.UploadMedia(ctx, mautrix.ReqUploadMedia{
|
|
Content: f,
|
|
ContentLength: info.Size(),
|
|
ContentType: mimeType,
|
|
FileName: filepath.Base(filePath),
|
|
})
|
|
if err != nil {
|
|
return "", fmt.Errorf("upload media: %w", err)
|
|
}
|
|
|
|
return resp.ContentURI.String(), nil
|
|
}
|
|
|
|
// SetAvatarURL sets the bot's avatar to an already-uploaded mxc:// URI.
|
|
func (c *Client) SetAvatarURL(ctx context.Context, mxcURI string) error {
|
|
parsed, err := id.ParseContentURI(mxcURI)
|
|
if err != nil {
|
|
return fmt.Errorf("parse mxc URI %q: %w", mxcURI, err)
|
|
}
|
|
if err := c.raw.SetAvatarURL(ctx, parsed); err != nil {
|
|
return fmt.Errorf("set avatar URL: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SetAvatar uploads the image at filePath and sets it as the bot's avatar.
|
|
// Convenience wrapper: calls UploadMedia then SetAvatarURL.
|
|
func (c *Client) SetAvatar(ctx context.Context, filePath string) (string, error) {
|
|
uri, err := c.UploadMedia(ctx, filePath)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if err := c.SetAvatarURL(ctx, uri); err != nil {
|
|
return "", err
|
|
}
|
|
return uri, nil
|
|
}
|
|
|
|
// SetDisplayName sets the bot's display name on the Matrix homeserver.
|
|
func (c *Client) SetDisplayName(ctx context.Context, name string) error {
|
|
if err := c.raw.SetDisplayName(ctx, name); err != nil {
|
|
return fmt.Errorf("set display name: %w", err)
|
|
}
|
|
return nil
|
|
}
|