Skip to content

Commit

Permalink
discord: Trpg::Detatoko プラグインの Discord 版を実装
Browse files Browse the repository at this point in the history
  • Loading branch information
koi-chan committed Feb 20, 2019
1 parent 3823e0d commit fc2a58d
Show file tree
Hide file tree
Showing 4 changed files with 275 additions and 21 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ gem install mailcatcher
| ------------ | ---- | --- | ------- |
| [DiceRoll](doc/plugins/dice_roll.md) | ダイスロール | o | o |
| [RandomGenerator](doc/plugins/random_generator.md) | ランダムジェネレータ | o | o |
| [Trpg::Detatoko](doc/plugins/trpg/detatoko.md) | 「でたとこサーガ」専用のダイス・表引きコマンド | o | x |
| [Trpg::Detatoko](doc/plugins/trpg/detatoko.md) | 「でたとこサーガ」専用のダイス・表引きコマンド | o | o |
| [BCDice](doc/plugins/bcdice.md) | [ボーンズ&カーズ](https://github.com/torgtaitai/BCDice) のダイスコマンドを利用する | o | x |

#### 情報検索・引用
Expand All @@ -91,7 +91,7 @@ gem install mailcatcher
| ------------ | ---- | --- | ------- |
| [Keyword](doc/plugins/keyword.md) | キーワード検索 | o | o |
| [OnlineSessionSearch](doc/plugins/online_session_search.md) | [TRPG.NET セッションマッチングシステム](http://session.trpg.net/)から予定されているオンラインセッションの情報を検索する | o | x |
| [CreTwitterCitation](doc/plugins/cre_twitter_citation.md) | Twitter @cre_ne_jp の引用 | o | x |
| [CreTwitterCitation](doc/plugins/cre_twitter_citation.md) | Twitter @cre_ne_jp の引用 | o | - |
| [UrlFetchTitle](doc/plugins/url_fetch_title.md) | 発言された URL のページタイトルを取得する | o | - |

#### ユーティリティ
Expand Down
8 changes: 4 additions & 4 deletions lib/rgrb/plugin/random_generator/discord_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def initialize(*)
end

# NOTICE でジェネレート結果を返す
# @param [Cinch::Message] m メッセージ
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] tables_str 表のリスト
# @return [void]
def rg(m, tables_str)
Expand All @@ -57,7 +57,7 @@ def rg(m, tables_str)
end

# NOTICE で表の説明を返す
# @param [Cinch::Message] m メッセージ
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] tables_str 表のリスト
# @return [void]
def desc(m, tables_str)
Expand All @@ -77,7 +77,7 @@ def desc(m, tables_str)
end

# NOTICE で表の詳細な情報を返す
# @param [Cinch::Message] m メッセージ
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] tables_str 表のリスト
# @return [void]
def info(m, tables_str)
Expand All @@ -97,7 +97,7 @@ def info(m, tables_str)
end

# 表の名前を一覧する
# @param [Cinch::Message] m メッセージ
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @return [String]
def list(m)
log_incoming(m)
Expand Down
28 changes: 13 additions & 15 deletions lib/rgrb/plugin/trpg/detatoko/constants.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,19 @@ module RGRB
module Plugin
module Trpg
module Detatoko
class IrcAdapter
# スキルランクを表す正規表現
SR_RE = /(?:s|sr)(\d+)/
# 固定値での四則演算を表す正規表現
SOLID_RE = %r|([+*\-/])(\d+)|
# フラグを指定した時の正規表現
FLAG_RE = /@(\d+)/
# 1行キャラシ用IDを表す正規表現
LCSID_RE = /(\d+|title)/
LCSIDS_RE = /(#{LCSID_RE}(?: +#{LCSID_RE})*)/
# コマンドのパターンの最後を表す正規表現
END_RE = /(?:[\s ]|$)/
# スタンス系統にマッチする正規表現
STANCE_RE = /(?:#{Generator::STANCES.keys.join('|')}|全部|[・+\+])+/
end
# スキルランクを表す正規表現
SR_RE = /(?:s|sr)(\d+)/
# 固定値での四則演算を表す正規表現
SOLID_RE = %r|([+*\-/])(\d+)|
# フラグを指定した時の正規表現
FLAG_RE = /@(\d+)/
# 1行キャラシ用IDを表す正規表現
LCSID_RE = /(?:\d+|title)/
LCSIDS_RE = /(#{LCSID_RE}(?: +#{LCSID_RE})*)/
# コマンドのパターンの最後を表す正規表現
END_RE = /(?:[\s ]|$)/
# スタンス系統にマッチする正規表現
STANCE_RE = /(?:#{Generator::STANCES.keys.join('|')}|全部|[・+\+])+/
end
end
end
Expand Down
256 changes: 256 additions & 0 deletions lib/rgrb/plugin/trpg/detatoko/discord_adapter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
# vim: fileencoding=utf-8

require 'rgrb/discord_plugin'
require 'rgrb/plugin/trpg/detatoko/generator'
require 'rgrb/plugin/trpg/detatoko/constants'

module RGRB
module Plugin
module Trpg
module Detatoko
# Detatoko の Discord アダプター
class DiscordAdapter
include RGRB::DiscordPlugin

set(plugin_name: 'Trpg::Detatoko')
self.prefix = '.d'
prefix_ja = '。で'

match(/#{SR_RE}#{END_RE}/io, method: :skill_decision)
match(/#{SR_RE}#{SOLID_RE}#{END_RE}/io, method: :skill_decision)
match(/#{SR_RE}#{SOLID_RE}#{FLAG_RE}/io, method: :skill_decision)
match(/#{SR_RE}#{FLAG_RE}#{END_RE}/io, method: :skill_decision_flag)
match(/#{SR_RE}#{FLAG_RE}#{SOLID_RE}/io, method: :skill_decision_flag)

match(/(v|m|s|w)s/i, method: :stigma)
match(/(t|k)r/i, method: :stigma)

match(/(v|m|s|w)be/i, method: :badend)
match(/(t|k)b/i, method: :badend)

match(/stance[\s ]+(#{STANCE_RE})/io, method: :stance)

match(/(lb|d)g/i, method: :ground)

match(/c(?:[^s]|$)/i, method: :character_class)

match(/(|n|d)pp/i, method: :position)

match(/lt/i, method: :like_things)

match(/(lb|q)c/i, method: :chart)

match(/cs #{LCSIDS_RE}/io, method: :lcs)

match(/す([あかさたなはまやらわ]+)/i, method: :skill_decision_ja, :prefix => prefix_ja)
match(/(体|気)力烙印/i, method: :stigma, :prefix => prefix_ja)
match(/(体|気)力バッドエンド/i, method: :badend, :prefix => prefix_ja)
match(/スタンス[\s ]+(#{STANCE_RE})/io, method: :stance, :prefix => prefix_ja)
match(/(|悪への)ラスボス立場/i, method: :ground, :prefix => prefix_ja)
match(/クラス/i, method: :character_class, :prefix => prefix_ja)
match(/(|敵|悪)ポジション/i, method: :position, :prefix => prefix_ja)
match(/((?:趣味|苦手)|(?:好き|嫌い)なもの)/i, method: :like_things, :prefix => prefix_ja)
match(/(ラスボス|クエスト)チャート/i, method: :chart, :prefix => prefix_ja)

def initialize(*args)
super

@generator = Generator.new
@header = "でたとこサーガ "
end

# スキルランクから判定値を得る
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] skill_rank スキルランク
# @param [String] calc 判定値に四則演算を行なう場合の演算子
# @param [String] solid 四則演算を行なう場合の計算される数
# @param [String] flag 現在の PC のフラグ値
# @return [void]
def skill_decision(m, skill_rank, calc = '+', solid = 0, flag = 0)
log_incoming(m)
messages = @generator
.skill_decision(skill_rank.to_i, calc, solid.to_i, flag.to_i)
send_channel(m.channel, messages, "#{@header}[#{m.user.mention}]: ")
end

# skill_decision のフラグ先行コマンド用ラッパー
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] skill_rank スキルランク
# @param [String] flag 現在の PC のフラグ値
# @param [String] calc 判定値に四則演算を行なう場合の演算子
# @param [String] solid 四則演算を行なう場合の計算される数
# @return [void]
def skill_decision_flag(m, skill_rank, flag = 0, calc = '+', solid = 0)
log_incoming(m)
skill_decision(m, skill_rank, calc, solid, flag)
end

# skill_decision の日本語コマンド
# 日本語コマンドは四則演算はフラグ値を考慮しない
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] skill_rank_ja スキルランクの日本語形式
# @return [void]
def skill_decision_ja(m, skill_rank_ja)
log_incoming(m)
messages = @generator.skill_decision_ja(skill_rank_ja)
send_channel(m.channel, messages, "#{@header}[#{m.user.mention}]: ")
end

# 烙印(p.63)を得る
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] tcode 何の烙印か
# @return [void]
def stigma(m, tcode)
log_incoming(m)
tcode = type_tr(tcode)
header = "#{@header}[#{m.user.mention}]<#{type_conv(tcode)}力烙印>: "
message = @generator.stigma(tcode)
send_channel(m.channel, message, header)
end

# バッドエンド表(p.65)を振る
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] tcode 何のバッドエンド表か
# @return [void]
def badend(m, tcode)
log_incoming(m)
tcode = type_tr(tcode)
header = "#{@header}[#{m.user.mention}]<#{type_conv(tcode)}力バッドエンド>: "
message = @generator.badend(tcode)
send_channel(m.channel, message, header)
end

# スタンス表から引く
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] uses 選ぶ元となるスタンス
# @return [void]
def stance(m, uses)
log_incoming(m)
header = "#{@header}[#{m.user.mention}]<スタンス表>: "
message = @generator.stance(uses)
send_channel(m.channel, message, header)
end

# ラスボス立場表を引く
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] type 何のラスボス立場表か
# @return [void]
def ground(m, type)
log_incoming(m)
insert, type = case type
when 'lb', ''
['', :normal]
when 'd', '悪への'
['悪への', :dark]
end
header = "#{@header}[#{m.user.mention}]<#{insert}ラスボス立場>: "
message = @generator.ground(type)
send_channel(m.channel, message, header)
end

# クラスを1つ選ぶ
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @return [void]
def character_class(m)
log_incoming(m)
header = "#{@header}[#{m.user.mention}]<クラス>: "
message = @generator.character_class
send_channel(m.channel, message, header)
end

# ポジションを1つ選ぶ
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] type 何のポジションか
# @return [void]
def position(m, type)
log_incoming(m)
insert, type = case type
when ''
['PC', :pc]
when 'n', '敵'
['敵NPC', :npc]
when 'd', '悪'
['悪の', :dark]
end
header = "#{@header}[#{m.user.mention}]<#{insert}ポジション>: "
message = @generator.position(type)
send_channel(m.channel, message, header)
end

# 【好きなもの・趣味】/【苦手なもの・弱点】表を引く
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @return [void]
def like_things(m)
log_incoming(m)
header = "#{@header}[#{m.user.mention}]<趣味・弱点>: "
message = @generator.like_things
send_channel(m.channel, message, header)
end

# ラスボスチャート・クエストチャートを引く
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] type ラスボスか・クエストか
# @return [void]
def chart(m, type)
log_incoming(m)

insert, type = case type
when 'lb', 'ラスボス'
['ラスボス', :lastboss]
when 'q', 'クエスト'
['クエスト', :quest]
end

header = "#{@header}[#{m.user.mention}]<#{insert}チャート>: "
message = @generator.chart(type)
send_channel(m.channel, message, header)
end

# 1行のキャラクターシートを生成する
# @param [Discordrb::Events::MessageEvent] m メッセージ
# @param [String] ids_str キャラクターシートの ID (String 型)
# @return [void]
def lcs(m, ids_str)
log_incoming(m)

result = @generator.lcs(ids_str.split(' '))
messages = []

if(result[:errors].count != 0)
header = "#{@header}[#{m.user.mention}]<1行キャラクターシート>: "
messages << "#{header}#{result[:errors].count} 件のエラーが発生しました"
messages.concat(result[:errors].map {|line| "#{header}#{line}"})
end
messages.concat(result[:lcs])

send_channel(m.channel, messages)
end

private

# 体力・気力コードを対応する日本語に変換する
# @param [String/Symbol] tcode 体力・気力コード
# @return [String]
def type_conv(tcode)
case "#{tcode}"
when 'v'
'体'
when 'm'
'気'
end
end

# コマンドでの表記を内部での体力・気力のフラグに書き換える
# @param [String] code コマンドでの表記
# @return [Symbol]
def type_tr(code)
code.tr!('tk', 'vm')
code.tr!('sw', 'vm')
code.tr!('体気', 'vm')
code.to_sym
end
end
end
end
end
end

0 comments on commit fc2a58d

Please sign in to comment.