its for when you want to get like notifications for your reposts
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor: instead of sending like jetstream dids to filter, just dont and do it our side

dusk 2f18acb4 b16df182

+38 -8
+38 -8
main.go
··· 35 35 // Global state 36 36 var ( 37 37 subscribers = hashmap.New[string, *SubscriberData]() 38 + listeningTo = hashmap.New[string, *hashmap.Map[string, *SubscriberData]]() 38 39 39 40 likeStream *client.Client 40 41 subscriberStream *client.Client ··· 122 123 } 123 124 logger.Info("fetched reposts") 124 125 125 - subscriber := &SubscriberData{ 126 + sd := &SubscriberData{ 126 127 DID: did, 127 128 Conn: conn, 128 129 // use user follows as default listen to ··· 130 131 Reposts: reposts, 131 132 } 132 133 133 - subscribers.Set(did, subscriber) 134 + subscribers.Set(sd.DID, sd) 135 + for listenDid := range sd.ListenTo { 136 + listenTo(sd, listenDid) 137 + } 138 + 134 139 updateSubscriberStreamOpts() 135 140 updateLikeStreamOpts() 136 141 // delete subscriber after we are done 137 142 defer func() { 138 - subscribers.Del(did) 143 + for listenDid := range sd.ListenTo { 144 + stopListeningTo(sd.DID, listenDid) 145 + } 146 + subscribers.Del(sd.DID) 147 + 139 148 updateSubscriberStreamOpts() 140 149 updateLikeStreamOpts() 141 150 }() ··· 151 160 } 152 161 } 153 162 163 + func listenTo(sd *SubscriberData, did string) { 164 + targetDids, _ := listeningTo.GetOrInsert(did, hashmap.New[string, *SubscriberData]()) 165 + targetDids.Insert(sd.DID, sd) 166 + } 167 + 168 + func stopListeningTo(subscriberDid, did string) { 169 + if targetDids, exists := listeningTo.Get(did); exists { 170 + targetDids.Del(subscriberDid) 171 + } 172 + } 173 + 154 174 func getLikeStreamOpts() models.SubscriberOptionsUpdatePayload { 155 175 return models.SubscriberOptionsUpdatePayload{ 156 176 WantedCollections: []string{"app.bsky.feed.like"}, 157 - WantedDIDs: getFollowsDids(), 177 + // WantedDIDs: getFollowsDids(), 158 178 } 159 179 } 160 180 ··· 198 218 return nil 199 219 } 200 220 221 + // skip handling event if its not from a source we are listening to 222 + targets, exists := listeningTo.Get(event.Did) 223 + if !exists { 224 + return nil 225 + } 226 + 201 227 var like bsky.FeedLike 202 228 if err := json.Unmarshal(event.Commit.Record, &like); err != nil { 203 - logger.Error("Failed to unmarshal like", "error", err) 229 + logger.Error("failed to unmarshal like", "error", err) 204 230 return nil 205 231 } 206 232 207 - subscribers.Range(func(s string, sd *SubscriberData) bool { 233 + targets.Range(func(s string, sd *SubscriberData) bool { 208 234 for repostURI, _ := range sd.Reposts { 209 235 // (un)liked a post the subscriber reposted 210 236 if like.Subject.Uri == repostURI { ··· 215 241 } 216 242 217 243 if err := sd.Conn.WriteJSON(notification); err != nil { 218 - logger.Error("Failed to send notification", "subscriber", sd.DID, "error", err) 244 + logger.Error("failed to send notification", "subscriber", sd.DID, "error", err) 219 245 } 220 246 } 221 247 } ··· 242 268 case "app.bsky.graph.follow": 243 269 modifySubscribersWithEvent( 244 270 event, 245 - func(s *SubscriberData, r bsky.GraphFollow) { delete(s.ListenTo, r.Subject) }, 271 + func(s *SubscriberData, r bsky.GraphFollow) { 272 + delete(s.ListenTo, r.Subject) 273 + stopListeningTo(s.DID, r.Subject) 274 + }, 246 275 func(s *SubscriberData, r bsky.GraphFollow) { 247 276 s.ListenTo[r.Subject] = struct{}{} 277 + listenTo(s, r.Subject) 248 278 }, 249 279 ) 250 280 }