動機
コロナ渦の大学生なので,ずっと家にいて暇です.常に仲間とDiscordのVCをつないで作業をしています.
ふとトイレに行くときに,PCのマイクをミュートにし忘れることがあります.
イヤホンはBluetoothなので音は聞こえているのですが,トイレとかキッチンに行った時とかにミュートにし忘れることがあって不便です.
そこで,離れたところからスマホでPCのDiscordをミュートにできたらと思っていたのですが,DiscordのRPCなAPIで実現できそうだったので試してみました.
環境
- ThinkPad X270
- Arch Linux
- Node.js v14.16.0
- discord-rpc v3.2.0
- express
- Discord
Discordのアプリを,Node.jsで動くエージェントサーバーで操作する感じです.
Node.jsのサーバー上で,ExpressによるWebサーバーとDiscordRPCクライアントが走っています.
Webサーバーがリクエストを受け取ったらDiscordのミュートをトグルする,といった形です.
準備
Discordの
- ClientID
- ClientSecret
- AccessToken
が必要になります.
AccessTokenのScopesについては,私の場合は,
rpc
rpc.api
-
identify
のトークンを発行しました.
ソース
const DiscordRPC = require('discord-rpc')
const express = require('express')
const clientId = 'CLIENT_ID'
const clientSecret = 'CLIENT_SECRET'
if(process.argv.length <= 2) {
console.error('You must specify access_token')
return
}
const accessToken = process.argv[2]
const rpc = new DiscordRPC.Client({ transport: 'ipc' });
function startWebServer() {
const app = express()
const port = 3000
app.get('/', (req, res) => {
rpc.getVoiceSettings().then((e) => {
return rpc.setVoiceSettings({mute: !e.mute})
}).then(() => {
res.sendStatus(200)
})
})
app.listen(port, '0.0.0.0', () => {
console.log(`Discord Muter listening at http://localhost:${port}`)
})
}
rpc.on('ready', () => {
startWebServer()
});
rpc.login({
clientId,
scopes: ['rpc', 'rpc.api', 'identify'],
accessToken
}).catch(console.error);
やってみよう
Discordのアプリを開いて,ボイスチャットに入っておきます.
$ node index.js {アクセストークン}
でサーバーを起動します.
その状態で,普通に,PCのブラウザから,http://localhost:3000/
にアクセスすると,ミュートになります.
もう一度アクセスでミュート解除です.
私はTaskerでウィジェット化しています.
他にもRPCにはいろいろなAPIが用意されていそうなので,時間があるときに探してみたいと思います!!