Files
shields/services/ore/ore-base.js
2021-07-09 12:53:55 +01:00

87 lines
2.3 KiB
JavaScript

import Joi from 'joi'
import { BaseJsonService, InvalidResponse } from '../index.js'
const sessionSchema = Joi.object({
session: Joi.string().required(),
}).required()
const resourceSchema = Joi.object({
promoted_versions: Joi.array()
.items({
version: Joi.string().required(),
tags: Joi.array()
.items({
name: Joi.string().required(),
display_data: Joi.string().allow(null),
})
.required(),
})
.required(),
stats: Joi.object({
stars: Joi.number().required(),
downloads: Joi.number().required(),
}).required(),
category: Joi.string().required(),
settings: Joi.object({
license: Joi.object({
name: Joi.string().allow(null).allow(''),
url: Joi.string().allow(null).allow(''),
}),
}).required(),
}).required()
const documentation = `
<p>Your Plugin ID is the name of your plugin in lowercase, without any spaces or dashes.</p>
<p>Example: <code>https://ore.spongepowered.org/Erigitic/Total-Economy</code> - Here the Plugin ID is <code>totaleconomy<code/>.`
const keywords = ['sponge', 'spongemc', 'spongepowered']
class BaseOreService extends BaseJsonService {
async _refreshSessionToken() {
const requestOptions = {
schema: sessionSchema,
url: 'https://ore.spongepowered.org/api/v2/authenticate',
options: { method: 'POST' },
}
const { session } = await this._requestJson(requestOptions)
BaseOreService.sessionToken = session
}
async fetch({
pluginId,
schema = resourceSchema,
url = `https://ore.spongepowered.org/api/v2/projects/${pluginId}`,
}) {
const requestOptions = {
schema,
url,
options: {
headers: {
Authorization: `OreApi session=${BaseOreService.sessionToken}`,
},
},
}
try {
return await this._requestJson(requestOptions)
} catch (error) {
if (error instanceof InvalidResponse) {
const { response: _response } = error
const { statusCode } = _response
if (statusCode === 401) {
await this._refreshSessionToken()
requestOptions.options.headers.Authorization = `OreApi session=${BaseOreService.sessionToken}`
return this._requestJson(requestOptions)
}
}
throw error
}
}
}
BaseOreService.sessionToken = null
export { keywords, documentation, BaseOreService }