From 264f5e39dc4ed626dbc107a364972724394e9901 Mon Sep 17 00:00:00 2001 From: chris48s Date: Fri, 28 Sep 2018 21:00:21 +0100 Subject: [PATCH] refactor [discord] service (#2107) --- lib/all-badge-examples.js | 4 -- services/discord/discord.service.js | 102 ++++++++++++++++------------ services/discord/discord.tester.js | 3 +- 3 files changed, 61 insertions(+), 48 deletions(-) diff --git a/lib/all-badge-examples.js b/lib/all-badge-examples.js index 3334479806..2a61d35330 100644 --- a/lib/all-badge-examples.js +++ b/lib/all-badge-examples.js @@ -432,10 +432,6 @@ const allBadgeExamples = [ title: 'Gitter', previewUrl: '/gitter/room/nwjs/nw.js.svg', }, - { - title: 'Discord', - previewUrl: '/discord/102860784329052160.svg', - }, ], }, { diff --git a/services/discord/discord.service.js b/services/discord/discord.service.js index 0e0e0c65dc..414820d86f 100644 --- a/services/discord/discord.service.js +++ b/services/discord/discord.service.js @@ -1,49 +1,65 @@ 'use strict' -const LegacyService = require('../legacy-service') -const { makeBadgeData: getBadgeData } = require('../../lib/badge-data') +const Joi = require('joi') +const BaseJsonService = require('../base-json') -module.exports = class Discord extends LegacyService { - static registerLegacyRouteHandler({ camp, cache }) { - camp.route( - /^\/discord\/([^/]+)\.(svg|png|gif|jpg|json)$/, - cache((data, match, sendBadge, request) => { - const serverID = match[1] - const format = match[2] - const apiUrl = `https://discordapp.com/api/guilds/${serverID}/widget.json` +const discordSchema = Joi.object({ + members: Joi.array() + .allow(null) + .required(), +}).required() - request(apiUrl, (err, res, buffer) => { - const badgeData = getBadgeData('chat', data) - if (res && res.statusCode === 404) { - badgeData.text[1] = 'invalid server' - sendBadge(format, badgeData) - return - } - if (err != null || !res || res.statusCode !== 200) { - badgeData.text[1] = 'inaccessible' - if (res && res.headers['content-type'] === 'application/json') { - try { - const data = JSON.parse(buffer) - if (data && typeof data.message === 'string') { - badgeData.text[1] = data.message.toLowerCase() - } - } catch (e) {} - } - sendBadge(format, badgeData) - return - } - try { - const data = JSON.parse(buffer) - const members = Array.isArray(data.members) ? data.members : [] - badgeData.text[1] = members.length + ' online' - badgeData.colorscheme = 'brightgreen' - sendBadge(format, badgeData) - } catch (e) { - badgeData.text[1] = 'invalid' - sendBadge(format, badgeData) - } - }) - }) - ) +module.exports = class Discord extends BaseJsonService { + async fetch({ serverId }) { + const url = `https://discordapp.com/api/guilds/${serverId}/widget.json` + return this._requestJson({ + url, + schema: discordSchema, + errorMessages: { + 404: 'invalid server', + 403: 'widget disabled', + }, + }) + } + + static render({ members }) { + return { + message: `${members} online`, + color: 'brightgreen', + } + } + + async handle({ serverId }) { + const data = await this.fetch({ serverId }) + const members = Array.isArray(data.members) ? data.members : [] + return this.constructor.render({ members: members.length }) + } + + // Metadata + static get defaultBadgeData() { + return { label: 'chat' } + } + + static get category() { + return 'chat' + } + + static get url() { + return { + base: 'discord', + format: '([^/]+)', + capture: ['serverId'], + } + } + + static get examples() { + return [ + { + title: 'Discord', + exampleUrl: '102860784329052160', + urlPattern: ':serverId', + staticExample: this.render({ members: 23 }), + }, + ] } } diff --git a/services/discord/discord.tester.js b/services/discord/discord.tester.js index f3aa86782a..3da44f6113 100644 --- a/services/discord/discord.tester.js +++ b/services/discord/discord.tester.js @@ -7,11 +7,12 @@ const t = new ServiceTester({ id: 'discord', title: 'Discord' }) module.exports = t t.create('gets status for Reactiflux') - .get('/102860784329052160.json') + .get('/102860784329052160.json?style=_shields_test') .expectJSONTypes( Joi.object().keys({ name: 'chat', value: Joi.string().regex(/^[0-9]+ online$/), + colorB: '#4c1', }) )