111 lines
4.7 KiB
JavaScript
111 lines
4.7 KiB
JavaScript
const _ = require('underscore');
|
|
const helptext = `The \`!me\` command can be used to begin setting up your player character. \`!me\` shows your character, \`!me --done\` finishes.
|
|
\`!me\` shows current information
|
|
\`!me --done\` sets your character as ready to play (but you can still adjust it until game start) {\`!me -d \`}
|
|
\`!me --name <...>\` set name (Max. 48 characters) {\`!me -n <...>\`}
|
|
\`!me --age N\` set age (0 < N < 1000) {\`!me -a N\`}
|
|
\`!me --title <...>\` set title name (Max. 48 characters, e.g. Major General, Doctor, Lady) {\`!me -t <...>\`}
|
|
\`!me --story <...>\` give a background story (32-320 characters) {\`!me -s <...>\`}
|
|
You can combine these for speed, examples:
|
|
\`!me -n Johnny Smooth -a 23 -t Presentator\`
|
|
\`!me --name Scotty Love --age 24 --title Village Idiot\`
|
|
Mix and match long form and shorthand:
|
|
\`!me --name Mr. Eaten --age 271 -s <...>\` (<...> omitted for brevity)
|
|
Finalize on-the-go (be sure to include all options):
|
|
\`!me -n Speedy Gonzales -a 15 -t Insurgent -s <...> -d\` (<...> omitted for brevity)
|
|
`
|
|
|
|
let expressions = {};
|
|
expressions.name = {};
|
|
expressions.name.pt = /((?:--name)|(?:-n))/;
|
|
expressions.name.ex = /(?:(?:--name)|(?:-n)\s)(.{1,48}?)\s?(?:-|$)/;
|
|
expressions.age = {};
|
|
expressions.age.pt = /((?:--age)|(?:-a))/;
|
|
expressions.age.ex = /(?:(?:--age)|(?:-a)\s)(\d{1,3})\s?(?:-|$)/;
|
|
expressions.title = {};
|
|
expressions.title.pt = /((?:--title)|(?:-t))/;
|
|
expressions.title.ex = /(?:(?:--title)|(?:-t)\s)(.{1,48}?)\s?(?:-|$)/;
|
|
expressions.story = {};
|
|
expressions.story.pt = /((?:--story)|(?:-s))/;
|
|
expressions.story.ex = /(?:(?:--story)|(?:-s)\s)(.{32,320}?)\s?(?:-|$)/;
|
|
const exDone = /(?:(?:--done)|(?:-d))/
|
|
|
|
function p(flag, context) {
|
|
return new Promise((resolve, reject) => {
|
|
let flagged = expressions[flag].pt.exec(context.args);
|
|
if(flagged) {
|
|
let match = expressions[flag].ex.exec(context.args);
|
|
if(match) {
|
|
context.state.player[context.pid][flag] = match[1];
|
|
console.info(`[${context.id}] set ${flag} for [${context.pid}]`);
|
|
resolve(`Set \`${flag}\``);
|
|
} else {
|
|
console.warn(`[${context.id}] could not parse arguments for flag <${flagged[1]}>, use \`!help me\` to check requirements`);
|
|
resolve(`Could not parse arguments for flag \`${flag}\``);
|
|
}
|
|
} else {
|
|
resolve(`Flag for \`${flag}\` not present.`);
|
|
}
|
|
});
|
|
}
|
|
|
|
function me(context) {
|
|
return new Promise((resolve, reject) => {
|
|
if(!context.state.player) { context.state.player = {}; }
|
|
if(context.isHelpRequest) {
|
|
context.message.reply(helptext)
|
|
.then(() => {
|
|
console.info(`[${context.id}] ? me`);
|
|
resolve();
|
|
}).catch(err => reject(err));
|
|
} else if(!context.args) {
|
|
if(!context.state.player[context.pid]) {
|
|
context.message.reply(`[${context.pid}] You do not have a character yet, use the \`!help me\` command to find out how to create one.`)
|
|
.then(() => resolve())
|
|
.catch(err => reject(err));
|
|
} else {
|
|
let player = context.state.player[context.pid];
|
|
let text = '```\n';
|
|
text += player.title ? `${player.title} ` : '[missing title] ';
|
|
text += player.name ? `${player.name}, ` : '[missing name], ';
|
|
text += player.age ? `${player.age} years old.\n` : '[missing age]\n';
|
|
text += player.story ? player.story : '[missing background story]';
|
|
text += '\n```';
|
|
context.message.reply(text)
|
|
.then(() => resolve())
|
|
.catch(err => reject(err));
|
|
}
|
|
} else {
|
|
if(!context.state.player[context.pid]) { context.state.player[context.pid] = {}}
|
|
Promise.all([
|
|
p("name", context),
|
|
p("age", context),
|
|
p("title", context),
|
|
p("story", context)
|
|
]).then(values => {
|
|
let result = _.reduce(values, (c, v) => { return `${c}\n${v}`});
|
|
if(exDone.test(context.args)) {
|
|
let player = context.state.player[context.pid];
|
|
if(player.name && player.age && player.title && player.story) {
|
|
player.complete = true;
|
|
console.info(`[${context.id}] completed [${context.pid}]`);
|
|
result += `\nCompleted basic player setup for [${context.pid}]`;
|
|
} else {
|
|
console.info(`[${context.id}] incomplete [${context.pid}]`);
|
|
result += `\nMissing information for [${context.pid}]. \nUse \`!me\` and \`!help me\` for more information`;
|
|
}
|
|
}
|
|
context.message.reply(result)
|
|
.then(() => {
|
|
context.stateChanged = true;
|
|
resolve(context);
|
|
}).catch(err => reject(err));
|
|
}).catch(err => reject(err));
|
|
}
|
|
});
|
|
}
|
|
|
|
module.exports = commands => {
|
|
commands.me = me;
|
|
};
|