Giter Club home page Giter Club logo

rgrb's Introduction

汎用チャットボット RGRB

Test Maintainability Test Coverage

RGRB は Ruby で実装されている汎用 IRC/Discord ボットです。プラグイン方式により柔軟な拡張が可能です。

動作環境

  • Linux または OSX
    • 現在のところ Windows には未対応。
  • Ruby 3.0 以降

インストール

Ruby をインストールしていない場合はインストールしてください。

Bundler をインストールしていない場合は以下を実行してください。

gem install bundler

上記が完了したら、適当なディレクトリにファイルを設置し、以下を実行して必要な gem(ライブラリ)をインストールしてください。

なお、gem をインストールするためには、システムにいくつかのライブラリと開発環境がインストールされている必要があります。CentOS 7 を最小限構成でセットアップしている場合、以下の追加パッケージが必要です。

  • make
  • gcc
  • gcc-c++
  • libicu-devel
  • zlib-devel
  • which
  • sqlite-devel
  • gdbm-devel
cd /path/to/rgrb
bundle install --deployment

開発時のみ必要なライブラリのインストール

開発時は、メール送信テストを行えるようにするため、mailcatcher をインストールしてください。

gem install mailcatcher

設定

IRC ボット用および Discord ボット用の設定ファイルのテンプレートがそれぞれ同梱されています。 IRC ボット用のテンプレートは config/irc.yaml です。 Discord ボット用のテンプレートファイルは config/discord.yaml です。 複数の設定を使う場合は、このファイルをコピーして config/ に設置します。

各設定は設定 ID によって識別します。設定 ID とは、config/ 以下に設置した YAML ファイルの、config/ を基準とした相対パスから拡張子を除いたものです。例えば config/irc.yaml の場合は irc となり、config/trpg/detatoko.yaml の場合は trpg/detatoko になります。

プラグインの設定を別のファイルに書くことも可能です。その場合、親となる設定ファイルの Include 節で設定 ID を指定し、子となる設定ファイルを取り込みます。ただし、取り込まれたファイルからさらに他の設定ファイルを取り込むことはできません。具体例は上記の設定ファイルのテンプレートでご確認ください。

プラグイン一覧

IRC / Discord 欄の凡例

記号 意味
o 実装済み
! すべての機能が実装されているわけではない
x 未実装
- 実装予定なし(チャット環境固有の物)

オンラインセッション支援

プラグイン名 内容 IRC Discord
DiceRoll ダイスロール o o
RandomGenerator ランダムジェネレータ o o
Trpg::Detatoko 「でたとこサーガ」専用のダイス・表引きコマンド o o
BCDice ボーンズ&カーズ のダイスコマンドを利用する o o

情報検索・引用

プラグイン名 内容 IRC Discord
Keyword キーワード検索 o o
OnlineSessionSearch TRPG.NET セッションマッチングシステムから予定されているオンラインセッションの情報を検索する o x
CreTwitterCitation Twitter @cre_ne_jp の引用 o -
UrlFetchTitle 発言された URL のページタイトルを取得する o -

ユーティリティ

プラグイン名 内容 IRC Discord
CreBotHelp クリエイターズネットワークの IRC ボットとしてのヘルプを表示する o o
ServerConnectionReport IRC サーバの接続状態の変化を報告する o -
Part チャンネルからの退出 o -
KickBack RGRB が KICK されたとき、そのチャンネルに再度 JOIN する o -
Invite RGRB が INVITE されたとき、そのチャンネルに JOIN する o -
Jihou 毎日決まった時刻になった時、チャンネルに通知する o x
Ctcp CTCP メッセージを受信した時、適切な応答を返す o -

IRC ボットの起動

IRC ボットを起動するには、以下を実行してください。Ctrl + C を押すと終了します。

cd /path/to/rgrb
bin/rgrb-ircbot

-c--config)オプションで、使用する設定を指定することができます。その場合、-c に続けて設定 ID を書きます。

cd /path/to/rgrb
bin/rgrb-ircbot -c test # /path/to/rgrb/config/test.yaml を使用する場合

systemd による制御を行なう場合は systemd を参照してください。

Discord ボットの招待

招待リンク

上のリンクをクリックすることで、Discord ボットを、ご自身が管理者になっている Discord サーバに招待することが出来ます。 この場合、ご自身のコンピュータ上で RGRB をインストールしたり、RGRB を起動したりする必要はありません。

Discord ボットの起動

(ToDo: 増補)

開発者向けドキュメントの生成

YARD を利用してライブラリのドキュメントを doc/ 以下に生成することができます。以下を実行してください。

cd /path/to/rgrb
rake yard

仕様

  • IRC ボットに対して短い時間に大量のメッセージを送ると、応答が遅れます。これは IRC サーバの負荷調整に依るものです。

ToDo

連絡先

ご意見・ご要望・バグ報告等は、irc.cre.jp 系 IRC サーバ群の IRC チャンネル「#cre」や、GitHub リポジトリ上の「Issues」・「Pull Requests」にて承っております。お気軽にお寄せください。

ライセンス

MIT License日本語

制作

© 2014- クリエイターズネットワーク技術部

rgrb's People

Contributors

dependabot[bot] avatar koi-chan avatar ochaochaocha3 avatar raa0121 avatar risou avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rgrb's Issues

Part プラグインの追加

現在 LimeChat マクロで実装されているチャンネル退出コマンド .part.part-NICK を移植する。

UrlFetchTitle: 応答メッセージを分かりやすくする

プラグイン UrlFetchTitle の応答時、タイトルだけでなく、前後にタイトルを調べたのだということが分かるようなメッセージを挿入する。
可能ならそのメッセージは設定ファイルで定義できるようにしたい。

計算機機能を実装する

オンラインセッションでの利用を想定した計算機機能を実装する。

まずとりあえず使える程度に実装する。その後ダイスロール等を拡張して BCDice 等のように充実させていければ良いのかな、と。

rg:リファレンスの自動生成

各表の情報、使用例を解説するリファレンスを自動生成できるようにする。

YAML 形式のデータファイルに使用例を埋め込むことが必要。

rg:表の一覧表示

引ける表の一覧表示。

おそらく数が多いので、現在作成中のリファレンスページへのリンクを NOTICE するのが良さそう。

データベースに状態を保存できるようにする

OriginalCommand プラグインでやりかけているが、データベースに様々な情報を保存できるようにしたい。
OnlineSessionSearch や ServerConnectionReport をIRCコマンドから任意のチャンネルに使えるようにするなどの利用法もありそうですし、ランダムジェネレータのデッキ版(チャンネルごとに同じものを重複して引けないようにする)なども用意したいと思います。

キーワード引数の使用をやめる

  • Ruby 2.2 未満で遅い。
  • YARD のドキュメント生成でエラーが発生する。

ので、当分の間キーワード引数を使わないようにしてみる。

rg: データファイル追加

次のデータファイルを追加する。

  • mah-jongg-tile「麻雀牌から一つ選びます。」
  • hanafuda「花札から札を一つ選びます。」
  • alphabet「アルファベット26字から一つ選びます。」

IRCプロトコルにあわせたメッセージの自動切断

cinch の、IRCコマンドが長すぎた場合にちょうど良い長さで出力を切る機能は、2バイト文字だとうまく動作しない可能性がある。
以下の2つの動作を確認した。

  • IRCサーバー側から Request Too Long エラーによって強制切断される。
  • 途中で切断しても文字の途中で切断されて、最後の文字が化ける。

cinch自体の改良を行なうか、RGRB側でメッセージの自動調整機能を実装したい。

rg: 偏りテストの条件緩和

確率分布の条件が厳しすぎてテストが落ちる回数が多いので、条件を緩和する。出る値がすべて同じか、そうでないかくらいでも良さそう。

ServerConnectionReport: ほかのデーモンへの対応

プラグイン ServerConnectionReport は、ngIRCd の仕様に依存している。
他のデーモンに移行すると、 &SERVER チャンネルでログが流されなくなるので、プラグインが動作しなくなる。
それぞれに依存するコードを用意しなければならないかもしれないが、少なくともCREで使うデーモンには対応できるよう、対策しなければならない。

rg: 循環参照エラーの実装見直し

プラグイン Randam Generator の循環参照エラーの実装を変更したい。
方策としては以下の3つがある。

  1. 最初の数回のエラーは無視し、ある決まった回数以上起こった場合にエラーとして処理を中断する
  2. 循環参照エラーが発生した場合、他のテーブルを参照しないテーブルを参照し直す
  3. 循環参照エラーが発生した場合、エラーが発生しない同じテーブルの違う項目を選択し直す

理想としては、データファイルで項目を定義するとき、他のテーブルを参照するものと参照しないもので別のBodyとして定義する、というものであると思われる。
しかし、それは200前後に及ぶデータファイル全てを書き換えなければならないため非現実的であると言わざるを得ない。
よって、「とりあえず動く」状態に実装し直した後、余裕があれば書き換えていくものがいいと思われる。

rg: データファイル読み込みの例外処理

プラグイン Randam Generator において、データファイルに何らかのエラーが発生した時、起動が中断される。
また、どのデータファイルでエラーが発生したのかがログからは分からない。
そのため、以下の対策を講じたい。

  1. 読み込みエラーを例外としてキャッチする
  2. エラーが発生してもほかの正常なデータファイルだけで起動を続行する
  3. 異常が起きたデータファイルの名前を標準エラー出力に流す

定数を格納するモジュールを作る?

例えば DiceRoll で使われている定数を他のプラグインで使いたいとき、現在は DiceRoll モジュール直下で定数が宣言されているため、include しにくい。プラグインのモジュールの下に Const のような名前のモジュールを作って、その中で定義する方が使いやすくなるかもしれない。

現在:

module RGRB
  module Plugin
    module DiceRoll
      # アラビア数字による数を表す正規表現
      NUM_RE = /[1-9]/
      NUMS_RE = /[1-9]\d*/
      # ひらがなによる数を表す正規表現
      KANA_NUM_RE = /[あかさたなはまやら]/
      KANA_NUMS_RE = /[あかさたなはまやら][あかさたなはまやらわ]*/
    end
  end
end

案:

module RGRB
  module Plugin
    module DiceRoll
      module Const
        # アラビア数字による数を表す正規表現
        NUM_RE = /[1-9]/
        NUMS_RE = /[1-9]\d*/
        # ひらがなによる数を表す正規表現
        KANA_NUM_RE = /[あかさたなはまやら]/
        KANA_NUMS_RE = /[あかさたなはまやら][あかさたなはまやらわ]*/
      end
    end
  end
end

コマンド応答をコンソールへ出力する

IRCへの何らかの応答をした場合、その内容を標準出力または標準エラー出力に流すようにしたい。
現在のコマンドオプションには、出力をほとんど全てなくすか、cinchから出力されるメッセージをすべて出すかの2択しかない。

rg:表の公開・非公開

YAML の Access: public or private によって表を引くことができるかどうかを決める。private な表は引けないようにする。

UrlFetchTitle: HTTPレスポンスによる例外処理

プラグイン UrlFetchTitle において、ある程度のHTTPレスポンスを例外としてキャッチする。

例えば、
404・500エラーなどの場合、特別なメッセージを流す。
300などの転送系のエラーの場合、転送したことを知らせるメッセージを流す。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.