diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-03-23 15:06:56 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-03-23 15:06:56 +0900 |
| commit | 7e4a800352dd1de91a7a6c457b39f297d76fd9bf (patch) | |
| tree | 174117f77dcc50defb3081b94a67c3de5c63c5cf /src/misc | |
| parent | コミット忘れ (diff) | |
| download | sharkey-7e4a800352dd1de91a7a6c457b39f297d76fd9bf.tar.gz sharkey-7e4a800352dd1de91a7a6c457b39f297d76fd9bf.tar.bz2 sharkey-7e4a800352dd1de91a7a6c457b39f297d76fd9bf.zip | |
noteのread処理
Diffstat (limited to 'src/misc')
| -rw-r--r-- | src/misc/antenna-cache.ts | 36 | ||||
| -rw-r--r-- | src/misc/check-hit-antenna.ts | 14 |
2 files changed, 46 insertions, 4 deletions
diff --git a/src/misc/antenna-cache.ts b/src/misc/antenna-cache.ts new file mode 100644 index 0000000000..6be1c18db5 --- /dev/null +++ b/src/misc/antenna-cache.ts @@ -0,0 +1,36 @@ +import { Antennas } from '../models'; +import { Antenna } from '../models/entities/antenna'; +import { subsdcriber } from '../db/redis'; + +let antennasFetched = false; +let antennas: Antenna[] = []; + +export async function getAntennas() { + if (!antennasFetched) { + antennas = await Antennas.find(); + antennasFetched = true; + } + + return antennas; +} + +subsdcriber.on('message', async (_, data) => { + const obj = JSON.parse(data); + + if (obj.channel === 'internal') { + const { type, body } = obj.message; + switch (type) { + case 'antennaCreated': + antennas.push(body); + break; + case 'antennaUpdated': + antennas[antennas.findIndex(a => a.id === body.id)] = body; + break; + case 'antennaDeleted': + antennas = antennas.filter(a => a.id !== body.id); + break; + default: + break; + } + } +}); diff --git a/src/misc/check-hit-antenna.ts b/src/misc/check-hit-antenna.ts index 0464f14131..9897dd414e 100644 --- a/src/misc/check-hit-antenna.ts +++ b/src/misc/check-hit-antenna.ts @@ -4,18 +4,24 @@ import { User } from '../models/entities/user'; import { UserListJoinings, UserGroupJoinings } from '../models'; import parseAcct from './acct/parse'; import { getFullApAccount } from './convert-host'; +import { PackedNote } from '../models/repositories/note'; -export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: User, followers: User['id'][]): Promise<boolean> { +/** + * noteUserFollowers / antennaUserFollowing はどちらか一方が指定されていればよい + */ +export async function checkHitAntenna(antenna: Antenna, note: (Note | PackedNote), noteUser: { username: string; host: string | null; }, noteUserFollowers?: User['id'][], antennaUserFollowing?: User['id'][]): Promise<boolean> { if (note.visibility === 'specified') return false; if (note.visibility === 'followers') { - if (!followers.includes(antenna.userId)) return false; + if (noteUserFollowers && !noteUserFollowers.includes(antenna.userId)) return false; + if (antennaUserFollowing && !antennaUserFollowing.includes(note.userId)) return false; } if (!antenna.withReplies && note.replyId != null) return false; if (antenna.src === 'home') { - if (!followers.includes(antenna.userId)) return false; + if (noteUserFollowers && !noteUserFollowers.includes(antenna.userId)) return false; + if (antennaUserFollowing && !antennaUserFollowing.includes(note.userId)) return false; } else if (antenna.src === 'list') { const listUsers = (await UserListJoinings.find({ userListId: antenna.userListId! @@ -75,7 +81,7 @@ export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: Us } if (antenna.withFile) { - if (note.fileIds.length === 0) return false; + if (note.fileIds && note.fileIds.length === 0) return false; } // TODO: eval expression |