add channel_muting services

This commit is contained in:
samunohito 2024-06-10 20:36:30 +09:00
parent cbc256b7ce
commit 94ededa68d
5 changed files with 166 additions and 14 deletions

View file

@ -12,8 +12,9 @@ import type { NotificationService } from '@/core/NotificationService.js';
import { bindThis } from '@/decorators.js';
import { CacheService } from '@/core/CacheService.js';
import { MiFollowing, MiUserProfile } from '@/models/_.js';
import type { StreamEventEmitter, GlobalEvents } from '@/core/GlobalEventService.js';
import type { GlobalEvents, StreamEventEmitter } from '@/core/GlobalEventService.js';
import { ChannelFollowingService } from '@/core/ChannelFollowingService.js';
import { ChannelMutingService } from '@/core/ChannelMutingService.js';
import type { ChannelsService } from './ChannelsService.js';
import type { EventEmitter } from 'events';
import type Channel from './channel.js';
@ -33,10 +34,12 @@ export default class Connection {
public userProfile: MiUserProfile | null = null;
public following: Record<string, Pick<MiFollowing, 'withReplies'> | undefined> = {};
public followingChannels: Set<string> = new Set();
public mutingChannels: Set<string> = new Set();
public userIdsWhoMeMuting: Set<string> = new Set();
public userIdsWhoBlockingMe: Set<string> = new Set();
public userIdsWhoMeMutingRenotes: Set<string> = new Set();
public userMutedInstances: Set<string> = new Set();
public userMutedChannels: Set<string> = new Set();
private fetchIntervalId: NodeJS.Timeout | null = null;
constructor(
@ -45,7 +48,7 @@ export default class Connection {
private notificationService: NotificationService,
private cacheService: CacheService,
private channelFollowingService: ChannelFollowingService,
private channelMutingService: ChannelMutingService,
user: MiUser | null | undefined,
token: MiAccessToken | null | undefined,
) {
@ -56,10 +59,19 @@ 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,
mutingChannels,
userIdsWhoMeMuting,
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.channelMutingService.userMutingChannelsCache.fetch(this.user.id),
this.cacheService.userMutingsCache.fetch(this.user.id),
this.cacheService.userBlockedCache.fetch(this.user.id),
this.cacheService.renoteMutingsCache.fetch(this.user.id),
@ -67,6 +79,7 @@ export default class Connection {
this.userProfile = userProfile;
this.following = following;
this.followingChannels = followingChannels;
this.mutingChannels = mutingChannels;
this.userIdsWhoMeMuting = userIdsWhoMeMuting;
this.userIdsWhoBlockingMe = userIdsWhoBlockingMe;
this.userIdsWhoMeMutingRenotes = userIdsWhoMeMutingRenotes;
@ -112,16 +125,37 @@ export default class Connection {
const { type, body } = obj;
switch (type) {
case 'readNotification': this.onReadNotification(body); break;
case 'subNote': this.onSubscribeNote(body); break;
case 's': this.onSubscribeNote(body); break; // alias
case 'sr': this.onSubscribeNote(body); this.readNote(body); break;
case 'unsubNote': this.onUnsubscribeNote(body); break;
case 'un': this.onUnsubscribeNote(body); break; // alias
case 'connect': this.onChannelConnectRequested(body); break;
case 'disconnect': this.onChannelDisconnectRequested(body); break;
case 'channel': this.onChannelMessageRequested(body); break;
case 'ch': this.onChannelMessageRequested(body); break; // alias
case 'readNotification':
this.onReadNotification(body);
break;
case 'subNote':
this.onSubscribeNote(body);
break;
case 's':
this.onSubscribeNote(body);
break; // alias
case 'sr':
this.onSubscribeNote(body);
this.readNote(body);
break;
case 'unsubNote':
this.onUnsubscribeNote(body);
break;
case 'un':
this.onUnsubscribeNote(body);
break; // alias
case 'connect':
this.onChannelConnectRequested(body);
break;
case 'disconnect':
this.onChannelDisconnectRequested(body);
break;
case 'channel':
this.onChannelMessageRequested(body);
break;
case 'ch':
this.onChannelMessageRequested(body);
break; // alias
}
}

View file

@ -6,7 +6,7 @@
import { bindThis } from '@/decorators.js';
import { isInstanceMuted } from '@/misc/is-instance-muted.js';
import { isUserRelated } from '@/misc/is-user-related.js';
import { isRenotePacked, isQuotePacked } from '@/misc/is-renote.js';
import { isQuotePacked, isRenotePacked } from '@/misc/is-renote.js';
import type { Packed } from '@/misc/json-schema.js';
import type Connection from './Connection.js';
@ -54,6 +54,10 @@ export default abstract class Channel {
return this.connection.followingChannels;
}
protected get mutingChannels() {
return this.connection.mutingChannels;
}
protected get subscriber() {
return this.connection.subscriber;
}