Giter Club home page Giter Club logo

bcdice-irc's Introduction

BCDice

Action Status Gem Version YARD codecov Discord

様々なTRPGシステムの判定に対応したオンセツール用ダイスコマンドエンジン

Documents

バグ報告や機能要望

BCDiceの問題を発見したり、機能の要望がある時に起こすアクションの一例は以下のようなものがあります。

  1. Discordの BCDice Offcial Chat にある各種チャンネルへ投稿する (迷ったらここ!)
  2. Twitterで @ysakasin にメンションを送る
  3. 問い合わせフォームから問い合わせる
  4. GitHubの issue や Pull Request を作成する (GitとGitHubがわかる人向け)

Quick Start

require "bcdice"
require "bcdice/game_system" # 全ゲームシステムをロードする

cthulhu7th = BCDice.game_system_class("Cthulhu7th")
result = cthulhu7th.eval("CC<=25") #=> #<BCDice::Result>
result.text      #=> "(1D100<=25) ボーナス・ペナルティダイス[0] > 1 > 1 > クリティカル"
result.success?  #=> true
result.critical? #=> true
require "bcdice"
require "bcdice/user_defined_dice_table"

text = <<~TEXT
  飲み物表
  1D6
  1:水
  2:緑茶
  3:麦茶
  4:コーラ
  5:オレンジジュース
  6:選ばれし者の知的飲料
TEXT
result = BCDice::UserDefinedDiceTable.eval(text) #=> #<BCDice::Result>
result.text #=> "飲み物表(6) > 選ばれし者の知的飲料"

LICENSE

BSD 3-Clause License

bcdice-irc's People

Contributors

ochaochaocha3 avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

raa0121

bcdice-irc's Issues

PresetStore: ViewModelを作る

PresetStoreがモデルとして肥大化しすぎているため、イベントやプリセットの保存について可能なアクション、プリセットを削除できるかの判定をビューモデル(PresetStoreViewModel)に移す。

現在の状態をタイトルバーに表示する

接続済みなどの状態が分かりやすくなるように、タイトルバーに表示する。

  • disconnected: 「未接続 - BCDice」
  • connecting: 「接続中... - BCDice」
  • connected: 「hostname:port [ゲームシステム名] - BCDice」
    • ゲームシステムが変更されたときにも更新すること。
  • disconnecting: 「切断中... - BCDice」

文字コードを選択できるようにする

以下の文字コードを選択できるようにする(LimeChat2互換)。

文字コード 言語 RubyのEncodingクラス
UTF-8 Unicode UTF_8
CP1252 西欧言語 Windows_1252
ISO-8859-15 西欧言語 ISO_8859_15
ISO-2022-JP 日本語 ISO_2022_JP
Korean CP949 韓国語 CP949
Chinese GBK **語簡体字 GBK
Chinese GB18030 **語簡体字 GB18030
Chinese Big5 **語繁体字 Big5

READMEを書く

以下の内容を含むREADMEを書く。

  • 必須環境
    • Ruby >= 2.6(Bundlerのインストールが不要なように)
  • 動作に必要な準備
    • Rubyのインストール
    • bundle install
      • native-package-installerによって必要なパッケージは自動的にインストールされる。
  • 起動方法
    • Windows: exe/bcdice-irc-gui.rb を開く。
    • macOS/Linux: 端末で exe/bcdice-irc-gui.rb を実行する。
  • 接続方法
    • 画面左側の各欄でIRCサーバについて設定する。
    • 画面右側でゲームシステムを選択する。
    • 設定後、「接続」ボタンを押すと接続する。
    • 画面上部でプリセットの保存(更新)、削除が可能。
  • 接続後の操作
    • /INVITE ボットのニックネーム チャンネル で他のチャンネルに参加させることができる。
      • 例:/INVITE BCDice #Dice_Test
    • マスターコマンド:旧READMEを参考にして一覧する。
  • 今後の予定
    • v1では広く配布することを目的としない。BCDice本体からこのプログラムを段階的に移動できるようにすることを目的とする。
    • v2では、GUI部分をGoで実装し直して、シングルバイナリ化することを目指す。そのために、BCDiceを含むRuby部分とGUI部分との通信方法を設計し、実装する。

カード機能を実装する

関連:bcdice/BCDice#210

  • カード機能のテストを追加する。
    • 特定のユーザ宛のメッセージを識別できるようにする。
  • ゲームシステム変更時のデッキ初期化を実装する。
    • カオスフレア
    • バルナ・クロニカ

入れ子クラスを外に出す

クラスの中に別ファイルでクラスを作るのは、ファイルの読み込み順が問題になる、また階層が深くなりがちなどで不便。以下のように外に出す。

  • IRCBot::Config(irc_bot/config.rb)→ IRCBotConfig(irc_bot_config.rb)
  • IRCBot::EncodingInfo(irc_bot/encoding.rb)→ EncodingInfo(encoding_info.rb)
    • IRCBot::AVAILABLE_ENCODINGS → AVAILABLE_ENCODINGS
  • IRCBot::MessageSink(irc_bot/message_sink.rb)→ IRCMessageSink(irc_message_sink.rb)
  • IRCBot::Plugin::DiceCommand(irc_bot/plugin/dice_command.rb)→ IRCBotPlugin::DiceCommand(irc_bot_plugin/dice_command.rb)
  • IRCBot::Plugin::IRCChannel(irc_bot/plugin/irc_channel.rb)→ IRCBotPlugin::IRCChannel(irc_bot_plugin/irc_channel.rb)
  • IRCBot::Plugin::MasterCommand(irc_bot/plugin/master_command.rb)→ IRCBotPlugin::MasterCommand(irc_bot_plugin/master_command.rb)
  • IRCBot::PluginConfig(irc_bot/plugin_config.rb)→ IRCBotPluginConfig(irc_bot_plugin_config.rb)

マスターコマンド、ヘルプコマンドを移植する

関連: bcdice/BCDice#211

以下をBCDiceから移す。

  • MasterCommand
    • Set Master
    • Set Game
    • Set Viewmode
    • Set Upper
    • Set Reroll
    • Set Sort
    • Set CardPlace
    • Set ShortSpell(機能していないので完全に削除する)
    • Set Tap
    • Set CardSet(テストデータがなくテストできないので、一旦削除する)
    • Mode(移植時は bcdice/BCDice#179 も考慮すること)
  • HelpCommand(新しく作る)
    • help
    • c-help(移植時は CardTrader#printCardHelp を使わないようにする)

マスターコマンドのテストを書く

  • チャンネルメッセージに反応しない
  • ゲームシステム変更
    • クトゥルフ
    • 存在しないゲームシステム
  • Set Master
    • ニックネーム指定なし(マスター設定)
    • ニックネーム指定なし(マスター解除)
    • ニックネーム指定あり
    • ニックネーム指定なし(他人がマスターのとき、マスターを確認する)
  • Set Upper
    • 上方無限ロールの閾値設定(5)
    • 上方無限ロールの閾値設定解除(0)
  • Set Reroll
    • 個数振り足しロールの回数制限(100)
    • 個数振り足しロールの回数制限解除(0)
  • Set Sort
    • ソートあり
    • ソートなし
  • Set ViewMode
    • マスター未設定時に設定可能
    • マスターが自分のときに設定可能
    • マスターが他人のときに設定不可能
  • Set CardPlace
    • マスター未設定時にカード置き場ありに設定可能
    • マスター未設定時にカード置き場なしに設定可能
    • マスターが自分のときにカード置き場ありに設定可能
    • マスターが他人のときに設定不可能
  • Set Tap
    • マスター未設定時にタップありに設定可能
    • マスター未設定時にタップなしに設定可能
    • マスターが自分のときにタップありに設定可能
    • マスターが他人のときに設定不可能
  • help
  • c-help
  • mode
    • マスター未設定時にモード確認可能
    • マスターが自分のときにモード確認可能
    • マスターが他人のときにモード確認不可能

接続試行を強制切断できるようにする

JOINに失敗した場合など、接続がうまくいかないと操作できなくなってしまう。そこで、接続試行を強制停止できるようにする。

  • タイムアウトによる切断
  • タイムアウト秒の設定機能
  • ボタン操作による切断

シグナルハンドラを別のモジュールに移す

現在はシグナルハンドラがすべてアプリケーションのクラスに書かれているため、クラスが長くなって探しにくい。そこで、BCDiceIRC::GUI::SignalHandlersモジュールを作って、そちらにシグナルハンドラを移す。また、Gladeのファイル内でシグナルハンドラ名を宣言するのをやめて、自分でconnectするように変える。

PresetStore: イベントを整備する

PresetStoreをObservableとして整備して、以下のイベントに対する処理を登録できるようにしたい。

  • preset_load(config, index): プリセットを選択して読み込んだときに発生する。
    • load_by_index(index)load_by_name(name) で読み込むと呼ばれる。
  • preset_append(config, index): プリセットを追加したときに発生する。
    • push(config) で、新しい名前のプリセットを追加すると呼ばれる。
  • preset_update(config, index): プリセットを更新したときに発生する。
    • push(config) で、既に登録されている名前のプリセットを追加すると呼ばれる。
  • preset_delete(index): プリセットを削除したときに発生する。
    • delete(name) でプリセットを削除すると呼ばれる。

プリセットの読み込み、保存、削除

プリセットを読み込み、保存/更新、削除できるようにする。

プリセットの読み込み

  • 起動時に、最後に選択されたプリセットを読み込む。
  • コンボボックスからプリセットが選択されると、
    • そのプリセットの値をウィジェットに入力し、ステータスバーに「プリセット「<名前>」を読み込みました」と表示する。
    • 最後に選択されたプリセットの番号を更新する。

プリセットの保存/更新

以下、プリセットの追加を「保存」、既存のプリセットの値の変更を「更新」と書く。

  • プリセット名の入力
    • 1. 既存のプリセットと同じ名前が入力された場合、ボタンのラベルは「更新」、押せるようにする。
      • 空扱いの場合でも、押せるようにしないと既存のプリセットを更新できなくなってしまう。
    • 2. プリセット名が空(ActiveSupportの blank? 相当:/\A[[:space:]]*\z/)の場合、ボタンのラベルは「保存」、押せないようにする。
    • 3. 新しいプリセット名が入力された場合、ボタンのラベルは「保存」、押せるようにする。
  • 「保存/更新」を押すと、PresetStoreにプリセットを記録する。
    • 「保存」の場合、プリセット集の最後に新しいプリセットを追加する。
    • 「更新」の場合、プリセット集の既存の項目の値を変更する。
  • プリセット記録後、プリセットコンボボックスの項目を更新する。
    • 「保存」の場合
      • コンボボックスの最後に新しいプリセットの項目を追加する。
      • 追加した項目をアクティブにする。
        • その際、通常のプリセット選択時とは異なり、各欄を更新しない。
    • 「更新」の場合
      • コンボボックスには新しい項目を追加しない。
      • 更新した項目をアクティブにする。
        • その際、通常のプリセット選択時とは異なり、各欄を更新しない。
  • 保存後、ステータスバーに以下のいずれかを表示する:
    • 新しい名前の場合:「プリセット「<名前>」を保存しました」と表示する。
    • 既存のプリセットと同じ名前の場合:「プリセット「<名前>」を更新しました」と表示する。

プリセットの削除

  • プリセット名の入力
    • 1. 保存されたプリセットが1つ以下の場合は、削除ボタンを押せない。
    • 2. プリセットが選択された場合、削除ボタンを押せる。
    • 3. 既存のプリセットと同じ名前が入力された場合、削除ボタンを押せる。
    • 4. 新しいプリセット名が入力された場合、削除ボタンを押せない。
  • 削除ボタンを押すとプリセットを削除する。
    • PresetStoreから指定された名前のプリセットを削除する。
    • コンボボックスのプリセット名を空にする。
    • 削除ボタンを押せなくする。
    • PresetStore#last_selected_index を-1に設定し、コンボボックスのアクティブ番号にも反映する。
    • ステータスバーに「プリセット「名前」を削除しました」と表示する。

YAMLファイルへの保存

保存先:config/presets.yaml

  • 最後に選択されたプリセットの番号を更新した際、YAMLファイルへ保存する。
  • プリセットを保存/更新した際、YAMLファイルへ保存する。
  • プリセットを削除した際、YAMLファイルへ保存する。
  • YAMLファイルへプリセット情報を保存できなかった場合、ステータスバーで「プリセット設定ファイルの保存に失敗しました」と表示する。

状態変化への対応

  • 未接続時以外は、プリセットコンボボックス、保存ボタン、削除ボタンをすべて反応しないようにする。

PresetStore: 一時的なプリセット名を設定可能にする

プリセットコンボボックスに入力された設定名(temporary_preset_name)をPresetStoreに設定可能にする。そして、プリセットの保存について実行可能なアクション(preset_save_action)、プリセットの削除が可能かどうか(preset_deletablity)をPresetStoreが判断する。これらが変化したときに、対応するイベント(preset_save_action_updated、preset_deletablity_updated)を発生させる。

イベント

  • preset_save_action_updated(action)
  • preset_deletability_updated(can_delete_preset)

Mediator: 例外を捕捉してログに残す

Mediatorのスレッドが落ちると様々な反応がなくなってしまうので、それを防ぐためにスレッドの処理において例外を捕捉して、ログに残すようにする。

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.