This commit is contained in:
May 2023-01-26 16:33:41 -08:00
parent 7cab14dd8d
commit fbdc5f0edd
3 changed files with 77 additions and 53 deletions

View file

@ -19,7 +19,7 @@ TOKEN=KILL-YOURSELF.NOW
- [X] 1.1.4 serve /assets as static files & make /server endpoint
- [X] 1.2.0 add file parameters section + custom ids
- [X] 1.2.1 add file counter to main page
- [ ] 1.2.2 clean up this shitty code
- [X] 1.2.2 clean up this shitty code
- [ ] 1.2.3 add id locks, allowing you to set a key for a file that allows you to overwrite the file in the future
- [ ] 1.2.4 prevent cloning of local/private ip addresses
- [ ] 1.3.0 add simple moderation tools

View file

@ -21,7 +21,7 @@ const multerSetup = multer({storage:memoryStorage()})
let config = require(`${process.cwd()}/config.json`)
app.use("/static",express.static("assets"))
app.use(bodyParser.text({limit:(config.maxDiscordFileSize*config.maxDiscordFiles)+1048576,type:["application/json","text/plain"]}))
let files:{[key:string]:{filename:string,mime:string,messageids:string[]}} = {}
//let files:{[key:string]:{filename:string,mime:string,messageids:string[]}} = {}
// funcs
@ -37,10 +37,7 @@ function ThrowError(response:express.Response,code:number,errorMessage:string) {
if (!fs.existsSync(__dirname+"/../.data/")) fs.mkdirSync(__dirname+"/../.data/")
fs.readFile(__dirname+"/../.data/files.json",(err,buf) => {
if (err) {console.log(err);return}
files = JSON.parse(buf.toString() || "{}")
})
// discord
@ -49,7 +46,7 @@ let client = new Client({intents:[
IntentsBitField.Flags.MessageContent
],rest:{timeout:config.requestTimeout}})
let uploadChannel:Discord.TextBasedChannel
let files = new Files(client,config)
app.get("/", function(req,res) {
fs.readFile(__dirname+"/../pages/base.html",(err,buf) => {
@ -86,7 +83,7 @@ app.get("/clone", function(req,res) {
app.post("/upload",multerSetup.single('file'),async (req,res) => {
if (req.file) {
try {
uploadFile({name:req.file.originalname,mime:req.file.mimetype,uploadId:req.header("monofile-upload-id")},req.file.buffer)
files.uploadFile({name:req.file.originalname,mime:req.file.mimetype,uploadId:req.header("monofile-upload-id")},req.file.buffer)
.then((uID) => res.send(uID))
.catch((stat) => {res.status(stat.status);res.send(`[err] ${stat.message}`)})
} catch {
@ -134,35 +131,7 @@ app.get("/download/:fileId",(req,res) => {
})
app.get("/file/:fileId",async (req,res) => {
if (files[req.params.fileId]) {
let file = files[req.params.fileId]
let bufToCombine = []
for (let i = 0; i < file.messageids.length; i++) {
let msg = await uploadChannel.messages.fetch(file.messageids[i]).catch(() => {return null})
if (msg?.attachments) {
let attach = Array.from(msg.attachments.values())
for (let i = 0; i < attach.length; i++) {
let d = await axios.get(attach[i].url,{responseType:"arraybuffer"}).catch((e:Error) => {console.error(e)})
if (d) {
bufToCombine.push(d.data)
} else {
res.sendStatus(500);return
}
}
}
}
let nb:Buffer|null = Buffer.concat(bufToCombine)
res.setHeader('Content-Type',file.mime)
res.send(nb)
nb = null
} else {
res.sendStatus(404)
}
})
app.get("/server",(req,res) => {
@ -173,18 +142,6 @@ app.get("*",(req,res) => {
ThrowError(res,404,"Page not found.")
})
client.on("ready",() => {
console.log("Discord OK!")
client.guilds.fetch(config.targetGuild).then((g) => {
g.channels.fetch(config.targetChannel).then((a) => {
if (a?.isTextBased()) {
uploadChannel = a
}
})
})
})
app.listen(3000,function() {
console.log("Web OK!")
})

View file

@ -1,6 +1,7 @@
import axios from "axios";
import Discord, { Client, TextBasedChannel } from "discord.js";
import { readFile, writeFile } from "fs";
import { Readable } from "node:stream"
export let id_check_regex = /[A-Za-z0-9_\-\.]+/
@ -40,8 +41,27 @@ export default class Files {
uploadChannel?: TextBasedChannel
constructor(client: Client, config: Configuration) {
this.config = config;
this.client = client;
client.on("ready",() => {
console.log("Discord OK!")
client.guilds.fetch(config.targetGuild).then((g) => {
g.channels.fetch(config.targetChannel).then((a) => {
if (a?.isTextBased()) {
this.uploadChannel = a
}
})
})
})
readFile(__dirname+"/../.data/files.json",(err,buf) => {
if (err) {console.log(err);return}
this.files = JSON.parse(buf.toString() || "{}")
})
}
uploadFile(settings:FileUploadSettings,fBuffer:Buffer):Promise<string|StatusCodeError> {
@ -159,12 +179,59 @@ export default class Files {
// todo: move read code here
readFile(uploadId: string):Promise<Buffer|StatusCodeError> {
readFile(uploadId: string):Promise<{dataStream:Readable,contentType:string}> {
return new Promise(async (resolve,reject) => {
if (!this.uploadChannel) {
reject({status:503,message:"server is not ready - please try again later"})
return
}
unlink():Promise<void> {
if (this.files[uploadId]) {
let file = this.files[uploadId]
let dataStream = new Readable()
resolve({
contentType: file.mime,
dataStream: dataStream
})
for (let i = 0; i < file.messageids.length; i++) {
let msg = await this.uploadChannel.messages.fetch(file.messageids[i]).catch(() => {return null})
if (msg?.attachments) {
let attach = Array.from(msg.attachments.values())
for (let i = 0; i < attach.length; i++) {
let d = await axios.get(attach[i].url,{responseType:"arraybuffer"}).catch((e:Error) => {console.error(e)})
if (d) {
dataStream.push(d.data)
} else {
reject({status:500,message:"internal server error"})
return
}
}
}
}
} else {
reject({status:404,message:"not found"})
}
})
}
unlink(uploadId:string):Promise<void> {
return new Promise((resolve,reject) => {
let tmp = this.files[uploadId];
delete this.files[uploadId];
writeFile(process.cwd()+"/.data/files.json",JSON.stringify(this.files),(err) => {
if (err) {
this.files[uploadId] = tmp
reject()
} else {
resolve()
}
})
})
}
}