add alias support for mentions

This commit is contained in:
Astra 2025-06-16 17:05:44 +01:00
parent fa0376bf3c
commit 164f3629ab
3 changed files with 53 additions and 7 deletions

View file

@ -133,6 +133,13 @@ type TelegramRecord struct {
Message string `json:"message"` Message string `json:"message"`
} }
type Alias struct {
Target string `json:"target"`
Subject string `json:"subject"`
Error string `json:"error"`
Message string `json:"message"`
}
func (bluesky *Bluesky) CommitTelegramResponse(data *TelegramRecord, rkey string) *CommitResponse { func (bluesky *Bluesky) CommitTelegramResponse(data *TelegramRecord, rkey string) *CommitResponse {
bluesky.CheckSessionValid() bluesky.CheckSessionValid()
@ -225,3 +232,34 @@ func (bluesky *Bluesky) DeleteRecord(args []string) *CommitResponse {
Post("/xrpc/com.atproto.repo.deleteRecord").BodyJSON(params).Receive(resp, resp) Post("/xrpc/com.atproto.repo.deleteRecord").BodyJSON(params).Receive(resp, resp)
return resp return resp
} }
func (bluesky *Bluesky) FetchAliases() []Records {
resp := new(AliasRecord)
params := struct {
Repo string `url:"repo"`
Collection string `url:"collection"`
}{
Repo: bluesky.Cfg.DID,
Collection: "blue.zio.bsky2tg.alias",
}
bluesky.sling.New().Get("/xrpc/com.atproto.repo.listRecords").QueryStruct(&params).Receive(resp, resp)
return resp.Records
}
type AliasRecord struct {
Records []Records `json:"records"`
Cursor string `json:"cursor"`
}
type Value struct {
Type string `json:"$type"`
Error string `json:"error"`
Target string `json:"target"`
Message string `json:"message"`
Subject string `json:"subject"`
}
type Records struct {
URI string `json:"uri"`
Cid string `json:"cid"`
Value Value `json:"value"`
}

View file

@ -133,7 +133,7 @@ func (b *BSky) ParsePost(post []byte) (*Post, error) {
return p, nil return p, nil
} }
func (post *Post) ProcessFacets() string { func (post *Post) ProcessFacets(aliases []Records) string {
if post == nil { if post == nil {
return "" return ""
} }
@ -160,6 +160,14 @@ func (post *Post) ProcessFacets() string {
switch feature.Type { switch feature.Type {
case "app.bsky.richtext.facet#mention": case "app.bsky.richtext.facet#mention":
link := fmt.Sprintf(`<a href="https://bsky.app/profile/%s">%s</a>`, feature.Did, post.Text[start:end]) link := fmt.Sprintf(`<a href="https://bsky.app/profile/%s">%s</a>`, feature.Did, post.Text[start:end])
if aliases != nil {
for _, alias := range aliases {
if alias.Value.Subject == feature.Did {
link = fmt.Sprintf(`<a href="%s">%s</a>`,
strings.SplitN(alias.Value.Target, "#", 2)[0], strings.SplitN(alias.Value.Target, "#", 2)[1])
}
}
}
result.WriteString(link) result.WriteString(link)
case "app.bsky.richtext.facet#link": case "app.bsky.richtext.facet#link":
link := fmt.Sprintf(`<a href="%s">%s</a>`, feature.URI, post.Text[start:end]) link := fmt.Sprintf(`<a href="%s">%s</a>`, feature.URI, post.Text[start:end])

12
main.go
View file

@ -110,7 +110,7 @@ func main() {
// return // return
// } // }
// for _, post := range posts.Records { // for _, post := range posts.Records {
// log.Printf("post: %s\n", post.Value.ProcessFacets()) // log.Printf("post: %s\n", post.Value.ProcessFacets(h.bsky.Bluesky.FetchAliases()))
// s, _ := json.Marshal(post.Value) // s, _ := json.Marshal(post.Value)
// h.ProcessPost(&models.Event{Did: bskyClient.Bluesky.Cfg.DID, Commit: &models.Commit{ // h.ProcessPost(&models.Event{Did: bskyClient.Bluesky.Cfg.DID, Commit: &models.Commit{
// Record: s, // Record: s,
@ -180,7 +180,7 @@ func (h *handler) ProcessPost(event *models.Event) error {
handle, _ := h.bsky.GetHandleFromDID(strings.Split(ps.Embed.Record.Record.URI, "/")[2]) handle, _ := h.bsky.GetHandleFromDID(strings.Split(ps.Embed.Record.Record.URI, "/")[2])
captionText = fmt.Sprintf( captionText = fmt.Sprintf(
quotePostFormat, quotePostFormat,
ps.ProcessFacets(), ps.ProcessFacets(h.bsky.Bluesky.FetchAliases()),
strings.Split(ps.Embed.Record.Record.URI, "/")[2], strings.Split(ps.Embed.Record.Record.URI, "/")[2],
strings.Split(ps.Embed.Record.Record.URI, "/")[4], strings.Split(ps.Embed.Record.Record.URI, "/")[4],
handle, handle,
@ -191,7 +191,7 @@ func (h *handler) ProcessPost(event *models.Event) error {
handle, _ := h.bsky.GetHandleFromDID(strings.Split(ps.Embed.Record.URI, "/")[2]) handle, _ := h.bsky.GetHandleFromDID(strings.Split(ps.Embed.Record.URI, "/")[2])
captionText = fmt.Sprintf( captionText = fmt.Sprintf(
quotePostFormat, quotePostFormat,
ps.ProcessFacets(), ps.ProcessFacets(h.bsky.Bluesky.FetchAliases()),
strings.Split(ps.Embed.Record.URI, "/")[2], strings.Split(ps.Embed.Record.URI, "/")[2],
strings.Split(ps.Embed.Record.URI, "/")[4], strings.Split(ps.Embed.Record.URI, "/")[4],
handle, handle,
@ -202,8 +202,8 @@ func (h *handler) ProcessPost(event *models.Event) error {
} }
if captionText == "" { if captionText == "" {
if ps.ProcessFacets() != "" { if ps.ProcessFacets(h.bsky.Bluesky.FetchAliases()) != "" {
captionText = fmt.Sprintf(postFormat, ps.ProcessFacets(), h.bsky.Bluesky.Cfg.DID, event.Commit.RKey, h.bsky.Bluesky.Cfg.Handle) captionText = fmt.Sprintf(postFormat, ps.ProcessFacets(h.bsky.Bluesky.FetchAliases()), h.bsky.Bluesky.Cfg.DID, event.Commit.RKey, h.bsky.Bluesky.Cfg.Handle)
} else { } else {
captionText = fmt.Sprintf("<a href=\"https://bsky.app/profile/%s/post/%s\">🦋 @%s</a>", h.bsky.Bluesky.Cfg.DID, event.Commit.RKey, h.bsky.Bluesky.Cfg.Handle) captionText = fmt.Sprintf("<a href=\"https://bsky.app/profile/%s/post/%s\">🦋 @%s</a>", h.bsky.Bluesky.Cfg.DID, event.Commit.RKey, h.bsky.Bluesky.Cfg.Handle)
} }
@ -276,7 +276,7 @@ func (h *handler) ProcessPost(event *models.Event) error {
} else { } else {
m := tgbotapi.MessageConfig{} m := tgbotapi.MessageConfig{}
if captionText == "" { if captionText == "" {
m = tgbotapi.NewMessage(cid, fmt.Sprintf(postFormat, ps.ProcessFacets(), h.bsky.Bluesky.Cfg.DID, event.Commit.RKey, h.bsky.Bluesky.Cfg.Handle)) m = tgbotapi.NewMessage(cid, fmt.Sprintf(postFormat, ps.ProcessFacets(h.bsky.Bluesky.FetchAliases()), h.bsky.Bluesky.Cfg.DID, event.Commit.RKey, h.bsky.Bluesky.Cfg.Handle))
} else { } else {
m = tgbotapi.NewMessage(cid, captionText) m = tgbotapi.NewMessage(cid, captionText)
} }