LoginSignup
0

More than 3 years have passed since last update.

posted at

updated at

Lua で Discord 向けしりとり bot を作る

しりとるあ

実は 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'兄貴と私') -- → あにきとわたし

jsoncoro-httpdiscordia の依存ライブラリなので、
ありがたく使わせていただきます。

長音・記号を除く

長音が最後の文字に来ると困るので、置換します。

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 への返信も抑制します。

config
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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0