From d1558ea096abbd6c22405a7c0f34b08953652a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Kooi?= Date: Thu, 6 Jul 2017 20:36:15 +0200 Subject: [PATCH] Implement dynamic emoji management. --- src/HttpApi.js | 2 ++ src/controllers/emoji.js | 38 ++++++++++++++++++++++++++++++++++++++ src/routes/emoji.js | 36 ++++++++++++++++++++++++++++++++++++ src/sockets.js | 6 ++++++ 4 files changed, 82 insertions(+) create mode 100644 src/controllers/emoji.js create mode 100644 src/routes/emoji.js diff --git a/src/HttpApi.js b/src/HttpApi.js index e4572664..8d737b48 100644 --- a/src/HttpApi.js +++ b/src/HttpApi.js @@ -16,6 +16,7 @@ import chat from './routes/chat'; import motd from './routes/motd'; import now from './routes/now'; import imports from './routes/import'; +import emoji from './routes/emoji'; // middleware import addFullUrl from './middleware/addFullUrl'; @@ -135,6 +136,7 @@ export default class UwaveHttpApi extends Router { .use('/bans', bans(this)) .use('/booth', booth(this)) .use('/chat', chat(this)) + .use('/emoji', emoji(this)) .use('/import', imports(this)) .use('/motd', motd(this)) .use('/now', now(this)) diff --git a/src/controllers/emoji.js b/src/controllers/emoji.js new file mode 100644 index 00000000..cee38991 --- /dev/null +++ b/src/controllers/emoji.js @@ -0,0 +1,38 @@ +import { NotFoundError } from '../errors'; +import toItemResponse from '../utils/toItemResponse'; + +export async function getAll(req) { + const { emoji } = req.uwave; + + return toItemResponse( + await emoji.list(), + { url: req.fullUrl }, + ); +} + +export async function getEmoji(req) { + const { emoji } = req.uwave; + + const data = await emoji.getEmoji(req.params.shortcode); + if (!data) { + throw new NotFoundError(); + } + + return toItemResponse(data, { url: req.fullUrl }); +} + +export async function addCustomEmoji(req) { + const { emoji } = req.uwave; + + await emoji.addCustomEmoji(req.user, req.params.shortcode, req); + + return toItemResponse({}, { url: req.fullUrl }); +} + +export async function deleteCustomEmoji(req) { + const { emoji } = req.uwave; + + await emoji.deleteCustomEmoji(req.user, req.params.shortcode); + + return toItemResponse({}, { url: req.fullUrl }); +} diff --git a/src/routes/emoji.js b/src/routes/emoji.js new file mode 100644 index 00000000..e4918896 --- /dev/null +++ b/src/routes/emoji.js @@ -0,0 +1,36 @@ +import router from 'router'; +import route from '../route'; +import { HTTPError } from '../errors'; +import protect from '../middleware/protect'; +import * as controller from '../controllers/emoji'; + +export default function emojiRouter() { + function checkEmojiEnabled(req, res, next) { + if (!req.uwave.emoji) { + next(new HTTPError(400, 'Emoji are not enabled.')); + } else { + next(); + } + } + + return router() + .use(checkEmojiEnabled) + .get( + '/', + route(controller.getAll), + ) + .get( + '/:shortcode', + route(controller.getEmoji), + ) + .put( + '/:shortcode', + protect('emoji.add'), + route(controller.addCustomEmoji), + ) + .delete( + '/:shortcode', + protect('emoji.remove'), + route(controller.deleteCustomEmoji), + ); +} diff --git a/src/sockets.js b/src/sockets.js index dff91446..7b23ff6c 100644 --- a/src/sockets.js +++ b/src/sockets.js @@ -428,6 +428,12 @@ export default class SocketServer { } }); }, + 'emoji:add': (emoji) => { + this.broadcast('emoji:add', emoji); + }, + 'emoji:remove': (emoji) => { + this.broadcast('emoji:remove', emoji); + }, }; /**