Slackで表示中のチャンネルでメンション以外も音を鳴らす方法

Slackでメンション以外も音を鳴らす

Slackではメンションで@iwbjpのようにメッセージで@を使用するとメンバーに直接「スッコココ」という音で通知できます。

しかし、メンションを使用しない普通のメッセージだと送信されても、デフォルト設定では音が鳴りません。

チャンネル内に新しいメッセージが送信されたら音を鳴らして知らせてほしいことがありますが、相手が必ずしもメンションで送信するとは限らないです。

現在見ているチャンネルのみで、メンション以外のメッセージも音を鳴らしてほしくても、Slackにはそのような設定はありません。

そのため、もし通常のメッセージで音を鳴らす場合はJavaScriptでメッセージを検知して音を鳴らします。

これはブラウザ版のSlackのみで使用可能な方法で、やり方はブラウザのConsoleに以下のコードを貼り付けて実行するだけです。

これは単純にSlackにメッセージが送信されたら検知してAudioContextで音を鳴らしているだけです。

function startDingDong() {
  let tmpText = ''

  setInterval(() => {
    const msgContent = document.querySelectorAll('[data-qa="message_content"]')
    const len = msgContent.length
    const msg = msgContent[len - 1]
    const msgText = msg.innerText.replace(/^\d{1,3}$/gm, '').trim()

    if (tmpText !== msgText) {
      tmpText = msgText
      const audioCtx = new (window.AudioContext || window.webkitAudioContext)()
      const playDingDong = () => {
        const oscillator1 = audioCtx.createOscillator()
        const oscillator2 = audioCtx.createOscillator()
        const gainNode = audioCtx.createGain()
        oscillator1.frequency.setValueAtTime(523.25, audioCtx.currentTime)
        oscillator1.type = 'sine'
        oscillator2.frequency.setValueAtTime(659.25, audioCtx.currentTime)
        oscillator2.type = 'sine'
        gainNode.gain.setValueAtTime(0, audioCtx.currentTime)
        oscillator1.connect(gainNode)
        oscillator2.connect(gainNode)
        gainNode.connect(audioCtx.destination)
        oscillator1.start(audioCtx.currentTime)
        gainNode.gain.linearRampToValueAtTime(1, audioCtx.currentTime + 0.01)
        gainNode.gain.linearRampToValueAtTime(0, audioCtx.currentTime + 0.3)
        oscillator1.stop(audioCtx.currentTime + 0.3)
        oscillator2.start(audioCtx.currentTime + 0.5)
        gainNode.gain.setValueAtTime(0, audioCtx.currentTime + 0.5)
        gainNode.gain.linearRampToValueAtTime(1, audioCtx.currentTime + 0.51)
        gainNode.gain.linearRampToValueAtTime(0, audioCtx.currentTime + 0.8)
        oscillator2.stop(audioCtx.currentTime + 0.8)
      }

      playDingDong()
    }
  }, 1000)
}

startDingDong()

ChromeであればSnippetに保存して使用すると使いやすいです。

Slackで現在見ているチャンネルに新しいメッセージが来るのをにらめっこしながら待機して、仕事で無駄な仕事を浪費している方はぜひご活用ください。