refactor [discord] service (#2107)
This commit is contained in:
@@ -432,10 +432,6 @@ const allBadgeExamples = [
|
||||
title: 'Gitter',
|
||||
previewUrl: '/gitter/room/nwjs/nw.js.svg',
|
||||
},
|
||||
{
|
||||
title: 'Discord',
|
||||
previewUrl: '/discord/102860784329052160.svg',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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 }),
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
})
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user