meshchat 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: