Discordウェブフック連携を用いたチャット通知の実装

ヒサギです。いつも「ソラニワ(Stroll Green)」を遊んで頂きましてありがとうございます。
時間が経つのは速いもので、あっという間にゲームの終わりが近づいてきて、ここまでおおよそ恙無く運営できていたことにホッとしつつもなんだか寂しい気もしています。一応、相当のんびりと進めていたのですが、過ぎてしまうと案外早いですね。

今回は、これから定期ゲーム・AP制ゲーム等を作られる・公開される予定がある方、あるいは、PBCなどのWEBサービスを開発される方向けに、より良いものを作って頂ければ私がPLとして参加するときに楽しいな、という想いを込めて本ゲームの機能として備わっていた「Discord連携通知」の作り方を解説していきます。
ほとんどAPIを叩くだけなので解説も何もない気がしますが、いってみましょう。

そもそもどういった機能?

画像1

画像3

すでにお使いの方はわかるかと思いますが、ゲーム内のリアルタイムチャットで誰かにレス発言を行うと、そのレス相手が事前に用意したウェブフックURLに対して通知を送信する機能になります。
相手がスマートフォンをお使いであれば、端末のプッシュ通知として受け取ることができます。
これによって、①レス相手がチャットを見ていないときでもレスがあったことにすぐ気付ける(利用者側の利点)、②レスがあったかどうかを何度もページ更新して確認する必要が減るためサーバ負担が減る(運営側の利点)の2つの強力な効果が見込めます。すごい、魔法みたい!

基本的な使い方と完成品

<?php
// Discordに対してポストする関数
function postNotifyDiscord($message, $webhookurl) {
	$options = array(
		'http' => array(
		'method' => 'POST',
		'header' => 'Content-Type: application/json',
		'content' => json_encode($message),
		'timeout' => 5,
		)
	);
	$res = file_get_contents($webhookurl, false, stream_context_create($options));
}

// 使い方
$iconurl = "http://st.x0.to/noimage.jpg"; // アイコン(フルパスURL形式)
$targeturl = "https://discordapp.com/api/webhooks/xxxxxxxxxx/yyyyyyyyyyyy"; // 通知対象のWEBフックURL
// 送信
postNotifyDiscord(array("username"=>"StrollGreen通知", "avatar_url"=>$iconurl, "content"=>"【Stroll Green】あなた宛てのレスがあります! http://st.x0.to/?mode=chat&list=2"), $targeturl);

?>

コピペで動作できるように実際のものを簡略化したPHPのソースコードです。PHPで書かれていますが、仕組みがわかればPHPでなくてもHTTP通信できる諸々で書けると思います。
※こちらのソースコードは、他者に迷惑をかけない範囲でご自由にコピーしてお使い頂いて構いません
※セキュリティ系のコードはご自身で適切な方法で書いてください

使い方は単純で、対象が予め用意していたウェブフックURLに対してJSON形式のパラメータでPOSTリクエストを投げる、これだけです。
正しく相手へ通知が行った場合は、上記の図のようにDiscordの各自のサーバのチャンネルに対して発言が自動的に送信されます。これが基本的な使い方になります。

応用編

詳しくはDiscordのAPIリファレンスを読むのが良いと思いますが、簡単にカスタマイズする方法を説明します。

(1)アイコンをキャラクターのアイコンにしたい
パラメータの「avatar_url」を他のアイコンURLに変更することでそれぞれのアイコンとして送信されます。(ただ、本ゲームでは他キャラクターのアイコン画像を想定されにくい用途で渡してしまうことが適切か微妙だったため、自キャラクターのアイコン画像のみに限定しています。)

(2)通知の本文を変更したい
パラメータの「content」を変えることで、例えば投稿本文などを送信させることもできます。(ただ、本ゲームではやはり投稿内容を後から削除や修正などが効かないゲーム外へ持ち出すのが微妙だったため、固定の文章にしています。)

(3)チャット返信以外にも通知したい
この通知はチャット返信以外でも色々なところで活用できると思います。例えば、アイテム取引が提示されたら通知とか、更新期限が未宣言のまま近づいてきたら通知とかでも面白いかもしれません。

所感

結局のところ実験機能という位置づけで今日まで来てしまいましたが、特に問題や課題となる点も無く、たとえば定期ゲームの標準機能として備わっても全然いいかと思い、技術を共有することにしました。
何かお気づきの点、要望、改善案等がございましたらお知らせください。それでは。

この記事が気に入ったらサポートをしてみませんか?