Class: LocalMessageRouter
- Inherits:
-
Object
- Object
- LocalMessageRouter
- Defined in:
- lib/local_message/local_message_router.rb
Instance Attribute Summary collapse
-
#open_ports ⇒ Object
readonly
Returns the value of attribute open_ports.
-
#port ⇒ Object
readonly
Returns the value of attribute port.
-
#registered_users ⇒ Object
readonly
Returns the value of attribute registered_users.
Instance Method Summary collapse
- #forward_message(sender, recipient, message) ⇒ Object
- #handle(message, port, ip) ⇒ Object
- #has_recipient?(message) ⇒ Boolean
-
#initialize(listening_port) ⇒ LocalMessageRouter
constructor
A new instance of LocalMessageRouter.
- #port_open?(port) ⇒ Boolean
- #register(username, port, ip) ⇒ Object
- #register?(message) ⇒ Boolean
- #registered?(username) ⇒ Boolean
- #send(hostname, port, message) ⇒ Object
- #send_ack(hostname, port, recipient, message) ⇒ Object
- #send_register_ack(hostname, port, username) ⇒ Object
- #start ⇒ Object
- #strip_message(message) ⇒ Object
- #strip_recipient(message) ⇒ Object
- #strip_username_port(message) ⇒ Object
- #username_by_ip(ip) ⇒ Object
Constructor Details
#initialize(listening_port) ⇒ LocalMessageRouter
Returns a new instance of LocalMessageRouter.
7 8 9 10 11 |
# File 'lib/local_message/local_message_router.rb', line 7 def initialize(listening_port) @port = listening_port @registered_users = {} @open_ports = [] end |
Instance Attribute Details
#open_ports ⇒ Object (readonly)
Returns the value of attribute open_ports.
5 6 7 |
# File 'lib/local_message/local_message_router.rb', line 5 def open_ports @open_ports end |
#port ⇒ Object (readonly)
Returns the value of attribute port.
5 6 7 |
# File 'lib/local_message/local_message_router.rb', line 5 def port @port end |
#registered_users ⇒ Object (readonly)
Returns the value of attribute registered_users.
5 6 7 |
# File 'lib/local_message/local_message_router.rb', line 5 def registered_users @registered_users end |
Instance Method Details
#forward_message(sender, recipient, message) ⇒ Object
102 103 104 105 106 107 108 109 |
# File 'lib/local_message/local_message_router.rb', line 102 def (sender, recipient, ) if registered?(recipient) info = registered_users[recipient] = "@#{sender} #{()}" puts "Sending message to #{recipient}, host: #{info.hostname} port: #{info.port}" send(info.hostname, info.port, ) end end |
#handle(message, port, ip) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/local_message/local_message_router.rb', line 31 def handle(, port, ip) if register?() username, port = strip_username_port() register(username, port.to_i, ip) if registered?(username) puts "Registered #{username} => #{ip}:#{port}" else puts "Couldn't register #{username}" end #send_register_ack(ip, port, username) elsif has_recipient?() recipient = strip_recipient() sender = username_by_ip(ip) (sender, recipient, ) if registered?(recipient) #send_ack(ip, port, recipient, message) else #send_ack(ip, port, recipient, "No such recipient") end else "Message not handled" end end |
#has_recipient?(message) ⇒ Boolean
89 90 91 92 |
# File 'lib/local_message/local_message_router.rb', line 89 def has_recipient?() return true if /(@.+)\s+/.match() false end |
#port_open?(port) ⇒ Boolean
111 112 113 |
# File 'lib/local_message/local_message_router.rb', line 111 def port_open?(port) open_ports.include?(port) end |
#register(username, port, ip) ⇒ Object
64 65 66 |
# File 'lib/local_message/local_message_router.rb', line 64 def register(username, port, ip) registered_users[username] = LocalMessageUser.new(port, ip) end |
#register?(message) ⇒ Boolean
55 56 57 58 |
# File 'lib/local_message/local_message_router.rb', line 55 def register?() return true if /@register/.match() false end |
#registered?(username) ⇒ Boolean
60 61 62 |
# File 'lib/local_message/local_message_router.rb', line 60 def registered?(username) registered_users.has_key?(username) end |
#send(hostname, port, message) ⇒ Object
115 116 117 118 119 120 121 122 123 |
# File 'lib/local_message/local_message_router.rb', line 115 def send(hostname, port, ) Thread.new do puts "Sending #{} to #{hostname}:#{port}" socket = TCPSocket.open(hostname, port) sleep 1 socket.write() socket.close end end |
#send_ack(hostname, port, recipient, message) ⇒ Object
125 126 127 128 |
# File 'lib/local_message/local_message_router.rb', line 125 def send_ack(hostname, port, recipient, ) send(hostname, port, "Sent #{} to #{recipient}") "Sent #{} to #{hostname}:#{port}" end |
#send_register_ack(hostname, port, username) ⇒ Object
68 69 70 71 72 73 74 75 76 |
# File 'lib/local_message/local_message_router.rb', line 68 def send_register_ack(hostname, port, username) if registered?(username) send(hostname, port, "Successfully registered #{username}") "Successfully registered #{username}" else send(hostname, port, "Failed to register #{username}") "Failed to register #{username}" end end |
#start ⇒ Object
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/local_message/local_message_router.rb', line 13 def start server = TCPServer.open(port) begin puts "Listening on port: #{port}..." Thread.start(server.accept) do |client| fam, port, hostname, ip = client.peeraddr puts "Connection initiated from #{hostname}:#{port}" = client.read puts "Message from #{hostname}:#{port}: #{}" puts handle(, port, ip) puts "Closing connection from #{hostname}:#{port}" client.close end end while true end |
#strip_message(message) ⇒ Object
98 99 100 |
# File 'lib/local_message/local_message_router.rb', line 98 def () .split[1..-1].join(" ") end |
#strip_recipient(message) ⇒ Object
94 95 96 |
# File 'lib/local_message/local_message_router.rb', line 94 def strip_recipient() .split[0].slice(1..-1) end |
#strip_username_port(message) ⇒ Object
84 85 86 87 |
# File 'lib/local_message/local_message_router.rb', line 84 def strip_username_port() /@register\s+(.+)\s+(\d+)/.match() [$1, $2] end |
#username_by_ip(ip) ⇒ Object
78 79 80 81 82 |
# File 'lib/local_message/local_message_router.rb', line 78 def username_by_ip(ip) registered_users.values.each do |user| return registered_users.key(user) if user.hostname == ip end end |