add v6 identify

This commit is contained in:
murdle 2026-01-04 04:14:25 +02:00
parent 501ec8e316
commit 5d13edf1be
2 changed files with 153 additions and 51 deletions

View File

@ -51,6 +51,7 @@ import {
Sticker, Sticker,
VoiceState, VoiceState,
UserSettingsProtos, UserSettingsProtos,
ReadyEventDataV6,
} from "@spacebar/util"; } from "@spacebar/util";
import { check } from "./instanceOf"; import { check } from "./instanceOf";
import { In } from "typeorm"; import { In } from "typeorm";
@ -539,42 +540,94 @@ export async function onIdentify(this: WebSocket, data: Payload) {
}); });
const remapReadStateIdsTime = taskSw.getElapsedAndReset(); const remapReadStateIdsTime = taskSw.getElapsedAndReset();
const d: ReadyEventData = { const base = {
v: 9,
application: application ? { id: application.id, flags: application.flags } : undefined,
user: user.toPrivateUser(), user: user.toPrivateUser(),
session_id: this.session_id,
resume_gateway_url:
Config.get().gateway.endpointClient ||
Config.get().gateway.endpointPublic ||
"ws://127.0.0.1:3001",
};
let d: ReadyEventData | ReadyEventDataV6;
if (this.version === 6) {
d = {
v: 6,
...base,
heartbeat_interval: 45_000,
guilds,
private_channels: channels,
presences: [],
relationships: user.relationships.map((x) => x.toPublicRelationship()),
users: Array.from(users),
notes: [],
user_settings: user.settings, user_settings: user.settings,
user_settings_proto: settingsProtos?.userSettings ? PreloadedUserSettings.toBase64(settingsProtos.userSettings) : undefined, read_state: read_states,
user_settings_proto_json: settingsProtos?.userSettings ? PreloadedUserSettings.toJson(settingsProtos.userSettings) : undefined, experiments: [],
guilds: this.capabilities.has(Capabilities.FLAGS.CLIENT_STATE_V2) ? guilds.map((x) => new ReadyGuildDTO(x).toJSON()) : guilds, guild_experiments: [],
user_guild_settings: [],
merged_members,
sessions: allSessions.map((s) => ({
session_id: s.session_id,
client_info: {
client: s.client_info?.client ?? "unknown",
os: s.client_info?.os ?? "unknown",
version: s.client_info?.version ?? null,
},
})),
connected_accounts: [],
friend_suggestion_count: 0,
analytics_token: "",
tutorial: {
indicators_suppressed: true,
indicators_confirmed: [],
},
notification_settings: {
flags: null,
},
game_relationships: [{}],
application: application
? { id: application.id, flags: application.flags }
: null,
};
} else {
d = {
v: 9,
...base,
user_settings: user.settings,
user_settings_proto: settingsProtos?.userSettings
? PreloadedUserSettings.toBase64(settingsProtos.userSettings)
: undefined,
user_settings_proto_json: settingsProtos?.userSettings
? PreloadedUserSettings.toJson(settingsProtos.userSettings)
: undefined,
guilds: this.capabilities.has(Capabilities.FLAGS.CLIENT_STATE_V2)
? guilds.map((x) => new ReadyGuildDTO(x).toJSON())
: guilds,
relationships: user.relationships.map((x) => x.toPublicRelationship()), relationships: user.relationships.map((x) => x.toPublicRelationship()),
read_state: { read_state: {
entries: read_states, entries: read_states,
partial: false, partial: false,
version: 0, // TODO version: 0,
}, },
user_guild_settings: { user_guild_settings: {
entries: user_guild_settings_entries, entries: user_guild_settings_entries,
partial: false, partial: false,
version: 0, // TODO version: 0,
}, },
private_channels: channels, private_channels: channels,
presences: [], presences: [],
session_id: this.session_id, country_code: user.settings.locale,
country_code: user.settings.locale, // TODO: do ip analysis instead
users: Array.from(users), users: Array.from(users),
merged_members: merged_members, merged_members,
sessions: allSessions, sessions: allSessions,
required_action:
resume_gateway_url: Config.get().gateway.endpointClient || Config.get().gateway.endpointPublic || "ws://127.0.0.1:3001", Config.get().login.requireVerification && !user.verified
? "REQUIRE_VERIFIED_EMAIL"
// lol hack whatever : undefined,
required_action: Config.get().login.requireVerification && !user.verified ? "REQUIRE_VERIFIED_EMAIL" : undefined,
consents: { consents: {
personalization: { personalization: { consented: false },
consented: false, // TODO
},
}, },
experiments: [], experiments: [],
guild_join_requests: [], guild_join_requests: [],
@ -585,14 +638,16 @@ export async function onIdentify(this: WebSocket, data: Payload) {
friend_suggestion_count: 0, friend_suggestion_count: 0,
analytics_token: "", analytics_token: "",
tutorial: null, tutorial: null,
session_type: "normal", // TODO session_type: "normal",
auth_session_id_hash: "", // TODO auth_session_id_hash: "",
notification_settings: { notification_settings: { flags: 0 },
// ????
flags: 0,
},
game_relationships: [], game_relationships: [],
application: application
? { id: application.id, flags: application.flags }
: undefined,
}; };
}
const buildReadyEventDataTime = taskSw.getElapsedAndReset(); const buildReadyEventDataTime = taskSw.getElapsedAndReset();
const _trace = [ const _trace = [
gatewayShardName, gatewayShardName,

View File

@ -64,6 +64,53 @@ export interface PublicRelationship {
// ! END Custom Events that shouldn't get sent to the client but processed by the server // ! END Custom Events that shouldn't get sent to the client but processed by the server
export interface ReadyEventDataV6 {
v: 6;
session_id: string;
resume_gateway_url: string;
heartbeat_interval: number;
user: UserPrivate;
guilds: GuildOrUnavailable[];
private_channels: ReadyPrivateChannel[];
presences: Presence[];
relationships: PublicRelationship[];
users: PublicUser[];
notes: {
id: string;
note: string;
}[];
user_settings: UserSettings;
read_state: ReadState[];
experiments: unknown[];
guild_experiments: unknown[];
user_guild_settings: unknown[];
merged_members: PublicMember[][];
sessions: {
session_id: string;
client_info: {
client: string;
os: string;
version: number | null;
};
}[];
connected_accounts: ConnectedAccount[];
friend_suggestion_count: number;
analytics_token: string;
tutorial: {
indicators_suppressed: boolean;
indicators_confirmed: string[];
};
notification_settings: {
flags: number | null;
};
game_relationships: unknown[];
application: {
id: string;
flags: number;
} | null;
_trace?: string[];
}
export interface ReadyEventData { export interface ReadyEventData {
v: number; v: number;
user: UserPrivate; user: UserPrivate;