mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-05-10 12:25:02 +00:00
Start move to d.js
This commit is contained in:
parent
a9e0466e33
commit
9fc045cd38
17 changed files with 339 additions and 6317 deletions
|
@ -1,4 +1,4 @@
|
|||
import { Client, Emoji, MemberPartial, Message, MessageContent, TextableChannel } from "eris";
|
||||
import { APIMessage, Client, Message, MessageReaction, PartialUser, TextChannel, User } from "discord.js";
|
||||
import { Awaitable } from "knub/dist/utils";
|
||||
import { MINUTES, noop } from "../utils";
|
||||
import Timeout = NodeJS.Timeout;
|
||||
|
@ -17,19 +17,19 @@ const defaultOpts: PaginateMessageOpts = {
|
|||
|
||||
export async function createPaginatedMessage(
|
||||
client: Client,
|
||||
channel: TextableChannel,
|
||||
channel: TextChannel | User,
|
||||
totalPages: number,
|
||||
loadPageFn: LoadPageFn,
|
||||
opts: Partial<PaginateMessageOpts> = {},
|
||||
): Promise<Message> {
|
||||
const fullOpts = { ...defaultOpts, ...opts } as PaginateMessageOpts;
|
||||
const firstPageContent = await loadPageFn(1);
|
||||
const message = await channel.createMessage(firstPageContent);
|
||||
const message = await channel.send(firstPageContent);
|
||||
|
||||
let page = 1;
|
||||
let pageLoadId = 0; // Used to avoid race conditions when rapidly switching pages
|
||||
const reactionListener = async (reactionMessage: Message, emoji: Emoji, reactor: MemberPartial) => {
|
||||
if (reactionMessage.id !== message.id) {
|
||||
const reactionListener = async (reactionMessage: MessageReaction, reactor: User | PartialUser) => {
|
||||
if (reactionMessage.message.id !== message.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -37,14 +37,14 @@ export async function createPaginatedMessage(
|
|||
return;
|
||||
}
|
||||
|
||||
if (reactor.id === client.user.id) {
|
||||
if (reactor.id === client.user!.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
let pageDelta = 0;
|
||||
if (emoji.name === "⬅️") {
|
||||
if (reactionMessage.emoji.name === "⬅️") {
|
||||
pageDelta = -1;
|
||||
} else if (emoji.name === "➡️") {
|
||||
} else if (reactionMessage.emoji.name === "➡️") {
|
||||
pageDelta = 1;
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,7 @@ export async function createPaginatedMessage(
|
|||
}
|
||||
|
||||
message.edit(newPageContent).catch(noop);
|
||||
message.removeReaction(emoji.name, reactor.id);
|
||||
reactionMessage.users.remove(reactor.id).catch(noop);
|
||||
refreshTimeout();
|
||||
};
|
||||
client.on("messageReactionAdd", reactionListener);
|
||||
|
@ -76,7 +76,7 @@ export async function createPaginatedMessage(
|
|||
const refreshTimeout = () => {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(() => {
|
||||
message.removeReactions().catch(noop);
|
||||
message.reactions.removeAll().catch(noop);
|
||||
client.off("messageReactionAdd", reactionListener);
|
||||
}, fullOpts.timeout);
|
||||
};
|
||||
|
@ -84,8 +84,8 @@ export async function createPaginatedMessage(
|
|||
refreshTimeout();
|
||||
|
||||
// Add reactions
|
||||
message.addReaction("⬅️").catch(noop);
|
||||
message.addReaction("➡️").catch(noop);
|
||||
message.react("⬅️").catch(noop);
|
||||
message.react("➡️").catch(noop);
|
||||
|
||||
return message;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { EmbedField } from "eris";
|
||||
import { EmbedField } from "discord.js";
|
||||
import { chunkMessageLines, emptyEmbedValue } from "../utils";
|
||||
|
||||
export function getChunkedEmbedFields(name: string, value: string, inline?: boolean): EmbedField[] {
|
||||
|
@ -10,11 +10,13 @@ export function getChunkedEmbedFields(name: string, value: string, inline?: bool
|
|||
fields.push({
|
||||
name,
|
||||
value: chunks[i],
|
||||
inline: false,
|
||||
});
|
||||
} else {
|
||||
fields.push({
|
||||
name: emptyEmbedValue,
|
||||
value: chunks[i],
|
||||
inline: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Constants, GuildChannel, Member, Permission } from "eris";
|
||||
import { GuildMember, GuildChannel } from "discord.js";
|
||||
import { getMissingPermissions } from "./getMissingPermissions";
|
||||
|
||||
/**
|
||||
|
@ -6,10 +6,11 @@ import { getMissingPermissions } from "./getMissingPermissions";
|
|||
* @return Bitmask of missing permissions
|
||||
*/
|
||||
export function getMissingChannelPermissions(
|
||||
member: Member,
|
||||
member: GuildMember,
|
||||
channel: GuildChannel,
|
||||
requiredPermissions: number | bigint,
|
||||
): bigint {
|
||||
const memberChannelPermissions = channel.permissionsOf(member.id);
|
||||
const memberChannelPermissions = channel.permissionsFor(member.id);
|
||||
if (!memberChannelPermissions) return BigInt(requiredPermissions);
|
||||
return getMissingPermissions(memberChannelPermissions, requiredPermissions);
|
||||
}
|
||||
|
|
|
@ -1,15 +1,18 @@
|
|||
import { Constants, Permission } from "eris";
|
||||
import { PermissionOverwrites, Permissions } from "discord.js";
|
||||
|
||||
/**
|
||||
* @param resolvedPermissions A Permission object from e.g. GuildChannel#permissionsOf() or Member#permission
|
||||
* @param resolvedPermissions A Permission object from e.g. GuildChannel#permissionsFor() or Member#permission
|
||||
* @param requiredPermissions Bitmask of required permissions
|
||||
* @return Bitmask of missing permissions
|
||||
*/
|
||||
export function getMissingPermissions(resolvedPermissions: Permission, requiredPermissions: number | bigint): bigint {
|
||||
const allowedPermissions = BigInt(resolvedPermissions.allow);
|
||||
export function getMissingPermissions(
|
||||
resolvedPermissions: Permissions | Readonly<Permissions>,
|
||||
requiredPermissions: number | bigint,
|
||||
): bigint {
|
||||
const allowedPermissions = BigInt(resolvedPermissions);
|
||||
const nRequiredPermissions = BigInt(requiredPermissions);
|
||||
|
||||
if (Boolean(allowedPermissions & BigInt(Constants.Permissions.administrator))) {
|
||||
if (Boolean(allowedPermissions & BigInt(Permissions.FLAGS.ADMINISTRATOR))) {
|
||||
return BigInt(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Constants } from "eris";
|
||||
import { Permissions } from "discord.js";
|
||||
|
||||
const camelCaseToTitleCase = str =>
|
||||
str
|
||||
|
@ -10,9 +10,9 @@ const camelCaseToTitleCase = str =>
|
|||
const permissionNumberToName: Map<bigint, string> = new Map();
|
||||
const ignoredPermissionConstants = ["all", "allGuild", "allText", "allVoice"];
|
||||
|
||||
for (const key in Constants.Permissions) {
|
||||
for (const key in Permissions.FLAGS) {
|
||||
if (ignoredPermissionConstants.includes(key)) continue;
|
||||
permissionNumberToName.set(BigInt(Constants.Permissions[key]), camelCaseToTitleCase(key));
|
||||
permissionNumberToName.set(BigInt(Permissions.FLAGS[key]), camelCaseToTitleCase(key));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
import { Constants, Permission } from "eris";
|
||||
import { PermissionOverwrites, Permissions } from "discord.js";
|
||||
|
||||
/**
|
||||
* @param resolvedPermissions A Permission object from e.g. GuildChannel#permissionsOf() or Member#permission
|
||||
* @param requiredPermissions Bitmask of required permissions
|
||||
*/
|
||||
export function hasDiscordPermissions(resolvedPermissions: Permission, requiredPermissions: number | bigint) {
|
||||
export function hasDiscordPermissions(resolvedPermissions: PermissionOverwrites, requiredPermissions: number | bigint) {
|
||||
const allowedPermissions = BigInt(resolvedPermissions.allow);
|
||||
const nRequiredPermissions = BigInt(requiredPermissions);
|
||||
|
||||
if (Boolean(allowedPermissions & BigInt(Constants.Permissions.administrator))) {
|
||||
if (Boolean(allowedPermissions & BigInt(Permissions.FLAGS.ADMINISTRATOR))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import { Member, Message, User } from "eris";
|
||||
import { GuildMember, Message, User } from "discord.js";
|
||||
import { SavedMessage } from "../data/entities/SavedMessage";
|
||||
|
||||
export function allStarboardsLock() {
|
||||
return `starboards`;
|
||||
}
|
||||
|
||||
export function banLock(user: Member | User | { id: string }) {
|
||||
export function banLock(user: GuildMember | User | { id: string }) {
|
||||
return `ban-${user.id}`;
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,7 @@ export function counterIdLock(counterId: number | string) {
|
|||
return `counter-${counterId}`;
|
||||
}
|
||||
|
||||
export function memberRolesLock(member: Member | User | { id: string }) {
|
||||
export function memberRolesLock(member: GuildMember | User | { id: string }) {
|
||||
return `member-roles-${member.id}`;
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,6 @@ export function messageLock(message: Message | SavedMessage | { id: string }) {
|
|||
return `message-${message.id}`;
|
||||
}
|
||||
|
||||
export function muteLock(user: Member | User | { id: string }) {
|
||||
export function muteLock(user: GuildMember | User | { id: string }) {
|
||||
return `mute-${user.id}`;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { MessageContent } from "eris";
|
||||
import { APIMessage, MessageOptions } from "discord.js";
|
||||
|
||||
function embedHasContent(embed: any) {
|
||||
for (const [key, value] of Object.entries(embed)) {
|
||||
|
@ -18,7 +18,7 @@ function embedHasContent(embed: any) {
|
|||
return false;
|
||||
}
|
||||
|
||||
export function messageHasContent(content: MessageContent): boolean {
|
||||
export function messageHasContent(content: string | MessageOptions): boolean {
|
||||
if (typeof content === "string") {
|
||||
return content.trim() !== "";
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { MessageContent } from "eris";
|
||||
import { MessageOptions } from "discord.js";
|
||||
import { messageHasContent } from "./messageHasContent";
|
||||
|
||||
export function messageIsEmpty(content: MessageContent): boolean {
|
||||
export function messageIsEmpty(content: string | MessageOptions): boolean {
|
||||
return !messageHasContent(content);
|
||||
}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import { Constants } from "eris";
|
||||
import { Permissions } from "discord.js";
|
||||
|
||||
/**
|
||||
* Bitmask of permissions required to read messages in a channel
|
||||
*/
|
||||
export const readChannelPermissions = Constants.Permissions.readMessages | Constants.Permissions.readMessageHistory;
|
||||
export const readChannelPermissions = Permissions.FLAGS.VIEW_CHANNEL | Permissions.FLAGS.READ_MESSAGE_HISTORY;
|
||||
|
||||
/**
|
||||
* Bitmask of permissions required to read messages in a channel (bigint)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { disableInlineCode, isSnowflake } from "../utils";
|
||||
import { getChannelIdFromMessageId } from "../data/getChannelIdFromMessageId";
|
||||
import { GuildPluginData, TypeConversionError } from "knub";
|
||||
import { TextChannel } from "eris";
|
||||
import { TextChannel } from "discord.js";
|
||||
|
||||
const channelAndMessageIdRegex = /^(\d+)[\-\/](\d+)$/;
|
||||
const messageLinkRegex = /^https:\/\/(?:\w+\.)?discord(?:app)?\.com\/channels\/\d+\/(\d+)\/(\d+)$/i;
|
||||
|
@ -46,7 +46,7 @@ export async function resolveMessageTarget(pluginData: GuildPluginData<any>, val
|
|||
return null;
|
||||
}
|
||||
|
||||
const channel = pluginData.guild.channels.get(result.channelId);
|
||||
const channel = pluginData.guild.channels.resolve(result.channelId);
|
||||
if (!channel || !(channel instanceof TextChannel)) {
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { MessageContent, MessageFile, User } from "eris";
|
||||
import { createChunkedMessage, HOURS, isDiscordRESTError } from "../utils";
|
||||
import { logger } from "../logger";
|
||||
import Timeout = NodeJS.Timeout;
|
||||
import { APIMessage, User } from "discord.js";
|
||||
|
||||
let dmsDisabled = false;
|
||||
let dmsDisabledTimeout: Timeout;
|
||||
|
@ -16,7 +16,7 @@ export class DMError extends Error {}
|
|||
|
||||
const error20026 = "The bot cannot currently send DMs";
|
||||
|
||||
export async function sendDM(user: User, content: MessageContent, source: string) {
|
||||
export async function sendDM(user: User, content: string | APIMessage, source: string) {
|
||||
if (dmsDisabled) {
|
||||
throw new DMError(error20026);
|
||||
}
|
||||
|
@ -24,15 +24,10 @@ export async function sendDM(user: User, content: MessageContent, source: string
|
|||
logger.debug(`Sending ${source} DM to ${user.id}`);
|
||||
|
||||
try {
|
||||
const dmChannel = await user.getDMChannel();
|
||||
if (!dmChannel) {
|
||||
throw new DMError("Unable to open DM channel");
|
||||
}
|
||||
|
||||
if (typeof content === "string") {
|
||||
await createChunkedMessage(dmChannel, content);
|
||||
await createChunkedMessage(user, content);
|
||||
} else {
|
||||
await dmChannel.createMessage(content);
|
||||
await user.send(content);
|
||||
}
|
||||
} catch (e) {
|
||||
if (isDiscordRESTError(e) && e.code === 20026) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue