Skip to main content
SlackMCを改造しておしゃべりチャットを
するプラグインを
作ってみた話
第一回神戸マインクラフト勉強会
夜子まま
自己紹介
• 名前: 寺園聖文 てらぞの まさふみ
• ハンドルネーム: 夜子まま
• 職業: Androidエンジニア、またはプログラミング講師
• マイクラ歴: 半年
• SNS: Twitter @yokmama とFacebookやってます
話す内容
Minecraft内の生徒とコミュニケーションをとるために使っている
Minecraft用Slackプラグインについてお話をします。
さてSlackは知っていますか?
Slackは結構便利なアプリなんですよ
????
????
どんなツールかというと
• 招待制のチャットツール
• いま開発者の中で最も注目されているチャットツール
• プラグイン開発が盛んで情報が多い
• 見た目がかわいく使いやすい
とはいっても最初からSlackを使って
いたわけではありません。
なので、ちょっと尺を引っ張るため、
そこまでの経緯を説明します。
(大人の事情)
dynmapプラグイン
マインクラフトのマップを自動マッピング
ゲーム中のプレイヤーをリアルタイムに表示
なんと、ブラウザ経由でゲーム内のユーザと
会話が可能!
dynmapで不満に感じていたこと
• 過去ログが残らない
• テキストしか使えない
• SlackとDynmapと二つのチャットツールの運用は面倒くさい
Minecraft用のSlackプラグインを探してみたが
Bukkit Devはとても沢山のプラグインを見つけることができるサイトです。
SlackMCというツール(v1.8.1に対応していた)
Outgoing Webhooksに対応していないけど、
Bukkit 1.8.8でも動いたので使ってみることに。
※検証は2016年4月頃の話なので、
現在はOutgoingにも対応しているかも
しれません。
SlackMC+Slack+Dynmap
次のような感じで使えるようになり、以前の問題が大分改善された
Minecraft内へ話しかける
Minecraft外へ話しかける
しかし人の欲望は底知れぬもの・・・
Slackから会話したいん
や!
SlackMCのソースがある。
じゃぁ、修正してOutgoingが使えるようにしよう。
ないなら、
作りゃいいのさ
豆知識:SlackAPIについて
WebHook型で、Slackへ、もしくは
SlackからというWebAPIが無料で
使える。
このアプリはチャンネル毎に設定
できるし無料プランだと10個まで
作れる。
SlackMCのソースを取得
Pluginの配布先から、ソースコードのリポジトリを探し、
Gitなら git clone で自分のPCにコピーする。
git clone https://github.com/CircuitSoftGroup/SlackMC.git
IntelliJあるいはEclipseでプロジェクトを開く
大体は、MavenProjectなのでpom.xmlを読み込んでプロジェクトを開くことができます。
BukkitPluginの基本
org.bukkit.plugin.java.JavaPluginを継承し
onEnableをオーバーライドしてそこで初期化処理をする。
あとは、
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
をオーバーライドし、そこでMinecraftからのコマンドをフックして
ごにょごにょするのが基本らしい。
SlackのOutgoingWebHooksの基本
任意のサーバーを立てて、そこでHttpリクエストをListenするWebアプリを起動する、
OutgoingWebHooksにそのWebアプリのURLを設定し、
Webアプリでは、Outgoingから届いたHTTPリクエストを処理するとSlackのメッセージを
取り出すことができるこれをごにょごにょする。
OutgoingWebHooksからのリクエストには固定のトークンがはいっているので、
トークンをもとに、Slackから届いたメッセージかどうかを判断することはできる。
Webアプリについて
Webアプリから、BukkitAPIにアクセスをしないといけない、つまり、どいうことかというと
独自にWebサーバーを立てて、Webアプリを構築すると、Bukkitのサーバーと何らかの方法で
お話をする仕組みをつくらないといけない。それは面倒くさい。
なので、BukkitPlugin内でWebServerを立てることにした。
BukkitRunnableを継承するとBukkit内でスケジューリン
グされ永続的に動くアプリが作れる。
public class SlackReceiveServer extends BukkitRunnable {
......
@Override
public void run() {
if(server == null) {
server = new Server(port);
server.setHandler(new SlackReceiveHandler());
try {
server.start();
server.join();
} catch (Exception e) {
plugin.getLogger().log(Level.SEVERE, "Error in starting SlackMC server: " + e);
}
}
}
.....
}
こいつがJettyServer
これをスケジューラに登録する
public class SlackBukkit extends JavaPlugin implements Listener, SlackListener {
・・・
@Override
public void onEnable() {
・・・
getServer().getScheduler().cancelTasks(this);
slackReceiveServer = new SlackReceiveServer(this, listen_port);
getServer().getScheduler().runTaskAsynchronously(this, slackReceiveServer);
getSlackPluginApi().registerSender(this);
}
・・・
}
これに登録しておくと、
あとは、Bukkitがよしなにしてくれる
あとはWebHook処理
public class SlackReceiveHandler extends AbstractHandler {
@Override
public void handle(String target, ・・・) throws IOException, ServletException {
if (request.getMethod().equals("POST")) {
String[] texts = request.getParameter("text").split(":", 2);
if(texts.length>1) {
String channel_name = request.getParameter("channel_name");
String user_name = request.getParameter("user_name");
String token = request.getParameter("token");
String userName = texts[0];
String text = texts[1].trim();
if(userName.equals("mc") && token.equals(SlackBukkit.token)) {
for (JavaPlugin plugin : getSlackPluginApi().getRegisteredPlugins()) {
System.out.print("slack plugin name:"+plugin.getDescription().getName());
if (plugin instanceof SlackListener) {
((SlackListener) plugin).onSlackMessage(token, channel_name, user_name, text);
break;
ここらへんはうっかりポイント
というわけで、Slackちゃん完成
Minecraft内へ話しかける
Minecraft外へ話しかける
????
????
????
????
????
しかし人の欲望は底知れぬもの・・・
Botと会話したいんや!
爆弾機能をいれていたのだけど、爆弾が爆発するまで何度もしゃ
べる生徒をみていて、不憫に思うようになった。
????
爆弾機能とは?
Minecraft内に誰もいない
mc: だれか発言をする
爆弾のトリガーが発動ランダムでカウントダウンを開始
誰もいないのに発言をするとカウントアップ、誰かインすると爆弾は解除
カウント0:カウント内に喋った人全員が爆発に巻き込まれる。
という、いかにもCleeperみたいな機能
これ
????
????
????
しかし、爆発するまでこれしかしゃべらないのは芸がな
い。
というわけで、今流行りの会話BOTを導入
することにしてみた。
????
????
????
????
過去に自分で作ったことがあるけど、
あまり出来が良かったわけでもないし、DOCOMOの雑談APIが
よく出来ているらしいのでそれを使ってみることにした。
DOCOMO雑談API
これはある程度、形態素解析をして自然な会話ができるらしい。
形態素解析(けいたいそかいせき)とは、
自然言語を形態素(言語のもつ最小単位の言葉)に分割し、それぞれの品詞を判別する作業
要するに品詞が分かれば、名詞から何について話をしているのか、副詞や形容詞から感情や驚き
助動詞や疑問詞で、会話の流れを把握することができるだろう?
という技術
あ、これの使い方はこれを参考にしたので、
やり方は省きます。(白目)
http://qiita.com/shanonim/items/f90ee13180ee70a1903d
Bukkitで使う場合のハマりどころ
MavenのLocalRepositoryを作って、そこにライブラリを入れてから、
pom.xmlにdocomo のライブラリを追加しておく必要があります。
かくして、、
Slackちゃんは会話できるようになった。
????
????
????
以上
ありがとうございました。