-
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
m2en
authored
Jan 4, 2023
1 parent
57ecdcb
commit 3166fc7
Showing
5 changed files
with
115 additions
and
11 deletions.
There are no files selected for viewing
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import { GyokuonAssetKey, GyokuonCommand } from './gyokuon.js'; | ||
import { it, vi } from 'vitest'; | ||
|
||
import { MockVoiceConnectionFactory } from '../../adaptor/index.js'; | ||
import { createMockMessage } from './command-message.js'; | ||
import { parseStringsOrThrow } from '../../adaptor/proxy/command/schema.js'; | ||
|
||
it('use case of gyokuon', async () => { | ||
const fn = vi.fn(); | ||
const connectionFactory = new MockVoiceConnectionFactory<GyokuonAssetKey>(); | ||
const responder = new GyokuonCommand({ | ||
connectionFactory, | ||
controller: { | ||
disconnectAllUsersIn: fn | ||
} | ||
}); | ||
|
||
await responder.on( | ||
createMockMessage(parseStringsOrThrow(['gyokuon'], responder.schema)) | ||
); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
import type { | ||
CommandMessage, | ||
CommandResponder, | ||
HelpInfo | ||
} from './command-message.js'; | ||
import type { Schema } from '../../model/command-schema.js'; | ||
import type { Snowflake } from '../../model/id.js'; | ||
import type { VoiceConnectionFactory } from '../voice-connection.js'; | ||
import type { VoiceRoomController } from './kaere.js'; | ||
|
||
export type GyokuonAssetKey = 'GYOKUON'; | ||
|
||
const SCHEMA = { | ||
names: ['gyokuon'], | ||
subCommands: {} | ||
} as const satisfies Schema; | ||
|
||
/** | ||
* gyokuon コマンドでこるくの玉音放送をボイスチャンネルに再生する機能 | ||
* | ||
* @export | ||
*/ | ||
export class GyokuonCommand implements CommandResponder<typeof SCHEMA> { | ||
help: Readonly<HelpInfo> = { | ||
title: 'こるくの玉音放送', | ||
description: | ||
'VC内にこるくの玉音放送を再生するよ。引数無しで即起動。どの方式でもコマンド発行者がVCに居ないと動かないよ。' | ||
}; | ||
readonly schema = SCHEMA; | ||
|
||
constructor( | ||
private readonly deps: { | ||
connectionFactory: VoiceConnectionFactory<GyokuonAssetKey>; | ||
controller: VoiceRoomController; | ||
} | ||
) {} | ||
|
||
async on(message: CommandMessage<typeof SCHEMA>): Promise<void> { | ||
const roomId = message.senderVoiceChannelId; | ||
if (!roomId) { | ||
await message.reply({ | ||
title: 'Gyokuon安全装置が作動したよ。', | ||
description: | ||
'起動した本人がボイスチャンネルに居ないのでキャンセルしておいた。悪く思わないでね。' | ||
}); | ||
return; | ||
} | ||
|
||
await this.start(message.senderGuildId, roomId); | ||
return; | ||
} | ||
|
||
// 玉音放送がすでに行われているか | ||
private doingGyokuon = false; | ||
private async start(guildId: Snowflake, roomId: Snowflake): Promise<void> { | ||
if (this.doingGyokuon) { | ||
return; | ||
} | ||
|
||
this.doingGyokuon = true; | ||
const connectionVC = await this.deps.connectionFactory.connectTo( | ||
guildId, | ||
roomId | ||
); | ||
|
||
connectionVC.connect(); | ||
connectionVC.onDisconnected(() => { | ||
this.doingGyokuon = false; | ||
return false; | ||
}); | ||
|
||
await connectionVC.playToEnd('GYOKUON'); | ||
|
||
connectionVC.destroy(); | ||
this.doingGyokuon = false; | ||
} | ||
} |