pvtchat/backend/src/ws/ws-events/guild-member-remove.ts

74 lines
2.6 KiB
TypeScript
Raw Normal View History

2022-12-16 00:38:45 +00:00
import { WS } from '@acrd/types';
2021-08-22 19:25:02 +01:00
import { Socket } from 'socket.io';
import { GuildDocument } from '../../data/models/guild';
2021-08-25 12:10:19 +01:00
import { GuildMember } from '../../data/models/guild-member';
import { SelfUserDocument } from '../../data/models/user';
2021-08-22 19:25:02 +01:00
import { WebSocket } from '../websocket';
2021-08-23 16:48:36 +01:00
import { WSEvent, } from './ws-event';
2021-08-22 19:25:02 +01:00
export default class implements WSEvent<'GUILD_MEMBER_REMOVE'> {
public on = 'GUILD_MEMBER_REMOVE' as const;
2021-08-22 19:25:02 +01:00
2021-08-24 17:14:24 +01:00
public async invoke(ws: WebSocket, client: Socket, { guildId, userId }: WS.Params.GuildMemberRemove) {
const guild = await deps.guilds.get(guildId);
const members = await deps.guilds.getMembers(guildId);
2022-12-16 00:38:45 +00:00
const member = members.find(m => m.userId === userId);
2021-08-22 19:25:02 +01:00
if (!member)
throw new TypeError('Member does not exist');
const selfUserId = ws.sessions.get(client.id);
if (guild.ownerId === member.userId)
throw new TypeError('You cannot leave a guild you own, check guild settings to delete guild');
2022-12-16 00:38:45 +00:00
2021-08-22 19:25:02 +01:00
else if (selfUserId !== member.userId)
await deps.wsGuard.validateCan(client, guildId, 'KICK_MEMBERS');
// TODO: validate user is higher before kicking them
2022-12-16 00:38:45 +00:00
const user = await deps.users.getSelf(member.userId);
2021-08-25 20:56:31 +01:00
const index = user.guildIds.indexOf(guildId);
user.guildIds.splice(index, 1);
2021-08-22 19:25:02 +01:00
await user.save();
2021-08-24 17:14:24 +01:00
await GuildMember.deleteOne({ guildId, userId });
2021-08-22 19:25:02 +01:00
const targetClientId = ws.sessions.getClientIdFromUserId(userId);
if (targetClientId) {
const memberClient = ws.io.sockets.sockets.get(targetClientId);
2021-09-09 12:35:20 +01:00
memberClient?.emit('GUILD_DELETE', { guildId } as WS.Args.GuildDelete);
await client.leave(guildId);
}
2022-12-16 00:38:45 +00:00
await this.leaveGuildRooms(client, guild);
2021-08-25 20:56:31 +01:00
return [await this.leaveGuildMessage(guild, user), {
emit: this.on,
to: [guildId],
send: { memberId: member.id },
}, {
emit: 'GUILD_DELETE' as const,
to: [userId],
send: { guildId },
}];
2021-11-15 18:20:44 +00:00
}
2022-12-16 00:38:45 +00:00
private async leaveGuildMessage(guild: GuildDocument, user: SelfUserDocument) {
2021-11-15 18:20:44 +00:00
try {
const sysMessage = await deps.messages.createSystem(guild.id, `<@${user.id}> left the guild.`, 'GUILD_MEMBER_LEAVE');
2022-12-16 00:38:45 +00:00
return {
emit: 'MESSAGE_CREATE' as const,
to: [guild.systemChannelId!],
send: { message: sysMessage },
};
2022-12-16 00:38:45 +00:00
} catch { }
2021-08-22 19:25:02 +01:00
}
private async leaveGuildRooms(client: Socket, guild: GuildDocument) {
await client.leave(guild.id);
const guildChannels = await deps.guilds.getChannels(guild.id);
2021-08-25 11:02:42 +01:00
for (const channel of guildChannels)
2021-08-22 19:25:02 +01:00
await client.leave(channel.id);
}
}