unoffical wafrn mirror
wafrn.net
atproto
social-network
activitypub
1import { Job } from 'bullmq'
2import { logger } from '../logger.js'
3import {
4 Blocks,
5 Emoji,
6 EmojiReaction,
7 FederatedHost,
8 Follows,
9 Post,
10 User,
11 UserLikesPostRelations
12} from '../../models/index.js'
13import { getRemoteActor } from '../activitypub/getRemoteActor.js'
14import { signAndAccept } from '../activitypub/signAndAccept.js'
15import { removeUser } from '../activitypub/removeUser.js'
16import getBlockedIds from '../cacheGetters/getBlockedIds.js'
17import getUserBlockedServers from '../cacheGetters/getUserBlockedServers.js'
18import { deletePostCommon } from '../deletePost.js'
19import { AcceptActivity } from '../activitypub/processors/accept.js'
20import { AnnounceActivity } from '../activitypub/processors/announce.js'
21import { CreateActivity } from '../activitypub/processors/create.js'
22import { FollowActivity } from '../activitypub/processors/follow.js'
23import { UpdateActivity } from '../activitypub/processors/update.js'
24import { UndoActivity } from '../activitypub/processors/undo.js'
25import { LikeActivity } from '../activitypub/processors/like.js'
26import { DeleteActivity } from '../activitypub/processors/delete.js'
27import { EmojiReactActivity } from '../activitypub/processors/emojiReact.js'
28import { RemoveActivity } from '../activitypub/processors/remove.js'
29import { AddActivity } from '../activitypub/processors/add.js'
30import { BlockActivity } from '../activitypub/processors/block.js'
31import { MoveActivity } from '../activitypub/processors/move.js'
32import { RejectActivity } from '../activitypub/processors/reject.js'
33import { wait } from '../wait.js'
34import { flagActivity } from '../activitypub/processors/flag.js'
35
36async function inboxWorker(job: Job) {
37 try {
38 const user = await User.findByPk(job.data.petitionBy)
39 if (!user) {
40 return
41 }
42
43 const body = job.data.petition
44 const req = { body: body }
45 // little hack that should be fixed later
46 if (req.body.type === 'Delete' && req.body.id.endsWith('#delete')) {
47 const userToRemove = await User.findOne({
48 where: {
49 remoteId: req.body.id.split('#')[0].toLowerCase()
50 }
51 })
52 if (userToRemove) {
53 await removeUser(userToRemove.id)
54 return
55 }
56 }
57 const remoteUser = await getRemoteActor(req.body.actor, user)
58 const host = await FederatedHost.findOne({
59 where: {
60 displayName: new URL(req.body.actor).host
61 }
62 })
63 if (remoteUser) {
64 // we check if the user has blocked the user or the server. This will mostly work for follows and dms. Will investigate further down the line
65 const userBlocks: string[] = await getBlockedIds(user.id, false, true)
66 const blocksExisting = userBlocks.includes(remoteUser.id) ? 1 : 0
67 const blockedServersData = await getUserBlockedServers(user.id)
68 const blocksServers = blockedServersData.find((elem: any) => elem.id === host?.id) ? 1 : 0
69 if (
70 (!remoteUser?.banned && !host?.blocked && blocksExisting + blocksServers === 0) ||
71 req.body.type === 'Undo' ||
72 req.body.type === 'Deletee'
73 ) {
74 switch (req.body.type) {
75 case 'Accept': {
76 await AcceptActivity(body, remoteUser, user)
77 break
78 }
79 case 'Reject': {
80 await RejectActivity(body, remoteUser, user)
81 break
82 }
83 case 'Announce': {
84 await AnnounceActivity(body, remoteUser, user)
85 break
86 }
87 case 'Page':
88 case 'Create': {
89 await CreateActivity(body, remoteUser, user)
90 break
91 }
92 case 'Follow': {
93 await FollowActivity(body, remoteUser, user)
94 break
95 }
96 case 'Update': {
97 await wait(5000)
98 await UpdateActivity(body, remoteUser, user)
99 break
100 }
101 case 'Undo': {
102 await UndoActivity(body, remoteUser, user)
103 break
104 }
105 case 'Like': {
106 await LikeActivity(body, remoteUser, user)
107 break
108 }
109 case 'Delete': {
110 await DeleteActivity(body, remoteUser, user)
111 break
112 }
113 case 'EmojiReact': {
114 await EmojiReactActivity(body, remoteUser, user)
115 break
116 }
117 case 'Remove': {
118 await RemoveActivity(body, remoteUser, user)
119 break
120 }
121 case 'Add': {
122 await AddActivity(body, remoteUser, user)
123 break
124 }
125 case 'Block': {
126 await BlockActivity(body, remoteUser, user)
127 break
128 }
129
130 case 'Move': {
131 await MoveActivity(body, remoteUser, user)
132 break
133 }
134 case 'Flag': {
135 await flagActivity(body, remoteUser, user)
136 break
137 }
138
139 // activities that we ignore:
140 case 'CacheFile':
141 case 'Playlist':
142 case 'Listen':
143 case 'View': {
144 // await signAndAccept(req, remoteUser, user)
145 break
146 }
147
148 default: {
149 logger.info(`NOT IMPLEMENTED: ${req.body.type}`)
150 logger.info(req.body)
151 }
152 }
153 }
154 }
155 } catch (err) {
156 logger.debug(err)
157 const error = new Error('error')
158 }
159}
160
161export { inboxWorker }