Skip to content

Commit

Permalink
Merge branch 'main' into feat/version
Browse files Browse the repository at this point in the history
  • Loading branch information
MikuroXina authored Jun 11, 2022
2 parents 73d6abe + 01b02ff commit 38a6943
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 10 deletions.
56 changes: 56 additions & 0 deletions src/adaptor/transformer/message-convert.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { MessageActionRow, MessageButton } from 'discord.js';
import type { RawMessage, Transformer } from './index.js';
import type { BoldItalicCop } from '../../service/bold-italic-cop.js';
import type { CommandMessage } from '../../service/command-message.js';
Expand Down Expand Up @@ -31,6 +32,22 @@ export const observableTransformer: Transformer<
> = (handler) => (raw: RawMessage) => handler(observableMessage(raw));

const SPACES = /\s+/;
const ONE_MINUTE_MS = 60_000;
const CONTROLS = new MessageActionRow().addComponents(
new MessageButton()
.setStyle('SECONDARY')
.setCustomId('prev')
.setLabel('戻る')
.setEmoji('⏪'),
new MessageButton()
.setStyle('SECONDARY')
.setCustomId('next')
.setLabel('進む')
.setEmoji('⏩')
);

const pagesFooter = (currentPage: number, pagesLength: number) =>
`ページ ${currentPage + 1}/${pagesLength}`;

export const converterWithPrefix =
(prefix: string): Transformer<CommandMessage, RawMessage> =>
Expand Down Expand Up @@ -58,6 +75,45 @@ export const converterWithPrefix =
}
};
},
async replyPages(pages) {
if (pages.length === 0) {
throw new Error('pages must not be empty array');
}

const generatePage = (index: number) =>
convertEmbed(pages[index]).setFooter({
text: pagesFooter(index, pages.length)
});

const paginated = await message.reply({
embeds: [generatePage(0)],
components: [CONTROLS]
});

const collector = paginated.createMessageComponentCollector({
time: ONE_MINUTE_MS
});
let currentPage = 0;
collector.on('collect', async (interaction) => {
switch (interaction.customId) {
case 'prev':
if (0 < currentPage) {
currentPage -= 1;
} else {
currentPage = pages.length - 1;
}
break;
case 'next':
if (currentPage < pages.length - 1) {
currentPage += 1;
} else {
currentPage = 0;
}
break;
}
await interaction.update({ embeds: [generatePage(currentPage)] });
});
},
async react(emoji) {
await message.react(emoji);
}
Expand Down
2 changes: 2 additions & 0 deletions src/model/embed-message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@ export interface EmbedMessage {
url?: string;
thumbnail?: EmbedMessageThumbnail;
}

export type EmbedPage = Omit<EmbedMessage, 'footer'>;
12 changes: 10 additions & 2 deletions src/service/command-message.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { EmbedMessage } from '../model/embed-message.js';
import type { EmbedMessage, EmbedPage } from '../model/embed-message.js';
import type { MessageEventResponder } from '../runner/index.js';
import type { Snowflake } from '../model/id.js';

Expand Down Expand Up @@ -61,11 +61,18 @@ export interface CommandMessage {
* このメッセージに `message` の内容で返信する。
*
* @param message
* @type {readonly string[]}
* @memberof CommandMessage
*/
reply(message: EmbedMessage): Promise<SentMessage>;

/**
* このメッセージにページ送りできる `pages` で返信する。
*
* @param pages
* @memberof CommandMessage
*/
replyPages(pages: EmbedPage[]): Promise<void>;

/**
* このメッセージに `emoji` の絵文字でリアクションする。
*
Expand Down Expand Up @@ -116,6 +123,7 @@ export const createMockMessage = (
Promise.resolve({
edit: () => Promise.resolve()
}),
replyPages: () => Promise.resolve(),
react: () => Promise.resolve(),
...partial
});
14 changes: 6 additions & 8 deletions src/service/help.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type {
HelpInfo
} from './command-message.js';
import type { MessageEvent, MessageResponseRunner } from '../runner/index.js';
import type { EmbedMessageField } from '../model/embed-message.js';
import type { EmbedPage } from '../model/embed-message.js';

export class HelpCommand implements CommandResponder {
help: Readonly<HelpInfo> = {
Expand All @@ -29,18 +29,16 @@ export class HelpCommand implements CommandResponder {
const helps = this.runner
.getResponders()
.map((responder) => responder.help);
const fields: EmbedMessageField[] = helps.map((help) =>
this.buildField(help)
);
await message.reply({ fields });
const pages: EmbedPage[] = helps.map((help) => this.buildField(help));
await message.replyPages(pages);
}

private buildField({
title,
description,
commandName,
argsFormat
}: Readonly<HelpInfo>): { name: string; value: string } {
}: Readonly<HelpInfo>): EmbedPage {
const patternsWithDesc: [string, string][] = argsFormat.map(
({ name, description, defaultValue }) => [
defaultValue === undefined ? `<${name}>` : `[${name}=${defaultValue}]`,
Expand All @@ -52,8 +50,8 @@ export class HelpCommand implements CommandResponder {
.join('\n');
const patterns = patternsWithDesc.map(([pattern]) => pattern);
return {
name: title,
value: `${description}
title,
description: `${description}
\`${commandName.join('/')}${['', ...patterns].join(' ')}\`
${argsDecrptions}`
};
Expand Down

0 comments on commit 38a6943

Please sign in to comment.