Merge branch 'master' of https://github.com/fosscord/fosscord-server
This commit is contained in:
commit
d55828a952
@ -24,20 +24,20 @@
|
|||||||
ASSET_ENDPOINT: "",
|
ASSET_ENDPOINT: "",
|
||||||
MEDIA_PROXY_ENDPOINT: "https://media.discordapp.net",
|
MEDIA_PROXY_ENDPOINT: "https://media.discordapp.net",
|
||||||
WIDGET_ENDPOINT: `//${location.host}/widget`,
|
WIDGET_ENDPOINT: `//${location.host}/widget`,
|
||||||
INVITE_HOST: `${location.host}/invite`,
|
INVITE_HOST: `${location.hostname}/invite`,
|
||||||
GUILD_TEMPLATE_HOST: "discord.new",
|
GUILD_TEMPLATE_HOST: "${location.host}",
|
||||||
GIFT_CODE_HOST: "discord.gift",
|
GIFT_CODE_HOST: "${location.hostname}",
|
||||||
RELEASE_CHANNEL: "stable",
|
RELEASE_CHANNEL: "stable",
|
||||||
MARKETING_ENDPOINT: "//discord.com",
|
MARKETING_ENDPOINT: "//discord.com",
|
||||||
BRAINTREE_KEY: "production_5st77rrc_49pp2rp4phym7387",
|
BRAINTREE_KEY: "production_5st77rrc_49pp2rp4phym7387",
|
||||||
STRIPE_KEY: "pk_live_CUQtlpQUF0vufWpnpUmQvcdi",
|
STRIPE_KEY: "pk_live_CUQtlpQUF0vufWpnpUmQvcdi",
|
||||||
NETWORKING_ENDPOINT: "//router.discordapp.net",
|
NETWORKING_ENDPOINT: "//router.discordapp.net",
|
||||||
RTC_LATENCY_ENDPOINT: "//latency.discord.media/rtc",
|
RTC_LATENCY_ENDPOINT: "//${location.hostname}/rtc",
|
||||||
PROJECT_ENV: "production",
|
PROJECT_ENV: "production",
|
||||||
REMOTE_AUTH_ENDPOINT: "//localhost:3020",
|
REMOTE_AUTH_ENDPOINT: "//localhost:3020",
|
||||||
SENTRY_TAGS: { buildId: "75e36d9", buildType: "normal" },
|
SENTRY_TAGS: { buildId: "75e36d9", buildType: "normal" },
|
||||||
MIGRATION_SOURCE_ORIGIN: "https://discordapp.com",
|
MIGRATION_SOURCE_ORIGIN: "https://${location.hostname}",
|
||||||
MIGRATION_DESTINATION_ORIGIN: "https://discord.com",
|
MIGRATION_DESTINATION_ORIGIN: "https://${location.hostname}",
|
||||||
HTML_TIMESTAMP: Date.now(),
|
HTML_TIMESTAMP: Date.now(),
|
||||||
ALGOLIA_KEY: "aca0d7082e4e63af5ba5917d5e96bed0"
|
ALGOLIA_KEY: "aca0d7082e4e63af5ba5917d5e96bed0"
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Router, Response, Request } from "express";
|
import { Router, Response, Request } from "express";
|
||||||
import { Channel, Config, emitEvent, getPermission, MessageDeleteBulkEvent, Message } from "@fosscord/util";
|
import { Channel, Config, emitEvent, getPermission, getRights, MessageDeleteBulkEvent, Message } from "@fosscord/util";
|
||||||
import { HTTPError } from "lambert-server";
|
import { HTTPError } from "lambert-server";
|
||||||
import { route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { In } from "typeorm";
|
import { In } from "typeorm";
|
||||||
@ -12,22 +12,28 @@ export interface BulkDeleteSchema {
|
|||||||
messages: string[];
|
messages: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: should users be able to bulk delete messages or only bots?
|
// should users be able to bulk delete messages or only bots? ANSWER: all users
|
||||||
// TODO: should this request fail, if you provide messages older than 14 days/invalid ids?
|
// should this request fail, if you provide messages older than 14 days/invalid ids? ANSWER: NO
|
||||||
// https://discord.com/developers/docs/resources/channel#bulk-delete-messages
|
// https://discord.com/developers/docs/resources/channel#bulk-delete-messages
|
||||||
router.post("/", route({ body: "BulkDeleteSchema" }), async (req: Request, res: Response) => {
|
router.post("/", route({ body: "BulkDeleteSchema" }), async (req: Request, res: Response) => {
|
||||||
const { channel_id } = req.params;
|
const { channel_id } = req.params;
|
||||||
const channel = await Channel.findOneOrFail({ id: channel_id });
|
const channel = await Channel.findOneOrFail({ id: channel_id });
|
||||||
if (!channel.guild_id) throw new HTTPError("Can't bulk delete dm channel messages", 400);
|
if (!channel.guild_id) throw new HTTPError("Can't bulk delete dm channel messages", 400);
|
||||||
|
|
||||||
|
const rights = await getRights(req.user_id);
|
||||||
|
rights.hasThrow("SELF_DELETE_MESSAGES");
|
||||||
|
|
||||||
|
let superuser = rights.has("MANAGE_MESSAGES");
|
||||||
const permission = await getPermission(req.user_id, channel?.guild_id, channel_id);
|
const permission = await getPermission(req.user_id, channel?.guild_id, channel_id);
|
||||||
permission.hasThrow("MANAGE_MESSAGES");
|
|
||||||
|
|
||||||
const { maxBulkDelete } = Config.get().limits.message;
|
const { maxBulkDelete } = Config.get().limits.message;
|
||||||
|
|
||||||
const { messages } = req.body as { messages: string[] };
|
const { messages } = req.body as { messages: string[] };
|
||||||
if (messages.length < 2) throw new HTTPError("You must at least specify 2 messages to bulk delete");
|
if (messages.length === 0) throw new HTTPError("You must specify messages to bulk delete");
|
||||||
if (messages.length > maxBulkDelete) throw new HTTPError(`You cannot delete more than ${maxBulkDelete} messages`);
|
if (!superuser) {
|
||||||
|
permission.hasThrow("MANAGE_MESSAGES");
|
||||||
|
if (messages.length > maxBulkDelete) throw new HTTPError(`You cannot delete more than ${maxBulkDelete} messages`);
|
||||||
|
}
|
||||||
|
|
||||||
await Message.delete(messages.map((x) => ({ id: x })));
|
await Message.delete(messages.map((x) => ({ id: x })));
|
||||||
|
|
||||||
|
@ -30,9 +30,9 @@ export interface PurgeSchema {
|
|||||||
after: string
|
after: string
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: should users be able to bulk delete messages or only bots?
|
/**
|
||||||
// TODO: should this request fail, if you provide messages older than 14 days/invalid ids?
|
TODO: apply the delete bit by bit to prevent client and database stress
|
||||||
// https://discord.com/developers/docs/resources/channel#bulk-delete-messages
|
**/
|
||||||
router.post("/", route({ /*body: "PurgeSchema",*/ }), async (req: Request, res: Response) => {
|
router.post("/", route({ /*body: "PurgeSchema",*/ }), async (req: Request, res: Response) => {
|
||||||
const { channel_id } = req.params;
|
const { channel_id } = req.params;
|
||||||
const channel = await Channel.findOneOrFail({ id: channel_id });
|
const channel = await Channel.findOneOrFail({ id: channel_id });
|
||||||
|
@ -4,41 +4,91 @@ import { ChannelPermissionOverwrite } from "./Channel";
|
|||||||
import { User } from "./User";
|
import { User } from "./User";
|
||||||
|
|
||||||
export enum AuditLogEvents {
|
export enum AuditLogEvents {
|
||||||
|
// guild level
|
||||||
GUILD_UPDATE = 1,
|
GUILD_UPDATE = 1,
|
||||||
|
GUILD_IMPORT = 2,
|
||||||
|
GUILD_EXPORTED = 3,
|
||||||
|
GUILD_ARCHIVE = 4,
|
||||||
|
GUILD_UNARCHIVE = 5,
|
||||||
|
// join-leave
|
||||||
|
USER_JOIN = 6,
|
||||||
|
USER_LEAVE = 7,
|
||||||
|
// channels
|
||||||
CHANNEL_CREATE = 10,
|
CHANNEL_CREATE = 10,
|
||||||
CHANNEL_UPDATE = 11,
|
CHANNEL_UPDATE = 11,
|
||||||
CHANNEL_DELETE = 12,
|
CHANNEL_DELETE = 12,
|
||||||
|
// permission overrides
|
||||||
CHANNEL_OVERWRITE_CREATE = 13,
|
CHANNEL_OVERWRITE_CREATE = 13,
|
||||||
CHANNEL_OVERWRITE_UPDATE = 14,
|
CHANNEL_OVERWRITE_UPDATE = 14,
|
||||||
CHANNEL_OVERWRITE_DELETE = 15,
|
CHANNEL_OVERWRITE_DELETE = 15,
|
||||||
|
// kick and ban
|
||||||
MEMBER_KICK = 20,
|
MEMBER_KICK = 20,
|
||||||
MEMBER_PRUNE = 21,
|
MEMBER_PRUNE = 21,
|
||||||
MEMBER_BAN_ADD = 22,
|
MEMBER_BAN_ADD = 22,
|
||||||
MEMBER_BAN_REMOVE = 23,
|
MEMBER_BAN_REMOVE = 23,
|
||||||
|
// member updates
|
||||||
MEMBER_UPDATE = 24,
|
MEMBER_UPDATE = 24,
|
||||||
MEMBER_ROLE_UPDATE = 25,
|
MEMBER_ROLE_UPDATE = 25,
|
||||||
MEMBER_MOVE = 26,
|
MEMBER_MOVE = 26,
|
||||||
MEMBER_DISCONNECT = 27,
|
MEMBER_DISCONNECT = 27,
|
||||||
BOT_ADD = 28,
|
BOT_ADD = 28,
|
||||||
|
// roles
|
||||||
ROLE_CREATE = 30,
|
ROLE_CREATE = 30,
|
||||||
ROLE_UPDATE = 31,
|
ROLE_UPDATE = 31,
|
||||||
ROLE_DELETE = 32,
|
ROLE_DELETE = 32,
|
||||||
|
ROLE_SWAP = 33,
|
||||||
|
// invites
|
||||||
INVITE_CREATE = 40,
|
INVITE_CREATE = 40,
|
||||||
INVITE_UPDATE = 41,
|
INVITE_UPDATE = 41,
|
||||||
INVITE_DELETE = 42,
|
INVITE_DELETE = 42,
|
||||||
|
// webhooks
|
||||||
WEBHOOK_CREATE = 50,
|
WEBHOOK_CREATE = 50,
|
||||||
WEBHOOK_UPDATE = 51,
|
WEBHOOK_UPDATE = 51,
|
||||||
WEBHOOK_DELETE = 52,
|
WEBHOOK_DELETE = 52,
|
||||||
|
WEBHOOK_SWAP = 53,
|
||||||
|
// custom emojis
|
||||||
EMOJI_CREATE = 60,
|
EMOJI_CREATE = 60,
|
||||||
EMOJI_UPDATE = 61,
|
EMOJI_UPDATE = 61,
|
||||||
EMOJI_DELETE = 62,
|
EMOJI_DELETE = 62,
|
||||||
|
EMOJI_SWAP = 63,
|
||||||
|
// deletion
|
||||||
|
MESSAGE_CREATE = 70, // messages sent using non-primary seat of the user only
|
||||||
|
MESSAGE_EDIT = 71, // non-self edits only
|
||||||
MESSAGE_DELETE = 72,
|
MESSAGE_DELETE = 72,
|
||||||
MESSAGE_BULK_DELETE = 73,
|
MESSAGE_BULK_DELETE = 73,
|
||||||
|
// pinning
|
||||||
MESSAGE_PIN = 74,
|
MESSAGE_PIN = 74,
|
||||||
MESSAGE_UNPIN = 75,
|
MESSAGE_UNPIN = 75,
|
||||||
|
// integrations
|
||||||
INTEGRATION_CREATE = 80,
|
INTEGRATION_CREATE = 80,
|
||||||
INTEGRATION_UPDATE = 81,
|
INTEGRATION_UPDATE = 81,
|
||||||
INTEGRATION_DELETE = 82,
|
INTEGRATION_DELETE = 82,
|
||||||
|
// stage actions
|
||||||
|
STAGE_INSTANCE_CREATE = 83,
|
||||||
|
STAGE_INSTANCE_UPDATE = 84,
|
||||||
|
STAGE_INSTANCE_DELETE = 85,
|
||||||
|
// stickers
|
||||||
|
STICKER_CREATE = 90,
|
||||||
|
STICKER_UPDATE = 91,
|
||||||
|
STICKER_DELETE = 92,
|
||||||
|
STICKER_SWAP = 93,
|
||||||
|
// threads
|
||||||
|
THREAD_CREATE = 110,
|
||||||
|
THREAD_UPDATE = 111,
|
||||||
|
THREAD_DELETE = 112,
|
||||||
|
// application commands
|
||||||
|
APPLICATION_COMMAND_PERMISSION_UPDATE = 121,
|
||||||
|
// automod
|
||||||
|
POLICY_CREATE = 140,
|
||||||
|
POLICY_UPDATE = 141,
|
||||||
|
// instance policies affecting the guild
|
||||||
|
GUILD_CROPPED_BY_POLICIES = 216,
|
||||||
|
// message moves
|
||||||
|
IN_GUILD_MESSAGE_MOVE = 223,
|
||||||
|
CROSS_GUILD_MESSAGE_MOVE = 224,
|
||||||
|
// message routing
|
||||||
|
ROUTE_CREATE = 225,
|
||||||
|
ROUTE_UPDATE = 226,
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity("audit_logs")
|
@Entity("audit_logs")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// https://github.com/discordjs/discord.js/blob/master/src/util/MessageFlags.js
|
// based on https://github.com/discordjs/discord.js/blob/master/src/util/MessageFlags.js
|
||||||
// Apache License Version 2.0 Copyright 2015 - 2021 Amish Shah
|
// Apache License Version 2.0 Copyright 2015 - 2021 Amish Shah, 2022 Erkin Alp Güney
|
||||||
|
|
||||||
import { BitField } from "./BitField";
|
import { BitField } from "./BitField";
|
||||||
|
|
||||||
@ -8,7 +8,13 @@ export class MessageFlags extends BitField {
|
|||||||
CROSSPOSTED: BigInt(1) << BigInt(0),
|
CROSSPOSTED: BigInt(1) << BigInt(0),
|
||||||
IS_CROSSPOST: BigInt(1) << BigInt(1),
|
IS_CROSSPOST: BigInt(1) << BigInt(1),
|
||||||
SUPPRESS_EMBEDS: BigInt(1) << BigInt(2),
|
SUPPRESS_EMBEDS: BigInt(1) << BigInt(2),
|
||||||
SOURCE_MESSAGE_DELETED: BigInt(1) << BigInt(3),
|
// SOURCE_MESSAGE_DELETED: BigInt(1) << BigInt(3), // fosscord will delete them from destination too, making this redundant
|
||||||
URGENT: BigInt(1) << BigInt(4),
|
URGENT: BigInt(1) << BigInt(4),
|
||||||
|
// HAS_THREAD: BigInt(1) << BigInt(5) // does not apply to fosscord due to infrastructural differences
|
||||||
|
PRIVATE_ROUTE: BigInt(1) << BigInt(6), // it that has been routed to only some of the users that can see the channel
|
||||||
|
INTERACTION_WAIT: BigInt(1) << BigInt(7), // discord.com calls this LOADING
|
||||||
|
// FAILED_TO_MENTION_SOME_ROLES_IN_THREAD: BigInt(1) << BigInt(8)
|
||||||
|
SCRIPT_WAIT: BigInt(1) << BigInt(24), // waiting for the self command to complete
|
||||||
|
IMPORT_WAIT: BigInt(1) << BigInt(25), // latest message of a bulk import, waiting for the rest of the channel to be backfilled
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user