forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
1package posthog 2 3import ( 4 "context" 5 "log" 6 7 "github.com/bluesky-social/indigo/atproto/syntax" 8 "github.com/posthog/posthog-go" 9 "tangled.org/core/appview/models" 10 "tangled.org/core/appview/notify" 11) 12 13type posthogNotifier struct { 14 client posthog.Client 15 notify.BaseNotifier 16} 17 18func NewPosthogNotifier(client posthog.Client) notify.Notifier { 19 return &posthogNotifier{ 20 client, 21 notify.BaseNotifier{}, 22 } 23} 24 25var _ notify.Notifier = &posthogNotifier{} 26 27func (n *posthogNotifier) NewRepo(ctx context.Context, repo *models.Repo) { 28 err := n.client.Enqueue(posthog.Capture{ 29 DistinctId: repo.Did, 30 Event: "new_repo", 31 Properties: posthog.Properties{"repo": repo.Name, "repo_at": repo.RepoAt()}, 32 }) 33 if err != nil { 34 log.Println("failed to enqueue posthog event:", err) 35 } 36} 37 38func (n *posthogNotifier) NewStar(ctx context.Context, star *models.Star) { 39 err := n.client.Enqueue(posthog.Capture{ 40 DistinctId: star.StarredByDid, 41 Event: "star", 42 Properties: posthog.Properties{"repo_at": star.RepoAt.String()}, 43 }) 44 if err != nil { 45 log.Println("failed to enqueue posthog event:", err) 46 } 47} 48 49func (n *posthogNotifier) DeleteStar(ctx context.Context, star *models.Star) { 50 err := n.client.Enqueue(posthog.Capture{ 51 DistinctId: star.StarredByDid, 52 Event: "unstar", 53 Properties: posthog.Properties{"repo_at": star.RepoAt.String()}, 54 }) 55 if err != nil { 56 log.Println("failed to enqueue posthog event:", err) 57 } 58} 59 60func (n *posthogNotifier) NewIssue(ctx context.Context, issue *models.Issue, mentions []syntax.DID) { 61 err := n.client.Enqueue(posthog.Capture{ 62 DistinctId: issue.Did, 63 Event: "new_issue", 64 Properties: posthog.Properties{ 65 "repo_at": issue.RepoAt.String(), 66 "issue_id": issue.IssueId, 67 "mentions": mentions, 68 }, 69 }) 70 if err != nil { 71 log.Println("failed to enqueue posthog event:", err) 72 } 73} 74 75func (n *posthogNotifier) NewPull(ctx context.Context, pull *models.Pull) { 76 err := n.client.Enqueue(posthog.Capture{ 77 DistinctId: pull.OwnerDid, 78 Event: "new_pull", 79 Properties: posthog.Properties{ 80 "repo_at": pull.RepoAt, 81 "pull_id": pull.PullId, 82 }, 83 }) 84 if err != nil { 85 log.Println("failed to enqueue posthog event:", err) 86 } 87} 88 89func (n *posthogNotifier) NewPullComment(ctx context.Context, comment *models.PullComment, mentions []syntax.DID) { 90 err := n.client.Enqueue(posthog.Capture{ 91 DistinctId: comment.OwnerDid, 92 Event: "new_pull_comment", 93 Properties: posthog.Properties{ 94 "repo_at": comment.RepoAt, 95 "pull_id": comment.PullId, 96 "mentions": mentions, 97 }, 98 }) 99 if err != nil { 100 log.Println("failed to enqueue posthog event:", err) 101 } 102} 103 104func (n *posthogNotifier) NewPullClosed(ctx context.Context, pull *models.Pull) { 105 err := n.client.Enqueue(posthog.Capture{ 106 DistinctId: pull.OwnerDid, 107 Event: "pull_closed", 108 Properties: posthog.Properties{ 109 "repo_at": pull.RepoAt, 110 "pull_id": pull.PullId, 111 }, 112 }) 113 if err != nil { 114 log.Println("failed to enqueue posthog event:", err) 115 } 116} 117 118func (n *posthogNotifier) NewFollow(ctx context.Context, follow *models.Follow) { 119 err := n.client.Enqueue(posthog.Capture{ 120 DistinctId: follow.UserDid, 121 Event: "follow", 122 Properties: posthog.Properties{"subject": follow.SubjectDid}, 123 }) 124 if err != nil { 125 log.Println("failed to enqueue posthog event:", err) 126 } 127} 128 129func (n *posthogNotifier) DeleteFollow(ctx context.Context, follow *models.Follow) { 130 err := n.client.Enqueue(posthog.Capture{ 131 DistinctId: follow.UserDid, 132 Event: "unfollow", 133 Properties: posthog.Properties{"subject": follow.SubjectDid}, 134 }) 135 if err != nil { 136 log.Println("failed to enqueue posthog event:", err) 137 } 138} 139 140func (n *posthogNotifier) UpdateProfile(ctx context.Context, profile *models.Profile) { 141 err := n.client.Enqueue(posthog.Capture{ 142 DistinctId: profile.Did, 143 Event: "edit_profile", 144 }) 145 if err != nil { 146 log.Println("failed to enqueue posthog event:", err) 147 } 148} 149 150func (n *posthogNotifier) DeleteString(ctx context.Context, did, rkey string) { 151 err := n.client.Enqueue(posthog.Capture{ 152 DistinctId: did, 153 Event: "delete_string", 154 Properties: posthog.Properties{"rkey": rkey}, 155 }) 156 if err != nil { 157 log.Println("failed to enqueue posthog event:", err) 158 } 159} 160 161func (n *posthogNotifier) EditString(ctx context.Context, string *models.String) { 162 err := n.client.Enqueue(posthog.Capture{ 163 DistinctId: string.Did.String(), 164 Event: "edit_string", 165 Properties: posthog.Properties{"rkey": string.Rkey}, 166 }) 167 if err != nil { 168 log.Println("failed to enqueue posthog event:", err) 169 } 170} 171 172func (n *posthogNotifier) NewString(ctx context.Context, string *models.String) { 173 err := n.client.Enqueue(posthog.Capture{ 174 DistinctId: string.Did.String(), 175 Event: "new_string", 176 Properties: posthog.Properties{"rkey": string.Rkey}, 177 }) 178 if err != nil { 179 log.Println("failed to enqueue posthog event:", err) 180 } 181} 182 183func (n *posthogNotifier) NewIssueComment(ctx context.Context, comment *models.IssueComment, mentions []syntax.DID) { 184 err := n.client.Enqueue(posthog.Capture{ 185 DistinctId: comment.Did, 186 Event: "new_issue_comment", 187 Properties: posthog.Properties{ 188 "issue_at": comment.IssueAt, 189 "mentions": mentions, 190 }, 191 }) 192 if err != nil { 193 log.Println("failed to enqueue posthog event:", err) 194 } 195} 196 197func (n *posthogNotifier) NewIssueState(ctx context.Context, actor syntax.DID, issue *models.Issue) { 198 var event string 199 if issue.Open { 200 event = "issue_reopen" 201 } else { 202 event = "issue_closed" 203 } 204 err := n.client.Enqueue(posthog.Capture{ 205 DistinctId: issue.Did, 206 Event: event, 207 Properties: posthog.Properties{ 208 "repo_at": issue.RepoAt.String(), 209 "actor": actor, 210 "issue_id": issue.IssueId, 211 }, 212 }) 213 if err != nil { 214 log.Println("failed to enqueue posthog event:", err) 215 } 216} 217 218func (n *posthogNotifier) NewPullState(ctx context.Context, actor syntax.DID, pull *models.Pull) { 219 var event string 220 switch pull.State { 221 case models.PullClosed: 222 event = "pull_closed" 223 case models.PullOpen: 224 event = "pull_reopen" 225 case models.PullMerged: 226 event = "pull_merged" 227 default: 228 log.Println("posthog: unexpected new PR state:", pull.State) 229 return 230 } 231 err := n.client.Enqueue(posthog.Capture{ 232 DistinctId: pull.OwnerDid, 233 Event: event, 234 Properties: posthog.Properties{ 235 "repo_at": pull.RepoAt, 236 "pull_id": pull.PullId, 237 "actor": actor, 238 }, 239 }) 240 if err != nil { 241 log.Println("failed to enqueue posthog event:", err) 242 } 243}