1
1
import { runInNewContext } from 'vm' ;
2
2
3
3
import { Command , Interaction , Structures } from 'detritus-client' ;
4
+ import { MAX_ATTACHMENT_SIZE } from 'detritus-client/lib/constants' ;
4
5
import { Markup } from 'detritus-client/lib/utils' ;
5
6
6
7
import { utilitiesFetchMedia , utilitiesFetchText } from '../api' ;
@@ -36,6 +37,7 @@ export const ATTACHMENT_EXTENSIONS_IMAGE = [
36
37
] ;
37
38
38
39
export const ATTACHMENT_EXTENSIONS_MEDIA = [
40
+ 'flac' ,
39
41
'mov' ,
40
42
'mp3' ,
41
43
'mp4' ,
@@ -46,6 +48,8 @@ export const ATTACHMENT_EXTENSIONS_MEDIA = [
46
48
47
49
export const ATTACHMENT_EXTENSIONS = [ ...ATTACHMENT_EXTENSIONS_IMAGE , ...ATTACHMENT_EXTENSIONS_MEDIA ] ;
48
50
51
+ export const FILE_SIZE_BUFFER = 10 * 1024 ; // 10 kb
52
+
49
53
export const MAX_ITERATIONS = 150 ;
50
54
export const MAX_NETWORK_REQUESTS = 10 ;
51
55
export const MAX_REGEX_TIME = 25 ;
@@ -63,6 +67,7 @@ export const REGEX_ARGUMENT_SPLITTER_ESCAPE_REPLACEMENT = new RegExp(`\\\\\\${Ta
63
67
64
68
65
69
export enum PrivateVariables {
70
+ FILE_SIZE = '__fileSize' ,
66
71
ITERATIONS_REMAINING = '__iterationsRemaining' ,
67
72
NETWORK_REQUESTS = '__networkRequests' ,
68
73
}
@@ -234,6 +239,7 @@ export const TagFunctionsToString = Object.freeze({
234
239
235
240
236
241
export interface TagVariables {
242
+ [ PrivateVariables . FILE_SIZE ] : number ,
237
243
[ PrivateVariables . ITERATIONS_REMAINING ] : number ,
238
244
[ PrivateVariables . NETWORK_REQUESTS ] : number ,
239
245
[ key : string ] : number | string ,
@@ -260,6 +266,9 @@ export async function parse(
260
266
if ( ! ( PrivateVariables . NETWORK_REQUESTS in variables ) ) {
261
267
variables [ PrivateVariables . NETWORK_REQUESTS ] = 0 ;
262
268
}
269
+ if ( ! ( PrivateVariables . FILE_SIZE in variables ) ) {
270
+ variables [ PrivateVariables . FILE_SIZE ] = 0 ;
271
+ }
263
272
const tag : TagResult = { files : [ ] , text : '' , variables} ;
264
273
tag . variables [ PrivateVariables . ITERATIONS_REMAINING ] -- ;
265
274
@@ -491,14 +500,21 @@ const ScriptTags = Object.freeze({
491
500
492
501
tag . variables [ PrivateVariables . NETWORK_REQUESTS ] ++ ;
493
502
try {
494
- const response = await utilitiesFetchMedia ( context , { url} ) ;
503
+ const maxFileSize = ( ( context . guild ) ? context . guild . maxAttachmentSize : MAX_ATTACHMENT_SIZE ) - FILE_SIZE_BUFFER ;
504
+ const response = await utilitiesFetchMedia ( context , { maxFileSize, url} ) ;
495
505
const filename = ( response . headers . get ( 'content-disposition' ) || '' ) . split ( ';' ) . pop ( ) ! . split ( 'filename=' ) . pop ( ) ! . slice ( 1 , - 1 ) || 'unknown.lmao' ;
496
506
497
507
let data : Buffer | string = await response . buffer ( ) ;
498
508
if ( ( response . headers . get ( 'content-type' ) || '' ) . startsWith ( 'text/' ) ) {
499
509
data = data . toString ( ) ;
500
510
}
501
511
512
+ const currentFileSize = tag . variables [ PrivateVariables . FILE_SIZE ] ;
513
+ if ( maxFileSize <= currentFileSize + data . length ) {
514
+ throw new Error ( `Attachments surpassed max file size of ${ maxFileSize } bytes` ) ;
515
+ }
516
+ tag . variables [ PrivateVariables . FILE_SIZE ] += data . length ;
517
+
502
518
tag . files . push ( {
503
519
buffer : data ,
504
520
filename,
@@ -658,7 +674,8 @@ const ScriptTags = Object.freeze({
658
674
tag . variables [ PrivateVariables . NETWORK_REQUESTS ] ++ ;
659
675
660
676
try {
661
- const response = await utilitiesFetchText ( context , { url} ) ;
677
+ const maxFileSize = ( context . guild ) ? context . guild . maxAttachmentSize : undefined ;
678
+ const response = await utilitiesFetchText ( context , { maxFileSize, url} ) ;
662
679
tag . text += await response . text ( ) ;
663
680
} catch ( error ) {
664
681
console . log ( error ) ;
0 commit comments