Skip to content

Commit c0c56bb

Browse files
committed
cmd/bsky-webhook: address review feedback
1 parent 2cd561c commit c0c56bb

File tree

4 files changed

+40
-44
lines changed

4 files changed

+40
-44
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.env

cmd/bsky-webhook/facets.go

+25-26
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,42 @@
11
package main
22

33
import (
4+
"cmp"
45
"fmt"
56
"slices"
67
"strings"
78
)
89

9-
func bskyMessageToSlackMarkup(bskyMessage BskyMessage) (string, error) {
10-
var slackStringBuilder strings.Builder
10+
func (b BskyTextFragment) featureURI() string {
11+
for _, feat := range b.Features {
12+
switch feat.URI {
13+
case "app.bsky.richtext.facet#link":
14+
return feat.URI
15+
case "app.bsky.richtext.facet#mention":
16+
return fmt.Sprintf("https://bsky.app/profile/%s", feat.DID)
17+
case "app.bsky.richtext.facet#tag":
18+
return fmt.Sprintf("https://bsky.app/hashtag/%s", feat.Tag)
19+
}
20+
}
21+
return ""
22+
}
23+
24+
func bskyMessageToSlackMarkup(msg BskyMessage) (string, error) {
25+
var sb strings.Builder
1126

12-
fragments, err := facetsToFragments(bskyMessage)
27+
fragments, err := facetsToFragments(msg)
1328
if err != nil {
1429
return "", err
1530
}
1631

17-
for _, fragment := range fragments {
18-
if fragment.Features == nil {
19-
slackStringBuilder.WriteString(fragment.Text)
32+
for _, frag := range fragments {
33+
if uri := frag.featureURI(); uri != "" {
34+
fmt.Fprintf(&sb, "<%s|%s>", uri, frag.Text)
2035
} else {
21-
uri := ""
22-
for _, feature := range fragment.Features {
23-
if feature.Type == "app.bsky.richtext.facet#link" {
24-
uri = feature.Uri
25-
break
26-
} else if feature.Type == "app.bsky.richtext.facet#mention" {
27-
uri = fmt.Sprintf("https://bsky.app/profile/%s", feature.Did)
28-
break
29-
} else if feature.Type == "app.bsky.richtext.facet#tag" {
30-
uri = fmt.Sprintf("https://bsky.app/hashtag/%s", feature.Tag)
31-
}
32-
}
33-
if uri != "" {
34-
slackStringBuilder.WriteString(fmt.Sprintf("<%s|%s>", uri, fragment.Text))
35-
} else {
36-
slackStringBuilder.WriteString(fragment.Text)
37-
}
36+
sb.WriteString(frag.Text)
3837
}
3938
}
40-
41-
return slackStringBuilder.String(), nil
39+
return sb.String(), nil
4240
}
4341

4442
func facetsToFragments(bskyMessage BskyMessage) ([]BskyTextFragment, error) {
@@ -47,8 +45,9 @@ func facetsToFragments(bskyMessage BskyMessage) ([]BskyTextFragment, error) {
4745

4846
fragments := []BskyTextFragment{}
4947

48+
// We use SortStable here as we want the original order of equal elements to stay the same.
5049
slices.SortStableFunc(facets, func(a, b BskyFacet) int {
51-
return a.Index.ByteStart - b.Index.ByteStart
50+
return cmp.Compare(a.Index.ByteStart, b.Index.ByteStart)
5251
})
5352

5453
textCursor := 0

cmd/bsky-webhook/main.go

+6-10
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ func readJetstreamMessage(ctx context.Context, jetstreamMessageEncoded []byte, b
237237
}
238238

239239
// parse timestamp user provided when posting
240-
postTime, err := time.Parse(time.RFC3339, bskyMessage.Commit.Record.CreatedAtString)
240+
postTime, err := time.Parse(time.RFC3339, bskyMessage.Commit.Record.CreatedAt)
241241
if err != nil {
242242
return err
243243
}
@@ -260,7 +260,7 @@ func readJetstreamMessage(ctx context.Context, jetstreamMessageEncoded []byte, b
260260
var imageURL string
261261

262262
if len(bskyMessage.Commit.Record.Embed.Images) != 0 {
263-
imageURL = fmt.Sprintf("https://cdn.bsky.app/img/feed_fullsize/plain/%s/%s", bskyMessage.Did, bskyMessage.Commit.Record.Embed.Images[0].Image.Ref.Link)
263+
imageURL = fmt.Sprintf("https://cdn.bsky.app/img/feed_fullsize/plain/%s/%s", bskyMessage.DID, bskyMessage.Commit.Record.Embed.Images[0].Image.Ref.Link)
264264
}
265265

266266
err = sendToSlack(ctx, jetstreamMessageStr, bskyMessage, imageURL, *profile, postTime)
@@ -274,7 +274,7 @@ func readJetstreamMessage(ctx context.Context, jetstreamMessageEncoded []byte, b
274274
}
275275

276276
func getBskyProfile(ctx context.Context, bskyMessage BskyMessage, bsky *bluesky.Client) (*bluesky.Profile, error) {
277-
profile, err := bsky.FetchProfile(ctx, bskyMessage.Did)
277+
profile, err := bsky.FetchProfile(ctx, bskyMessage.DID)
278278
if err != nil {
279279
return nil, err
280280
}
@@ -291,13 +291,9 @@ func sendToSlack(ctx context.Context, jetstreamMessageStr string, bskyMessage Bs
291291
var messageText string
292292
var err error
293293

294-
if len(bskyMessage.Commit.Record.Facets) != 0 {
295-
messageText, err = bskyMessageToSlackMarkup(bskyMessage)
296-
if err != nil {
297-
return err
298-
}
299-
} else {
300-
messageText = bskyMessage.Commit.Record.Text
294+
messageText, err = bskyMessageToSlackMarkup(bskyMessage)
295+
if err != nil {
296+
return err
301297
}
302298

303299
attachments := []SlackAttachment{

cmd/bsky-webhook/types.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
)
77

88
type BskyMessage struct {
9-
Did string `json:"did"`
9+
DID string `json:"did"`
1010
Commit *BskyCommit `json:"commit"`
1111
Kind string `json:"kind"`
1212
Time int64 `json:"time_us"`
@@ -15,7 +15,7 @@ type BskyMessage struct {
1515
func (m *BskyMessage) toURL(handle *string) string {
1616
author := handle
1717
if author == nil {
18-
author = &m.Did
18+
author = &m.DID
1919
}
2020

2121
return fmt.Sprintf("https://bsky.app/profile/%s/post/%s", url.PathEscape(*author), url.PathEscape(m.Commit.Rkey))
@@ -29,10 +29,10 @@ type BskyCommit struct {
2929
}
3030

3131
type BskyRecord struct {
32-
Text string `json:"text"`
33-
Embed BskyEmbed `json:"embed"`
34-
CreatedAtString string `json:"createdAt"`
35-
Facets []BskyFacet `json:"facets"`
32+
Text string `json:"text"`
33+
Embed BskyEmbed `json:"embed"`
34+
CreatedAt string `json:"createdAt"` // RFC3339 timestamp
35+
Facets []BskyFacet `json:"facets"`
3636
}
3737

3838
type BskyEmbed struct {
@@ -58,8 +58,8 @@ type BskyFacet struct {
5858

5959
type BskyFacetFeatures struct {
6060
Type string `json:"$type"`
61-
Uri string `json:"uri"`
62-
Did string `json:"did"`
61+
URI string `json:"uri"`
62+
DID string `json:"did"`
6363
Tag string `json:"tag"`
6464
}
6565

0 commit comments

Comments
 (0)