Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 引数なしでVC参加するタイプのコマンドにstartサブコマンドを追加 #1111

Merged
merged 4 commits into from
Oct 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions packages/bot/src/service/command/kaere.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,18 @@ it('use case of kaere', async () => {
)
);

await responder.on(
createMockMessage(
parseStringsOrThrow(['kaere', 'start'], responder.schema),
(message) => {
expect(message).toStrictEqual({
title: '提督、もうこんな時間だよ',
description: '早く寝よう'
});
}
)
);

await responder.on(
createMockMessage(
parseStringsOrThrow(['kaere', 'bed', 'status'], responder.schema),
Expand Down
55 changes: 35 additions & 20 deletions packages/bot/src/service/command/kaere.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { addDays, isBefore, setHours, setMinutes, setSeconds } from 'date-fns';

import type { Schema } from '../../model/command-schema.js';
import type { EmbedMessage } from '../../model/embed-message.js';
import type { Snowflake } from '../../model/id.js';
import { Reservation, ReservationTime } from '../../model/reservation.js';
Expand Down Expand Up @@ -117,9 +118,17 @@
description: '現在の予約を一覧するよ'
}
}
},
start: {
type: 'SUB_COMMAND',
description: 'VC内の人類に就寝を促すよ。'
},
help: {
type: 'SUB_COMMAND',
description: '専用のヘルプを表示するよ。'
}
}
} as const;
} as const satisfies Schema;

/**
* `kaere` コマンドでボイスチャンネルの参加者に切断を促す機能。
Expand All @@ -128,7 +137,7 @@
help: Readonly<HelpInfo> = {
title: 'Kaere一葉',
description:
'VC内の人類に就寝を促すよ。引数なしで即起動。どの方式でもコマンド発行者がVCに居ないと動かないよ',
'VC内の人類に就寝を促すよ。どの方式でもコマンド発行者がVCに居ないと動かないよ',
// 音声機能関連の機能は voice/ 以下にドキュメントを置いているため
pageName: 'voice/kaere'
};
Expand All @@ -153,7 +162,7 @@

async on(message: CommandMessage<typeof SCHEMA>): Promise<void> {
const { args } = message;
if (!args.subCommand) {
if (!args.subCommand || args.subCommand.name == 'start') {
const roomId = message.senderVoiceChannelId;
if (!roomId) {
await message.reply({
Expand All @@ -172,6 +181,15 @@
return this.handleBedCommand(message);
case 'reserve':
return this.handleReserveCommand(message);
case 'help':
await message.reply({
title: 'Kaere強制切断モードヘルプ',
description: `
- \`bed enable\`/\`bed disable\`: 強制切断モードの有効/無効化
- \`bed status\`: 強制切断モードの状態の確認
`
});
return;

Check warning on line 192 in packages/bot/src/service/command/kaere.ts

View check run for this annotation

Codecov / codecov/patch

packages/bot/src/service/command/kaere.ts#L185-L192

Added lines #L185 - L192 were not covered by tests
}
}

Expand Down Expand Up @@ -210,7 +228,13 @@
private async handleBedCommand(
message: CommandMessage<typeof SCHEMA>
): Promise<void> {
switch (message.args.subCommand?.subCommand.name) {
if (
message.args.subCommand == null ||
message.args.subCommand.name !== 'bed'
) {
throw new Error('expected bed command group');
}

Check warning on line 236 in packages/bot/src/service/command/kaere.ts

View check run for this annotation

Codecov / codecov/patch

packages/bot/src/service/command/kaere.ts#L235-L236

Added lines #L235 - L236 were not covered by tests
switch (message.args.subCommand.subCommand.name) {
case 'enable':
this.bedModeEnabled = true;
await message.reply({
Expand All @@ -231,19 +255,18 @@
});
return;
}
await message.reply({
title: 'Kaere強制切断モードヘルプ',
description: `
- \`bed enable\`/\`bed disable\`: 強制切断モードの有効/無効化
- \`bed status\`: 強制切断モードの状態の確認
`
});
}

private async handleReserveCommand(
message: CommandMessage<typeof SCHEMA>
): Promise<void> {
switch (message.args.subCommand?.subCommand.name) {
if (
message.args.subCommand == null ||
message.args.subCommand.name !== 'reserve'
) {
throw new Error('expected reserve command group');
}

Check warning on line 268 in packages/bot/src/service/command/kaere.ts

View check run for this annotation

Codecov / codecov/patch

packages/bot/src/service/command/kaere.ts#L267-L268

Added lines #L267 - L268 were not covered by tests
switch (message.args.subCommand.subCommand.name) {
case 'add':
{
const roomId = message.senderVoiceChannelId;
Expand Down Expand Up @@ -329,14 +352,6 @@
}
return;
}
await message.reply({
title: 'Kaere予約ヘルプ',
description: `
- \`reserve add [HH]:[MM]\`: Kaereの開始を指定時刻で予約
- \`reserve cancel [HH]:[MM]\`: 指定時刻の予約をキャンセル
- \`reserve list\`: 予約リストの一覧
`
});
}

private scheduleToStart(reservation: Reservation) {
Expand Down
14 changes: 14 additions & 0 deletions packages/bot/src/service/command/party.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,20 @@ describe('party ichiyo', () => {
);
});

it('starts the party', async () => {
await responder.on(
createMockMessage(
parseStringsOrThrow(['party', 'start'], responder.schema),
(message) => {
expect(message).toStrictEqual({
title: `パーティー Nigth`,
description: 'хорошо、宴の始まりだ。'
});
}
)
);
});

it('use case of party', async () => {
await responder.on(
createMockMessage(
Expand Down
11 changes: 8 additions & 3 deletions packages/bot/src/service/command/party.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { addHours, getMinutes, setMinutes, setSeconds } from 'date-fns';

import type { Schema } from '../../model/command-schema.js';
import type { EmbedMessage } from '../../model/embed-message.js';
import type { HelpInfo } from '../../runner/command.js';
import type { Clock, ScheduleRunner } from '../../runner/index.js';
Expand Down Expand Up @@ -86,9 +87,13 @@ const SCHEMA = {
choices: assetKeys
}
]
},
start: {
type: 'SUB_COMMAND',
description: 'VC内の人類に押しかけてPartyを開くよ。'
}
}
} as const;
} as const satisfies Schema;

/**
* `party` コマンドで押し掛けPartyする機能。
Expand All @@ -97,7 +102,7 @@ export class PartyCommand implements CommandResponderFor<typeof SCHEMA> {
help: Readonly<HelpInfo> = {
title: 'Party一葉',
description:
'VC内の人類に押しかけてPartyを開くよ。引数なしで即起動。どの方式でもコマンド発行者がVCに居ないと動かないよ',
'VC内の人類に押しかけてPartyを開くよ。どの方式でもコマンド発行者がVCに居ないと動かないよ',
// 音声機能関連の機能は voice/ 以下にドキュメントを置いているため
pageName: 'voice/party'
};
Expand All @@ -118,7 +123,7 @@ export class PartyCommand implements CommandResponderFor<typeof SCHEMA> {

async on(message: CommandMessage<typeof SCHEMA>): Promise<void> {
const { args } = message;
if (!args.subCommand) {
if (!args.subCommand || args.subCommand.name === 'start') {
await this.startPartyImmediately(message);
return;
}
Expand Down