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.Did,
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.Did,
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) Clone(ctx context.Context, repo *models.Repo) {
184 err := n.client.Enqueue(posthog.Capture{
185 DistinctId: repo.Did,
186 Event: "clone",
187 Properties: posthog.Properties{"repo": repo.Name, "repo_at": repo.RepoAt()},
188 })
189 if err != nil {
190 log.Println("failed to enqueue posthog event:", err)
191 }
192}
193
194func (n *posthogNotifier) NewIssueComment(ctx context.Context, comment *models.IssueComment, mentions []syntax.DID) {
195 err := n.client.Enqueue(posthog.Capture{
196 DistinctId: comment.Did,
197 Event: "new_issue_comment",
198 Properties: posthog.Properties{
199 "issue_at": comment.IssueAt,
200 "mentions": mentions,
201 },
202 })
203 if err != nil {
204 log.Println("failed to enqueue posthog event:", err)
205 }
206}
207
208func (n *posthogNotifier) NewIssueState(ctx context.Context, actor syntax.DID, issue *models.Issue) {
209 var event string
210 if issue.Open {
211 event = "issue_reopen"
212 } else {
213 event = "issue_closed"
214 }
215 err := n.client.Enqueue(posthog.Capture{
216 DistinctId: issue.Did,
217 Event: event,
218 Properties: posthog.Properties{
219 "repo_at": issue.RepoAt.String(),
220 "actor": actor,
221 "issue_id": issue.IssueId,
222 },
223 })
224 if err != nil {
225 log.Println("failed to enqueue posthog event:", err)
226 }
227}
228
229func (n *posthogNotifier) NewPullState(ctx context.Context, actor syntax.DID, pull *models.Pull) {
230 var event string
231 switch pull.State {
232 case models.PullClosed:
233 event = "pull_closed"
234 case models.PullOpen:
235 event = "pull_reopen"
236 case models.PullMerged:
237 event = "pull_merged"
238 default:
239 log.Println("posthog: unexpected new PR state:", pull.State)
240 return
241 }
242 err := n.client.Enqueue(posthog.Capture{
243 DistinctId: pull.OwnerDid,
244 Event: event,
245 Properties: posthog.Properties{
246 "repo_at": pull.RepoAt,
247 "pull_id": pull.PullId,
248 "actor": actor,
249 },
250 })
251 if err != nil {
252 log.Println("failed to enqueue posthog event:", err)
253 }
254}