アツマールでコメントの個人特定をする方法

# 筆者メモ
この記事は、もともとNoteで公開していた内容と完全に同じ内容です。
元の記事：https://note.com/hadhad/n/nad8548c4943d

もともと100円で売ってたんですが、誰も買わなかったので無料にしたところ、
twitterでプチバズったのにNoteのフォロワーがまったく増えなかったので、
もうQiitaに自己転載して、もっといろんな人が見れるようにしました。

記事に記載したプラグインやソースコードはWTFPLライセンスで配布します。勝手にして、どうぞ。

# はじめに

RPGアツマールのコメント機能は、ニコニコ動画と違って投稿したIDが公開されていない。
そのため、コメントした人全員が184コメントをしているような扱いになっている。
また、ゲーム側でコメントのNG機能も用意されてはいるが、ID指定ではなく「キーワード」での指定となっている。

その為に、RPGアツマールでは、ゲームをコメントで荒らされた場合、
**ユーザー単位でNGしたいのに、できない**という仕様になっている。

Twitter等で「アツマール コメント NG」とかで検索してみると、
**ユーザーID特定機能が欲しい**という人もチラホラ存在する。

だが僕は思う。
**運営を頼る以前に、自分で作れるハズだ**
と。

かくゆう自分も、この問題に直面していた。
気に入らないコメントは削除すればよいのだが、
**コメントの削除は運営の人力で申請制のため時間がかかる**し、
消せたとしても粘着質なユーザーは
すぐに同じようなコメントを書き込むからだ。

そこで僕は思った。
**「コメントした人のIDを特定して、
　指定IDの人をBANできるプラグインを作ったら面白そうだ」**
と。

結果、僕はこのプラグインの開発に**成功**した。

どうやったのかを次に記す。

# コメントを個人特定する仕組み

予め断っておくが、この方法では、
**既に書き込まれている過去のコメントからIDを特定することはできない。**

今回の方法はあくまで、
**「仕組みを取り入れた瞬間からのコメントが特定できる」**
という話だ。

この仕組みを実現するために僕は、
**「コメントを投稿する瞬間」に細工をすることにした。**

用意するアツマールのAPIは次の通り。
・[コメントAPI](https://atsumaru.github.io/api-references/comment/)
・[シグナルAPI](https://atsumaru.github.io/api-references/signal/)

コメントAPIには、
**「コメントを行った瞬間にコメント内容を取得できる」**
関数が用意されている。

そしてシグナルAPIには
**「100バイト以内の文章をユーザー情報付きで送信できる」**
関数が用意されている。
また**グローバルシグナルとして送信された情報は、
1000件までサーバーに記録される。**

ここまで見て、察しが良い人はもう分かっただろう。

つまり、
**１．コメントを行った瞬間に
２．ユーザー情報とコメントの内容をグローバルシグナルとして送信し
３．確認したいときにグローバルシグナルの中身を覗く**
という順序を辿れば、コメントの個人特定が可能というわけだ。

さて、仕組みを理解できたところで、
さっそくこれをツクールMVプラグインにしてみよう！

# コメントのユーザー情報を記録するプラグイン

このプラグインは、ツクールMVに適用するだけで効果を発揮する。
ソースコードは次の通り・・・

```js
/*:
* @plugindesc 投稿されたコメントをグローバルシグナルに送信
* @author Had2Apps
* @help
* コメントが投稿されると同時に、グローバルシグナルに内容が送信されます。
* これにより、誰がどのコメントを行ったかを特定することができます。
*
* グローバルシグナルの一覧をコンソールに表示したい場合は、スクリプトで
* window.RPGAtsumaru.signal.getGlobalSignals().then(console.log)
* を呼び出してください。
*/
(function () {
 if (window.RPGAtsumaru === undefined) {
   console.warn("APIが読み込めません");
   return;
 }
 function shorten(text) {
   var chars = text.split("");
   var current = 0;
   var temp = "";
   for (i = 0; i < chars.length; i++) {
     var escapedChar = escape(chars[i]);
     current = escapedChar.length < 4 ? current + 1 : current + 2;
     if (current > 100) return temp;
     temp += text.charAt(i);
   }
   return text;
 }
 function sendCommentLog(res) {
   var comment = res.comment;
   var log = shorten(comment);
   window.RPGAtsumaru.experimental.signal.sendSignalToGlobal(log).then(() => {
     console.log("OK");
   });
 }
 window.RPGAtsumaru.comment.posted.subscribe(sendCommentLog);
})();
```



解説しよう。

ここで使用されているAPI関数は
・`RPGAtsumaru.comment.posted.subscribe`
・`RPGAtsumaru.experimental.signal.sendSignalToGlobal`
の２つだ。

※今は `experimental.` なしでも動くらしい。動かなかった場合は外してみたらいいんじゃないかな。

`RPGAtsumaru.comment.posted.subscribe` は、
引数にコールバック関数を渡してやることで、ユーザーがコメントを投稿した瞬間に、コメント内容を引数に渡した状態でコールバック関数が実行されるようになっている。
このプラグインでは、後者のAPI関数を使った処理をコールバック関数として指定した。

`RPGAtsumaru.experimental.signal.sendSignalToGlobal` は、
引数に100バイト以内の文字列を渡してやることで、その文字列とユーザー情報をRPGアツマールのサーバーに送信してくれる。
shorten 関数では、取得されたコメントが100バイトに収まるように調整している。

ちなみに、送信されたグローバルシグナルを確認したい場合は、
スクリプトで次の処理を書き込めばいい。

```js
if (window.RPGAtsumaru !== undefined) {
  window.RPGAtsumaru.signal.getGlobalSignals().then(console.log)
}
```
この処理が実行されることで、
ブラウザのコンソール画面にグローバルシグナルの一覧が表示される。
これを見ればOKだ。

# 応用編：ユーザーIDのNG機能を実現する
ここまで読んだ人なら、ユーザーIDのNG機能を実装するのも、
そう難しくないはずだ。

ようは、上述のプラグインで取得した**IDが一致するユーザーが
ゲームをプレイできないように**細工すればいいのだ。

本記事では、実際にどのようにコードを書けばいいかは掲載しないが、
実現するためのヒントを以下に載せておこうと思う。

まず、NG機能を実装するのに使えそうな追加のAPIは次の通りだ。
・[ユーザー情報取得API](https://atsumaru.github.io/api-references/user/)
・[コメントAPI：シーン切り替え](https://atsumaru.github.io/api-references/apis/comment/#%E3%82%B7%E3%83%BC%E3%83%B3%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88API)

まず**ユーザー情報取得API**は、
今プレイしているユーザーのIDなどを取得できるAPIだ。
これを使用することで、グローバルシグナルをいちいち送信しなくても
ユーザーIDを取得することができる。
なので、プラグインで取得した**荒らしのユーザーID**と
**このAPIの情報を照らし合わせて、処理を変える**ようにすればいいのだ。

次に**コメントのシーン切り替えAPI**は、
コメント投稿先のシーン名を強制的に変更できるAPIだ。
これを応用することで、**荒らしユーザーだけ
荒らし専用のシーンに強制的に投稿させる**仕組みを作り、
他のユーザーからその荒らしのコメントを見れなくすることができる。

つまり処理の流れとしては、こうなればいいわけだ。
**１．プラグインから荒らしのユーザーIDを予め指定しておく
２．ユーザー情報取得APIでプレイヤーのIDを調べ、荒らしのIDと照合
３．一致する場合、コメントのシーンを荒らし専用シーンに強制設定
４．ゲームをプレイ不能にする**

先ほども書いた通り、
この記事ではそのプラグインをどのようにして
作るのかに関しては書かない。

もしプラグインを書いたことがない場合は、
勉強がてら作ってみることをおススメする。

これにて以上！

# さいごに
（この部分はもともとのNote記事にはなかったことです）

この方法を使えば、荒らしコメントを書く輩のリストを作ることが可能なので、
荒らしユーザーリストを作者のみんなで共有すれば、
実質「NG共有機能」みたいなことができるはず。

特定のユーザーのプレイを禁止するようにできれば、荒らし撲滅できると思う。
わりと過激な考え方だけど。

この記事で書いた技術は、あくまで良いことに使ってほしいです。
悪用しようと思えばできちゃうと思うんだよね。
**絶対に、人の迷惑になるようなことには使わないこと！**

そして自分がターゲットになっても困らないように、**身に振り方には気を付けよう！**

実践例：
https://game.nicovideo.jp/atsumaru/games/gm14221?link_in=users