sync/src/web/routes/api/moderation.js
2026-05-04 16:07:59 +02:00

103 lines
4.2 KiB
JavaScript

const express = require('express');
const db = require('../../../database');
const { botAuth, requireRank, getLoadedChannel } = require('./middleware');
const router = express.Router({ mergeParams: true });
router.get('/users', botAuth, (req, res) => {
const chan = getLoadedChannel(req.params.channel);
if (!chan) return res.status(503).json({ error: 'Channel is not currently active' });
const users = chan.users.map(u => ({
name: u.getName(),
rank: u.account.effectiveRank,
afk: u.is(0x4),
is_bot: Boolean(u.socket.context.user && u.socket.context.user.isBot)
}));
res.json(users);
});
router.post('/users/:name/kick', botAuth, requireRank(2), (req, res) => {
const chan = getLoadedChannel(req.params.channel);
if (!chan) return res.status(503).json({ error: 'Channel is not currently active' });
const targetName = req.params.name.toLowerCase();
const reason = (req.body && req.body.reason) ? String(req.body.reason) : 'Kicked by bot';
const target = chan.users.find(u => u.getLowerName() === targetName);
if (!target) return res.status(404).json({ error: 'User not found' });
if (target.account.effectiveRank >= req.bot.rank) {
return res.status(403).json({ error: 'Cannot kick a user with equal or higher rank' });
}
target.kick(reason);
res.json({ success: true });
});
router.post('/users/:name/ban', botAuth, requireRank(3), async (req, res) => {
const chan = getLoadedChannel(req.params.channel);
if (!chan) return res.status(503).json({ error: 'Channel is not currently active' });
const targetName = req.params.name.toLowerCase();
const reason = (req.body && req.body.reason) ? String(req.body.reason) : 'Banned by bot';
const target = chan.users.find(u => u.getLowerName() === targetName);
if (target && target.account.effectiveRank >= req.bot.rank) {
return res.status(403).json({ error: 'Cannot ban a user with equal or higher rank' });
}
chan.modules.kickban.ban(targetName, '', reason, req.bot.name, (err) => {
if (err) return res.status(400).json({ error: err });
res.json({ success: true });
});
});
router.delete('/users/:name/ban', botAuth, requireRank(3), (req, res) => {
const chan = getLoadedChannel(req.params.channel);
if (!chan) return res.status(503).json({ error: 'Channel is not currently active' });
const targetName = req.params.name.toLowerCase();
db.channels.listBans(chan.name, (err, bans) => {
if (err) return res.status(500).json({ error: 'Database error' });
const entry = bans.find(b => b.name.toLowerCase() === targetName);
if (!entry) return res.status(404).json({ error: 'Ban not found' });
db.channels.unbanId(chan.name, entry.id, (err2) => {
if (err2) return res.status(500).json({ error: 'Database error' });
chan.broadcastAll('banlist', bans.filter(b => b.id !== entry.id));
res.json({ success: true });
});
});
});
router.put('/users/:name/rank', botAuth, requireRank(4), async (req, res) => {
const chan = getLoadedChannel(req.params.channel);
if (!chan) return res.status(503).json({ error: 'Channel is not currently active' });
const targetName = req.params.name.toLowerCase();
const newRank = parseInt(req.body && req.body.rank, 10);
if (isNaN(newRank) || newRank < 1) {
return res.status(400).json({ error: 'Invalid rank' });
}
if (newRank >= req.bot.rank) {
return res.status(403).json({ error: 'Cannot assign rank equal to or higher than your own' });
}
const target = chan.users.find(u => u.getLowerName() === targetName);
if (!target) return res.status(404).json({ error: 'User not found in channel' });
if (target.account.effectiveRank >= req.bot.rank) {
return res.status(403).json({ error: 'Cannot change rank of a user with equal or higher rank' });
}
db.channels.setRank(chan.name, targetName, newRank, (err) => {
if (err) return res.status(500).json({ error: 'Database error' });
target.setChannelRank(newRank);
chan.broadcastAll('setUserRank', { name: target.getName(), rank: target.account.effectiveRank });
res.json({ success: true });
});
});
module.exports = router;