mirror of
https://github.com/ancsemi/Haven.git
synced 2026-10-30 02:25:38 +00:00
81 lines
3.8 KiB
JavaScript
81 lines
3.8 KiB
JavaScript
'use strict';
|
|
|
|
// Stock roles for a new server (and Reset to Default).
|
|
// Admin/host is users.is_admin, not a row in `roles`.
|
|
|
|
const MEMBER_PERMS = [
|
|
'edit_own_messages', 'delete_own_messages', 'send_self_destruct', 'upload_files',
|
|
'use_voice', 'use_tts', 'view_history', 'view_channel_members',
|
|
];
|
|
|
|
const MOD_PERMS = [
|
|
...MEMBER_PERMS,
|
|
'delete_message', 'delete_lower_messages', 'pin_message', 'archive_messages',
|
|
'kick_user', 'mute_user', 'ban_user', 'ban_ip',
|
|
'rename_channel', 'rename_sub_channel', 'set_channel_topic',
|
|
'manage_sub_channels', 'manage_channel_settings',
|
|
'create_channel', 'create_temp_channel',
|
|
'invite_users', 'mention_everyone', 'view_all_members',
|
|
'manage_webhooks', 'use_ferry', 'manage_emojis', 'manage_stickers',
|
|
'manage_soundboard', 'manage_music_queue', 'manage_tags',
|
|
'promote_user', 'read_only_override', 'view_audit_log', 'manage_display_names',
|
|
'highlight_messages',
|
|
];
|
|
|
|
const CHANNEL_MOD_PERMS = [
|
|
'kick_user', 'mute_user', 'delete_message', 'pin_message',
|
|
'manage_sub_channels', 'rename_sub_channel', 'delete_lower_messages',
|
|
'upload_files', 'use_voice', 'view_history', 'view_channel_members', 'manage_music_queue',
|
|
'delete_own_messages', 'edit_own_messages', 'send_self_destruct',
|
|
];
|
|
|
|
function seedDefaultRoles(db) {
|
|
const insertRole = db.prepare('INSERT INTO roles (name, level, scope, color) VALUES (?, ?, ?, ?)');
|
|
const insertPerm = db.prepare('INSERT INTO role_permissions (role_id, permission, allowed) VALUES (?, ?, 1)');
|
|
|
|
const mod = insertRole.run('Mod', 50, 'server', '#3498db');
|
|
MOD_PERMS.forEach(p => insertPerm.run(mod.lastInsertRowid, p));
|
|
|
|
// Channel-scoped; the default channel creator role is the highest channel role.
|
|
const channelMod = insertRole.run('Channel Mod', 25, 'channel', '#2ecc71');
|
|
CHANNEL_MOD_PERMS.forEach(p => insertPerm.run(channelMod.lastInsertRowid, p));
|
|
|
|
const member = insertRole.run('Member', 1, 'server', '#95a5a6');
|
|
db.prepare('UPDATE roles SET auto_assign = 1 WHERE id = ?').run(member.lastInsertRowid);
|
|
MEMBER_PERMS.forEach(p => insertPerm.run(member.lastInsertRowid, p));
|
|
|
|
return { memberId: member.lastInsertRowid, modId: mod.lastInsertRowid, channelModId: channelMod.lastInsertRowid };
|
|
}
|
|
|
|
// The Admin role (#5707): a real role at the top that whoever holds admin
|
|
// wears, so they look the part. It adds no power (that comes from is_admin).
|
|
// Its id is kept in server_settings so renaming it changes nothing, and an
|
|
// admin who deletes it is never handed a new one.
|
|
function getAdminRoleId(db) {
|
|
const row = db.prepare("SELECT value FROM server_settings WHERE key = 'admin_role_id'").get();
|
|
const id = row ? parseInt(row.value, 10) : NaN;
|
|
if (!Number.isInteger(id) || id <= 0) return null;
|
|
return db.prepare('SELECT id FROM roles WHERE id = ?').get(id) ? id : null;
|
|
}
|
|
|
|
function createAdminRole(db, { name = 'Admin', color = '#e74c3c', icon = null } = {}) {
|
|
const { VALID_ROLE_PERMS } = require('./socketHandlers/helpers');
|
|
const id = db.prepare("INSERT INTO roles (name, level, scope, color, icon) VALUES (?, 99, 'server', ?, ?)")
|
|
.run(name, color, icon).lastInsertRowid;
|
|
const insertPerm = db.prepare('INSERT OR IGNORE INTO role_permissions (role_id, permission, allowed) VALUES (?, ?, 1)');
|
|
VALID_ROLE_PERMS.forEach(p => insertPerm.run(id, p));
|
|
return id;
|
|
}
|
|
|
|
/** Give the Admin role to someone who has just become admin. */
|
|
function grantAdminRole(db, userId) {
|
|
const id = getAdminRoleId(db);
|
|
if (!id || !userId) return;
|
|
const has = db.prepare('SELECT 1 FROM user_roles WHERE user_id = ? AND role_id = ? AND channel_id IS NULL').get(userId, id);
|
|
if (!has) {
|
|
db.prepare('INSERT INTO user_roles (user_id, role_id, channel_id, granted_by) VALUES (?, ?, NULL, ?)').run(userId, id, userId);
|
|
}
|
|
}
|
|
|
|
module.exports = { MEMBER_PERMS, MOD_PERMS, CHANNEL_MOD_PERMS, seedDefaultRoles, getAdminRoleId, createAdminRole, grantAdminRole };
|