UNPKG

hubot-pushbot

Version:

PushBot implementation for hubot which is: "PushBot is an IRC bot that manages the topic in an IRC channel that has a push train."

1,036 lines (1,033 loc) 37.5 kB
// Description: // Pushbot for hubot // // Dependencies: // "typescript": "^1.5.0-beta", // "xregexp": "^2.0.0" // // Commands: // .join - Starts a pushbot session // .join before <username> - Starts a new pushbot session and moves before users's session // .join with <username> - Joins to a pushbot session // .hold <message> - Hold session, won't allow to change state or make it done // .unhold - Unhold session // .(uhoh|notgood|bad|fuck|fucked) - Mark yourself as not-all-good in the current push state // .(good|ok|in|go|great) - Mark yourself as all-good in the current push state // .(nm|nevermind|leave) - Hop out of queue // .message <message text> - Set session message // .kick <user> - Kicks user from session // .at <statename> - Changes session state // .done - Finishes session // .(drive|lead) - Take over leadership of session // .sessions - List sessions // .clearplease - Remove all sessions (all means all, not only for the room, but from the entire bot) var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var KickAction = (function () { function KickAction() { } KickAction.prototype.requireLeader = function () { return false; }; KickAction.prototype.requireMembership = function () { return true; }; KickAction.prototype.requireAllUserGood = function () { return false; }; return KickAction; }()); var DoneAction = (function () { function DoneAction() { } DoneAction.prototype.requireLeader = function () { return false; }; DoneAction.prototype.requireMembership = function () { return true; }; DoneAction.prototype.requireAllUserGood = function () { return false; }; return DoneAction; }()); var PushbotErrors; (function (PushbotErrors) { var PushbotError = (function () { function PushbotError() { this.stack = (new Error()).stack; } return PushbotError; }()); var NotInSessionError = (function (_super) { __extends(NotInSessionError, _super); function NotInSessionError() { _super.apply(this, arguments); this.name = 'NotInSessionError'; this.message = 'User not found in session'; } return NotInSessionError; }(PushbotError)); PushbotErrors.NotInSessionError = NotInSessionError; var NotLeadingError = (function (_super) { __extends(NotLeadingError, _super); function NotLeadingError() { _super.apply(this, arguments); this.name = 'NotLeadingError'; this.message = 'You are not leading any session'; } return NotLeadingError; }(PushbotError)); PushbotErrors.NotLeadingError = NotLeadingError; var UserNotKickableError = (function (_super) { __extends(UserNotKickableError, _super); function UserNotKickableError() { _super.apply(this, arguments); this.name = 'UserNotKickable'; this.message = 'You can not kick user'; } return UserNotKickableError; }(PushbotError)); PushbotErrors.UserNotKickableError = UserNotKickableError; var AlreadyInSessionError = (function (_super) { __extends(AlreadyInSessionError, _super); function AlreadyInSessionError() { _super.apply(this, arguments); this.name = 'AlreadyInSessionError'; this.message = 'User already participating in session'; } return AlreadyInSessionError; }(PushbotError)); PushbotErrors.AlreadyInSessionError = AlreadyInSessionError; var PermissionDeniedError = (function (_super) { __extends(PermissionDeniedError, _super); function PermissionDeniedError() { _super.apply(this, arguments); this.name = 'PermissionDeniedError'; this.message = 'You have no permission to perform the action'; } return PermissionDeniedError; }(PushbotError)); PushbotErrors.PermissionDeniedError = PermissionDeniedError; var UsersNotReadyError = (function (_super) { __extends(UsersNotReadyError, _super); function UsersNotReadyError(users) { _super.call(this); this.name = 'UsersNotReadyError'; if (users && users.length) { this.message = 'Users are not ready: ' + users.join(', '); } else { this.message = 'Users are not ready'; } } return UsersNotReadyError; }(PushbotError)); PushbotErrors.UsersNotReadyError = UsersNotReadyError; var UserNotFoundError = (function (_super) { __extends(UserNotFoundError, _super); function UserNotFoundError() { _super.apply(this, arguments); this.name = 'UserNotFoundError'; this.message = 'User not found'; } return UserNotFoundError; }(PushbotError)); PushbotErrors.UserNotFoundError = UserNotFoundError; var LeaderCanNotLeaveError = (function (_super) { __extends(LeaderCanNotLeaveError, _super); function LeaderCanNotLeaveError() { _super.apply(this, arguments); this.name = 'LeaderCanNotLeaveError'; this.message = 'Leader can not leave the session'; } return LeaderCanNotLeaveError; }(PushbotError)); PushbotErrors.LeaderCanNotLeaveError = LeaderCanNotLeaveError; var NotChangedError = (function (_super) { __extends(NotChangedError, _super); function NotChangedError() { _super.apply(this, arguments); this.name = 'NotChangedError'; this.message = 'Value not changed'; } return NotChangedError; }(PushbotError)); PushbotErrors.NotChangedError = NotChangedError; var RoomHoldedError = (function (_super) { __extends(RoomHoldedError, _super); function RoomHoldedError() { _super.apply(this, arguments); this.name = 'RoomHoldedError'; this.message = 'Room holded'; } return RoomHoldedError; }(PushbotError)); PushbotErrors.RoomHoldedError = RoomHoldedError; })(PushbotErrors || (PushbotErrors = {})); var util; (function (util) { function findIndex(array, test) { var index = -1; for (var i = 0, rl = array.length; i < rl; i++) { if (test(array[i])) { index = i; break; } } return index; } util.findIndex = findIndex; function invoke(method) { return function (obj) { return obj[method](); }; } util.invoke = invoke; })(util || (util = {})); var User; (function (User_1) { (function (UserState) { UserState[UserState["Good"] = 0] = "Good"; UserState[UserState["Uhoh"] = 1] = "Uhoh"; UserState[UserState["Waiting"] = 2] = "Waiting"; UserState[UserState["Spectate"] = 3] = "Spectate"; })(User_1.UserState || (User_1.UserState = {})); var UserState = User_1.UserState; var User = (function () { function User(userData) { this.name = userData.name; this.state = userData.state; this.__ref = userData; } User.prototype.getName = function () { return this.name; }; User.prototype.getState = function () { return this.state; }; User.prototype.setState = function (state) { this.__ref.state = state; this.state = state; }; User.prototype.isGood = function () { return this.getState() === UserState.Good; }; User.prototype.isHolding = function () { return this.getState() === UserState.Uhoh; }; User.prototype.isSpectating = function () { return this.getState() === UserState.Spectate; }; return User; }()); User_1.User = User; function createUser(userData) { return new User(userData); } User_1.createUser = createUser; })(User || (User = {})); var Session; (function (Session_1) { var Session = (function () { function Session(session) { this.leader = session.leader; this.state = session.state; this.message = session.message; this.users = session.users; this.__ref = session; } Session.prototype.getLeader = function () { return this.leader; }; Session.prototype.getUsers = function () { return this.users; }; Session.prototype.getState = function () { return this.state; }; Session.prototype.getMessage = function () { return this.message; }; Session.prototype.getHoldMessage = function () { return this.holdMessage; }; Session.prototype.setState = function (state) { this.state = state; this.__ref.state = state; }; Session.prototype.setMessage = function (message) { this.message = message; this.__ref.message = message; }; Session.prototype.setLeader = function (leaderName) { this.leader = leaderName; this.__ref.leader = leaderName; }; Session.prototype.addUser = function (userName) { this.getUsers().push({ name: userName, state: User.UserState.Waiting }); }; Session.prototype.isLeaderJoined = function () { var _this = this; return this.getUsers().some(function (user) { return _this.isUserLeader(User.createUser(user).getName()); }); }; Session.prototype.isUserLeader = function (userName) { return this.getLeader() === userName; }; Session.prototype.isUserMember = function (userName) { return this.getUsers().some(function (user) { return User.createUser(user).getName() === userName; }); }; Session.prototype.isAllUserGood = function () { return this.getUsers().map(User.createUser).every(util.invoke('isGood')); }; Session.prototype.isAnyUserBad = function () { return this.getUsers().map(User.createUser).some(util.invoke('isHolding')); }; Session.prototype.resetUsers = function () { this.getUsers().map(User.createUser).forEach(function (user) { user.setState(User.UserState.Waiting); }); }; Session.prototype.getUserIndex = function (userName) { var index = -1; var users = this.getUsers(); index = util.findIndex(users, function (user) { return User.createUser(user).getName() === userName; }); return index; }; Session.prototype.getHoldingUsers = function () { return this.getUsers().map(User.createUser).filter(function (user) { return user.isGood(); }); }; return Session; }()); Session_1.Session = Session; function sessionObj(session) { return new Session(session); } Session_1.sessionObj = sessionObj; })(Session || (Session = {})); var Room; (function (Room_1) { var Room = (function () { function Room(room) { this.sessions = room.sessions; this.holdMessage = room.holdMessage; this.holded = room.holded; this.__ref = room; } Room.prototype.getSessions = function () { return this.sessions; }; Room.prototype.setSessions = function (sessions) { this.sessions = sessions; this.__ref.sessions = sessions; }; Room.prototype.isHolded = function () { return this.holded; }; Room.prototype.hold = function () { this.holded = true; this.__ref.holded = true; }; Room.prototype.unhold = function () { this.holded = false; this.__ref.holded = false; }; Room.prototype.setHoldMessage = function (message) { this.holdMessage = message; this.__ref.holdMessage = message; }; Room.prototype.getHoldMessage = function () { return this.holdMessage; }; Room.prototype.isUserInSession = function (userName) { var roomSessions = this.getSessions(); if (!roomSessions) { return false; } var index = util.findIndex(roomSessions, function (session) { return Session.sessionObj(session).isUserMember(userName); }); return index > -1; }; return Room; }()); Room_1.Room = Room; })(Room || (Room = {})); var Brain; (function (Brain_1) { var Brain = (function () { function Brain(robot) { if (!robot.brain.data.pushbot) { robot.brain.data.pushbot = Object.create(null); } this.data = robot.brain.data.pushbot; } Brain.prototype.getRooms = function () { return this.data; }; Brain.prototype.getRoom = function (room) { var roomObj = this.getRooms()[room]; if (roomObj) { return new Room.Room(roomObj); } return null; }; Brain.prototype.getRoomSessions = function (room) { var roomData = this.getRoom(room); return roomData && roomData.getSessions(); }; Brain.prototype.hasSessions = function (room) { var roomSessions = this.getRoomSessions(room); return roomSessions && roomSessions.length > 0; }; Brain.prototype.setRoomData = function (room) { this.getRooms()[room] = { holded: false, sessions: [] }; }; Brain.prototype.setRoomSessions = function (room, sessions) { var roomData = this.getRoom(room); if (!roomData) { this.setRoomData(room); } this.getRoom(room).setSessions(sessions); }; Brain.prototype.clearRoomSessions = function (room) { this.setRoomData(room); }; Brain.prototype.setRoomSessionAtIndex = function (room, index, session) { this.getRoomSessions(room)[index] = session; }; Brain.prototype.getRoomSessionAtIndex = function (room, index) { var rooms = this.getRoomSessions(room); if (rooms && rooms.length > index) { return rooms[index]; } return null; }; return Brain; }()); Brain_1.Brain = Brain; })(Brain || (Brain = {})); var XRegExp = require('xregexp'); function createAction(name) { var output; switch (name) { case 'kick': output = new KickAction(); break; case 'done': output = new DoneAction(); break; default: output = null; } return output; } var defaultMessage = '-'; function createSession(leader) { return { leader: leader, state: '', holded: false, holdMessage: '', message: defaultMessage, users: [{ name: leader, state: User.UserState.Waiting }] }; } module.exports = function (robot) { 'use strict'; function createBrain() { return new Brain.Brain(robot); } var commands = { join: ['join'], joinBefore: ['join before'], joinWith: ['join with'], hold: ['hold'], unhold: ['unhold'], uhoh: ['uhoh', 'notgood', 'bad', 'fuck', 'fucked'], good: ['good', 'ok', 'in', 'go', 'great'], spectate: ['spectate'], nevermind: ['leave', 'nevermind', 'nm'], message: ['message'], kick: ['kick'], at: ['at'], done: ['done'], drive: ['drive', 'lead'], sessions: ['sessions'], clearplease: ['clearplease'] }; var messageRegexp = '[\\p{Latin}\\p{Common}\\w\'"(){}\\[\\]+*&%$#@~<>=/\\\\ .:;!?_-]+', userNameRegexp = '[\\w_-][\\w._-]+', stateNameRegexp = '[\\p{Latin}\\p{Common}\\w_-]+'; var emptyMessage = '-'; var bot = '.', goodUserMarker = '✓', holdingUserMarker = '✗', spectateUserMarker = '☺'; function hasPermission(user, action, session) { if (action.requireLeader() && user !== session.getLeader()) { return false; } if (action.requireMembership() && !session.isUserMember(user)) { return false; } return true; } function isUsersStateOk(action, session) { return !action.requireAllUserGood() || !session.isAllUserGood(); } function getSortedSessionUsers(sess) { var users = sess.getUsers().map(User.createUser); var leader = sess.getLeader(); users.sort(function (a, b) { if (a.getName() === leader) { return -1; } else if (b.getName() === leader) { return 1; } else { return 0; } }); return users; } function getUserListStr(users) { return users.map(function (user) { var userName = user.getName(); if (user.isGood()) { return "" + goodUserMarker + userName; } else if (user.isHolding()) { return "" + holdingUserMarker + userName; } else if (user.isSpectating()) { return "" + spectateUserMarker + userName; } else { return userName; } }).join(' + '); } function getStateStrForSession(session) { var sess = Session.sessionObj(session); var msg = []; if (sess.getMessage() && sess.getMessage() !== emptyMessage) { msg.push(sess.getMessage()); } if (sess.getState()) { msg.push('<' + sess.getState() + '>'); } msg.push(getUserListStr(getSortedSessionUsers(sess))); return msg.join(' '); } function createRoom(room) { var brain = createBrain(); if (!brain.getRoomSessions(room)) { brain.setRoomSessions(room, []); } } function setTopic(msg) { var topic = getTopicString(msg.message.room); robot.logger.debug('Set topic:', topic, 'room:', msg.message.room); if ('setTopic' in msg.robot.adapter) { return msg.runWithMiddleware('setTopic', { plaintext: true }, topic); } return msg.topic(topic); } function addSession(room, leader) { createRoom(room); var roomSessions = createBrain().getRoomSessions(room); roomSessions.push(createSession(leader)); return null; } function insertSession(room, leader, beforeIndex) { var roomSessions = createBrain().getRoomSessions(room); roomSessions.splice(beforeIndex, 0, createSession(leader)); return null; } function removeSession(room, leader) { var brain = createBrain(); var roomSessions = brain.getRoomSessions(room); var index = -1; index = util.findIndex(roomSessions, function (session) { return Session.sessionObj(session).isUserLeader(leader); }); if (index > -1) { roomSessions.splice(index, 1); brain.setRoomSessions(room, roomSessions); } } function findSessionIndexWithUser(room, userName) { var brain = createBrain(), roomSessions; if (!brain.hasSessions(room)) { return -1; } roomSessions = brain.getRoomSessions(room); return util.findIndex(roomSessions, function (session) { return Session.sessionObj(session).getUserIndex(userName) > -1; }); } function leaveSession(room, userName) { createRoom(room); var brain = createBrain(); var roomSessions = brain.getRoomSessions(room); var index = util.findIndex(roomSessions, function (session) { return Session.sessionObj(session).getUserIndex(userName) > -1; }); if (brain.getRoom(room).isUserInSession(userName)) { var session = brain.getRoomSessionAtIndex(room, index); ; var sess = Session.sessionObj(session); if (sess.isUserLeader(userName)) { return new PushbotErrors.LeaderCanNotLeaveError(); } var userIndex = sess.getUserIndex(userName); if (userIndex === -1) { return new PushbotErrors.UserNotFoundError(); } var users = sess.getUsers(); users.splice(userIndex, 1); if (users.length === 0) { removeSession(room, sess.getLeader()); } else { if (!sess.isLeaderJoined()) { sess.setLeader(users[0].name); } brain.setRoomSessionAtIndex(room, index, session); } return null; } else { return new PushbotErrors.NotInSessionError(); } } function joinSession(room, refUser, user) { createRoom(room); var sessionIndex = findSessionIndexWithUser(room, refUser); if (sessionIndex === -1) { return new PushbotErrors.NotInSessionError(); } var session = createBrain().getRoomSessionAtIndex(room, sessionIndex); if (Session.sessionObj(session).getUserIndex(user) > -1) { return new PushbotErrors.AlreadyInSessionError(); } else { Session.sessionObj(session).addUser(user); return null; } } function setUserState(room, userName, state) { var index = findSessionIndexWithUser(room, userName); if (index > -1) { var brain = createBrain(); var session = brain.getRoomSessionAtIndex(room, index); var sess = Session.sessionObj(session); var userIndex = sess.getUserIndex(userName); if (User.createUser(sess.getUsers()[userIndex]).getState() === state) { return new PushbotErrors.NotChangedError(); } sess.getUsers()[userIndex].state = state; brain.setRoomSessionAtIndex(room, index, session); return null; } else { return new PushbotErrors.NotInSessionError(); } } function finish(room, userName) { createRoom(room); var brain = createBrain(); if (brain.getRoom(room).isHolded()) { return new PushbotErrors.RoomHoldedError(); } var index = findSessionIndexWithUser(room, userName); if (index > -1) { var session = createBrain().getRoomSessionAtIndex(room, index); var sess = Session.sessionObj(session); var action = createAction('done'); if (!hasPermission(userName, action, sess)) { return new PushbotErrors.PermissionDeniedError(); } if (!isUsersStateOk(action, sess)) { return new PushbotErrors.UsersNotReadyError(sess.getHoldingUsers().map(util.invoke('getName'))); } removeSession(room, sess.getLeader()); return null; } return new PushbotErrors.NotInSessionError(); } function setRoomState(room, userName, state) { createRoom(room); var brain = createBrain(); if (brain.getRoom(room).isHolded()) { return new PushbotErrors.RoomHoldedError(); } var index = findSessionIndexWithUser(room, userName); robot.logger.debug('set room state call', index, room, userName, state); if (index !== -1) { var session = brain.getRoomSessionAtIndex(room, index); var sess = Session.sessionObj(session); if (sess.isAnyUserBad()) { var userNames = sess.getUsers() .map(User.createUser) .filter(util.invoke('isHolding')) .map(util.invoke('getName')); return new PushbotErrors.UsersNotReadyError(userNames); } if (sess.getState() === state) { return new PushbotErrors.NotChangedError(); } sess.setState(state); sess.resetUsers(); return null; } else { return new PushbotErrors.NotLeadingError(); } } function unholdRoom(room) { createRoom(room); var brain = createBrain(); var roomObj = brain.getRoom(room); if (!roomObj) { createRoom(room); roomObj = brain.getRoom(room); } if (!roomObj.isHolded()) { return new PushbotErrors.NotChangedError(); } roomObj.unhold(); roomObj.setHoldMessage(''); return null; } function holdRoom(room, message) { createRoom(room); var brain = createBrain(); var roomObj = brain.getRoom(room); roomObj.hold(); roomObj.setHoldMessage(message); return null; } function driveSession(room, userName) { var sessionIndex = findSessionIndexWithUser(room, userName); if (sessionIndex === -1) { return new PushbotErrors.NotInSessionError(); } var session = createBrain().getRoomSessionAtIndex(room, sessionIndex); var sess = Session.sessionObj(session); if (sess.isUserLeader(userName)) { return new PushbotErrors.NotChangedError(); } Session.sessionObj(session).setLeader(userName); return null; } function getTopicString(room) { var brain = createBrain(); var roomObj = brain.getRoom(room); var roomSessions = createBrain().getRoomSessions(room); var topic = []; if (roomObj.isHolded()) { var holdMessage = roomObj.getHoldMessage(); topic.push("HOLD: \u2602 " + holdMessage + " \u2602"); } topic = topic.concat(roomSessions.map(getStateStrForSession)); return topic.join(' | '); } function kickUser(room, leader, userName) { var index = findSessionIndexWithUser(room, leader); if (index === -1) { return new PushbotErrors.NotInSessionError(); } var session = createBrain().getRoomSessionAtIndex(room, index); if (!hasPermission(leader, createAction('kick'), Session.sessionObj(session))) { return new PushbotErrors.PermissionDeniedError(); } if (leader === userName) { return new PushbotErrors.UserNotKickableError(); } return leaveSession(room, userName); } function setMessage(room, userName, message) { var sessionIndex = findSessionIndexWithUser(room, userName); if (sessionIndex === -1) { return new PushbotErrors.NotInSessionError(); } var session = createBrain().getRoomSessionAtIndex(room, sessionIndex); var sess = Session.sessionObj(session); if (sess.getMessage() === message) { return new PushbotErrors.NotChangedError(); } sess.setMessage(message); return null; } function extractMsgDetails(msg) { return { room: msg.message.room, userName: msg.message.user.name }; } function onJoinCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = addSession(room, userName); if (err) { msg.reply(err.message); robot.logger.error(err); } else { setTopic(msg); } } function onNevermindCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = leaveSession(room, userName); if (err && !(err instanceof PushbotErrors.NotInSessionError)) { msg.reply(err.message); robot.logger.error('.nevermind:', err); } else { setTopic(msg); } } function onJoinWithCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var leader = msg.match[1]; var err = joinSession(room, leader, userName); if (err) { msg.reply(err.message); robot.logger.error('.join with:', err); } else { setTopic(msg); } } function onJoinBeforeCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var refUser = msg.match[1]; var sessionIndex = findSessionIndexWithUser(room, refUser); var err; if (sessionIndex === -1) { err = new PushbotErrors.NotInSessionError(); } else { err = insertSession(room, userName, sessionIndex); } if (err) { msg.reply(err.message); robot.logger.error('.join before:', err); } else { setTopic(msg); } } function onDoneCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = finish(room, userName); if (err) { if (!(err instanceof PushbotErrors.NotInSessionError)) { msg.reply(err.message); } } else { var nextSession = createBrain().getRoomSessionAtIndex(room, 0); if (nextSession) { msg.send(nextSession.users.map(User.createUser).map(util.invoke('getName')).join(', ') + ': You are up!'); } setTopic(msg); } } function onAtCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = setRoomState(room, userName, msg.match[1]); robot.logger.debug('set room state', err); if (err) { if (!(err instanceof PushbotErrors.NotChangedError)) { msg.reply(err.message); robot.logger.error('.at:', err); } } else { setTopic(msg); } } function onGoodCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = setUserState(room, userName, User.UserState.Good); if (err) { if (!(err instanceof PushbotErrors.NotChangedError)) { msg.reply(err.message); robot.logger.error('.good:', err); } } else { var sessionIndex = findSessionIndexWithUser(room, userName); var session = createBrain().getRoomSessionAtIndex(room, sessionIndex); var sess = Session.sessionObj(session); if (sess.isAllUserGood()) { msg.send(getSortedSessionUsers(sess).map(util.invoke('getName')).join(', ') + ': Everyone is ready'); } setTopic(msg); } } function onUhOhCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = setUserState(room, userName, User.UserState.Uhoh); if (err) { if (!(err instanceof PushbotErrors.NotChangedError)) { msg.reply(err.message); robot.logger.error('.uhoh:', err); } } else { setTopic(msg); } } function onSpectateCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = setUserState(room, userName, User.UserState.Spectate); if (err) { if (!(err instanceof PushbotErrors.NotChangedError)) { msg.reply(err.message); robot.logger.error('.spectate:', err); } } else { setTopic(msg); } } function onHoldCommand(msg) { robot.logger.debug('COMMANBD HOLD'); var room = msg.message.room; var message = msg.match[1]; var err = holdRoom(room, message); if (err) { msg.reply(err.message); robot.logger.error('.hold:', err); } else { setTopic(msg); } } function onUnholdCommand(msg) { var room = msg.message.room; var err = unholdRoom(room); if (err) { if (!(err instanceof PushbotErrors.NotChangedError)) { msg.reply(err.message); robot.logger.error('.unhold:', err); } } else { setTopic(msg); } } function onSessionsCommand(msg) { var room = msg.message.room; var brain = createBrain(); var roomSessions = brain.getRoomSessions(room); if (roomSessions && roomSessions.length) { msg.reply(roomSessions.map(function (session) { var msg = []; var sess = Session.sessionObj(session); if (sess.getState()) { msg.push('<' + sess.getState() + '>'); } if (sess.getMessage() && sess.getMessage() !== emptyMessage) { msg.push('message: ' + sess.getMessage()); } msg.push('leader: ' + sess.getLeader()); if (sess.getUsers().length > 1) { msg.push('participants: ' + getUserListStr(getSortedSessionUsers(sess).filter(function (u) { return u.getName() !== sess.getLeader(); }))); } return msg.join(', '); }).join('\n')); } else { msg.reply('No sessions so far'); } } function onKickCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = kickUser(room, userName, msg.match[1]); if (err && !(err instanceof PushbotErrors.NotInSessionError)) { msg.reply(err.message); robot.logger.error('.kick:', err); } else { setTopic(msg); } } function onMessageCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = setMessage(room, userName, msg.match[1]); if (err) { if (!(err instanceof PushbotErrors.NotChangedError)) { msg.reply(err.message); } } else { setTopic(msg); } } function onClearPleaseCommand(msg) { createBrain().clearRoomSessions(msg.message.room); setTopic(msg); } function onDriveCommand(msg) { var _a = extractMsgDetails(msg), room = _a.room, userName = _a.userName; var err = driveSession(room, userName); if (err) { if (err instanceof PushbotErrors.NotChangedError) { return; } msg.reply(err.message); return; } setTopic(msg); } function createCommandRegexp(commands, args) { if (args) { return new XRegExp('^\\' + bot + '(?:' + commands.join('|') + ') (' + args + ')\\s*$'); } else { return new XRegExp('^\\' + bot + '(?:' + commands.join('|') + ')\\s*$'); } } robot.brain.on('loaded', function () { if (!robot.brain.data.pushbot) { robot.brain.data.pushbot = {}; } }); robot.hear(createCommandRegexp(commands.join), onJoinCommand); robot.hear(createCommandRegexp(commands.nevermind), onNevermindCommand); robot.hear(createCommandRegexp(commands.joinWith, userNameRegexp), onJoinWithCommand); robot.hear(createCommandRegexp(commands.joinBefore, userNameRegexp), onJoinBeforeCommand); robot.hear(createCommandRegexp(commands.done), onDoneCommand); robot.hear(createCommandRegexp(commands.at, stateNameRegexp), onAtCommand); robot.hear(createCommandRegexp(commands.good), onGoodCommand); robot.hear(createCommandRegexp(commands.uhoh), onUhOhCommand); robot.hear(createCommandRegexp(commands.spectate), onSpectateCommand); robot.hear(createCommandRegexp(commands.hold, messageRegexp), onHoldCommand); robot.hear(createCommandRegexp(commands.unhold), onUnholdCommand); robot.hear(createCommandRegexp(commands.sessions), onSessionsCommand); robot.hear(createCommandRegexp(commands.kick, userNameRegexp), onKickCommand); robot.hear(createCommandRegexp(commands.message, messageRegexp), onMessageCommand); robot.hear(createCommandRegexp(commands.clearplease), onClearPleaseCommand); robot.hear(createCommandRegexp(commands.drive), onDriveCommand); };