pockybot
Version:
Spark bot that handles team recognition
81 lines (80 loc) • 4.01 kB
JavaScript
;
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;