しりとるあ
実は Lua でまともな実用プログラムを書くのは初めてだったりしますが、がんばりました。
環境構築
Ubuntu Server 上でやりました。*nix 系なら同じようにできますが、
Windows の場合は手順が異なります。Luvit 公式サイトを確認してください。
Luvit をインストール
公式サイト があります。
curl -L https://github.com/luvit/lit/raw/master/get-lit.sh | sh
インストールが一瞬で終わるのでびびります。
できたファイルは PATH の通った場所に移動しておきましょう。
Discordia をインストール
Lua から Discord がいじれる、Discordia を使います。
lit install SinisterRectus/discordia
初期設定
https://discordapp.com/developers/applications/ にアクセスし、
新しいアプリケーションを作成します。
アプリケーションができたら、左側のメニューにある [Bot] を押して
新しい Bot を作成します。Botトークンは後で使います。メモっておきましょう。
アプリケーションのトークンではないので注意!
ピンポンする
Discordia のサンプルコードそのままですので、省略。
Bot INSERT_TOKEN_HERE
を、 Bot [メモったトークン]
に置き換えます。
しりとりに必要なもの
しりとりは文字のよみが分からないと始まりません。
Gooラボ API のひらがな化 API を使います。
登録して、アプリ ID を取得しておきます。GitHub アカウントが必要です。
ひらがな化
Gooラボ API を使って、メッセージをひらがな化します。
local json = require 'json'
local http = require 'coro-http'
local function yomiOf(kanji)
local res, body = http.request(
'POST',
'https://labs.goo.ne.jp/api/hiragana',
{
{ 'Content-Type', 'application/json' }
},
json.encode {
app_id = HIRAGANA_API_ID, -- ここをIDに書き換える
sentence = kanji,
output_type = 'hiragana'
}
)
local hiragana = json.decode(body)
return hiragana.converted
end
print(yomiOf'兄貴と私') -- → あにきとわたし
json
と coro-http
は discordia
の依存ライブラリなので、
ありがたく使わせていただきます。
長音・記号を除く
長音が最後の文字に来ると困るので、置換します。
hiragana:gsub('ー', '')
他にも最後に来ると困る記号群を置換します。
日本語文字列では正規表現が使いものにならないので、がんばります。
local hiraganar = {
'[!-~]', '「', '」', '!', '?', '{', '}', '_', '*', '%',
'。', '、', '|', '=', '<', '>', '^', '~', '¥','+', '・', ';',
':', '…', '‥', '(', ')', '’'
}
for i, str in ipairs(hiraganar) do
hiragana = hiragana:gsub(str, '')
end
最後の一文字を取る
Lua は utf8 に対応してないので、最後の一文字を取るのはわりと大変です。
Lua で utf8 を扱うライブラリもありますが、今回は使わないでいきます。
API レスポンスから末尾3バイトを取り出します。
ひらがなしか来ないのがわかっているからできる力技です。
これで最後の1文字が抽出できました。
同じように最初の1文字も取れます。
-- 最後
hiragana:sub(-3)
-- 最初
hiragana:sub(1, 3)
あとは、取った文字を比較してやればよいです!
特定チャンネルだけに反応する
反応するチャンネルリストをあらかじめ登録しておくことで、
不要なチャンネルへの返信を抑制します。ついでに Bot への返信も抑制します。
reactChannels = { 'チャンネルID', }
-- ut:includes(obj, fn) … obj テーブルに fn に一致する value があるか調べる
-- https://github.com/plageoj/shiritolua/blob/master/utils.lua#L8
local outOfKaya = not ut:includes(config.reactChannels, function(itm)
return '<#'..itm..'>' == message.channel.mentionString
end)
if outOfKaya or message.author.bot then
return
end
ここで取り上げたのはプログラムの一部のみです。
全てのソースが含まれているリポジトリはこちら:
https://github.com/plageoj/shiritolua