diff --git a/gateway/src/events/Connection.ts b/gateway/src/events/Connection.ts
index c1a6b618..2cf22f7d 100644
--- a/gateway/src/events/Connection.ts
+++ b/gateway/src/events/Connection.ts
@@ -24,6 +24,7 @@ export async function Connection(
request: IncomingMessage
) {
try {
+ // @ts-ignore
socket.on("close", Close);
// @ts-ignore
socket.on("message", Message);
@@ -68,12 +69,10 @@ export async function Connection(
});
socket.readyTimeout = setTimeout(() => {
- Session.delete({ session_id: socket.session_id }); //should we await?
return socket.close(CLOSECODES.Session_timed_out);
}, 1000 * 30);
} catch (error) {
console.error(error);
- Session.delete({ session_id: socket.session_id }); //should we await?
return socket.close(CLOSECODES.Unknown_error);
}
}
diff --git a/gateway/src/listener/listener.ts b/gateway/src/listener/listener.ts
index ee640f38..c5b1a576 100644
--- a/gateway/src/listener/listener.ts
+++ b/gateway/src/listener/listener.ts
@@ -178,7 +178,7 @@ async function consume(this: WebSocket, opts: EventOpts) {
case "CHANNEL_CREATE":
case "CHANNEL_DELETE":
case "CHANNEL_UPDATE":
- case "GUILD_EMOJI_UPDATE":
+ case "GUILD_EMOJIS_UPDATE":
case "READY": // will be sent by the gateway
case "USER_UPDATE":
case "APPLICATION_COMMAND_CREATE":
diff --git a/gateway/src/opcodes/Identify.ts b/gateway/src/opcodes/Identify.ts
index 6decf21c..673dde9d 100644
--- a/gateway/src/opcodes/Identify.ts
+++ b/gateway/src/opcodes/Identify.ts
@@ -11,6 +11,7 @@ import {
PublicMember,
PublicUser,
PrivateUserProjection,
+ ReadState,
} from "@fosscord/util";
import { Send } from "../util/Send";
import { CLOSECODES, OPCODES } from "../util/Constants";
@@ -40,7 +41,7 @@ export async function onIdentify(this: WebSocket, data: Payload) {
return this.close(CLOSECODES.Authentication_failed);
}
this.user_id = decoded.id;
- if (!identify.intents) identify.intents = 0b11111111111111n;
+ if (!identify.intents) identify.intents = BigInt("0b11111111111111");
this.intents = new Intents(identify.intents);
if (identify.shard) {
this.shard_id = identify.shard[0];
@@ -64,6 +65,7 @@ export async function onIdentify(this: WebSocket, data: Payload) {
"guild",
"guild.channels",
"guild.emojis",
+ "guild.emojis.user",
"guild.roles",
"guild.stickers",
"user",
@@ -92,7 +94,7 @@ export async function onIdentify(this: WebSocket, data: Payload) {
// @ts-ignore
x.channel.recipients = x.channel.recipients?.map((x) => x.user);
//TODO is this needed? check if users in group dm that are not friends are sent in the READY event
- //users = users.concat(x.channel.recipients);
+ users = users.concat(x.channel.recipients as unknown as User[]);
if (x.channel.isDm()) {
x.channel.recipients = x.channel.recipients!.filter(
(x) => x.id !== this.user_id
@@ -138,6 +140,13 @@ export async function onIdentify(this: WebSocket, data: Payload) {
//We save the session and we delete it when the websocket is closed
await session.save();
+ const read_states = await ReadState.find({ user_id: this.user_id });
+ read_states.forEach((s: any) => {
+ s.id = s.channel_id;
+ delete s.user_id;
+ delete s.channel_id;
+ });
+
const privateUser = {
avatar: user.avatar,
mobile: user.mobile,
@@ -176,8 +185,7 @@ export async function onIdentify(this: WebSocket, data: Payload) {
geo_ordered_rtc_regions: [], // TODO
relationships: user.relationships.map((x) => x.toPublicRelationship()),
read_state: {
- // TODO
- entries: [],
+ entries: read_states,
partial: false,
version: 304128,
},
@@ -200,7 +208,7 @@ export async function onIdentify(this: WebSocket, data: Payload) {
// @ts-ignore
experiments: experiments, // TODO
guild_join_requests: [], // TODO what is this?
- users: users.unique(),
+ users: users.filter((x) => x).unique(),
merged_members: merged_members,
// shard // TODO: only for bots sharding
// application // TODO for applications
diff --git a/gateway/src/opcodes/LazyRequest.ts b/gateway/src/opcodes/LazyRequest.ts
index d37e32da..f5fd561a 100644
--- a/gateway/src/opcodes/LazyRequest.ts
+++ b/gateway/src/opcodes/LazyRequest.ts
@@ -41,6 +41,7 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) {
const items = [];
for (const role of roles) {
+ // @ts-ignore
const [role_members, other_members] = partition(members, (m: Member) =>
m.roles.find((r) => r.id === role.id)
);
@@ -53,9 +54,12 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) {
groups.push(group);
for (const member of role_members) {
- member.roles = member.roles.filter((x) => x.id !== guild_id);
+ member.roles = member.roles.filter((x: Role) => x.id !== guild_id);
items.push({
- member: { ...member, roles: member.roles.map((x) => x.id) },
+ member: {
+ ...member,
+ roles: member.roles.map((x: Role) => x.id),
+ },
});
}
members = other_members;
@@ -84,7 +88,9 @@ export async function onLazyRequest(this: WebSocket, { d }: Payload) {
}
function partition<T>(array: T[], isValid: Function) {
+ // @ts-ignore
return array.reduce(
+ // @ts-ignore
([pass, fail], elem) => {
return isValid(elem)
? [[...pass, elem], fail]
|