mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-18 05:25:40 +09:00
perf(gateway): speed up presence and harden guild queries (#3072)
This commit is contained in:
1 parent
6e2f90b03c
commit
ab0b483fbe
44 files changed
+2166
-144
No files matched your search
@@ -20,6 +20,7 @@ import {handleGuildCountsUpdate} from '@app/features/guild/events/GuildCountsUpd
|
||||
import {handleGuildCreate} from '@app/features/guild/events/GuildCreate';
|
||||
import {handleGuildDelete} from '@app/features/guild/events/GuildDelete';
|
||||
import {handleGuildEmojisUpdate} from '@app/features/guild/events/GuildEmojisUpdate';
|
||||
import {handleGuildHealthUpdate} from '@app/features/guild/events/GuildHealthUpdate';
|
||||
import {handleGuildMemberAdd} from '@app/features/guild/events/GuildMemberAdd';
|
||||
import {handleGuildMemberListUpdate} from '@app/features/guild/events/GuildMemberListUpdate';
|
||||
import {handleGuildMemberRemove} from '@app/features/guild/events/GuildMemberRemove';
|
||||
@@ -112,6 +113,7 @@ export function createHandlerRegistry(): GatewayHandlerRegistry {
|
||||
registry.set('GUILD_MEMBERS_CHUNK', handleGuildMembersChunk as GatewayEventHandler);
|
||||
registry.set('GUILD_MEMBER_LIST_UPDATE', handleGuildMemberListUpdate as GatewayEventHandler);
|
||||
registry.set('GUILD_COUNTS_UPDATE', handleGuildCountsUpdate as GatewayEventHandler);
|
||||
registry.set('GUILD_HEALTH_UPDATE', handleGuildHealthUpdate as GatewayEventHandler);
|
||||
registry.set('CHANNEL_MEMBER_COUNTS_UPDATE', handleChannelMemberCountsUpdate as GatewayEventHandler);
|
||||
registry.set('GUILD_ROLE_CREATE', handleGuildRoleCreate as GatewayEventHandler);
|
||||
registry.set('GUILD_ROLE_UPDATE', handleGuildRoleUpdate as GatewayEventHandler);
|
||||
|
||||
@@ -23,4 +23,5 @@ export type GuildReadyData = Readonly<{
|
||||
joined_at: string;
|
||||
unavailable?: boolean;
|
||||
unavailable_hidden?: boolean;
|
||||
degraded?: boolean;
|
||||
}>;
|
||||
@@ -48,6 +48,9 @@ export function handleGuildCreate(data: GuildReadyData, _context: GatewayHandler
|
||||
return;
|
||||
}
|
||||
GuildAvailability.setGuildAvailable(data.id);
|
||||
if (!isSync || data.degraded !== undefined) {
|
||||
GuildAvailability.setGuildDegraded(data.id, data.degraded === true);
|
||||
}
|
||||
Guilds.handleGuildCreate(data);
|
||||
GuildCount.handleGuildCreate(data);
|
||||
if (!isSync) {
|
||||
|
||||
@@ -32,6 +32,7 @@ interface GuildDeletePayload {
|
||||
}
|
||||
|
||||
export function handleGuildDelete(data: GuildDeletePayload, _context: GatewayHandlerContext): void {
|
||||
GuildAvailability.setGuildDegraded(data.id, false);
|
||||
GuildAvailability.handleGuildAvailability(data.id, data.unavailable, data.unavailable_hidden);
|
||||
Guilds.handleGuildDelete({guildId: data.id, unavailable: data.unavailable});
|
||||
GuildList.handleGuildDelete(data.id, data.unavailable);
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import GuildAvailability from '@app/features/guild/state/GuildAvailability';
|
||||
import Guilds from '@app/features/guild/state/Guilds';
|
||||
|
||||
export function handleGuildHealthUpdate(data: {guild_id: string; degraded: boolean}): void {
|
||||
if (Guilds.getGuild(data.guild_id)) {
|
||||
GuildAvailability.setGuildDegraded(data.guild_id, data.degraded);
|
||||
}
|
||||
}
|
||||
@@ -5,12 +5,14 @@ import {makeAutoObservable, observable} from 'mobx';
|
||||
|
||||
class GuildAvailability {
|
||||
unavailableGuilds: Set<string> = observable.set();
|
||||
degradedGuilds: Set<string> = observable.set();
|
||||
|
||||
constructor() {
|
||||
makeAutoObservable(
|
||||
this,
|
||||
{
|
||||
unavailableGuilds: false,
|
||||
degradedGuilds: false,
|
||||
},
|
||||
{autoBind: true},
|
||||
);
|
||||
@@ -23,11 +25,20 @@ class GuildAvailability {
|
||||
}
|
||||
|
||||
setGuildUnavailable(guildId: string): void {
|
||||
this.degradedGuilds.delete(guildId);
|
||||
if (!this.unavailableGuilds.has(guildId)) {
|
||||
this.unavailableGuilds.add(guildId);
|
||||
}
|
||||
}
|
||||
|
||||
setGuildDegraded(guildId: string, degraded: boolean): void {
|
||||
if (degraded) {
|
||||
this.degradedGuilds.add(guildId);
|
||||
} else {
|
||||
this.degradedGuilds.delete(guildId);
|
||||
}
|
||||
}
|
||||
|
||||
handleGuildAvailability(guildId: string, unavailable = false, unavailableHidden = false): void {
|
||||
if (unavailable && !unavailableHidden) {
|
||||
this.setGuildUnavailable(guildId);
|
||||
@@ -38,7 +49,11 @@ class GuildAvailability {
|
||||
|
||||
loadUnavailableGuilds(guilds: ReadonlyArray<GuildReadyData>): void {
|
||||
this.unavailableGuilds.clear();
|
||||
this.degradedGuilds.clear();
|
||||
for (const guild of guilds) {
|
||||
if (guild.degraded && !guild.unavailable) {
|
||||
this.degradedGuilds.add(guild.id);
|
||||
}
|
||||
if (guild.unavailable && !guild.unavailable_hidden) {
|
||||
this.unavailableGuilds.add(guild.id);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user