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/)
360 lines (306 loc) • 8.82 kB
JavaScript
'use babel';
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _discordGraf = require('discord-graf');
var _commonTags = require('common-tags');
var _character = require('../../database/character');
var _character2 = _interopRequireDefault(_character);
var _config = require('../../config');
var _config2 = _interopRequireDefault(_config);
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);
}
};
}
};
class ListCharactersCommand extends _discordGraf.Command {
constructor(bot) {
super(bot, {
name: 'characters',
aliases: ['list-characters', 'list-chars', 'chars'],
module: 'characters',
memberName: 'list',
description: 'Lists/searches characters in the database.',
usage: 'characters [search] [page]',
details: _commonTags.oneLine`
If no search string is specified, all characters will be listed.
If the search string is only one letter long, characters that start with that character will be listed.
If the search string is more than one letter, all characters that contain that string will be listed.
If the search string contains spaces, it must be surrounded by quotes.
`,
examples: ['characters', 'characters c', 'characters bill'],
guildOnly: true,
argsType: 'multiple'
});
}
run(message, args) {
return new Promise(function ($return, $error) {
let last, page, search, characters;
last = args.length >= 1 ? args.length - 1 : 0;
page = !isNaN(args[last]) ? parseInt(args.pop()) : 1;
search = args.join(' ');
return _character2.default.findInGuild(message.guild, search, false).then(function ($await_1) {
characters = $await_1;
if (characters.length > 0) {
characters.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
let paginated;
paginated = this.bot.util.paginate(characters, page, Math.floor(_config2.default.paginationItems));
characters = paginated.items;
return $return(_commonTags.stripIndents`
__**Character${search ? `s ${search.length === 1 ? 'that begin with' : 'that contain'} "${search}"` : ' list'}, ${paginated.pageText}:**__
${characters.map(char => `**-** ${char.name}`).join('\n')}
${paginated.maxPage > 1 ? `\nUse ${this.bot.util.usage(`characters ${search ? `${search} ` : ''}<page>`, message.guild)} to view a specific page.` : ''}
Use ${this.bot.util.usage('character <name>', message.guild)} to view information about a character.
`);
} else {
return $return(`There are no characters ${search ? `${search.length === 1 ? 'that begin with' : 'that contain'} "${search}"` : 'in the database'}.`);
}
return $return();
}.$asyncbind(this, $error), $error);
}.$asyncbind(this));
}
}
exports.default = ListCharactersCommand;
//# sourceMappingURL=list.js.map