Added Magic 8-Ball game.
This commit is contained in:
parent
34fb977e77
commit
acf60eeca0
|
@ -21,8 +21,13 @@ module.exports = {
|
|||
greeting: 'Hi, I am aisha, your game host!',
|
||||
usernamePrefix: '@',
|
||||
channels: ['GamesNight'],
|
||||
games: ['mash', 'trivia', 'letters', 'duck', 'dice', 'rock-paper-scissors', 'ping', 'say', 'kill', 'uptime', 'help'],
|
||||
games: ['mash', 'trivia', 'letters', 'duck', '8ball', 'dice', 'rock-paper-scissors', 'ping', 'say', 'kill', 'uptime', 'help'],
|
||||
schatColors: {
|
||||
white: 'white',
|
||||
blue: 'var(--message-40)',
|
||||
navy: 'var(--message-41)',
|
||||
},
|
||||
schatColorAliases: {
|
||||
red: 'red',
|
||||
orange: 'orange',
|
||||
yellow: 'yellow',
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
"jsdom": "^18.1.0",
|
||||
"linkify-it": "^3.0.3",
|
||||
"simple-node-logger": "^21.8.12",
|
||||
"string-similarity": "^4.0.4",
|
||||
"tensify": "^0.0.4",
|
||||
"ws": "^8.2.3",
|
||||
"yargs": "^17.2.1"
|
||||
|
@ -3250,6 +3251,11 @@
|
|||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/string-similarity": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz",
|
||||
"integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ=="
|
||||
},
|
||||
"node_modules/string-width": {
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||
|
@ -6334,6 +6340,11 @@
|
|||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"string-similarity": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz",
|
||||
"integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ=="
|
||||
},
|
||||
"string-width": {
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
"jsdom": "^18.1.0",
|
||||
"linkify-it": "^3.0.3",
|
||||
"simple-node-logger": "^21.8.12",
|
||||
"string-similarity": "^4.0.4",
|
||||
"tensify": "^0.0.4",
|
||||
"ws": "^8.2.3",
|
||||
"yargs": "^17.2.1"
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
'use strict';
|
||||
|
||||
const config = require('config');
|
||||
const crypto = require('crypto');
|
||||
const timers = require('timers/promises');
|
||||
const stringSimilarity = require('string-similarity');
|
||||
|
||||
const style = require('../utils/style');
|
||||
|
||||
const contemplations = [
|
||||
'Hmmm...',
|
||||
'🤔',
|
||||
'Let\'s see...',
|
||||
];
|
||||
|
||||
const answers = {
|
||||
positive: [
|
||||
'It is certain',
|
||||
'It is decidedly so',
|
||||
'Without a doubt',
|
||||
'Yes definitely',
|
||||
'You may rely on it',
|
||||
'As I see it, yes',
|
||||
'Most likely',
|
||||
'Outlook good',
|
||||
'Yes',
|
||||
'Signs points to yes',
|
||||
],
|
||||
inconclusive: [
|
||||
'Reply hazy, try again',
|
||||
'Ask again later',
|
||||
'Better not tell you now',
|
||||
'Cannot predict now',
|
||||
'Concentrate and ask again',
|
||||
],
|
||||
negative: [
|
||||
'Don\'t count on it',
|
||||
'My reply is no',
|
||||
'My sources say no',
|
||||
'Outlook not so good',
|
||||
'Very doubtful',
|
||||
],
|
||||
};
|
||||
|
||||
const questions = new Map();
|
||||
|
||||
function purgeQuestions() {
|
||||
Array.from(questions.entries()).forEach(([question, { timestamp }]) => {
|
||||
if (new Date() - timestamp > 5 * 60 * 1000) { // 5 minutes
|
||||
questions.delete(question);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function onCommand(args, context) {
|
||||
const question = args.join(' ');
|
||||
|
||||
if (!/\w+\s+\w+\?/.test(question)) {
|
||||
context.sendMessage('Please ask me a question, any question...', context.room.id);
|
||||
return;
|
||||
}
|
||||
|
||||
// attempt to give consistent answers between similar questions
|
||||
const similarQuestion = questions.size > 0
|
||||
? stringSimilarity.findBestMatch(question, Array.from(questions.keys())).bestMatch
|
||||
: null;
|
||||
|
||||
const answerType = similarQuestion?.rating > 0.5
|
||||
? questions.get(similarQuestion.target).answerType
|
||||
: Object.keys(answers)[crypto.randomInt(0, 3)];
|
||||
|
||||
const answer = answers[answerType][crypto.randomInt(0, answers[answerType].length)];
|
||||
|
||||
questions.set(question, { answerType, timestamp: new Date() });
|
||||
|
||||
context.sendMessage(`🎱 ${contemplations[crypto.randomInt(0, contemplations.length)]}`, context.room.id, { label: false });
|
||||
|
||||
await timers.setTimeout(Math.random() * 3000 + 1000);
|
||||
|
||||
context.sendMessage(style.bgnavy(style.white(`◣ ${answer} ◢`)), context.room.id, {
|
||||
label: false,
|
||||
style: {
|
||||
color: config.schatColors.white,
|
||||
background: config.schatColors.navy,
|
||||
},
|
||||
});
|
||||
|
||||
purgeQuestions();
|
||||
}
|
||||
|
||||
function onMessage(message, context) {
|
||||
const regex = new RegExp(`^${config.usernamePrefix}${config.user.username}:?\\s+\\w+\\s+\\w+.*\\?`, 'i');
|
||||
|
||||
if (regex.test(message.body)) {
|
||||
onCommand([message.body.replaceAll(`${config.usernamePrefix}${config.user.username}:?`, '').trim()], context, false);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
onCommand,
|
||||
onMessage,
|
||||
};
|
|
@ -117,9 +117,9 @@ async function getGames(bot, identifier) {
|
|||
bot.socket.transmit('message', {
|
||||
roomId,
|
||||
recipient,
|
||||
type: recipient && options.type !== 'message' ? 'whisper' : 'message',
|
||||
type: recipient && options?.type !== 'message' ? 'whisper' : 'message',
|
||||
body: curatedBody,
|
||||
style: config.style,
|
||||
style: { ...config.style, ...options?.style },
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -235,7 +235,7 @@ function onMessage(message, bot, games) {
|
|||
}
|
||||
}
|
||||
|
||||
if (message.type === 'message') {
|
||||
if (message.type === 'message' && user.username !== config.user.username) {
|
||||
Object.values(Object.fromEntries(Object.values(games).map((game) => [game.key, game]))).forEach((game) => game.onMessage?.(message, {
|
||||
...game,
|
||||
bot,
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue