require('dotenv').config(); const Revolt = require('revolt.js'); const Enmap = require('enmap'); const { default: Logger, LogLevel } = require('log75'); const db = { blacklist: new Enmap({ name: 'userBlacklist' }), devs: new Enmap({ name: 'devList' }) } const config = { revoltClient: { apiURL: process.env.API_URL || 'https://api.revolt.chat', autoReconnect: true, debug: false }, prefix: process.env.BOT_PREFIX || '/', debug: process.env.NODE_ENV !== 'production', botOwner: process.env.BOT_OWNER || null, creds: { // chrome debug -> Application -> IndexedDB -> localforage -> state -> auth.accounts[user ID].session session_token: process.env.SESSION_TOKEN, user_id: process.env.USER_ID, id: process.env.SESSION_ID } } const logger = new Logger(config.debug ? LogLevel.Debug : LogLevel.Standard); const client = new Revolt.Client(config.revoltClient); client.on("message", async message => { const author = await client.users.fetch(message.author).catch(()=>{}); const channel = await client.channels.fetch(message.channel).catch(()=>{}); if (!author || !channel) return logger.debug(`Received message with unknown author or channel`); if (author._id === client.user._id) return logger.debug(`Sent message -> ${channel.name} => ${message.content}`); const logPrefix = `${author.username} (${author._id}) in ${channel.name || 'Unnamed'} (${channel._id})`; logger.debug(`${logPrefix} => ${message.content}`); if (!message.content.startsWith(config.prefix)) return; let args = message.content.substr(config.prefix.length).split(' '); let commandName = args.shift(); let command = commands.find(cmd => cmd.meta.name === commandName || cmd.meta.aliases?.indexOf(commandName) > -1); if (!command) return; let userDevLvl = require('./util/dev').getDevLevel(message.author); let blacklistStatus = db.blacklist.get(message.author); if (blacklistStatus?.blacklisted && userDevLvl <= 0) { logger.warn(`Rejected blocked user`); if (!blacklistStatus.silent && blacklistStatus.nextWarning < Date.now()) { await client.channels.sendMessage(message.channel, `<@${message.author}>, you're currently not allowed to use this bot.`); } blacklistStatus.nextWarning = Date.now() + 1000 * 60 * 2; db.blacklist.set(message.author, blacklistStatus); return; } if (userDevLvl < (command.meta.devLevel ?? 0)) return logger.warn(`Rejected dev command`); logger.info(`${logPrefix} -> COMMAND ${config.prefix}${commandName} ${args?.join(' ')}`) try { command.run(message, args); } catch(e) { await client.channels.sendMessage(message.channel, `bot is death\n\`\`\`js\n${e}\`\`\``); } }); // Log in if (!config.creds.session_token) return logger.error('gimme token or die'); if (!config.creds.user_id) return logger.error('gimme user id or die'); if (!config.creds.id) return logger.error('gimme session id or die'); logger.info(`Attempting to continue session...`); client.useExistingSession(config.creds) .then(() => { logger.done('Logged in'); logger.info(`${client.user.username} (${client.user._id}): Ready`); require('./util/friendships'); // Manage relationships require('./util/levels'); // Level ups }); module.exports = { client, logger, config, db } const { commands } = require('./util/command_loader');