refactor [discord] service (#2107)

This commit is contained in:
chris48s
2018-09-28 21:00:21 +01:00
committed by GitHub
parent 4ef2ea757b
commit 264f5e39dc
3 changed files with 61 additions and 48 deletions

View File

@@ -432,10 +432,6 @@ const allBadgeExamples = [
title: 'Gitter',
previewUrl: '/gitter/room/nwjs/nw.js.svg',
},
{
title: 'Discord',
previewUrl: '/discord/102860784329052160.svg',
},
],
},
{

View File

@@ -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 }),
},
]
}
}

View File

@@ -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',
})
)