mattn/mruby-lingrbot - GitHubbuild_config.rb はこんな感じ。
https://github.com/mattn/mruby-lingrbot
MRuby::Build.new do |conf|
toolchain :gcc
conf.gem :git => 'https://github.com/mattn/mruby-sha1.git'
conf.gem :git => 'https://github.com/mattn/mruby-sinatic.git'
conf.gem :git => 'https://github.com/mattn/mruby-http.git'
conf.gem :git => 'https://github.com/mattn/mruby-uv.git'
conf.gem :git => 'https://github.com/mattn/mruby-json.git'
conf.gem :git => 'https://github.com/mattn/mruby-sandbox.git'
end
そして Sinatic を使ったコードはこんな感じ。
#!mruby
sb = Sandbox.new
get "/lingr" do |r, param|
"ワシもmrubyじゃ"
end
post "/lingr" do |r, param|
json = JSON.parse(r.body)
ret = ''
json["events"].each do |e|
if e["message"] && e["message"]["text"]
m = e["message"]["text"].split(" ", 2)
if m[0] == '!mruby'
if m.size == 1
ret = 'ワシがmrubyじゃ'
elsif m.size == 2
ret = sb.eval(m[1])
end
end
end
end
ret
end
Sinatic.run :port => 8888
いい感じに Sinatra してていいですね。!mruby 1+2
みたいに発言すると、eval して返してくれるのですが、そのまま eval させると、UV の API でセキュリティ的にまずいので、Sandbox を用意しました。mattn/mruby-sandbox - GitHubこれを使うと実行しているmrubyとは別のスタックマシン上で制限された mruby が動作します。とある人に「欲しい」と言われて10分程度で作りました。今のところ、ご機嫌よく動いてます。
https://github.com/mattn/mruby-sandbox
ちなみにこの bot にアイコンを付けたいので、誰か mruby のアイコン描いて下さい。お願いします。
icon ・ Issue #998 - mruby/mruby - GitHub試験的なのでちょくちょく落とすと思います。
https://github.com/mruby/mruby/issues/998