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; };