mirror of
https://github.com/discordeno/discordeno.git
synced 2026-06-01 08:20:08 +00:00
refactor export type into interfaces
This commit is contained in:
@@ -190,9 +190,7 @@ function handleDiscordPayload(data: DiscordPayload) {
|
||||
guild.memberCount = memberCount;
|
||||
const member = createMember(
|
||||
options,
|
||||
guild.id,
|
||||
[...guild.roles.values()].map((role) => role.raw),
|
||||
guild.ownerID,
|
||||
guild,
|
||||
);
|
||||
guild.members.set(options.user.id, member);
|
||||
cache.users.set(options.user.id, createUser(member.user));
|
||||
@@ -232,9 +230,7 @@ function handleDiscordPayload(data: DiscordPayload) {
|
||||
};
|
||||
const member = createMember(
|
||||
newMemberData,
|
||||
options.guild_id,
|
||||
[...guild.roles.values()].map((r) => r.raw),
|
||||
guild.ownerID,
|
||||
guild,
|
||||
);
|
||||
guild.members.set(options.user.id, member);
|
||||
cache.users.set(options.user.id, createUser(member.user));
|
||||
@@ -274,9 +270,7 @@ function handleDiscordPayload(data: DiscordPayload) {
|
||||
member.user.id,
|
||||
createMember(
|
||||
member,
|
||||
options.guild_id,
|
||||
[...guild.roles.values()].map((r) => r.raw),
|
||||
guild.ownerID,
|
||||
guild,
|
||||
),
|
||||
);
|
||||
cache.users.set(member.user.id, createUser(member.user));
|
||||
@@ -341,9 +335,7 @@ function handleDiscordPayload(data: DiscordPayload) {
|
||||
options.author.id,
|
||||
createMember(
|
||||
{ ...options.member, user: options.author },
|
||||
options.guild_id,
|
||||
[...guild.roles.values()].map((r) => r.raw),
|
||||
guild.ownerID,
|
||||
guild,
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -418,9 +410,7 @@ function handleDiscordPayload(data: DiscordPayload) {
|
||||
if (guild) {
|
||||
const member = createMember(
|
||||
options.member,
|
||||
options.guild_id,
|
||||
[...guild.roles.values()].map((r) => r.raw),
|
||||
guild.ownerID,
|
||||
guild,
|
||||
);
|
||||
guild.members.set(
|
||||
options.member.user.id,
|
||||
|
||||
@@ -213,4 +213,4 @@ export function createChannel(data: ChannelCreatePayload) {
|
||||
return channel;
|
||||
}
|
||||
|
||||
export type Channel = ReturnType<typeof createChannel>;
|
||||
export interface Channel extends ReturnType<typeof createChannel> {}
|
||||
|
||||
@@ -15,7 +15,7 @@ import {
|
||||
FetchMembersOptions,
|
||||
} from "../types/guild.ts";
|
||||
import { createRole } from "./role.ts";
|
||||
import { createMember } from "./member.ts";
|
||||
import { createMember, Member } from "./member.ts";
|
||||
import { createChannel } from "./channel.ts";
|
||||
import {
|
||||
CreateChannelOptions,
|
||||
@@ -70,11 +70,7 @@ export const createGuild = (data: CreateGuildPayload) => {
|
||||
/** When this guild was joined at. */
|
||||
joinedAt: Date.parse(data.joined_at),
|
||||
/** The users in this guild. */
|
||||
members: new Map(
|
||||
data.members.map((
|
||||
m,
|
||||
) => [m.user.id, createMember(m, data.id, data.roles, data.owner_id)]),
|
||||
),
|
||||
members: new Map<string, Member>(),
|
||||
/** The channels in the guild */
|
||||
channels: new Map(data.channels.map((c) => [c.id, createChannel(c)])),
|
||||
/** The presences of all the users in the guild. */
|
||||
@@ -225,7 +221,7 @@ export const createGuild = (data: CreateGuildPayload) => {
|
||||
|
||||
const roleData = role_data as RoleData;
|
||||
const role = createRole(roleData);
|
||||
guild.roles.set(roleData.id, role);
|
||||
// guild.roles.set(roleData.id, role);
|
||||
return role;
|
||||
},
|
||||
/** Edit a guild role. Requires the MANAGE_ROLES permission. */
|
||||
@@ -473,7 +469,11 @@ export const createGuild = (data: CreateGuildPayload) => {
|
||||
},
|
||||
};
|
||||
|
||||
data.members.forEach((m) =>
|
||||
guild.members.set(m.user.id, createMember(m, guild))
|
||||
);
|
||||
|
||||
return guild;
|
||||
};
|
||||
|
||||
export type Guild = ReturnType<typeof createGuild>;
|
||||
export interface Guild extends ReturnType<typeof createGuild> {}
|
||||
|
||||
@@ -3,7 +3,6 @@ import { formatImageURL } from "../utils/cdn.ts";
|
||||
import { MemberCreatePayload, EditMemberOptions } from "../types/member.ts";
|
||||
import { ImageSize, ImageFormats } from "../types/cdn.ts";
|
||||
import { Permission, Permissions } from "../types/permission.ts";
|
||||
import { RoleData } from "../types/role.ts";
|
||||
import {
|
||||
memberHasPermission,
|
||||
botHasPermission,
|
||||
@@ -13,13 +12,9 @@ import {
|
||||
import { Errors } from "../types/errors.ts";
|
||||
import { RequestManager } from "../module/requestManager.ts";
|
||||
import { botID } from "../module/client.ts";
|
||||
import { Guild } from "./guild.ts";
|
||||
|
||||
export const createMember = (
|
||||
data: MemberCreatePayload,
|
||||
guildID: string,
|
||||
roleData: RoleData[],
|
||||
ownerID: string,
|
||||
) => ({
|
||||
export const createMember = (data: MemberCreatePayload, guild: Guild) => ({
|
||||
...data,
|
||||
/** The complete raw data from the member create payload */
|
||||
raw: data,
|
||||
@@ -43,45 +38,45 @@ export const createMember = (
|
||||
: endpoints.USER_DEFAULT_AVATAR(Number(data.user.discriminator) % 5),
|
||||
/** Add a role to the member */
|
||||
addRole: (roleID: string, reason?: string) => {
|
||||
const botsHighestRole = highestRole(guildID, botID);
|
||||
const botsHighestRole = highestRole(guild.id, botID);
|
||||
if (
|
||||
botsHighestRole &&
|
||||
!higherRolePosition(guildID, botsHighestRole.id, roleID)
|
||||
!higherRolePosition(guild.id, botsHighestRole.id, roleID)
|
||||
) {
|
||||
throw new Error(Errors.BOTS_HIGHEST_ROLE_TOO_LOW);
|
||||
}
|
||||
|
||||
if (!botHasPermission(guildID, [Permissions.MANAGE_ROLES])) {
|
||||
if (!botHasPermission(guild.id, [Permissions.MANAGE_ROLES])) {
|
||||
throw new Error(Errors.MISSING_MANAGE_ROLES);
|
||||
}
|
||||
|
||||
return RequestManager.put(
|
||||
endpoints.GUILD_MEMBER_ROLE(guildID, data.user.id, roleID),
|
||||
endpoints.GUILD_MEMBER_ROLE(guild.id, data.user.id, roleID),
|
||||
{ reason },
|
||||
);
|
||||
},
|
||||
/** Remove a role from the member */
|
||||
removeRole: (roleID: string, reason?: string) => {
|
||||
const botsHighestRole = highestRole(guildID, botID);
|
||||
const botsHighestRole = highestRole(guild.id, botID);
|
||||
if (
|
||||
botsHighestRole &&
|
||||
!higherRolePosition(guildID, botsHighestRole.id, roleID)
|
||||
!higherRolePosition(guild.id, botsHighestRole.id, roleID)
|
||||
) {
|
||||
throw new Error(Errors.BOTS_HIGHEST_ROLE_TOO_LOW);
|
||||
}
|
||||
|
||||
if (!botHasPermission(guildID, [Permissions.MANAGE_ROLES])) {
|
||||
if (!botHasPermission(guild.id, [Permissions.MANAGE_ROLES])) {
|
||||
throw new Error(Errors.MISSING_MANAGE_ROLES);
|
||||
}
|
||||
return RequestManager.delete(
|
||||
endpoints.GUILD_MEMBER_ROLE(guildID, data.user.id, roleID),
|
||||
endpoints.GUILD_MEMBER_ROLE(guild.id, data.user.id, roleID),
|
||||
{ reason },
|
||||
);
|
||||
},
|
||||
/** Kick a member from the server */
|
||||
kick: (reason?: string) => {
|
||||
const botsHighestRole = highestRole(guildID, botID);
|
||||
const membersHighestRole = highestRole(guildID, data.user.id);
|
||||
const botsHighestRole = highestRole(guild.id, botID);
|
||||
const membersHighestRole = highestRole(guild.id, data.user.id);
|
||||
if (
|
||||
botsHighestRole && membersHighestRole &&
|
||||
botsHighestRole.position <= membersHighestRole.position
|
||||
@@ -89,11 +84,11 @@ export const createMember = (
|
||||
throw new Error(Errors.BOTS_HIGHEST_ROLE_TOO_LOW);
|
||||
}
|
||||
|
||||
if (!botHasPermission(guildID, [Permissions.KICK_MEMBERS])) {
|
||||
if (!botHasPermission(guild.id, [Permissions.KICK_MEMBERS])) {
|
||||
throw new Error(Errors.MISSING_KICK_MEMBERS);
|
||||
}
|
||||
return RequestManager.delete(
|
||||
endpoints.GUILD_MEMBER(guildID, data.user.id),
|
||||
endpoints.GUILD_MEMBER(guild.id, data.user.id),
|
||||
{ reason },
|
||||
);
|
||||
},
|
||||
@@ -103,14 +98,14 @@ export const createMember = (
|
||||
if (options.nick.length > 32) {
|
||||
throw new Error(Errors.NICKNAMES_MAX_LENGTH);
|
||||
}
|
||||
if (!botHasPermission(guildID, [Permissions.MANAGE_NICKNAMES])) {
|
||||
if (!botHasPermission(guild.id, [Permissions.MANAGE_NICKNAMES])) {
|
||||
throw new Error(Errors.MISSING_MANAGE_NICKNAMES);
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
options.roles &&
|
||||
!botHasPermission(guildID, [Permissions.MANAGE_ROLES])
|
||||
!botHasPermission(guild.id, [Permissions.MANAGE_ROLES])
|
||||
) {
|
||||
throw new Error(Errors.MISSING_MANAGE_ROLES);
|
||||
}
|
||||
@@ -118,7 +113,7 @@ export const createMember = (
|
||||
if (options.mute) {
|
||||
// TODO: This should check if the member is in a voice channel
|
||||
if (
|
||||
!botHasPermission(guildID, [Permissions.MUTE_MEMBERS])
|
||||
!botHasPermission(guild.id, [Permissions.MUTE_MEMBERS])
|
||||
) {
|
||||
throw new Error(Errors.MISSING_MUTE_MEMBERS);
|
||||
}
|
||||
@@ -126,7 +121,7 @@ export const createMember = (
|
||||
|
||||
if (
|
||||
options.deaf &&
|
||||
!botHasPermission(guildID, [Permissions.DEAFEN_MEMBERS])
|
||||
!botHasPermission(guild.id, [Permissions.DEAFEN_MEMBERS])
|
||||
) {
|
||||
throw new Error(Errors.MISSING_DEAFEN_MEMBERS);
|
||||
}
|
||||
@@ -134,7 +129,7 @@ export const createMember = (
|
||||
// TODO: if channel id is provided check if the bot has CONNECT and MOVE in channel and current channel
|
||||
|
||||
return RequestManager.patch(
|
||||
endpoints.GUILD_MEMBER(guildID, data.user.id),
|
||||
endpoints.GUILD_MEMBER(guild.id, data.user.id),
|
||||
options,
|
||||
);
|
||||
},
|
||||
@@ -142,10 +137,11 @@ export const createMember = (
|
||||
hasPermissions: (permissions: Permission[]) => {
|
||||
return memberHasPermission(
|
||||
data.user.id,
|
||||
ownerID,
|
||||
roleData,
|
||||
guild,
|
||||
data.roles,
|
||||
permissions,
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
export interface Member extends ReturnType<typeof createMember> {}
|
||||
|
||||
@@ -160,4 +160,4 @@ export function createMessage(data: MessageCreateOptions) {
|
||||
};
|
||||
}
|
||||
|
||||
export type Message = ReturnType<typeof createMessage>;
|
||||
export interface Message extends ReturnType<typeof createMessage> {}
|
||||
|
||||
@@ -8,4 +8,4 @@ export const createRole = (data: RoleData) => ({
|
||||
mention: `<@&${data.id}>`,
|
||||
});
|
||||
|
||||
export type Role = ReturnType<typeof createRole>;
|
||||
export interface Role extends ReturnType<typeof createRole> {}
|
||||
|
||||
@@ -29,4 +29,4 @@ export const createUser = (data: UserPayload) => ({
|
||||
: endpoints.USER_DEFAULT_AVATAR(Number(data.discriminator) % 5),
|
||||
});
|
||||
|
||||
export type User = ReturnType<typeof createUser>;
|
||||
export interface User extends ReturnType<typeof createUser> {}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { createMember } from "../structures/member.ts";
|
||||
import { UserPayload } from "./guild.ts";
|
||||
|
||||
export interface EditMemberOptions {
|
||||
@@ -30,5 +29,3 @@ export interface MemberCreatePayload {
|
||||
/** Whether the user is muted in voice channels */
|
||||
mute: boolean;
|
||||
}
|
||||
|
||||
export type Member = ReturnType<typeof createMember>;
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { ChannelType, UserPayload } from "./guild.ts";
|
||||
import { User } from "../structures/user.ts";
|
||||
import { Member, MemberCreatePayload } from "./member.ts";
|
||||
import { MemberCreatePayload } from "./member.ts";
|
||||
import { Channel } from "../structures/channel.ts";
|
||||
import { Member } from "../structures/member.ts";
|
||||
|
||||
export interface MentionedUser extends User {
|
||||
member: Member;
|
||||
|
||||
@@ -7,7 +7,6 @@ import {
|
||||
VoiceStateUpdatePayload,
|
||||
} from "./discord.ts";
|
||||
import { User } from "../structures/user.ts";
|
||||
import { Member } from "./member.ts";
|
||||
import { Role } from "../structures/role.ts";
|
||||
import { Message } from "../structures/message.ts";
|
||||
import {
|
||||
@@ -19,6 +18,7 @@ import {
|
||||
} from "./message.ts";
|
||||
import { Channel } from "../structures/channel.ts";
|
||||
import { Guild } from "../structures/guild.ts";
|
||||
import { Member } from "../structures/member.ts";
|
||||
|
||||
export interface Fulfilled_Client_Options {
|
||||
token: string;
|
||||
|
||||
@@ -1,26 +1,33 @@
|
||||
import { Permission, Permissions } from "../types/permission.ts";
|
||||
import { RoleData } from "../types/role.ts";
|
||||
import { cache } from "./cache.ts";
|
||||
import { botID } from "../module/client.ts";
|
||||
import { Role } from "../structures/role.ts";
|
||||
import { Guild } from "../structures/guild.ts";
|
||||
|
||||
export function memberHasPermission(
|
||||
memberID: string,
|
||||
ownerID: string,
|
||||
roleData: RoleData[],
|
||||
guild: Guild,
|
||||
memberRoleIDs: string[],
|
||||
permissions: Permission[],
|
||||
) {
|
||||
if (memberID === ownerID) return true;
|
||||
|
||||
const permissionBits = roleData
|
||||
.filter((role) => memberRoleIDs.includes(role.id))
|
||||
.reduce((bits, data) => {
|
||||
bits |= data.permissions;
|
||||
if (memberID === guild.ownerID) return true;
|
||||
|
||||
const permissionBits = memberRoleIDs.map((id) =>
|
||||
guild.roles.get(id)?.permissions || 0
|
||||
)
|
||||
.reduce((bits, permissions) => {
|
||||
bits |= permissions;
|
||||
return bits;
|
||||
}, 0);
|
||||
|
||||
// const permissionBits = [...guild.roles.values()]
|
||||
// .filter((role) => memberRoleIDs.includes(role.id))
|
||||
// .map((role) => role.permissions)
|
||||
// .reduce((bits, permissions) => {
|
||||
// bits |= permissions;
|
||||
// return bits;
|
||||
// }, 0);
|
||||
|
||||
if (permissionBits & Permissions.ADMINISTRATOR) return true;
|
||||
|
||||
return permissions.every((permission) =>
|
||||
|
||||
Reference in New Issue
Block a user