Class: LocalMessageRouter

Inherits:
Object
  • Object
show all
Defined in:
lib/local_message/local_message_router.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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_portsObject (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

#portObject (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_usersObject (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 forward_message(sender, recipient, message)
  if registered?(recipient)
    info = registered_users[recipient]
    message_with_sender = "@#{sender} #{strip_message(message)}"
    puts "Sending message to #{recipient}, host: #{info.hostname} port: #{info.port}"
    send(info.hostname, info.port, message_with_sender)
  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(message, port, ip)
  if register?(message)
    username, port = strip_username_port(message)
    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?(message)
    recipient = strip_recipient(message)
    sender = username_by_ip(ip)
    forward_message(sender, recipient, message)
    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

Returns:

  • (Boolean)


89
90
91
92
# File 'lib/local_message/local_message_router.rb', line 89

def has_recipient?(message)
  return true if /(@.+)\s+/.match(message)
  false
end

#port_open?(port) ⇒ Boolean

Returns:

  • (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

Returns:

  • (Boolean)


55
56
57
58
# File 'lib/local_message/local_message_router.rb', line 55

def register?(message)
  return true if /@register/.match(message)
  false
end

#registered?(username) ⇒ Boolean

Returns:

  • (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, message)
  Thread.new do
    puts "Sending #{message} to #{hostname}:#{port}"
    socket = TCPSocket.open(hostname, port)
    sleep 1
    socket.write(message)
    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, message)
  send(hostname, port, "Sent #{message} to #{recipient}")
  "Sent #{message} 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

#startObject



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}"
      message = client.read
      puts "Message from #{hostname}:#{port}: #{message}"
      puts handle(message, 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 strip_message(message)
  message.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(message)
  message.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(message)
  /@register\s+(.+)\s+(\d+)/.match(message)
  [$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