mirror of
https://github.com/mollersuite/monofile.git
synced 2024-11-25 15:06:26 -08:00
wip
This commit is contained in:
parent
7cab14dd8d
commit
fbdc5f0edd
|
@ -19,7 +19,7 @@ TOKEN=KILL-YOURSELF.NOW
|
||||||
- [X] 1.1.4 serve /assets as static files & make /server endpoint
|
- [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.0 add file parameters section + custom ids
|
||||||
- [X] 1.2.1 add file counter to main page
|
- [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.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.2.4 prevent cloning of local/private ip addresses
|
||||||
- [ ] 1.3.0 add simple moderation tools
|
- [ ] 1.3.0 add simple moderation tools
|
||||||
|
|
51
src/index.ts
51
src/index.ts
|
@ -21,7 +21,7 @@ const multerSetup = multer({storage:memoryStorage()})
|
||||||
let config = require(`${process.cwd()}/config.json`)
|
let config = require(`${process.cwd()}/config.json`)
|
||||||
app.use("/static",express.static("assets"))
|
app.use("/static",express.static("assets"))
|
||||||
app.use(bodyParser.text({limit:(config.maxDiscordFileSize*config.maxDiscordFiles)+1048576,type:["application/json","text/plain"]}))
|
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
|
// funcs
|
||||||
|
|
||||||
|
@ -37,10 +37,7 @@ function ThrowError(response:express.Response,code:number,errorMessage:string) {
|
||||||
|
|
||||||
if (!fs.existsSync(__dirname+"/../.data/")) fs.mkdirSync(__dirname+"/../.data/")
|
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
|
// discord
|
||||||
|
|
||||||
|
@ -49,7 +46,7 @@ let client = new Client({intents:[
|
||||||
IntentsBitField.Flags.MessageContent
|
IntentsBitField.Flags.MessageContent
|
||||||
],rest:{timeout:config.requestTimeout}})
|
],rest:{timeout:config.requestTimeout}})
|
||||||
|
|
||||||
let uploadChannel:Discord.TextBasedChannel
|
let files = new Files(client,config)
|
||||||
|
|
||||||
app.get("/", function(req,res) {
|
app.get("/", function(req,res) {
|
||||||
fs.readFile(__dirname+"/../pages/base.html",(err,buf) => {
|
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) => {
|
app.post("/upload",multerSetup.single('file'),async (req,res) => {
|
||||||
if (req.file) {
|
if (req.file) {
|
||||||
try {
|
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))
|
.then((uID) => res.send(uID))
|
||||||
.catch((stat) => {res.status(stat.status);res.send(`[err] ${stat.message}`)})
|
.catch((stat) => {res.status(stat.status);res.send(`[err] ${stat.message}`)})
|
||||||
} catch {
|
} catch {
|
||||||
|
@ -134,35 +131,7 @@ app.get("/download/:fileId",(req,res) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
app.get("/file/:fileId",async (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) => {
|
app.get("/server",(req,res) => {
|
||||||
|
@ -173,18 +142,6 @@ app.get("*",(req,res) => {
|
||||||
ThrowError(res,404,"Page not found.")
|
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() {
|
app.listen(3000,function() {
|
||||||
console.log("Web OK!")
|
console.log("Web OK!")
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
import axios from "axios";
|
||||||
import Discord, { Client, TextBasedChannel } from "discord.js";
|
import Discord, { Client, TextBasedChannel } from "discord.js";
|
||||||
import { readFile, writeFile } from "fs";
|
import { readFile, writeFile } from "fs";
|
||||||
|
import { Readable } from "node:stream"
|
||||||
|
|
||||||
export let id_check_regex = /[A-Za-z0-9_\-\.]+/
|
export let id_check_regex = /[A-Za-z0-9_\-\.]+/
|
||||||
|
|
||||||
|
@ -40,8 +41,27 @@ export default class Files {
|
||||||
uploadChannel?: TextBasedChannel
|
uploadChannel?: TextBasedChannel
|
||||||
|
|
||||||
constructor(client: Client, config: Configuration) {
|
constructor(client: Client, config: Configuration) {
|
||||||
|
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.client = client;
|
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> {
|
uploadFile(settings:FileUploadSettings,fBuffer:Buffer):Promise<string|StatusCodeError> {
|
||||||
|
@ -159,12 +179,59 @@ export default class Files {
|
||||||
|
|
||||||
// todo: move read code here
|
// 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()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue