Skip to content

Commit 68fc82f

Browse files
committed
Extend command, disable dm renders
1 parent ad2932a commit 68fc82f

File tree

12 files changed

+148
-15
lines changed

12 files changed

+148
-15
lines changed

src/commands/extend.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { SlashCommandBuilder } from 'discord.js';
2+
import { BotCommand } from '../types';
3+
export default function(): BotCommand {
4+
const command = new SlashCommandBuilder()
5+
.setName('extend')
6+
.setDMPermission(false)
7+
.setDescription('Generate images from a base image without a prompt')
8+
.addAttachmentOption(option =>
9+
option.setName('image')
10+
.setDescription('Inital jpg or png image to generate variations of. Will be resized to the specified width and height')
11+
.setRequired(true))
12+
.addAttachmentOption(option =>
13+
option.setName('mask')
14+
.setDescription('Black and white jpg or png image to use as mask for inpainting over init_image'))
15+
.addNumberOption(option =>
16+
option.setName('pstrength')
17+
.setDescription('Prompt strength when using init image. 1.0 corresponds to full destruction of information in image')
18+
.setMinValue(0)
19+
.setMaxValue(1))
20+
.addIntegerOption(option =>
21+
option.setName('numsteps')
22+
.setDescription('Number of denoising steps. Default 50')
23+
.setMinValue(1)
24+
.setMaxValue(500))
25+
.addNumberOption(option =>
26+
option.setName('guidescale')
27+
.setDescription('Scale for classifier-free guidance. Default 7.5')
28+
.setMinValue(1)
29+
.setMaxValue(20))
30+
.addIntegerOption(option =>
31+
option.setName('seed')
32+
.setDescription('Generation seed. Randomized if not provided')
33+
.setMinValue(0)
34+
.setMaxValue(999999999))
35+
36+
return {
37+
command,
38+
commandJson: command.toJSON()
39+
}
40+
}

src/commands/imagine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BotCommand } from '../types';
33
export default function(): BotCommand {
44
const command = new SlashCommandBuilder()
55
.setName('imagine')
6+
.setDMPermission(false)
67
.setDescription('Generate images from prompts')
78
.addStringOption(option =>
89
option.setName('prompt')

src/commands/imagineQuick.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BotCommand } from '../types';
33
export default function(): BotCommand {
44
const command = new SlashCommandBuilder()
55
.setName('imagine-quick')
6+
.setDMPermission(false)
67
.setDescription('Generate a single image based on a prompt. Faster.')
78
.addStringOption(option =>
89
option.setName('prompt')

src/commands/queue.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BotCommand } from '../types';
33
export default function(): BotCommand {
44
const command = new SlashCommandBuilder()
55
.setName('queue')
6+
.setDMPermission(false)
67
.setDescription('Prompt queue')
78
.addSubcommand(subcommand =>
89
subcommand

src/embeds/addedToQueue.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export default function(queueType: QueueType, queueItem: QueueItem, queuePositio
2020
.setThumbnail('https://i.imgur.com/pXmPAAG.gif')
2121
.setTimestamp()
2222
.addFields([
23-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
23+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
2424
{name: 'Width', value: queueItem.prediction.width.toString(), inline: true},
2525
{name: 'Height', value: queueItem.prediction.height.toString(), inline: true},
2626
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
@@ -44,7 +44,7 @@ export default function(queueType: QueueType, queueItem: QueueItem, queuePositio
4444
.setThumbnail('https://i.imgur.com/pXmPAAG.gif')
4545
.setTimestamp()
4646
.addFields([
47-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
47+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
4848
{name: 'Width', value: queueItem.prediction.width.toString(), inline: true},
4949
{name: 'Height', value: queueItem.prediction.height.toString(), inline: true},
5050
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},

src/embeds/imageResult.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default function(queueItem: QueueItem): BotEmbed {
1414
.setDescription('Result for parameters\n\nGenerated using the quick imagine command. Check out `/imagine` for new features!')
1515
.setTimestamp()
1616
.addFields([
17-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
17+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
1818
{name: 'Width', value: queueItem.prediction.width.toString(), inline: true},
1919
{name: 'Height', value: queueItem.prediction.height.toString(), inline: true},
2020
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
@@ -37,7 +37,7 @@ export default function(queueItem: QueueItem): BotEmbed {
3737
.setDescription('Result for upscale')
3838
.setTimestamp()
3939
.addFields([
40-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
40+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
4141
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
4242
{name: 'Steps', value: queueItem.prediction.numInferenceSteps.toString(), inline: true},
4343
{name: 'Guidance Scale', value: queueItem.prediction.guidanceScale.toString(), inline: true},
@@ -58,7 +58,7 @@ export default function(queueItem: QueueItem): BotEmbed {
5858
.setDescription('Variant results are displayed below')
5959
.setTimestamp()
6060
.addFields([
61-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
61+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
6262
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
6363
{name: 'Steps', value: queueItem.prediction.numInferenceSteps.toString(), inline: true},
6464
{name: 'Guidance Scale', value: queueItem.prediction.guidanceScale.toString(), inline: true},
@@ -98,7 +98,7 @@ export default function(queueItem: QueueItem): BotEmbed {
9898
.setDescription('Result for parameters')
9999
.setTimestamp()
100100
.addFields([
101-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
101+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
102102
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
103103
{name: 'Steps', value: queueItem.prediction.numInferenceSteps.toString(), inline: true},
104104
{name: 'Guidance Scale', value: queueItem.prediction.guidanceScale.toString(), inline: true},

src/embeds/processingPrompt.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default function(queueItem: QueueItem): BotEmbed {
1515
.setThumbnail('https://i.gifer.com/2RNf.gif')
1616
.setTimestamp()
1717
.addFields([
18-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
18+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
1919
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
2020
{name: 'Steps', value: queueItem.prediction.numInferenceSteps.toString(), inline: true},
2121
{name: 'Guidance Scale', value: queueItem.prediction.guidanceScale.toString(), inline: true},
@@ -36,7 +36,7 @@ export default function(queueItem: QueueItem): BotEmbed {
3636
.setThumbnail('https://i.gifer.com/2RNf.gif')
3737
.setTimestamp()
3838
.addFields([
39-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
39+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
4040
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
4141
{name: 'Steps', value: queueItem.prediction.numInferenceSteps.toString(), inline: true},
4242
{name: 'Guidance Scale', value: queueItem.prediction.guidanceScale.toString(), inline: true},
@@ -57,7 +57,7 @@ export default function(queueItem: QueueItem): BotEmbed {
5757
.setThumbnail('https://i.gifer.com/2RNf.gif')
5858
.setTimestamp()
5959
.addFields([
60-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
60+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
6161
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
6262
{name: 'Steps', value: queueItem.prediction.numInferenceSteps.toString(), inline: true},
6363
{name: 'Guidance Scale', value: queueItem.prediction.guidanceScale.toString(), inline: true},
@@ -78,7 +78,7 @@ export default function(queueItem: QueueItem): BotEmbed {
7878
.setThumbnail('https://i.gifer.com/2RNf.gif')
7979
.setTimestamp()
8080
.addFields([
81-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
81+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
8282
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
8383
{name: 'Steps', value: queueItem.prediction.numInferenceSteps.toString(), inline: true},
8484
{name: 'Guidance Scale', value: queueItem.prediction.guidanceScale.toString(), inline: true},
@@ -100,7 +100,7 @@ export default function(queueItem: QueueItem): BotEmbed {
100100
.setThumbnail('https://i.gifer.com/2RNf.gif')
101101
.setTimestamp()
102102
.addFields([
103-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
103+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
104104
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},
105105
{name: 'Steps', value: queueItem.prediction.numInferenceSteps.toString(), inline: true},
106106
{name: 'Guidance Scale', value: queueItem.prediction.guidanceScale.toString(), inline: true},

src/embeds/queueDetails.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default function(queueItem: QueueItem): BotEmbed {
1010
.setThumbnail('https://i.imgur.com/wj1PRKP.png')
1111
.setTimestamp()
1212
.addFields([
13-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: false},
13+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: false},
1414
{name: 'Width', value: queueItem.prediction.width.toString(), inline: true},
1515
{name: 'Height', value: queueItem.prediction.height.toString(), inline: true},
1616
{name: 'Prompt Strength', value: queueItem.prediction.promptStrength.toString(), inline: true},

src/embeds/queueShow.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default function(args: QueueShowArgs): BotEmbed {
1515

1616
const queueField = [
1717
{name: position === 0 ? 'Next Up' : 'Queue Position', value: position === 0 ? 'This will be generated next' : `#${position}`, inline: false},
18-
{name: 'Prompt', value: codeBlock(queueItem.prediction.prompt), inline: true},
18+
{name: 'Prompt', value: queueItem.prediction.prompt ? codeBlock(queueItem.prediction.prompt) : 'Not Supplied', inline: true},
1919
{name: 'Owner', value: userMention(queueItem.discordCaller), inline: true},
2020
{name: 'Prompt ID', value: codeBlock(queueItem.uuid), inline: true},
2121
]

src/events/commandExtend.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { Interaction } from 'discord.js'
2+
import { Bot } from '../bot'
3+
import { BotEvent, QueueItem, QueueItemType } from '../types'
4+
import addedToQueue, { QueueType } from '../embeds/addedToQueue'
5+
import { v4 as uuidv4 } from 'uuid'
6+
import { getImageAttachmentURL, getRandomInt } from '../utils'
7+
8+
const botEvent: BotEvent = {
9+
name: 'Command Handler - Extend',
10+
event: 'interactionCreate',
11+
once: false,
12+
async execute(bot: Bot, interaction: Interaction) {
13+
if (!interaction.isChatInputCommand()) return
14+
if (interaction.commandName !== 'extend') return
15+
16+
await interaction.deferReply()
17+
18+
const initImage = getImageAttachmentURL(interaction.options.getAttachment('image'))
19+
const mask = getImageAttachmentURL(interaction.options.getAttachment('mask'))
20+
const promptStrength = interaction.options.getNumber('pstrength')
21+
const numInferenceSteps = interaction.options.getInteger('numsteps')
22+
const guidanceScale = interaction.options.getNumber('guidancescale')
23+
const seed = interaction.options.getInteger('seed')
24+
25+
const queueItem: QueueItem = {
26+
discordCaller: interaction.user.id.toString(),
27+
seed: seed ?? getRandomInt(1, 99999999),
28+
uuid: uuidv4(),
29+
interaction,
30+
type: QueueItemType.Extended,
31+
prediction: {
32+
prompt: undefined,
33+
width: 512,
34+
height: 512,
35+
initImage,
36+
mask,
37+
promptStrength: promptStrength ?? 0.8,
38+
numOutputs: 4,
39+
numInferenceSteps: numInferenceSteps ?? 50,
40+
guidanceScale: guidanceScale ?? 7.5
41+
}
42+
}
43+
44+
if (bot.stableDiffusion.isProcessing() || bot.hasQueue()) {
45+
const queuePos = bot.addQueue(queueItem)
46+
47+
await interaction.editReply({
48+
embeds: addedToQueue(QueueType.Queued, queueItem, queuePos).embeds
49+
})
50+
} else {
51+
bot.addQueue(queueItem)
52+
53+
await interaction.editReply({
54+
embeds: addedToQueue(QueueType.Instant, queueItem).embeds
55+
})
56+
}
57+
}
58+
}
59+
60+
export default botEvent

0 commit comments

Comments
 (0)