parent
							
								
									3343df5c23
								
							
						
					
					
						commit
						cec8cea01a
					
				| @ -30,6 +30,8 @@ export function isTextChannel(type: ChannelType): boolean { | ||||
| 		case ChannelType.GUILD_VOICE: | ||||
| 		case ChannelType.GUILD_STAGE_VOICE: | ||||
| 		case ChannelType.GUILD_CATEGORY: | ||||
| 		case ChannelType.GUILD_FORUM: | ||||
| 		case ChannelType.DIRECTORY: | ||||
| 			throw new HTTPError("not a text channel", 400); | ||||
| 		case ChannelType.DM: | ||||
| 		case ChannelType.GROUP_DM: | ||||
| @ -155,7 +157,7 @@ const messageUpload = multer({ | ||||
| // https://discord.com/developers/docs/resources/channel#create-message
 | ||||
| // TODO: text channel slowdown
 | ||||
| // TODO: trim and replace message content and every embed field
 | ||||
| // TODO: check allowed_mentions
 | ||||
| // TODO: only dispatch mentions denoted in allowed_mentions
 | ||||
| 
 | ||||
| // Send message
 | ||||
| router.post( | ||||
|  | ||||
							
								
								
									
										75
									
								
								api/src/routes/channels/#channel_id/purge.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								api/src/routes/channels/#channel_id/purge.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | ||||
| import { HTTPError } from "lambert-server"; | ||||
| import { route } from "@fosscord/api"; | ||||
| import { isTextChannel } from "./messages"; | ||||
| import { FindManyOptions, Between } from "typeorm"; | ||||
| import { | ||||
| 	Attachment, | ||||
| 	Channel, | ||||
| 	Config, | ||||
| 	Embed, | ||||
| 	DiscordApiErrors, | ||||
| 	emitEvent, | ||||
| 	FosscordApiErrors, | ||||
| 	getPermission, | ||||
| 	getRights, | ||||
|  	Message, | ||||
| 	MessageDeleteBulkEvent, | ||||
| 	Snowflake, | ||||
| 	uploadFile  | ||||
| } from "@fosscord/util"; | ||||
| import { Router, Response, Request } from "express"; | ||||
| import multer from "multer"; | ||||
| import { handleMessage, postHandleMessage } from "@fosscord/api"; | ||||
| 
 | ||||
| const router: Router = Router(); | ||||
| 
 | ||||
| export default router; | ||||
| 
 | ||||
| export interface PurgeSchema { | ||||
| 	before: 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?
 | ||||
| // https://discord.com/developers/docs/resources/channel#bulk-delete-messages
 | ||||
| router.post("/", route({ body: "PurgeSchema", right: "SELF_DELETE_MESSAGES" }), async (req: Request, res: Response) => { | ||||
| 	const { channel_id } = req.params; | ||||
| 	const channel = await Channel.findOneOrFail({ id: channel_id }); | ||||
| 	 | ||||
| 	if (!channel.guild_id) throw new HTTPError("Can't purge dm channels", 400); | ||||
| 	isTextChannel(channel.type); | ||||
| 
 | ||||
| 	const rights = await getRights(req.user_id); | ||||
| 	if (!rights.has("MANAGE_MESSAGES")) { | ||||
| 		const permissions = await getPermission(req.user_id, channel.guild_id, channel_id); | ||||
| 		permissions.hasThrow("MANAGE_MESSAGES"); | ||||
| 		permissions.hasThrow("MANAGE_CHANNELS"); | ||||
| 	} | ||||
| 	 | ||||
| 	const { before, after } = req.body as PurgeSchema; | ||||
| 
 | ||||
| 	// TODO: send the deletion event bite-by-bite to prevent client stress
 | ||||
| 	var query: FindManyOptions<Message> & { where: { id?: any; }; } = { | ||||
| 		order: { id: "ASC" }, | ||||
| 		// take: limit,
 | ||||
| 		where: { | ||||
| 		 channel_id, | ||||
| 		 id: Between(after, before), // the right way around
 | ||||
| 		 }, | ||||
| 		relations: ["author", "webhook", "application", "mentions", "mention_roles", "mention_channels", "sticker_items", "attachments"] | ||||
| 	}; | ||||
| 
 | ||||
| 	const messages = await Message.find(query); | ||||
| 	const endpoint = Config.get().cdn.endpointPublic; | ||||
| 
 | ||||
| 	await Message.delete(messages.map((x) => ({ id: x }))); | ||||
| 	 | ||||
| 	await emitEvent({ | ||||
| 		event: "MESSAGE_DELETE_BULK", | ||||
| 		channel_id, | ||||
| 		data: { ids: messages.map(x => x.id), channel_id, guild_id: channel.guild_id } | ||||
| 	} as MessageDeleteBulkEvent); | ||||
| 
 | ||||
| 	res.sendStatus(204); | ||||
| }); | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Erkin Alp Güney
						Erkin Alp Güney