diff --git a/src/api/cr.ins/main.ts b/src/api/cr.ins/main.ts new file mode 100644 index 0000000..cffae3c --- /dev/null +++ b/src/api/cr.ins/main.ts @@ -0,0 +1,3 @@ +import { Server, ServerManagement } from '../../class'; + +export default (management: ServerManagement) => new Server(management, 3891, `${__dirname}/routes`); diff --git a/src/api/cr.ins/routes/index.ts b/src/api/cr.ins/routes/index.ts new file mode 100644 index 0000000..baf2256 --- /dev/null +++ b/src/api/cr.ins/routes/index.ts @@ -0,0 +1 @@ +export { default as root } from './root'; diff --git a/src/api/cr.ins/routes/root.ts b/src/api/cr.ins/routes/root.ts new file mode 100644 index 0000000..c18a8c7 --- /dev/null +++ b/src/api/cr.ins/routes/root.ts @@ -0,0 +1,32 @@ +import { LocalStorage, Route, Server } from '../../../class'; + +export default class Root extends Route { + constructor(server: Server) { + super(server); + this.conf = { + path: '/', + }; + } + + public bind() { + this.router.get('/m/:id', async (req, res) => { + try { + const id = req.params.id.split('.')[0]; + const file = await this.server.client.db.File.findOne({ identifier: id }); + if (!file) return res.status(404).json({ code: this.constants.codes.NOT_FOUND, message: this.constants.messages.NOT_FOUND }); + if (file.downloaded >= file.maxDownloads) return res.status(404).json({ code: this.constants.codes.NOT_FOUND, message: this.constants.messages.NOT_FOUND }); + if (req.query.d === '1') { + res.contentType('text/html'); + const decomp = await LocalStorage.decompress(file.data); + res.status(200).send(decomp); + } else { + res.contentType(file.mimeType); + res.status(200).send(file.data); + } + return await file.updateOne({ $inc: { downloaded: 1 } }); + } catch (err) { + return this.handleError(err, res); + } + }); + } +} diff --git a/src/api/index.ts b/src/api/index.ts index b4fc983..2748a82 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,5 +1,7 @@ import locsh from './loc.sh/main'; +import crins from './cr.ins/main'; export default { 'loc.sh': locsh, + 'cr.ins': crins, }; diff --git a/src/api/loc.sh/routes/root.ts b/src/api/loc.sh/routes/root.ts index 086d1a2..110ba2e 100644 --- a/src/api/loc.sh/routes/root.ts +++ b/src/api/loc.sh/routes/root.ts @@ -23,18 +23,5 @@ export default class Root extends Route { return res.status(500).json({ code: this.constants.codes.SERVER_ERROR, message: this.constants.messages.SERVER_ERROR }); } }); - - this.router.get('/m/:id', async (req, res) => { - try { - const id = req.params.id.split('.')[0]; - const file = await this.server.client.db.File.findOne({ identifier: id }); - if (file.downloaded >= file.maxDownloads) return res.status(404).json({ code: this.constants.codes.NOT_FOUND, message: this.constants.messages.NOT_FOUND }); - res.contentType(file.mimeType); - res.status(200).send(file.data); - return await file.updateOne({ $inc: { downloaded: 1 } }); - } catch (err) { - return this.handleError(err, res); - } - }); } } diff --git a/src/commands/storemessages.ts b/src/commands/storemessages.ts index 44d1292..7ac3e82 100644 --- a/src/commands/storemessages.ts +++ b/src/commands/storemessages.ts @@ -1,52 +1,52 @@ -import { randomBytes } from 'crypto'; -import { Message, TextChannel } from 'eris'; -import { Client, Command, LocalStorage } from '../class'; - -export default class StoreMessages extends Command { - constructor(client: Client) { - super(client); - this.name = 'storemessages'; - this.description = 'Fetches 1000 messages from the specified channel and stores them in a HTML file.'; - this.usage = `${this.client.config.prefix}storemessages [member ID]`; - this.aliases = ['sm']; - this.permissions = 7; - this.guildOnly = true; - this.enabled = true; - } - - public async run(message: Message, args: string[]) { - try { - if (!args[0]) return this.client.commands.get('help').run(message, [this.name]); - const check = this.client.util.resolveGuildChannel(args[0], this.mainGuild, false); - if (!check || check.type !== 0) return this.error(message.channel, 'The channel you specified either doesn\'t exist or isn\'t a textable guild channel.'); - const chan = this.mainGuild.channels.get(check.id); - const loadingMessage = await this.loading(message.channel, 'Fetching messages...'); - let messages = await chan.getMessages(10000); - if (args[1]) { - messages = messages.filter((m) => m.author.id === args[1]); - } - let html = `

Library of Code sp-us

Channel: ${chan.name} (${chan.id})
Generated by: ${message.author.username}#${message.author.discriminator}
Generated at: ${new Date().toLocaleString('en-us')}

`; - for (const msg of messages) { - html += `(${new Date(msg.timestamp).toLocaleString('en-us')}) [${msg.author.username}#${msg.author.discriminator} - ${msg.author.id}]: ${msg.cleanContent}
`; - } - message.delete(); - const identifier = randomBytes(10).toString('hex'); - - const comp = await LocalStorage.compress(html); - const file = new this.client.db.File({ - name: `${chan.name}-${new Date().toLocaleString('en-us')}.html.gz`, - identifier, - mimeType: 'application/gzip', - data: comp, - downloaded: 0, - maxDownloads: 1, - }); - await file.save(); - loadingMessage.delete(); - this.client.getDMChannel(message.author.id).then((c) => c.createMessage(`https://loc.sh/m/${identifier}.html.gz`)).catch(() => this.error(message.channel, 'Could not send a DM to you.')); - return this.success(message.channel, `Fetched messages for <#${chan.id}>. Check your DMs for link to access.`); - } catch (err) { - return this.client.util.handleError(err, message, this); - } - } -} +import { randomBytes } from 'crypto'; +import { Message, TextChannel } from 'eris'; +import { Client, Command, LocalStorage } from '../class'; + +export default class StoreMessages extends Command { + constructor(client: Client) { + super(client); + this.name = 'storemessages'; + this.description = 'Fetches 1000 messages from the specified channel and stores them in a HTML file.'; + this.usage = `${this.client.config.prefix}storemessages [member ID]`; + this.aliases = ['sm']; + this.permissions = 7; + this.guildOnly = true; + this.enabled = true; + } + + public async run(message: Message, args: string[]) { + try { + if (!args[0]) return this.client.commands.get('help').run(message, [this.name]); + const check = this.client.util.resolveGuildChannel(args[0], this.mainGuild, false); + if (!check || check.type !== 0) return this.error(message.channel, 'The channel you specified either doesn\'t exist or isn\'t a textable guild channel.'); + const chan = this.mainGuild.channels.get(check.id); + const loadingMessage = await this.loading(message.channel, 'Fetching messages...'); + let messages = await chan.getMessages(10000); + if (args[1]) { + messages = messages.filter((m) => m.author.id === args[1]); + } + let html = `CLASSIFIED RESOURCE: CL-GEN/AD

Library of Code sp-us

Channel: ${chan.name} (${chan.id})
Generated by: ${message.author.username}#${message.author.discriminator}
Generated at: ${new Date().toLocaleString('en-us')}

`; + for (const msg of messages) { + html += `(${new Date(msg.timestamp).toLocaleString('en-us')}) [${msg.author.username}#${msg.author.discriminator} - ${msg.author.id}]: ${msg.cleanContent}
`; + } + message.delete(); + const identifier = randomBytes(20).toString('hex'); + + const comp = await LocalStorage.compress(html); + const file = new this.client.db.File({ + name: `${chan.name}-${new Date().toLocaleString('en-us')}.html.gz`, + identifier, + mimeType: 'application/gzip', + data: comp, + downloaded: 0, + maxDownloads: 20, + }); + await file.save(); + loadingMessage.delete(); + this.client.getDMChannel(message.author.id).then((c) => c.createMessage(`https://cr.ins/m/${identifier}.html.gz || https://cr.ins/m/${identifier}.html?d=1`)).catch(() => this.error(message.channel, 'Could not send a DM to you.')); + return this.success(message.channel, `Fetched messages for <#${chan.id}>. Check your DMs for link to access.`); + } catch (err) { + return this.client.util.handleError(err, message, this); + } + } +}