Skip to content

Commit

Permalink
.ons 実装、テスト実装
Browse files Browse the repository at this point in the history
refs #6
  • Loading branch information
ochaochaocha3 committed Feb 14, 2015
1 parent 0376846 commit 9b8fd14
Show file tree
Hide file tree
Showing 5 changed files with 345 additions and 24 deletions.
44 changes: 26 additions & 18 deletions lib/rgrb/plugin/online_session_search/generator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,21 @@
require 'open-uri'
require 'json'

require 'rgrb/plugin/online_session_search/session'

module RGRB
module Plugin
# オンラインセッション情報検索プラグイン
module OnlineSessionSearch
# OnlineSessionSearch の出力テキスト生成器
class Generator
# セッションマッチングシステム JSON 形式データの URL
SESSION_JSON_URL = 'http://session.trpg.net/json.php2'
# 情報取得に失敗したときのエラーメッセージ
GET_ERROR_MESSAGE = 'オンラインセッション情報の取得に失敗しました'
SESSION_JSON_URL = 'http://session.trpg.net/json.php'

def latest_schedules(n = 5)
url = "#{SESSION_JSON_URL}?n=#{n}"

begin
session_data = get_session_data(url)
rescue
[GET_ERROR_MESSAGE]
end
session_data_from(url)
end

def search(str, n = 5)
Expand All @@ -32,25 +28,37 @@ def search(str, n = 5)
}
url = "#{SESSION_JSON_URL}?#{URI.encode_www_form(params)}"

begin
session_data = get_session_data(url)
rescue
[GET_ERROR_MESSAGE]
end
session_data_from(url)
end

def get_session_data(url)
def session_data_from(url)
json = open(url, 'r:UTF-8') { |f| f.read }
parse(json)
sessions = Session.parse_json(json)
format(sessions)
end
private :get_session_data
private :session_data_from

def body(session_data)
if session_data.empty?
def format(sessions)
if sessions.empty?
['開催予定のセッションは見つかりませんでしたの☆']
else
sessions.map do |session|
n_members_str =
(session.min_members == session.max_members) ?
"#{session.max_members}人" :
"#{session.min_members}-#{session.max_members}人"
params = [
session.start_time.strftime('%F %R'),
n_members_str,
session.url
]

"#{session.game_system} / #{session.name} " \
"(#{params.join('; ')})"
end
end
end
private :format
end
end
end
Expand Down
25 changes: 19 additions & 6 deletions lib/rgrb/plugin/online_session_search/irc_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@ class IrcAdapter

# セッションマッチングシステムの URL
SESSION_URL = 'http://session.trpg.net/'

# 一覧の URL を提示するメッセージ
LIST_MESSAGE = "一覧は #{SESSION_URL} からどうぞ♪"
# 情報取得に失敗したときのエラーメッセージ
GET_ERROR_MESSAGE = 'オンラインセッション情報の取得に失敗しました'

set(plugin_name: 'OnlineSessionSearch')
match(/ons\s*$/, method: :latest_schedules)
Expand All @@ -31,9 +34,14 @@ def latest_schedules(m)
)
m.target.send(LIST_MESSAGE, true)

messages = @generator.latest_schedules(5)
messages.each do |s|
m.target.send(s, true)
begin
messages = @generator.latest_schedules(5)
messages.each do |s|
m.target.send(s, true)
end
rescue => e
bot.loggers.exception(e)
m.target.send(GET_ERROR_MESSAGE, true)
end
end

Expand All @@ -43,9 +51,14 @@ def search(m, str)
)
m.target.send(LIST_MESSAGE, true)

messages = @generator.search(str, 5)
messages.each do |s|
m.target.send(s, true)
begin
messages = @generator.search(str, 5)
messages.each do |s|
m.target.send(s, true)
end
rescue => e
bot.loggers.exception(e)
m.target.send(GET_ERROR_MESSAGE, true)
end
end
end
Expand Down
90 changes: 90 additions & 0 deletions lib/rgrb/plugin/online_session_search/session.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# vim: fileencoding=utf-8

require 'json'
require 'time'

module RGRB
module Plugin
module OnlineSessionSearch
class Session
# ID
# @return [Integer]
attr_reader :id
# セッション情報の URL
# @return [String]
attr_reader :url
# セッション名
# @return [String]
attr_reader :name
# ゲームシステム名
# @return [String]
attr_reader :game_system
# 開始日時
# @return [Time]
attr_reader :start_time
# 最低人数
# @return [Integer]
attr_reader :min_members
# 最高人数
# @return [Integer]
attr_reader :max_members
# アカウント
# @return [String]
attr_reader :account
# ユーザー名
# @return [String]
attr_reader :user_name
# Twitter 画像 URL
# @return [String]
attr_reader :twitter_image_url

# JSON からセッション情報へ変換する
#
# 入力される JSON はセッション情報の配列と仮定している
#
# @return [Array<OnlineSessionSearch::Session>]
def self.parse_json(json)
sessions = JSON.parse(json)
sessions.map do |data|
new(
id: data['SID'].to_i,
url: data['url'],
name: data['SesName'],
game_system: data['SysName'],
start_time: Time.parse("#{data['StartTime']} +0900"),
min_members: data['MinMembers'].to_i,
max_members: data['MaxMembers'].to_i,
account: data['account'],
user_name: data['username'],
twitter_image_url: data['twitterimage']
)
end
end

def initialize(
id: 0,
url: '',
name: '',
game_system: '',
start_time: Time.now,
min_members: 0,
max_members: 1,
account: '',
user_name: '',
twitter_image_url: ''
)
@id = id
@url = url
@name = name
@game_system = game_system
@start_time = start_time
@min_members = min_members
@max_members = max_members
@account = account
@user_name = user_name
@twitter_image_url = twitter_image_url
end
end
end
end
end
84 changes: 84 additions & 0 deletions spec/rgrb/plugin/online_session_search/generator_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# vim: fileencoding=utf-8

require_relative '../../../spec_helper'
require 'rgrb/plugin/online_session_search/generator'
require 'rgrb/plugin/online_session_search/session'

describe RGRB::Plugin::OnlineSessionSearch::Generator do
let(:generator) { described_class.new }

shared_examples 'a session' do
let(:session) do
described_class.new(
id: id,
url: url,
name: name,
game_system: game_system,
start_time: start_time,
min_members: min_members,
max_members: max_members,
account: account,
user_name: user_name,
twitter_image_url: twitter_image_url
)
end
end

describe '#format (private)' do
shared_examples 'a session' do
subject { generator.send(:format, [session]) }
it { should eq([expected_message]) }
end

context 'セッション情報が見つからなかったとき' do
let(:expected_message) { '開催予定のセッションは見つかりませんでしたの☆' }

subject { generator.send(:format, []) }
it { should eq([expected_message]) }
end

context 'セッション 1' do
include_examples 'a session' do
let(:session) do
RGRB::Plugin::OnlineSessionSearch::Session.new(
id: 9999,
url: 'http://session.trpg.net/9999',
name: 'セッション 1',
game_system: 'ソードワールド2.0',
start_time: Time.new(2015, 1, 23, 4, 56, 43, '+09:00'),
min_members: 3,
max_members: 4,
account: '@foo',
user_name: 'Foo',
twitter_image_url: 'http://example.net/foo.png'
)
end
let(:expected_message) do
'ソードワールド2.0 / セッション 1 (2015-01-23 04:56; 3-4人; http://session.trpg.net/9999)'
end
end
end

context 'セッション 2' do
include_examples 'a session' do
let(:session) do
RGRB::Plugin::OnlineSessionSearch::Session.new(
id: 99999,
url: 'http://session.trpg.net/99999',
name: 'セッション 2',
game_system: 'エリュシオン',
start_time: Time.new(2015, 2, 10, 23, 59, 59, '+09:00'),
min_members: 5,
max_members: 5,
account: '@bar',
user_name: 'Bar',
twitter_image_url: 'http://example.org/bar.png'
)
end
let(:expected_message) do
'エリュシオン / セッション 2 (2015-02-10 23:59; 5人; http://session.trpg.net/99999)'
end
end
end
end
end
Loading

0 comments on commit 9b8fd14

Please sign in to comment.