From 914c355ad0bbd62e06686b9a8308d21d47166335 Mon Sep 17 00:00:00 2001 From: Charlie Laabs Date: Sun, 2 Jan 2022 14:37:01 -0600 Subject: [PATCH] Add message seeding feature --- package-lock.json | 14 +++++++------- package.json | 2 +- src/deploy-commands.ts | 8 ++++++++ src/index.ts | 38 ++++++++++++++++++++++++-------------- 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index d9a7aaa..24ed97a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "erlpack": "github:discord/erlpack", "fs-extra": "^10.0.0", "json5": "^2.2.0", - "markov-strings-db": "^4.1.3", + "markov-strings-db": "^4.1.4", "pino": "^7.5.1", "pino-pretty": "^7.3.0", "reflect-metadata": "^0.1.13", @@ -2681,9 +2681,9 @@ "dev": true }, "node_modules/markov-strings-db": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/markov-strings-db/-/markov-strings-db-4.1.3.tgz", - "integrity": "sha512-F/ZPN6Azys7zi58KbAzwvns8p99o5v6BVpBORsKqTyWJJx76caNOLSh4fzm0RIPLEm4tXVw9HIXx1YX4AxYJyQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/markov-strings-db/-/markov-strings-db-4.1.4.tgz", + "integrity": "sha512-Uq7Z3n7EWO+htgDuWV6bueMd9TFINtNL4NRikll8DkypNrxqiB1zaPvOakOOAvoeCthq+A4JDHeyVqHKXolehg==", "dependencies": { "reflect-metadata": "^0.1.13", "typeorm": "^0.2.41" @@ -6431,9 +6431,9 @@ "dev": true }, "markov-strings-db": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/markov-strings-db/-/markov-strings-db-4.1.3.tgz", - "integrity": "sha512-F/ZPN6Azys7zi58KbAzwvns8p99o5v6BVpBORsKqTyWJJx76caNOLSh4fzm0RIPLEm4tXVw9HIXx1YX4AxYJyQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/markov-strings-db/-/markov-strings-db-4.1.4.tgz", + "integrity": "sha512-Uq7Z3n7EWO+htgDuWV6bueMd9TFINtNL4NRikll8DkypNrxqiB1zaPvOakOOAvoeCthq+A4JDHeyVqHKXolehg==", "requires": { "reflect-metadata": "^0.1.13", "typeorm": "^0.2.41" diff --git a/package.json b/package.json index 64cc4bf..0636de6 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "erlpack": "github:discord/erlpack", "fs-extra": "^10.0.0", "json5": "^2.2.0", - "markov-strings-db": "^4.1.3", + "markov-strings-db": "^4.1.4", "pino": "^7.5.1", "pino-pretty": "^7.3.0", "reflect-metadata": "^0.1.13", diff --git a/src/deploy-commands.ts b/src/deploy-commands.ts index ba4e119..4422570 100644 --- a/src/deploy-commands.ts +++ b/src/deploy-commands.ts @@ -25,6 +25,14 @@ export const messageCommand = new SlashCommandBuilder() .setName('debug') .setDescription('Follow up the generated message with the detailed sources that inspired it.') .setRequired(false) + ) + .addStringOption((seed) => + seed + .setName('seed') + .setDescription( + `A ${config.stateSize}-word phrase to attempt to start a generated sentence with.` + ) + .setRequired(false) ); /** diff --git a/src/index.ts b/src/index.ts index e55f1b8..aa28821 100644 --- a/src/index.ts +++ b/src/index.ts @@ -344,6 +344,12 @@ interface GenerateResponse { error?: Discord.MessageOptions; } +interface GenerateOptions { + tts?: boolean; + debug?: boolean; + startSeed?: string; +} + /** * General Markov-chain response function * @param interaction The message that invoked the action, used for channel info. @@ -353,10 +359,10 @@ interface GenerateResponse { */ async function generateResponse( interaction: Discord.Message | Discord.CommandInteraction, - debug = false, - tts = false + options?: GenerateOptions ): Promise { - L.debug('Responding...'); + L.debug({ options }, 'Responding...'); + const { tts = false, debug = false, startSeed } = options || {}; if (!interaction.guildId) { L.warn('Received an interaction without a guildId'); return { message: { content: INVALID_GUILD_MESSAGE } }; @@ -368,6 +374,7 @@ async function generateResponse( const markov = await getMarkovByGuildId(interaction.guildId); try { + markovGenerateOptions.startSeed = startSeed; const response = await markov.generate(markovGenerateOptions); L.info({ string: response.string }, 'Generated response text'); L.debug({ response }, 'Generated response object'); @@ -539,33 +546,35 @@ client.on('messageCreate', async (message) => { } if (command === 'tts') { L.debug('Responding to legacy command tts'); - const generatedResponse = await generateResponse(message, false, true); + const generatedResponse = await generateResponse(message, { tts: true }); if (generatedResponse.message) await message.reply(generatedResponse.message); if (generatedResponse.debug) await message.reply(generatedResponse.debug); if (generatedResponse.error) await message.reply(generatedResponse.error); } if (command === 'debug') { L.debug('Responding to legacy command debug'); - const generatedResponse = await generateResponse(message, true); + const generatedResponse = await generateResponse(message, { debug: true }); if (generatedResponse.message) await message.reply(generatedResponse.message); if (generatedResponse.debug) await message.reply(generatedResponse.debug); if (generatedResponse.error) await message.reply(generatedResponse.error); } if (command === null) { if (!message.author.bot) { + if (client.user && message.mentions.has(client.user)) { + L.debug('Responding to mention'); + // <@!278354154563567636> how are you doing? + const startSeed = message.content.replace(/<@!\d+>/g, '').trim(); + const generatedResponse = await generateResponse(message, { startSeed }); + if (generatedResponse.message) await message.reply(generatedResponse.message); + if (generatedResponse.debug) await message.reply(generatedResponse.debug); + if (generatedResponse.error) await message.reply(generatedResponse.error); + } + if (await isValidChannel(message.channelId)) { L.debug('Listening'); const markov = await getMarkovByGuildId(message.channel.guildId); await markov.addData([messageToData(message)]); } - - if (client.user && message.mentions.has(client.user)) { - L.debug('Responding to mention'); - const generatedResponse = await generateResponse(message); - if (generatedResponse.message) await message.reply(generatedResponse.message); - if (generatedResponse.debug) await message.reply(generatedResponse.debug); - if (generatedResponse.error) await message.reply(generatedResponse.error); - } } } }); @@ -603,7 +612,8 @@ client.on('interactionCreate', async (interaction) => { await interaction.deferReply(); const tts = interaction.options.getBoolean('tts') || false; const debug = interaction.options.getBoolean('debug') || false; - const generatedResponse = await generateResponse(interaction, debug, tts); + const startSeed = interaction.options.getString('seed')?.trim() || undefined; + const generatedResponse = await generateResponse(interaction, { tts, debug, startSeed }); if (generatedResponse.message) await interaction.editReply(generatedResponse.message); else await interaction.deleteReply(); if (generatedResponse.debug) await interaction.followUp(generatedResponse.debug);