meshchat 0.8.0 → 0.10.0

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.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +39 -11
  3. data/lib/meshchat.rb +48 -42
  4. data/lib/meshchat/configuration.rb +14 -0
  5. data/lib/meshchat/configuration/app_config.rb +63 -0
  6. data/lib/meshchat/configuration/database.rb +41 -0
  7. data/lib/meshchat/{config → configuration}/hash_file.rb +7 -6
  8. data/lib/meshchat/configuration/identity.rb +79 -0
  9. data/lib/meshchat/{config → configuration}/settings.rb +22 -26
  10. data/lib/meshchat/debug.rb +69 -0
  11. data/lib/meshchat/encryption.rb +7 -2
  12. data/lib/meshchat/encryption/aes_rsa.rb +2 -1
  13. data/lib/meshchat/encryption/passthrough.rb +5 -3
  14. data/lib/meshchat/locale/en.yml +14 -0
  15. data/lib/meshchat/models/node.rb +140 -0
  16. data/lib/meshchat/network.rb +19 -0
  17. data/lib/meshchat/network/dispatcher.rb +83 -0
  18. data/lib/meshchat/network/errors.rb +11 -0
  19. data/lib/meshchat/network/incoming.rb +13 -0
  20. data/lib/meshchat/network/incoming/message_decryptor.rb +51 -0
  21. data/lib/meshchat/network/incoming/message_processor.rb +75 -0
  22. data/lib/meshchat/network/incoming/request_processor.rb +30 -0
  23. data/lib/meshchat/network/local.rb +12 -0
  24. data/lib/meshchat/network/local/connection.rb +58 -0
  25. data/lib/meshchat/network/local/server.rb +69 -0
  26. data/lib/meshchat/network/message.rb +34 -0
  27. data/lib/meshchat/network/message/base.rb +139 -0
  28. data/lib/meshchat/network/message/chat.rb +9 -0
  29. data/lib/meshchat/network/message/disconnect.rb +21 -0
  30. data/lib/meshchat/network/message/emote.rb +9 -0
  31. data/lib/meshchat/network/message/factory.rb +80 -0
  32. data/lib/meshchat/network/message/node_list.rb +75 -0
  33. data/lib/meshchat/network/message/node_list_diff.rb +18 -0
  34. data/lib/meshchat/network/message/node_list_hash.rb +32 -0
  35. data/lib/meshchat/network/message/ping.rb +31 -0
  36. data/lib/meshchat/network/message/ping_reply.rb +12 -0
  37. data/lib/meshchat/network/message/whisper.rb +28 -0
  38. data/lib/meshchat/network/remote.rb +13 -0
  39. data/lib/meshchat/network/remote/connection.rb +28 -0
  40. data/lib/meshchat/network/remote/relay.rb +109 -0
  41. data/lib/meshchat/network/remote/relay_pool.rb +52 -0
  42. data/lib/meshchat/ui.rb +13 -0
  43. data/lib/meshchat/ui/cli.rb +48 -0
  44. data/lib/meshchat/ui/cli/base.rb +39 -0
  45. data/lib/meshchat/ui/cli/input_factory.rb +50 -0
  46. data/lib/meshchat/ui/cli/keyboard_line_input.rb +14 -0
  47. data/lib/meshchat/ui/command.rb +51 -0
  48. data/lib/meshchat/ui/command/base.rb +77 -0
  49. data/lib/meshchat/ui/command/bind.rb +47 -0
  50. data/lib/meshchat/ui/command/chat.rb +31 -0
  51. data/lib/meshchat/ui/command/config.rb +37 -0
  52. data/lib/meshchat/ui/command/emote.rb +23 -0
  53. data/lib/meshchat/ui/command/exit.rb +16 -0
  54. data/lib/meshchat/ui/command/help.rb +20 -0
  55. data/lib/meshchat/ui/command/identity.rb +16 -0
  56. data/lib/meshchat/ui/command/import.rb +42 -0
  57. data/lib/meshchat/ui/command/irb.rb +22 -0
  58. data/lib/meshchat/ui/command/offline.rb +23 -0
  59. data/lib/meshchat/ui/command/online.rb +18 -0
  60. data/lib/meshchat/ui/command/ping.rb +65 -0
  61. data/lib/meshchat/ui/command/ping_all.rb +19 -0
  62. data/lib/meshchat/ui/command/send_disconnect.rb +20 -0
  63. data/lib/meshchat/ui/command/server.rb +22 -0
  64. data/lib/meshchat/ui/command/share.rb +16 -0
  65. data/lib/meshchat/ui/command/whisper.rb +40 -0
  66. data/lib/meshchat/ui/display.rb +78 -0
  67. data/lib/meshchat/ui/display/base.rb +58 -0
  68. data/lib/meshchat/ui/display/manager.rb +59 -0
  69. data/lib/meshchat/ui/notifier.rb +9 -0
  70. data/lib/meshchat/ui/notifier/base.rb +33 -0
  71. data/lib/meshchat/version.rb +3 -2
  72. metadata +150 -80
  73. data/lib/meshchat/cli.rb +0 -188
  74. data/lib/meshchat/cli/base.rb +0 -13
  75. data/lib/meshchat/cli/input.rb +0 -37
  76. data/lib/meshchat/command/base.rb +0 -80
  77. data/lib/meshchat/command/bind.rb +0 -44
  78. data/lib/meshchat/command/chat.rb +0 -30
  79. data/lib/meshchat/command/config.rb +0 -34
  80. data/lib/meshchat/command/emote.rb +0 -20
  81. data/lib/meshchat/command/exit.rb +0 -13
  82. data/lib/meshchat/command/help.rb +0 -17
  83. data/lib/meshchat/command/identity.rb +0 -13
  84. data/lib/meshchat/command/import.rb +0 -41
  85. data/lib/meshchat/command/init.rb +0 -34
  86. data/lib/meshchat/command/irb.rb +0 -23
  87. data/lib/meshchat/command/listen.rb +0 -13
  88. data/lib/meshchat/command/offline.rb +0 -20
  89. data/lib/meshchat/command/online.rb +0 -15
  90. data/lib/meshchat/command/ping.rb +0 -65
  91. data/lib/meshchat/command/ping_all.rb +0 -15
  92. data/lib/meshchat/command/send_disconnect.rb +0 -15
  93. data/lib/meshchat/command/server.rb +0 -20
  94. data/lib/meshchat/command/share.rb +0 -13
  95. data/lib/meshchat/command/stop_listening.rb +0 -13
  96. data/lib/meshchat/command/whisper.rb +0 -38
  97. data/lib/meshchat/database.rb +0 -30
  98. data/lib/meshchat/display.rb +0 -33
  99. data/lib/meshchat/display/base.rb +0 -60
  100. data/lib/meshchat/display/manager.rb +0 -55
  101. data/lib/meshchat/instance.rb +0 -40
  102. data/lib/meshchat/message.rb +0 -41
  103. data/lib/meshchat/message/base.rb +0 -97
  104. data/lib/meshchat/message/chat.rb +0 -19
  105. data/lib/meshchat/message/disconnect.rb +0 -13
  106. data/lib/meshchat/message/emote.rb +0 -9
  107. data/lib/meshchat/message/node_list.rb +0 -63
  108. data/lib/meshchat/message/node_list_diff.rb +0 -15
  109. data/lib/meshchat/message/node_list_hash.rb +0 -33
  110. data/lib/meshchat/message/ping.rb +0 -32
  111. data/lib/meshchat/message/ping_reply.rb +0 -9
  112. data/lib/meshchat/message/relay.rb +0 -43
  113. data/lib/meshchat/message/whisper.rb +0 -36
  114. data/lib/meshchat/models/entry.rb +0 -104
  115. data/lib/meshchat/net/client.rb +0 -83
  116. data/lib/meshchat/net/listener/errors.rb +0 -11
  117. data/lib/meshchat/net/listener/request.rb +0 -48
  118. data/lib/meshchat/net/listener/request_processor.rb +0 -50
  119. data/lib/meshchat/net/listener/server.rb +0 -114
  120. data/lib/meshchat/net/request.rb +0 -29
  121. data/lib/meshchat/notifier/base.rb +0 -31
@@ -1,13 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Exit < Command::Base
4
- def self.description
5
- 'exits the program'
6
- end
7
-
8
- def handle
9
- CLI.shutdown
10
- end
11
- end
12
- end
13
- end
@@ -1,17 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Help < Command::Base
4
- def self.description
5
- 'displays this help message'
6
- end
7
-
8
- def handle
9
- MeshChat::CLI::COMMAND_MAP.each do |key, klass|
10
- if klass.respond_to?(:description)
11
- Display.info "/#{key}\t\t" + klass.description
12
- end
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,13 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Identity < Command::Base
4
- def self.description
5
- 'displays your identity'
6
- end
7
-
8
- def handle
9
- Display.success Settings.identity
10
- end
11
- end
12
- end
13
- end
@@ -1,41 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Import < Command::Base
4
- def self.description
5
- 'imports an identity file (formatted as json)'
6
- end
7
-
8
- def handle
9
- if command_valid?
10
- node = Models::Entry.import_from_file(filename)
11
- if node.valid? && node.persisted?
12
- Display.success "#{node.alias_name} successfully imported"
13
-
14
- # send the server list to this new node
15
- Net::Client.send(
16
- node: node,
17
- message: Message::NodeList.new
18
- )
19
- else
20
- Display.alert "#{node.alias_name} is invalid"
21
- Display.alert node.errors.full_messages.join("\n")
22
- end
23
- else
24
- Display.alert usage
25
- end
26
- end
27
-
28
- def usage
29
- 'Usage: /import {filename}'
30
- end
31
-
32
- def command_valid?
33
- filename.present?
34
- end
35
-
36
- def filename
37
- sub_command
38
- end
39
- end
40
- end
41
- end
@@ -1,34 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Init < Command::Base
4
- def handle
5
- if Settings.uid_exists?
6
- if confirm? 'uid exists, are you sure you want a new identity?'
7
- Settings.generate_uid
8
- else
9
- Display.alert 'uid generation aborted'
10
- end
11
- else
12
- Settings.generate_uid
13
- end
14
-
15
- if Settings.keys_exist?
16
- if confirm? 'keys exist, overwrite?'
17
- Settings.generate_keys
18
- else
19
- Display.alert 'key generation aborted'
20
- end
21
- else
22
- Settings.generate_keys
23
- end
24
- end
25
-
26
- def confirm?(msg)
27
- Display.warning(msg + ' (Y/N)')
28
- response = MeshChat::CLI.get_input
29
- response = response.chomp
30
- ['yes', 'y'].include?(response.downcase)
31
- end
32
- end
33
- end
34
- end
@@ -1,23 +0,0 @@
1
- module MeshChat
2
- class Command
3
-
4
- # TODO: only include this and awesome_print when booted with
5
- # debug=true in the config
6
- class IRB < Command::Base
7
- def self.description
8
- 'runs ruby commands (useful for debugging)'
9
- end
10
-
11
- def handle
12
- begin
13
- code = command_args[1..command_args.length].join(' ')
14
- ap eval(code)
15
- ''
16
- rescue => e
17
- ap e.message
18
- ap e.backtrace
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,13 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Listen < Command::Base
4
- def self.description
5
- 'starts listening for messages'
6
- end
7
-
8
- def handle
9
- CLI.start_server
10
- end
11
- end
12
- end
13
- end
@@ -1,20 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Offline < Command::Base
4
- def self.description
5
- 'shows offline users'
6
- end
7
-
8
- def handle
9
- list = Node.offline.map(&:as_info)
10
- msg = if list.present?
11
- list.join(", ")
12
- else
13
- 'no one is offline'
14
- end
15
-
16
- Display.info msg
17
- end
18
- end
19
- end
20
- end
@@ -1,15 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Online < Command::Base
4
- def self.description
5
- 'shows online users'
6
- end
7
-
8
- def handle
9
- msg = Node.online.map(&:as_info).join(", ").presence || 'no one is online'
10
-
11
- Display.info msg
12
- end
13
- end
14
- end
15
- end
@@ -1,65 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Ping < Command::Base
4
- def self.description
5
- 'pings a particular user'
6
- end
7
-
8
- def handle
9
- if command_valid?
10
- msg = Message::Ping.new
11
-
12
- field, value = parse_ping_command
13
-
14
- node =
15
- if field == 'location'
16
- Node.find_by_location(lookup_value)
17
- else
18
- Node.find_by_alias_name(lookup_value)
19
- end
20
-
21
- location = node.try(:location)
22
-
23
- unless location
24
- return Display.alert "#{lookup_value} could not be found"
25
- end
26
-
27
- Net::Client.send(
28
- node: node,
29
- message: msg
30
- )
31
- else
32
- Display.alert usage
33
- end
34
- end
35
-
36
- def usage
37
- 'Usage: /ping {field} {value} e.g.: /ping alias neurotek or /ping location 10.10.10.10:8080'
38
- end
39
-
40
- def lookup_field
41
- sub_command
42
- end
43
-
44
- def lookup_value
45
- value = command_args.last
46
- value if value != sub_command
47
- end
48
-
49
- def command_valid?
50
- parse_ping_command.compact.length == 2
51
- end
52
-
53
- def parse_ping_command
54
- @parsed_args ||=
55
- if lookup_field == 'location' || lookup_field == 'alias'
56
- [lookup_field, lookup_value]
57
- elsif lookup_field =~ /(?:[0-9]{1,3}\.){3}[0-9]{1,3}/
58
- ['location', lookup_field]
59
- else
60
- ['alias', lookup_field]
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,15 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class PingAll < Command::Base
4
- def self.description
5
- 'pings all known users'
6
- end
7
-
8
- def handle
9
- Node.all.each do |n|
10
- Net::Client.send(node: n, message: Message::Ping.new)
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class SendDisconnect < Command::Base
4
- def self.description
5
- 'sends a disconnect message to all users'
6
- end
7
-
8
- def handle
9
- Node.all.each do |n|
10
- Net::Client.send(node: n, message: Message::Disconnect.new)
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,20 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Server < Command::Base
4
- ONLINE = 'online'
5
- def self.description
6
- 'known server statuses'
7
- end
8
-
9
-
10
- def handle
11
- case sub_command
12
- when ONLINE
13
- Display.info Node.online.map(&:as_info).join(', ') || 'no one is online'
14
- else
15
- Display.info Node.all.map(&:as_info).join(', ') || 'there are no nodes'
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,13 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Share < Command::Base
4
- def self.description
5
- 'exports your identity to a json file to give to another user'
6
- end
7
-
8
- def handle
9
- Settings.share
10
- end
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class StopListening < Command::Base
4
- def self.description
5
- 'prevents incoming messages'
6
- end
7
-
8
- def handle
9
- CLI.close_server
10
- end
11
- end
12
- end
13
- end
@@ -1,38 +0,0 @@
1
- module MeshChat
2
- class Command
3
- class Whisper < Command::Base
4
- def self.description
5
- 'sends a private message to a spepcific person'
6
- end
7
-
8
- def target
9
- # get first arg
10
- command
11
- end
12
-
13
- def message
14
- command_args[1..command_args.length].try(:join, ' ')
15
- end
16
-
17
- def handle
18
- node = Node.find_by_alias_name(target)
19
-
20
- if node
21
- m = Message::Whisper.new(
22
- message: message,
23
- to: target
24
- )
25
-
26
- Display.whisper m.display
27
-
28
- Net::Client.send(
29
- node: node,
30
- message: m
31
- )
32
- else
33
- Display.alert "node for #{target} not found or is not online"
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,30 +0,0 @@
1
- module MeshChat
2
- module Database
3
- module_function
4
-
5
- # Upon initial startup, instantiated the database
6
- # this is used for storing the information of every node
7
- # on the network
8
- def setup_storage
9
- ActiveRecord::Base.establish_connection(
10
- adapter: "sqlite3",
11
- database: "meshchat.sqlite3",
12
- pool: 128
13
- )
14
-
15
- ActiveRecord::Migration.suppress_messages do
16
- ActiveRecord::Schema.define do
17
- unless table_exists? :entries
18
- create_table :entries do |table|
19
- table.column :alias_name, :string
20
- table.column :location, :string
21
- table.column :uid, :string
22
- table.column :public_key, :string
23
- table.column :online, :boolean, default: true, null: false
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,33 +0,0 @@
1
- module MeshChat
2
- module Display
3
-
4
- module_function
5
-
6
- # delegate :start, :add_line,
7
- # :info, :warning, :alert, :success, :chat, :whisper,
8
- # :present_message, to: :current
9
-
10
- # TODO: Delegate doesn't work on modules?
11
- def start(*args); current.start(*args); end
12
- def add_line(*args); current.add_line(*args); end
13
- def info(*args); current.info(*args); end
14
- def emote(*args); current.emote(*args); end
15
- def warning(*args); current.warning(*args); end
16
- def alert(*args); current.alert(*args); end
17
- def success(*args); current.success(*args); end
18
- def chat(*args); current.chat(*args); end
19
- def whisper(*args); current.whisper(*args); end
20
- def present_message(*args); current.present_message(*args); end
21
-
22
- # TODO: break these out in to their own Logger class, and not
23
- # on the display object
24
- def fatal(*args); current.fatal(*args); end
25
- def debug(*args); current.debug(*args); end
26
- def error(*args); current.error(*args); end
27
-
28
- def current
29
- MeshChat::Instance.display
30
- end
31
-
32
- end
33
- end