UNPKG

pockybot

Version:

Spark bot that handles team recognition

81 lines (80 loc) 4.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const trigger_1 = require("../../models/trigger"); const database_1 = require("../../models/database"); const command_1 = require("../../models/command"); const constants_1 = require("../../constants"); const xmlMessageParser_1 = require("../parsers/xmlMessageParser"); const logger_1 = require("../logger"); class RemoveUser extends trigger_1.default { constructor(config, dbUsers, dbLocation, pockyDb) { super(); this.config = config; this.dbUsers = dbUsers; this.dbLocation = dbLocation; this.pockyDb = pockyDb; } isToTriggerOn(message) { if (!(this.config.checkRole(message.personId, database_1.Role.Admin) || this.config.checkRole(message.personId, database_1.Role.RemoveUser))) { return false; } let parsedMessage = xmlMessageParser_1.default.parseNonPegMessage(message); return parsedMessage.botId === constants_1.default.botId && parsedMessage.command.toLowerCase().startsWith(command_1.Command.RemoveUser); } async createMessage(message) { let parsedMessage = xmlMessageParser_1.default.parseXmlMessage(message); if (parsedMessage.length === 3) { if (parsedMessage[1].text().trim().toLowerCase() !== command_1.Command.RemoveUser || parsedMessage[2].name() !== 'spark-mention' || parsedMessage[2].attr('data-object-type').value() !== 'person') { return { markdown: 'Please mention or provide the name of the person you want to remove' }; } let personId = xmlMessageParser_1.default.getPersonId(parsedMessage[2].attr('data-object-id').value()); const response = await this.removeUser(personId, parsedMessage[2].text()); return { markdown: response }; } if (parsedMessage.length < 2) { return { markdown: 'Please mention or provide the name of the person you want to remove' }; } const pattern = new RegExp(`^${command_1.Command.RemoveUser}`, 'ui'); const name = parsedMessage[1].text().trim().replace(pattern, '').trim(); if (name === '') { return { markdown: 'Please mention or provide the name of the person you want to remove' }; } let users; try { users = await this.dbUsers.getUsers(); } catch (error) { logger_1.Logger.error(`[Remove.createMessage] Error getting users: ${error.message}`); return { markdown: 'Error getting users' }; } const user = users.find(x => x.username.toLowerCase() === name.toLowerCase()); if (!user) { return { markdown: `Could not find user with display name '${name}'` }; } const response = await this.removeUser(user.userid, name); return { markdown: response }; } async removeUser(userId, username) { const keywords = this.config.getStringConfig('keyword'); const penaltyKeywords = this.config.getStringConfig('penaltyKeyword'); const pegsGiven = await this.pockyDb.countPegsGiven(userId, keywords, penaltyKeywords); const penaltyPegsGiven = await this.pockyDb.countPenaltyPegsGiven(userId, keywords, penaltyKeywords); const pegsReceived = await this.pockyDb.countPegsReceived(userId); if (pegsGiven > 0 || penaltyPegsGiven > 0 || pegsReceived > 0) { return `Cannot remove user '${username}', they still have outstanding pegs`; } try { await this.dbLocation.deleteUserLocation(userId); await this.dbUsers.deleteUser(userId); return `User '${username}' has been removed`; } catch (error) { logger_1.Logger.error(`[Remove.removeUser] Error deleting user ${username}: ${error.message}`); return `Error removing user '${username}'`; } } } exports.default = RemoveUser;