Module: Narou::Input
- Defined in:
- lib/web/streaminginput.rb,
lib/input.rb
Overview
入力確認機能を WEB UI 用に差し替える
Constant Summary collapse
- TIMEOUT_FOR_PONG =
モーダルの生存確認を送って返答を待つ時間(s)
2
- @@modal_id =
0
- @@mutex =
Mutex.new
Class Method Summary collapse
-
.choose(title, message, choices) ⇒ Object
選択肢を表示して選択させる.
-
.confirm(message, default = false, nontty_default = true) ⇒ Object
肯定か否定かの確認を入力.
- .create_modal_id ⇒ Object
-
.request_show_modal_for_client(modal_name, send_data) ⇒ Object
クライアント(ブラウザ)にユーザ入力用のモーダルを表示要求する.
Class Method Details
.choose(title, message, choices) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/input.rb', line 49 def choose(title, , choices) default = choices[:default] || choices.first[0] return default unless $stdin.tty? puts title puts choices.each do |name, help| next if name == :default puts "<bold>#{name}</bold>: #{help}".termcolor end loop do print "> " input = $stdin.gets.strip.downcase if key = choices.keys.delete(input) return key end puts "選択肢の中にありません。もう一度入力して下さい" end end |
.confirm(message, default = false, nontty_default = true) ⇒ Object
肯定か否定かの確認を入力
default: エンターを押した場合に返ってくる値 nontty_default: pipe等から接続された場合に返ってくる値 @return: yes = true, no = false
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/input.rb', line 20 def confirm(, default = false, nontty_default = true) return nontty_default unless $stdin.tty? confirm_msg = "#{} (y/n)?: " print confirm_msg while input = $stdin.getch puts input case input.downcase when "y" return true when "n" return false else return default if input.strip == "" print confirm_msg end end end |
.create_modal_id ⇒ Object
21 22 23 24 25 26 27 28 |
# File 'lib/web/streaminginput.rb', line 21 def create_modal_id id = nil @@mutex.synchronize do id = @@modal_id @@modal_id += 1 end id end |
.request_show_modal_for_client(modal_name, send_data) ⇒ Object
クライアント(ブラウザ)にユーザ入力用のモーダルを表示要求する
返事がなかった場合は nil を返す
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/web/streaminginput.rb', line 35 def request_show_modal_for_client(modal_name, send_data) pushserver = PushServer.instance id = create_modal_id que = Queue.new ponged = true pong_event_id = "pong.modal.#{id}" answer_event_id = "answer.modal.#{id}" answer_handler = ->(value, connection) do if value.kind_of?(Hash) que.push(value["result"]) else que.push(nil) end end pong_handler = ->(value, connection) do ponged = true end pushserver.on(pong_event_id, &pong_handler) pushserver.on(answer_event_id, &answer_handler) th = Thread.new do while ponged ponged = false # クライアントにpingを飛ばしてモーダルの生存確認をする pushserver.send_all("ping.modal" => { id: id }) # クライアントからの受信確認を待つ sleep TIMEOUT_FOR_PONG end # 応答なし que.push(nil) end send_data[:id] = id pushserver.send_all(modal_name => send_data) result = que.pop th.kill pushserver.off(pong_event_id, &pong_handler) pushserver.off(answer_event_id, &answer_handler) pushserver.send_all("hide.modal" => { id: id }) result end |