let sdk = require('matrix-js-sdk'); let message = require('./message'); let utility = require('./utility'); let { logger } = require('./logging'); class Bot { constructor(config, buildInfo) { this.config = config; this.buildInfo = buildInfo; this.connected = false; } /** * Initialize the bot connection */ init(messageCallback) { logger.info("Creating Matrix Client") this.client = sdk.createClient({ baseUrl: this.config.baseUrl, accessToken: this.config.accessToken, userId: this.config.userId }); this.client.on("sync", async (state, previousState, data) => { switch (state) { case "PREPARED": this.connected = true; await this.sendStatusStartup(); this.client.getJoinedRooms() .done((rooms) => { logger.info("Connected to: %o", rooms) }); break; case "SYNCING": logger.debug("Syncing") break; case "RECONNECTING": logger.debug("Reconnecting"); break; default: logger.error("Unexpected sync state: %s", state); process.exit(1); } }); this.client.on("RoomMember.membership", (event, member) => { if (member.membership === "invite" && this.config.admin.indexOf(ember.userId) >= 0) { this.client.joinRoom(member.roomId).done(() => { logger.info("Auto-joined %s", member.roomId); }); } }); this.client.on("Room.timeline", messageCallback); return this; } async connect() { // logger.info("Initializing Crypto"); // await bot.client.initCrypto(); logger.info("Starting Matrix SDK Client"); await this.client.startClient(); } sendStatusStartup() { let promises = [Promise.resolve(true)] if (this.connected) { this.config.statusRooms.forEach(roomId => { logger.debug("Notifying %s of startup", roomId); promises.push(this.client.sendMessage( roomId, message.createBasic("Started with version: " + this.buildInfo, message.types.NOTICE) ).then(() => { logger.debug("Notified %s of startup", roomId); })); }); } else { logger.warn("Attempting to send startup message while disconnected"); } return Promise.all(promises); } sendStatusShutdown() { let promises = [Promise.resolve(true)] if (this.connected) { this.config.statusRooms.forEach(roomId => { logger.debug("Notifying %s of shutdown", roomId); promises.push(this.client.sendMessage( roomId, message.createBasic("Shutting down", message.types.NOTICE) ).then(() => { logger.debug("Notified %s of shutdown", roomId); })); }); } else { logger.warn("Attempting to send shutdown message while disconnected"); } return Promise.all(promises); } } function create(config) { let buildInfo = utility.getBuildInfo(); logger.info("Running version: %s", buildInfo); return new Bot(config, buildInfo); } exports.create = create;