+2
-1
automod/engine/account_meta.go
+2
-1
automod/engine/account_meta.go
+42
automod/engine/cid_from_cdn_test.go
+42
automod/engine/cid_from_cdn_test.go
···
1
+
package engine
2
+
3
+
import (
4
+
"github.com/stretchr/testify/assert"
5
+
"testing"
6
+
)
7
+
8
+
func TestCidFromCdnUrl(t *testing.T) {
9
+
assert := assert.New(t)
10
+
11
+
fixCid := "abcdefghijk"
12
+
13
+
fixtures := []struct {
14
+
url string
15
+
cid *string
16
+
}{
17
+
{
18
+
url: "https://cdn.bsky.app/img/avatar/plain/did:plc:abc123/abcdefghijk@jpeg",
19
+
cid: &fixCid,
20
+
},
21
+
{
22
+
url: "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:abc123/abcdefghijk@jpeg",
23
+
cid: &fixCid,
24
+
},
25
+
{
26
+
url: "https://cdn.bsky.app/img/feed_fullsize",
27
+
cid: nil,
28
+
},
29
+
{
30
+
url: "https://cdn.bsky.app/img/feed_fullsize/plain/did:plc:abc123/abcdefghijk",
31
+
cid: &fixCid,
32
+
},
33
+
{
34
+
url: "https://cdn.asky.app/img/feed_fullsize/plain/did:plc:abc123/abcdefghijk@jpeg",
35
+
cid: nil,
36
+
},
37
+
}
38
+
39
+
for _, fix := range fixtures {
40
+
assert.Equal(fix.cid, CidFromCdnUrl(&fix.url))
41
+
}
42
+
}
+23
-1
automod/engine/fetch_account_meta.go
+23
-1
automod/engine/fetch_account_meta.go
···
5
5
"encoding/json"
6
6
"errors"
7
7
"fmt"
8
+
"net/url"
9
+
"strings"
8
10
"time"
9
11
10
12
comatproto "github.com/bluesky-social/indigo/api/atproto"
···
16
18
)
17
19
18
20
var newAccountRetryDuration = 3 * 1000 * time.Millisecond
21
+
22
+
// get the cid from a bluesky cdn url
23
+
func CidFromCdnUrl(str *string) *string {
24
+
if str == nil {
25
+
return nil
26
+
}
27
+
28
+
u, err := url.Parse(*str)
29
+
if err != nil || u.Host != "cdn.bsky.app" {
30
+
return nil
31
+
}
32
+
33
+
parts := strings.Split(u.Path, "/")
34
+
if len(parts) != 6 {
35
+
return nil
36
+
}
37
+
38
+
return &strings.Split(parts[5], "@")[0]
39
+
}
19
40
20
41
// Helper to hydrate metadata about an account from several sources: PDS (if access), mod service (if access), public identity resolution
21
42
func (e *Engine) GetAccountMeta(ctx context.Context, ident *identity.Identity) (*AccountMeta, error) {
···
75
96
76
97
am.Profile = ProfileSummary{
77
98
HasAvatar: pv.Avatar != nil,
78
-
Avatar: pv.Avatar,
99
+
AvatarCid: cidFromCdnUrl(pv.Avatar),
100
+
BannerCid: cidFromCdnUrl(pv.Banner),
79
101
Description: pv.Description,
80
102
DisplayName: pv.DisplayName,
81
103
}
+24
automod/engine/util.go
+24
automod/engine/util.go
···
1
1
package engine
2
2
3
+
import (
4
+
"net/url"
5
+
"strings"
6
+
)
7
+
3
8
func dedupeStrings(in []string) []string {
4
9
var out []string
5
10
seen := make(map[string]bool)
···
11
16
}
12
17
return out
13
18
}
19
+
20
+
// get the cid from a bluesky cdn url
21
+
func cidFromCdnUrl(str *string) *string {
22
+
if str == nil {
23
+
return nil
24
+
}
25
+
26
+
u, err := url.Parse(*str)
27
+
if err != nil || u.Host != "cdn.bsky.app" {
28
+
return nil
29
+
}
30
+
31
+
parts := strings.Split(u.Path, "/")
32
+
if len(parts) != 6 {
33
+
return nil
34
+
}
35
+
36
+
return &strings.Split(parts[5], "@")[0]
37
+
}