meshchat 0.12.0 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 677204be2321055039fb7d40db56bf98240b65c5
4
- data.tar.gz: 7183a0315be9faa2f4730c3a6f3c5d718ae184b6
3
+ metadata.gz: 56aa2cb171ad17cc1b7d19162c0bf720af173103
4
+ data.tar.gz: 6da9f9913dcd1b4cc59a7934582b77836c01bdf7
5
5
  SHA512:
6
- metadata.gz: cdf0dfc6e780ce78e04f0986ea82c895e3ced5a76ef0e69184e655aa5d2e3d411a5a53505fdc5f127d3e1820c75f053f15c72fd928eb8f6c23badc5fb1da3853
7
- data.tar.gz: 78e642349854b82423d953819e49f326046b5096f3c876611acdc12e1e5584cd98ae1c62d886f044867bf8176f4d247d88621dc009ed2467a54683ad9cdcdd1a
6
+ metadata.gz: 9422fdcb2ad7a3b3ab943a9c37ba3a9af90e0c16da7c65c9db51eacab1c36360c7b5e0d6a77e1f991f94b94c6cf947dd79ea66cfd56fba70a32d8e0e49970911
7
+ data.tar.gz: af6d8c3895ae4659a9c0485296efc7078efacbb22f795c62960ae7cec0fd3e2332242433b37de97a91b8e12e4ea821c3592822209599337139dd223fab06ef2e
@@ -73,7 +73,8 @@ module Meshchat
73
73
  input_receiver = Ui::CLI.new(
74
74
  message_dispatcher,
75
75
  message_dispatcher._message_factory,
76
- display)
76
+ display
77
+ )
77
78
 
78
79
  # by default the app_config[:input] is
79
80
  # Meshchat::Cli::KeyboardLineInput
@@ -31,6 +31,14 @@ module Meshchat
31
31
  Display.debug('Subscribed to relay...')
32
32
  end
33
33
 
34
+ def connected_to_relay
35
+ Display.debug('Connected to relay...')
36
+ end
37
+
38
+ def disconnected_from_relay
39
+ Display.debug('Disconnected from relay...')
40
+ end
41
+
34
42
  def received_message_from_relay(message, relay_url)
35
43
  Display.debug('RECEIVING on RELAY: ' + relay_url)
36
44
  Display.debug('RECEIVING on RELAY: ')
@@ -11,7 +11,8 @@ module Meshchat
11
11
  @_message_processor = MessageProcessor.new(
12
12
  network: network,
13
13
  message_dispatcher: message_dispatcher,
14
- location: location)
14
+ location: location
15
+ )
15
16
  end
16
17
 
17
18
  # @param [String] request_body - the encrypted message as a json string
@@ -39,7 +39,8 @@ module Meshchat
39
39
  head: {
40
40
  'Accept' => 'application/json',
41
41
  'Content-Type' => 'application/json'
42
- })
42
+ }
43
+ )
43
44
 
44
45
  http.errback &error_callback
45
46
  # example things available in the callback
@@ -19,7 +19,8 @@ module Meshchat
19
19
  @_message_dispatcher = message_dispatcher
20
20
  @_request_processor = Incoming::RequestProcessor.new(
21
21
  network: NETWORK_LOCAL,
22
- message_dispatcher: message_dispatcher)
22
+ message_dispatcher: message_dispatcher
23
+ )
23
24
  end
24
25
 
25
26
  def process_http_request
@@ -25,7 +25,8 @@ module Meshchat
25
25
  sender: {},
26
26
  payload: {},
27
27
  message_dispatcher: nil,
28
- message_factory: nil)
28
+ message_factory: nil
29
+ )
29
30
 
30
31
  if payload.present?
31
32
  @payload = payload.deep_stringify_keys
@@ -48,11 +48,13 @@ module Meshchat
48
48
 
49
49
  we_only_have_message = _message_factory.create(
50
50
  NODE_LIST_DIFF,
51
- data: { message: we_only_have })
51
+ data: { message: we_only_have }
52
+ )
52
53
 
53
54
  they_only_have_message = _message_factory.create(
54
55
  NODE_LIST_DIFF,
55
- data: { message: they_only_have })
56
+ data: { message: they_only_have }
57
+ )
56
58
 
57
59
  # give the sender our list
58
60
  _message_dispatcher.send_message(
@@ -66,7 +68,8 @@ module Meshchat
66
68
  Node.online.each do |node|
67
69
  _message_dispatcher.send_message(
68
70
  node: node,
69
- message: they_only_have_message)
71
+ message: they_only_have_message
72
+ )
70
73
  end
71
74
  end
72
75
  end
@@ -20,7 +20,8 @@ module Meshchat
20
20
 
21
21
  node_list = _message_factory.create(
22
22
  NODE_LIST,
23
- data: { message: Node.as_json })
23
+ data: { message: Node.as_json }
24
+ )
24
25
 
25
26
  _message_dispatcher.send_message(
26
27
  uid: payload['sender']['uid'],
@@ -11,7 +11,8 @@ module Meshchat
11
11
  payload: {},
12
12
  to: '',
13
13
  message_dispatcher: nil,
14
- message_factory: nil)
14
+ message_factory: nil
15
+ )
15
16
 
16
17
  super(
17
18
  message: message,
@@ -9,26 +9,33 @@ module Meshchat
9
9
  # https://github.com/NullVoxPopuli/mesh-relay/blob/master/app/channels/mesh_relay_channel.rb
10
10
  CHANNEL = 'MeshRelayChannel'
11
11
 
12
- attr_reader :_url, :_client, :_request_processor
12
+ attr_reader :_url, :_client, :_request_processor, :_message_queue
13
13
  attr_accessor :_connected
14
+
14
15
  delegate :perform, to: :_client
16
+ delegate :subscribed?, to: :_client
15
17
 
16
- def initialize(url, message_dispatcher, connected: nil)
18
+ def initialize(url, message_dispatcher, subscribed_callback = nil)
17
19
  @_url = url
20
+ @_message_queue = []
18
21
  @_request_processor = Incoming::RequestProcessor.new(
19
22
  network: NETWORK_RELAY,
20
23
  location: url,
21
- message_dispatcher: message_dispatcher)
24
+ message_dispatcher: message_dispatcher
25
+ )
22
26
 
23
- setup(connected: connected)
27
+ setup(subscribed_callback: subscribed_callback)
24
28
  end
25
29
 
26
- def setup(connected: nil)
30
+ def setup(subscribed_callback: nil)
27
31
  path = "#{_url}?uid=#{APP_CONFIG.user['uid']}"
28
32
  @_client = ActionCableClient.new(path, CHANNEL)
29
33
 
30
34
  # don't output anything upon connecting
31
- _client.connected { self._connected = true }
35
+ _client.connected do
36
+ Debug.connected_to_relay
37
+ self._connected = true
38
+ end
32
39
 
33
40
  # If there are errors, report them!
34
41
  _client.errored do |message|
@@ -37,7 +44,7 @@ module Meshchat
37
44
 
38
45
  _client.subscribed do
39
46
  Debug.subscribed_to_relay
40
- connected.call if connected
47
+ subscribed_callback.call if subscribed_callback
41
48
  end
42
49
 
43
50
  # forward the encrypted messages to our RequestProcessor
@@ -47,12 +54,17 @@ module Meshchat
47
54
  end
48
55
 
49
56
  _client.disconnected do
57
+ Debug.disconnected_from_relay
50
58
  self._connected = false
51
59
  end
52
60
 
53
61
  _client
54
62
  end
55
63
 
64
+ def send_now(payload)
65
+ _client.perform('chat', payload)
66
+ end
67
+
56
68
  def connected?
57
69
  _connected
58
70
  end
@@ -8,44 +8,71 @@ module Meshchat
8
8
  CHANNEL = 'MeshRelayChannel'
9
9
 
10
10
  attr_accessor :_message_dispatcher
11
- attr_accessor :_active_relay
11
+ attr_accessor :_active_relay, :_waiting_for_subscription
12
12
  attr_accessor :_known_relays, :_available_relays
13
+ attr_accessor :_message_queue
13
14
 
14
15
  def initialize(message_dispatcher)
15
16
  @_message_dispatcher = message_dispatcher
16
17
  @_known_relays = APP_CONFIG.user['relays'] || []
17
18
  @_available_relays = APP_CONFIG.user['relays'] || []
19
+ @_message_queue = []
18
20
 
19
21
  find_initial_relay if @_known_relays.present?
22
+
23
+ EM.add_periodic_timer(5) { ensure_relay }
20
24
  end
21
25
 
22
26
  # TODO: add logic for just selecting the first available relay.
23
27
  # we only need one connection.
24
28
  # @return [Array] an array of action cable clients
25
- def find_initial_relay(connected: nil)
29
+ def find_initial_relay
26
30
  url = _known_relays.first
27
- @_active_relay = Relay.new(
28
- url, _message_dispatcher,
29
- connected: connected)
31
+ self._waiting_for_subscription = true
32
+ @_active_relay = Relay.new(url, _message_dispatcher, lambda do
33
+ self._waiting_for_subscription = false
34
+ deplete_queue
35
+ end)
30
36
  end
31
37
 
32
38
  # @param [Hash] payload - the message payload
33
39
  def send_payload(payload)
34
40
  return if _active_relay.blank?
41
+ _message_queue << payload
42
+ ensure_connection do
43
+ deplete_queue
44
+ end
45
+ end
35
46
 
36
- ensure_active_connection! do
37
- _active_relay.perform('chat', payload)
47
+ def deplete_queue
48
+ until _message_queue.empty?
49
+ if _active_relay.subscribed?
50
+ payload = _message_queue.pop
51
+ _active_relay.send_now(payload)
52
+ end
38
53
  end
39
54
  end
40
55
 
41
- def ensure_active_connection!(&block)
42
- # TODO: make action_cable_client return a boolean
43
- if !_active_relay.connected?
44
- find_initial_relay(connected: block)
45
- else
56
+ def ensure_connection
57
+ if _active_relay.connected? && _active_relay.subscribed?
46
58
  yield
59
+ else
60
+ # if the relay isn't already connected,
61
+ # it'll be built with a callback to deplete the queue
62
+ ensure_relay
47
63
  end
48
64
  end
65
+
66
+ def ensure_relay
67
+ return if _waiting_for_subscription
68
+ return if _active_relay.subscribed?
69
+ return if _active_relay.connected?
70
+
71
+ # clear the previous node
72
+ _active_relay = nil
73
+ # re-connect
74
+ find_initial_relay
75
+ end
49
76
  end
50
77
  end
51
78
  end
@@ -57,7 +57,8 @@ module Meshchat
57
57
 
58
58
  def whisper_for_locked_target(input)
59
59
  command = Command::Whisper.new(
60
- input, _message_dispatcher, _message_factory, self)
60
+ input, _message_dispatcher, _message_factory, self
61
+ )
61
62
 
62
63
  command._target_node = _whisper_lock_target
63
64
  command
@@ -13,7 +13,6 @@ module Meshchat
13
13
  end
14
14
 
15
15
  module Handler
16
-
17
16
  def initialize
18
17
  Readline.callback_handler_install('> ') do |line|
19
18
  EventMachine.next_tick { handle_input(line) }
@@ -46,23 +45,18 @@ module Meshchat
46
45
  def callback_on_next_tick=(callback)
47
46
  @callback = callback
48
47
  end
49
-
50
48
  end
51
49
 
52
50
  class << self
53
51
  def autocompletes
54
52
  commands = Meshchat::Ui::Command::COMMAND_MAP.map { |k, _v| "/#{k}" }
55
- aliases = Meshchat::Node.all.map { |n| "#{n.alias_name}" }
53
+ aliases = Meshchat::Node.all.map { |n| n.alias_name.to_s }
56
54
  commands + aliases
57
55
  end
58
56
 
59
- def input_handler
60
- @input_handler
61
- end
57
+ attr_reader :input_handler
62
58
 
63
- def input_handler=(handler)
64
- @input_handler = handler
65
- end
59
+ attr_writer :input_handler
66
60
  end
67
61
 
68
62
  def start
@@ -77,7 +71,6 @@ module Meshchat
77
71
  Readline.completion_proc = completion
78
72
  end
79
73
 
80
-
81
74
  # def initialize(*args)
82
75
  # super(args)
83
76
  #
@@ -92,7 +85,6 @@ module Meshchat
92
85
  #
93
86
  # Readline.readline('> ', true)
94
87
  # end
95
-
96
88
  end
97
89
  end
98
90
  end
@@ -10,7 +10,7 @@ module Meshchat
10
10
  def handle
11
11
  Meshchat::Ui::Command::COMMAND_MAP.each do |key, klass|
12
12
  if klass.respond_to?(:description)
13
- line = "/%-18s %s" % [key, klass.description ]
13
+ line = '/%-18s %s' % [key, klass.description]
14
14
  Display.info line
15
15
  end
16
16
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Meshchat
2
3
  module Ui
3
4
  module Command
@@ -7,11 +8,9 @@ module Meshchat
7
8
  def find_by_target(string, &block)
8
9
  search_key = string.start_with?('#') ? :uid : :alias_name
9
10
  nodes = Node.where(search_key => string)
10
- if nodes.length == 0
11
- return Display.warning('No node by: ' + string)
12
- end
11
+ return Display.warning('No node by: ' + string) if nodes.empty?
13
12
 
14
- return block.call(nodes.first) if nodes.length == 1
13
+ return yield(nodes.first) if nodes.length == 1
15
14
 
16
15
  Display.warning I18n.t('node.multiple_with_alias', name: string)
17
16
  ask_for_specification(nodes, block)
@@ -21,7 +20,6 @@ module Meshchat
21
20
  # there are now more than 1 nodes
22
21
  display_nodes(nodes)
23
22
 
24
-
25
23
  # insert a callback into the input handler to run the next
26
24
  # time a line is received
27
25
  #
@@ -48,7 +46,7 @@ module Meshchat
48
46
  alias_name = node.alias_name
49
47
  uid = node.uid[0..5]
50
48
  last_seen = node.updated_at&.strftime('%B %e, %Y %H:%M:%S') || 'never'
51
- line = "%-2s | %-15s %-8s %s" % [i, alias_name, uid, last_seen]
49
+ line = '%-2s | %-15s %-8s %s' % [i, alias_name, uid, last_seen]
52
50
  Display.info line
53
51
  end
54
52
  end
@@ -3,7 +3,7 @@ module Meshchat
3
3
  module Ui
4
4
  module Command
5
5
  class Roll < Command::Chat
6
- REGEX = /(\d+)d(\d+)(\+(\d+))?/
6
+ REGEX = /(\d+)d(\d+)(([+-])(\d+))?/
7
7
 
8
8
  def self.description
9
9
  'rolls a die in the XdY+Z format'
@@ -11,12 +11,11 @@ module Meshchat
11
11
 
12
12
  def initialize(input, message_dispatcher, message_factory, input_factory)
13
13
  super
14
- Display.debug input
15
14
  # input, X, Y, +Z, Z
16
- _, num, size, _, modifier = REGEX.match(input).to_a.map(&:to_i)
15
+ _, num, size, modifier, _operator, number = REGEX.match(input).to_a
17
16
 
18
- result = Array.new(num) { rand(size) + 1 }.inject(:+) + modifier
19
- @_input = "rolls #{num}d#{size}#{modifier != 0 ? "+#{modifier}" : ''} and gets #{result}"
17
+ result = Array.new(num.to_i) { rand(size.to_i) + 1 }.inject(:+) + modifier.to_i
18
+ @_input = "rolls #{num}d#{size}#{modifier != 0 ? modifier : ''} and gets #{result}"
20
19
  end
21
20
 
22
21
  def show_myself(message)
@@ -31,7 +31,8 @@ module Meshchat
31
31
  data: {
32
32
  message: message,
33
33
  to: target
34
- })
34
+ }
35
+ )
35
36
 
36
37
  Display.whisper m.display
37
38
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Meshchat
2
3
  module Ui
3
4
  module Notifier
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Meshchat
3
- VERSION = '0.12.0'
3
+ VERSION = '0.12.1'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meshchat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - L. Preston Sego III
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-12 00:00:00.000000000 Z
11
+ date: 2016-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - ">="
144
144
  - !ruby/object:Gem::Version
145
- version: 1.2.6
145
+ version: 1.3.2
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
- version: 1.2.6
152
+ version: 1.3.2
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: i18n
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -369,6 +369,6 @@ rubyforge_project:
369
369
  rubygems_version: 2.5.1
370
370
  signing_key:
371
371
  specification_version: 4
372
- summary: Meshchat-0.12.0
372
+ summary: Meshchat-0.12.1
373
373
  test_files: []
374
374
  has_rdoc: