summaryrefslogtreecommitdiff
path: root/src/misc
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-03-23 15:06:56 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-03-23 15:06:56 +0900
commit7e4a800352dd1de91a7a6c457b39f297d76fd9bf (patch)
tree174117f77dcc50defb3081b94a67c3de5c63c5cf /src/misc
parentコミット忘れ (diff)
downloadsharkey-7e4a800352dd1de91a7a6c457b39f297d76fd9bf.tar.gz
sharkey-7e4a800352dd1de91a7a6c457b39f297d76fd9bf.tar.bz2
sharkey-7e4a800352dd1de91a7a6c457b39f297d76fd9bf.zip
noteのread処理
Diffstat (limited to 'src/misc')
-rw-r--r--src/misc/antenna-cache.ts36
-rw-r--r--src/misc/check-hit-antenna.ts14
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