LoginSignup
4
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-18

しりとるあ

実は 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

4
0
0

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
  3. You can use dark theme
What you can do with signing up
4
0