Module: Narou::Input

Defined in:
lib/web/streaminginput.rb,
lib/input.rb

Overview

入力確認機能を WEB UI 用に差し替える

Constant Summary collapse

TIMEOUT_FOR_PONG =

モーダルの生存確認を送って返答を待つ時間(s)

2
0
@@mutex =
Mutex.new

Class Method Summary collapse

Class Method Details

.choose(title, message, choices) ⇒ Object

選択肢を表示して選択させる

choices: { 選択肢: 説明 } のハッシュ形式で渡す。選択出来ない状況(pipe等)の場合に返す

値は :default の要素を返す。:default がない場合は先頭の要素

@return: 選ばれた選択肢を返す

@example:

choices = { "ja" => "日本語", "en" => "English", default: "ja" }
Narou::Input.choose("Title: Select language", "Please select a language?", choices)


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, message, choices)
  default = choices[:default] || choices.first[0]
  return default unless $stdin.tty?
  puts title
  puts message
  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(message, default = false, nontty_default = true)
  return nontty_default unless $stdin.tty?
  confirm_msg = "#{message} (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_idObject



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