UNPKG

discord-coc-bot

Version:

A Discord bot that contains commands useful for Call of Cthulu text roleplaying, based on RPbot by Gawdl3y (https://github.com/Gawdl3y/discord-rpbot/)

493 lines (418 loc) 13.9 kB
'use babel'; 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _bot = require('../bot'); var _bot2 = _interopRequireDefault(_bot); var _ = require('./'); var _2 = _interopRequireDefault(_); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } Function.prototype.$asyncbind = function $asyncbind(self, catcher) { "use strict"; if (!Function.prototype.$asyncbind) { Object.defineProperty(Function.prototype, "$asyncbind", { value: $asyncbind, enumerable: false, configurable: true, writable: true }); } if (!$asyncbind.trampoline) { $asyncbind.trampoline = function trampoline(t, x, s, e, u) { return function b(q) { while (q) { if (q.then) { q = q.then(b, e); return u ? undefined : q; } try { if (q.pop) { if (q.length) return q.pop() ? x.call(t) : q; q = s; } else q = q.call(t); } catch (r) { return e(r); } } }; }; } if (!$asyncbind.LazyThenable) { $asyncbind.LazyThenable = function () { function isThenable(obj) { return obj && obj instanceof Object && typeof obj.then === "function"; } function resolution(p, r, how) { try { var x = how ? how(r) : r; if (p === x) return p.reject(new TypeError("Promise resolution loop")); if (isThenable(x)) { x.then(function (y) { resolution(p, y); }, function (e) { p.reject(e); }); } else { p.resolve(x); } } catch (ex) { p.reject(ex); } } function _unchained(v) {} function thenChain(res, rej) { this.resolve = res; this.reject = rej; } function Chained() {} ; Chained.prototype = { resolve: _unchained, reject: _unchained, then: thenChain }; function then(res, rej) { var chain = new Chained(); try { this._resolver(function (value) { return isThenable(value) ? value.then(res, rej) : resolution(chain, value, res); }, function (ex) { resolution(chain, ex, rej); }); } catch (ex) { resolution(chain, ex, rej); } return chain; } function Thenable(resolver) { this._resolver = resolver; this.then = then; } ; Thenable.resolve = function (v) { return Thenable.isThenable(v) ? v : { then: function (resolve) { return resolve(v); } }; }; Thenable.isThenable = isThenable; return Thenable; }(); $asyncbind.EagerThenable = $asyncbind.Thenable = ($asyncbind.EagerThenableFactory = function (tick) { tick = tick || typeof process === "object" && process.nextTick || typeof setImmediate === "function" && setImmediate || function (f) { setTimeout(f, 0); }; var soon = function () { var fq = [], fqStart = 0, bufferSize = 1024; function callQueue() { while (fq.length - fqStart) { try { fq[fqStart](); } catch (ex) {} fq[fqStart++] = undefined; if (fqStart === bufferSize) { fq.splice(0, bufferSize); fqStart = 0; } } } return function (fn) { fq.push(fn); if (fq.length - fqStart === 1) tick(callQueue); }; }(); function Zousan(func) { if (func) { var me = this; func(function (arg) { me.resolve(arg); }, function (arg) { me.reject(arg); }); } } Zousan.prototype = { resolve: function (value) { if (this.state !== undefined) return; if (value === this) return this.reject(new TypeError("Attempt to resolve promise with self")); var me = this; if (value && (typeof value === "function" || typeof value === "object")) { try { var first = 0; var then = value.then; if (typeof then === "function") { then.call(value, function (ra) { if (!first++) { me.resolve(ra); } }, function (rr) { if (!first++) { me.reject(rr); } }); return; } } catch (e) { if (!first) this.reject(e); return; } } this.state = STATE_FULFILLED; this.v = value; if (me.c) soon(function () { for (var n = 0, l = me.c.length; n < l; n++) STATE_FULFILLED(me.c[n], value); }); }, reject: function (reason) { if (this.state !== undefined) return; this.state = STATE_REJECTED; this.v = reason; var clients = this.c; if (clients) soon(function () { for (var n = 0, l = clients.length; n < l; n++) STATE_REJECTED(clients[n], reason); }); }, then: function (onF, onR) { var p = new Zousan(); var client = { y: onF, n: onR, p: p }; if (this.state === undefined) { if (this.c) this.c.push(client);else this.c = [client]; } else { var s = this.state, a = this.v; soon(function () { s(client, a); }); } return p; } }; function STATE_FULFILLED(c, arg) { if (typeof c.y === "function") { try { var yret = c.y.call(undefined, arg); c.p.resolve(yret); } catch (err) { c.p.reject(err); } } else c.p.resolve(arg); } function STATE_REJECTED(c, reason) { if (typeof c.n === "function") { try { var yret = c.n.call(undefined, reason); c.p.resolve(yret); } catch (err) { c.p.reject(err); } } else c.p.reject(reason); } Zousan.resolve = function (val) { if (val && val instanceof Zousan) return val; var z = new Zousan(); z.resolve(val); return z; }; Zousan.reject = function (err) { if (err && err instanceof Zousan) return err; var z = new Zousan(); z.reject(err); return z; }; Zousan.version = "2.3.3-nodent"; return Zousan; })(); } function boundThen() { return resolver.apply(self, arguments); } var resolver = this; switch (catcher) { case true: return new $asyncbind.Thenable(boundThen); case 0: return new $asyncbind.LazyThenable(boundThen); case undefined: boundThen.then = boundThen; return boundThen; default: return function () { try { return resolver.apply(self, arguments); } catch (ex) { return catcher(ex); } }; } }; const sqlFindByGuild = 'SELECT CAST(server_id AS TEXT) AS server_id, name, info, CAST(user_id AS TEXT) AS user_id FROM characters WHERE server_id = ?'; const sqlFindByGuildAndName = 'SELECT CAST(server_id AS TEXT) AS server_id, name, info, CAST(user_id AS TEXT) AS user_id FROM characters WHERE server_id = ? AND name = ?'; const sqlFindByGuildAndNameLike = 'SELECT CAST(server_id AS TEXT) AS server_id, name, info, CAST(user_id AS TEXT) AS user_id FROM characters WHERE server_id = ? AND name LIKE ?'; const sqlInsert = 'INSERT INTO characters VALUES(?, ?, ?, ?)'; const sqlUpdate = 'UPDATE characters SET name = ?, info = ? WHERE server_id = ? AND name = ?'; const sqlDelete = 'DELETE FROM characters WHERE server_id = ? AND name = ?'; const sqlClear = 'DELETE FROM characters WHERE server_id = ?'; class Character { constructor(guild, owner, name, info) { if (!guild || !owner || !name) throw new Error('Character name, owner, and guild must be specified.'); this.guild = guild.id || guild; this.owner = owner.id || owner; this.name = name; this.info = info; } static save(character) { return new Promise(function ($return, $error) { let findStmt, existingCharacters; if (!character) return $error(new Error('A character must be specified.')); return _2.default.prepare(sqlFindByGuildAndName).then(function ($await_6) { findStmt = $await_6; return findStmt.all(character.guild, character.name).then(function ($await_7) { existingCharacters = $await_7; findStmt.finalize(); if (existingCharacters.length > 1) return $error(new Error('Multiple existing characters found.')); if (existingCharacters.length === 1) { if (existingCharacters[0].user_id === character.owner || _bot2.default.permissions.isMod(character.guild, character.owner)) { let updateStmt; return _2.default.prepare(sqlUpdate).then(function ($await_8) { updateStmt = $await_8; return updateStmt.run(character.name, character.info, character.guild, existingCharacters[0].name).then(function ($await_9) { updateStmt.finalize(); _bot2.default.logger.info('Updated existing character.', character); return $return({ character: new Character(character.guild, existingCharacters[0].user_id, character.name, character.info), new: false }); }.$asyncbind(this, $error), $error); }.$asyncbind(this, $error), $error); } else { return $return(false); } return $If_1.call(this); } else { let insertStmt; return _2.default.prepare(sqlInsert).then(function ($await_10) { insertStmt = $await_10; return insertStmt.run(character.guild, character.name, character.info, character.owner).then(function ($await_11) { insertStmt.finalize(); _bot2.default.logger.info('Added new character.', character); return $return({ character: character, new: true }); }.$asyncbind(this, $error), $error); }.$asyncbind(this, $error), $error); } function $If_1() { return $return(); } return $If_1.call(this); }.$asyncbind(this, $error), $error); }.$asyncbind(this, $error), $error); }); } static delete(character) { return new Promise(function ($return, $error) { let findStmt, existingCharacters; if (!character) return $error(new Error('A character must be specified.')); return _2.default.prepare(sqlFindByGuildAndName).then(function ($await_12) { findStmt = $await_12; return findStmt.all(character.guild, character.name).then(function ($await_13) { existingCharacters = $await_13; findStmt.finalize(); if (existingCharacters.length > 1) return $error(new Error('Multiple existing characters found.')); if (existingCharacters.length === 1) { if (existingCharacters[0].user_id === character.owner || _bot2.default.permissions.isMod(character.guild, character.owner)) { let deleteStmt; return _2.default.prepare(sqlDelete).then(function ($await_14) { deleteStmt = $await_14; return deleteStmt.run(character.guild, character.name).then(function ($await_15) { deleteStmt.finalize(); _bot2.default.logger.info('Deleted character.', character); return $return(true); }.$asyncbind(this, $error), $error); }.$asyncbind(this, $error), $error); } else { return $return(false); } return $If_3.call(this); } else { return $return(false); } function $If_3() { return $return(); } return $If_3.call(this); }.$asyncbind(this, $error), $error); }.$asyncbind(this, $error), $error); }); } static clearGuild(guild) { return new Promise(function ($return, $error) { let clearStmt; if (!guild) return $error(new Error('A guild must be specified.')); return _2.default.prepare(sqlClear).then(function ($await_16) { clearStmt = $await_16; return clearStmt.run(guild.id).then(function ($await_17) { clearStmt.finalize(); _bot2.default.logger.info('Cleared characters.', { guild: guild.name, guildID: guild.id }); return $return(); }.$asyncbind(this, $error), $error); }.$asyncbind(this, $error), $error); }); } static findInGuild(guild, searchString = null, searchExact = true) { return new Promise(function ($return, $error) { let findStmt, characters; if (!guild) return $error(new Error('A guild must be specified.')); guild = guild.id ? guild.id : guild; return _2.default.prepare(searchString ? sqlFindByGuildAndNameLike : sqlFindByGuild).then(function ($await_18) { findStmt = $await_18; return findStmt.all(guild, searchString ? searchString.length > 1 ? `%${searchString}%` : `${searchString}%` : undefined).then(function ($await_19) { characters = $await_19; findStmt.finalize(); for (const [index, character] of characters.entries()) characters[index] = new Character(character.server_id, character.user_id, character.name, character.info); return $return(searchExact ? _bot2.default.util.search(characters, searchString, { searchInexact: false }) : characters); }.$asyncbind(this, $error), $error); }.$asyncbind(this, $error), $error); }); } static convertStorage() { return new Promise(function ($return, $error) { let storageEntry, baseMap, keys, characters; storageEntry = _bot2.default.localStorage.getItem('characters'); if (!storageEntry) return $return(); baseMap = JSON.parse(storageEntry); if (!baseMap) return $return(); keys = Object.keys(baseMap); if (keys.length === 0) return $return(); characters = []; for (const key of keys) { let guildCharacters; guildCharacters = baseMap[key]; if (!guildCharacters || guildCharacters.length === 0) continue; characters.push(...guildCharacters); } if (characters.length > 0) { let stmt; return _2.default.prepare(sqlInsert).then(function ($await_20) { stmt = $await_20; for (const character of characters) { stmt.run(character.guild, character.name, character.info, character.owner); } stmt.finalize(); return $If_5.call(this); }.$asyncbind(this, $error), $error); } function $If_5() { _bot2.default.localStorage.removeItem('characters'); _bot2.default.logger.info('Converted characters from local storage to database.', { count: characters.length }); return $return(); } return $If_5.call(this); }); } } exports.default = Character; //# sourceMappingURL=character.js.map