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!',
|
greeting: 'Hi, I am aisha, your game host!',
|
||||||
usernamePrefix: '@',
|
usernamePrefix: '@',
|
||||||
channels: ['GamesNight'],
|
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: {
|
schatColors: {
|
||||||
|
white: 'white',
|
||||||
|
blue: 'var(--message-40)',
|
||||||
|
navy: 'var(--message-41)',
|
||||||
|
},
|
||||||
|
schatColorAliases: {
|
||||||
red: 'red',
|
red: 'red',
|
||||||
orange: 'orange',
|
orange: 'orange',
|
||||||
yellow: 'yellow',
|
yellow: 'yellow',
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
"jsdom": "^18.1.0",
|
"jsdom": "^18.1.0",
|
||||||
"linkify-it": "^3.0.3",
|
"linkify-it": "^3.0.3",
|
||||||
"simple-node-logger": "^21.8.12",
|
"simple-node-logger": "^21.8.12",
|
||||||
|
"string-similarity": "^4.0.4",
|
||||||
"tensify": "^0.0.4",
|
"tensify": "^0.0.4",
|
||||||
"ws": "^8.2.3",
|
"ws": "^8.2.3",
|
||||||
"yargs": "^17.2.1"
|
"yargs": "^17.2.1"
|
||||||
|
@ -3250,6 +3251,11 @@
|
||||||
"safe-buffer": "~5.1.0"
|
"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": {
|
"node_modules/string-width": {
|
||||||
"version": "4.2.3",
|
"version": "4.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||||
|
@ -6334,6 +6340,11 @@
|
||||||
"safe-buffer": "~5.1.0"
|
"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": {
|
"string-width": {
|
||||||
"version": "4.2.3",
|
"version": "4.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
"jsdom": "^18.1.0",
|
"jsdom": "^18.1.0",
|
||||||
"linkify-it": "^3.0.3",
|
"linkify-it": "^3.0.3",
|
||||||
"simple-node-logger": "^21.8.12",
|
"simple-node-logger": "^21.8.12",
|
||||||
|
"string-similarity": "^4.0.4",
|
||||||
"tensify": "^0.0.4",
|
"tensify": "^0.0.4",
|
||||||
"ws": "^8.2.3",
|
"ws": "^8.2.3",
|
||||||
"yargs": "^17.2.1"
|
"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', {
|
bot.socket.transmit('message', {
|
||||||
roomId,
|
roomId,
|
||||||
recipient,
|
recipient,
|
||||||
type: recipient && options.type !== 'message' ? 'whisper' : 'message',
|
type: recipient && options?.type !== 'message' ? 'whisper' : 'message',
|
||||||
body: curatedBody,
|
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, {
|
Object.values(Object.fromEntries(Object.values(games).map((game) => [game.key, game]))).forEach((game) => game.onMessage?.(message, {
|
||||||
...game,
|
...game,
|
||||||
bot,
|
bot,
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue