feat(streaming): no blocking user on my timeline
This commit is contained in:
parent
77ed6bb32b
commit
30c3154737
9 changed files with 61 additions and 1 deletions
|
@ -35,6 +35,7 @@ export default class Connection {
|
|||
public followingChannels: Set<string> = new Set();
|
||||
public userIdsWhoMeMuting: Set<string> = new Set();
|
||||
public userIdsWhoBlockingMe: Set<string> = new Set();
|
||||
public userIdsWhoMeBlocking: Set<string> = new Set();
|
||||
public userIdsWhoMeMutingRenotes: Set<string> = new Set();
|
||||
public userMutedInstances: Set<string> = new Set();
|
||||
private fetchIntervalId: NodeJS.Timeout | null = null;
|
||||
|
@ -56,11 +57,12 @@ export default class Connection {
|
|||
@bindThis
|
||||
public async fetch() {
|
||||
if (this.user == null) return;
|
||||
const [userProfile, following, followingChannels, userIdsWhoMeMuting, userIdsWhoBlockingMe, userIdsWhoMeMutingRenotes] = await Promise.all([
|
||||
const [userProfile, following, followingChannels, userIdsWhoMeMuting, userIdsWhoMeBlocking, userIdsWhoBlockingMe, userIdsWhoMeMutingRenotes] = await Promise.all([
|
||||
this.cacheService.userProfileCache.fetch(this.user.id),
|
||||
this.cacheService.userFollowingsCache.fetch(this.user.id),
|
||||
this.channelFollowingService.userFollowingChannelsCache.fetch(this.user.id),
|
||||
this.cacheService.userMutingsCache.fetch(this.user.id),
|
||||
this.cacheService.userBlockingCache.fetch(this.user.id),
|
||||
this.cacheService.userBlockedCache.fetch(this.user.id),
|
||||
this.cacheService.renoteMutingsCache.fetch(this.user.id),
|
||||
]);
|
||||
|
@ -68,6 +70,7 @@ export default class Connection {
|
|||
this.following = following;
|
||||
this.followingChannels = followingChannels;
|
||||
this.userIdsWhoMeMuting = userIdsWhoMeMuting;
|
||||
this.userIdsWhoMeBlocking = userIdsWhoMeBlocking;
|
||||
this.userIdsWhoBlockingMe = userIdsWhoBlockingMe;
|
||||
this.userIdsWhoMeMutingRenotes = userIdsWhoMeMutingRenotes;
|
||||
this.userMutedInstances = new Set(userProfile.mutedInstances);
|
||||
|
|
|
@ -42,6 +42,10 @@ export default abstract class Channel {
|
|||
return this.connection.userIdsWhoMeMutingRenotes;
|
||||
}
|
||||
|
||||
protected get userIdsWhoMeBlocking() {
|
||||
return this.connection.userIdsWhoMeBlocking;
|
||||
}
|
||||
|
||||
protected get userIdsWhoBlockingMe() {
|
||||
return this.connection.userIdsWhoBlockingMe;
|
||||
}
|
||||
|
@ -67,6 +71,10 @@ export default abstract class Channel {
|
|||
|
||||
// 流れてきたNoteがミュートしているユーザーが関わる
|
||||
if (isUserRelated(note, this.userIdsWhoMeMuting)) return true;
|
||||
|
||||
// 流れてきたNoteがブロックしているユーザーが関わる
|
||||
if (isUserRelated(note, this.userIdsWhoMeBlocking)) return true;
|
||||
|
||||
// 流れてきたNoteがブロックされているユーザーが関わる
|
||||
if (isUserRelated(note, this.userIdsWhoBlockingMe)) return true;
|
||||
|
||||
|
|
|
@ -49,6 +49,14 @@ class AntennaChannel extends Channel {
|
|||
|
||||
if (this.isNoteMutedOrBlocked(note)) return;
|
||||
|
||||
if (note.renote) {
|
||||
if (this.isNoteMutedOrBlocked(note.renote)) return;
|
||||
}
|
||||
|
||||
if (note.reply) {
|
||||
if (this.isNoteMutedOrBlocked(note.reply)) return;
|
||||
}
|
||||
|
||||
this.connection.cacheNote(note);
|
||||
|
||||
this.send('note', note);
|
||||
|
|
|
@ -48,6 +48,14 @@ class ChannelChannel extends Channel {
|
|||
|
||||
if (this.isNoteMutedOrBlocked(note)) return;
|
||||
|
||||
if (note.renote) {
|
||||
if (this.isNoteMutedOrBlocked(note.renote)) return;
|
||||
}
|
||||
|
||||
if (note.reply) {
|
||||
if (this.isNoteMutedOrBlocked(note.reply)) return;
|
||||
}
|
||||
|
||||
if (this.user && isRenotePacked(note) && !isQuotePacked(note)) {
|
||||
if (note.renote && Object.keys(note.renote.reactions).length > 0) {
|
||||
const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id);
|
||||
|
|
|
@ -78,6 +78,14 @@ class GlobalTimelineChannel extends Channel {
|
|||
|
||||
if (this.isNoteMutedOrBlocked(note)) return;
|
||||
|
||||
if (note.renote) {
|
||||
if (this.isNoteMutedOrBlocked(note.renote)) return;
|
||||
}
|
||||
|
||||
if (note.reply) {
|
||||
if (this.isNoteMutedOrBlocked(note.reply)) return;
|
||||
}
|
||||
|
||||
if (this.user && isRenotePacked(note) && !isQuotePacked(note)) {
|
||||
if (note.renote && Object.keys(note.renote.reactions).length > 0) {
|
||||
const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id);
|
||||
|
|
|
@ -59,6 +59,7 @@ class HomeTimelineChannel extends Channel {
|
|||
|
||||
if (note.reply) {
|
||||
const reply = note.reply;
|
||||
if (this.isNoteMutedOrBlocked(reply)) return;
|
||||
if (this.following[note.userId]?.withReplies) {
|
||||
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||
|
@ -70,6 +71,10 @@ class HomeTimelineChannel extends Channel {
|
|||
}
|
||||
}
|
||||
|
||||
if (note.renote) {
|
||||
if (this.isNoteMutedOrBlocked(note.renote)) return;
|
||||
}
|
||||
|
||||
// 純粋なリノート(引用リノートでないリノート)の場合
|
||||
if (note.renote && isRenotePacked(note) && !isQuotePacked(note)) {
|
||||
if (!this.withRenotes) return;
|
||||
|
|
|
@ -71,8 +71,15 @@ class HybridTimelineChannel extends Channel {
|
|||
if (!isMe && !note.visibleUserIds!.includes(this.user!.id)) return;
|
||||
}
|
||||
|
||||
if (this.isNoteMutedOrBlocked(note)) return;
|
||||
|
||||
if (note.renote) {
|
||||
if (this.isNoteMutedOrBlocked(note.renote)) return;
|
||||
}
|
||||
|
||||
if (note.reply) {
|
||||
const reply = note.reply;
|
||||
if (this.isNoteMutedOrBlocked(reply)) return;
|
||||
if ((this.following[note.userId]?.withReplies ?? false) || this.withReplies) {
|
||||
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||
|
|
|
@ -55,9 +55,14 @@ class LocalTimelineChannel extends Channel {
|
|||
if (this.withFiles && (note.fileIds == null || note.fileIds.length === 0)) return;
|
||||
if (this.withFiles && (note.files === undefined || note.files.length === 0)) return;
|
||||
|
||||
if (note.renote) {
|
||||
if (this.isNoteMutedOrBlocked(note.renote)) return;
|
||||
}
|
||||
|
||||
// 関係ない返信は除外
|
||||
if (note.reply) {
|
||||
const reply = note.reply;
|
||||
if (this.isNoteMutedOrBlocked(reply)) return;
|
||||
if ((this.following[note.userId]?.withReplies ?? false) || this.withReplies) {
|
||||
// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く
|
||||
if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return;
|
||||
|
|
|
@ -64,6 +64,14 @@ class RoleTimelineChannel extends Channel {
|
|||
|
||||
if (this.isNoteMutedOrBlocked(note)) return;
|
||||
|
||||
if (note.renote) {
|
||||
if (this.isNoteMutedOrBlocked(note.renote)) return;
|
||||
}
|
||||
|
||||
if (note.reply) {
|
||||
if (this.isNoteMutedOrBlocked(note.reply)) return;
|
||||
}
|
||||
|
||||
if (this.user && isRenotePacked(note) && !isQuotePacked(note)) {
|
||||
if (note.renote && Object.keys(note.renote.reactions).length > 0) {
|
||||
const myRenoteReaction = await this.noteEntityService.populateMyReaction(note.renote, this.user.id);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue