mirror of
https://github.com/roleypoly/roleypoly-v1.git
synced 2025-04-24 19:59:12 +00:00
135 lines
3.3 KiB
JavaScript
135 lines
3.3 KiB
JavaScript
module.exports = (R, $) => {
|
|
R.get('/api/servers', async ctx => {
|
|
try {
|
|
const { userId } = ctx.session
|
|
const srv = $.discord.getRelevantServers(userId)
|
|
const presentable = await $.P.presentableServers(srv, userId)
|
|
|
|
ctx.body = presentable
|
|
} catch (e) {
|
|
console.error(e.trace || e.stack)
|
|
}
|
|
})
|
|
|
|
R.get('/api/server/:id', async ctx => {
|
|
const { userId } = ctx.session
|
|
const { id } = ctx.params
|
|
|
|
const srv = $.discord.client.guilds.get(id)
|
|
|
|
if (srv == null) {
|
|
ctx.body = { err: 'not found' }
|
|
ctx.status = 404
|
|
return
|
|
}
|
|
|
|
let gm
|
|
if (srv.members.has(userId)) {
|
|
gm = $.discord.gm(id, userId)
|
|
} else if ($.discord.isRoot(userId)) {
|
|
gm = $.discord.fakeGm({ id: userId })
|
|
} else {
|
|
ctx.body = { err: 'not_a_member' }
|
|
ctx.status = 400
|
|
return
|
|
}
|
|
const server = await $.P.presentableServer(srv, gm)
|
|
|
|
ctx.body = server
|
|
})
|
|
|
|
R.get('/api/server/:id/slug', async ctx => {
|
|
const { userId } = ctx.session
|
|
const { id } = ctx.params
|
|
|
|
const srv = $.discord.client.guilds.get(id)
|
|
|
|
console.log(srv)
|
|
|
|
if (srv == null) {
|
|
ctx.body = { err: 'not found' }
|
|
ctx.status = 404
|
|
return
|
|
}
|
|
|
|
ctx.body = await $.P.serverSlug(srv)
|
|
})
|
|
|
|
R.patch('/api/server/:id', async ctx => {
|
|
const { userId } = ctx.session
|
|
const { id } = ctx.params
|
|
|
|
let gm = $.discord.gm(id, userId)
|
|
if (gm == null && $.discord.isRoot(userId)) {
|
|
gm = $.discord.fakeGm({ id: userId })
|
|
}
|
|
|
|
// check perms
|
|
if (!$.discord.getPermissions(gm).canManageRoles) {
|
|
ctx.status = 403
|
|
ctx.body = { err: 'cannot_manage_roles' }
|
|
return
|
|
}
|
|
|
|
const { message = null, categories = null } = ctx.request.body
|
|
|
|
// todo make less nasty
|
|
await $.server.update(id, {
|
|
...(message != null ? { message } : {}),
|
|
...(categories != null ? { categories } : {}),
|
|
})
|
|
|
|
ctx.body = { ok: true }
|
|
})
|
|
|
|
R.get('/api/admin/servers', async ctx => {
|
|
const { userId } = ctx.session
|
|
if (!$.discord.isRoot(userId)) {
|
|
return
|
|
}
|
|
|
|
ctx.body = $.discord.client.guilds.map(g => ({
|
|
url: `${process.env.APP_URL}/s/${g.id}`,
|
|
name: g.name,
|
|
members: g.members.array().length,
|
|
roles: g.roles.array().length,
|
|
}))
|
|
})
|
|
|
|
R.patch('/api/servers/:server/roles', async ctx => {
|
|
const { userId } = ctx.session
|
|
const { server } = ctx.params
|
|
|
|
let gm = $.discord.gm(server, userId)
|
|
if (gm == null && $.discord.isRoot(userId)) {
|
|
gm = $.discord.fakeGm({ id: userId })
|
|
}
|
|
|
|
// check perms
|
|
// if (!$.discord.getPermissions(gm).canManageRoles) {
|
|
// ctx.status = 403
|
|
// ctx.body = { err: 'cannot_manage_roles' }
|
|
// return
|
|
// }
|
|
|
|
const { added, removed } = ctx.request.body
|
|
|
|
const allowedRoles = await $.server.getAllowedRoles(server)
|
|
|
|
const pred = r => $.discord.safeRole(server, r) && allowedRoles.indexOf(r) !== -1
|
|
|
|
if (added.length > 0) {
|
|
gm = await gm.addRoles(added.filter(pred))
|
|
}
|
|
|
|
setTimeout(() => {
|
|
if (removed.length > 0) {
|
|
gm.removeRoles(removed.filter(pred))
|
|
}
|
|
}, 1000)
|
|
|
|
// console.log('role patch', { added, removed, allowedRoles, addedFiltered: added.filterNot(pred), removedFiltered: removed.filterNot(pred) })
|
|
|
|
ctx.body = { ok: true }
|
|
})
|
|
}
|