chatr 0.3.5 → 0.4.6

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.
data/README.md CHANGED
@@ -1,2 +1,20 @@
1
- chatr
2
- =====
1
+ # chatr
2
+
3
+ [![Build Status](https://travis-ci.org/benwoody/chatr.png)](https://travis-ci.org/benwoody/chatr)
4
+
5
+ ## Chatr Library
6
+ Chatr helps facilitate messages across socket connections. When a new Chatr::Host object is created, it creates a TCPServer to marshal messaging to and from the connecting clients.
7
+
8
+ ## chatr_host
9
+ This binary sets up a Chatr host connection. Clients may then open connections to that hosts IP and Chatr port (default 4242)
10
+
11
+ Run host:
12
+
13
+ chatr_host 3333
14
+
15
+ Connect to host:
16
+
17
+ telnet 192.168.1.1 3333
18
+
19
+ The Host will accept the new connection and route incoming socket messages to the Host and other connected clients.
20
+ Clients are designated by their machines IP Address and the incoming Socket ID.
@@ -1,32 +1,36 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'chatr'
3
+ require_relative '../lib/chatr.rb'
4
4
 
5
5
  # grab the first arguement from chatr_host
6
6
  port = ARGV[0]
7
7
 
8
- chatr = Chatr::Host.new port
8
+ chatr = Chatr::Host.new(port=4242)
9
9
 
10
10
  puts "Chat server initiated at #{chatr.local_ip} on port #{port}"
11
11
 
12
- host = chatr.instance_variable_get(:@host)
13
- connections = chatr.instance_variable_get(:@connections)
14
-
15
- while true
16
- session = select(connections,nil, nil,nil)
12
+ loop do
13
+ session = select(chatr.connections)
17
14
  if session != nil
18
15
  session[0].each do |socket|
19
- if socket == host
16
+ if socket == chatr.host
20
17
  chatr.accept_new_connection
18
+ new_socket = chatr.connections.last
19
+ join_msg = sprintf "Client #{new_socket.peeraddr[2]}:#{new_socket.peeraddr[1]} joined.\n"
20
+ chatr.broadcast_string(join_msg,new_socket)
21
21
  else
22
22
  input = socket.gets
23
23
  if input.chomp == "QUIT"
24
+ quit_msg = sprintf "Client #{socket.peeraddr[2]}:#{socket.peeraddr[1]} disconnected\n"
25
+ chatr.broadcast_string(quit_msg,socket)
24
26
  chatr.client_quit socket
25
27
  else
26
- chatr.write_out input, socket
28
+ output = sprintf "[#{socket.peeraddr[2]}|#{socket.peeraddr[1]}]: #{input}"
29
+ chatr.broadcast_string(output,socket)
27
30
  end
28
31
  end
29
32
  end
30
33
  end
31
34
  end
32
35
 
36
+
@@ -1 +1 @@
1
- 0.3.5
1
+ 0.4.6
@@ -1,14 +1,17 @@
1
1
  module Chatr
2
2
  class Host
3
3
 
4
+ attr_reader :host, :connections
5
+
4
6
  def initialize(port=4242)
5
7
  @host = build_connection local_ip, port
6
8
  @connections = grab_connections
7
9
  end
8
10
 
9
11
  # Find local ip
12
+ # This attempts an open connection to google.com and checks the local address used to attempt the request
10
13
  def local_ip
11
- Socket.ip_address_list.last.ip_address
14
+ UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}
12
15
  end
13
16
 
14
17
  # Start Socket connection
@@ -22,28 +25,24 @@ module Chatr
22
25
  connections << @host
23
26
  end
24
27
 
28
+ # Gives the number of connected clients
29
+ # Subtracts 1 to account for the host
30
+ def room_size
31
+ @connections.size - 1
32
+ end
33
+
25
34
  # Take new socket from remote connection.
26
35
  # This will write out new information to the client and output this to the host as well
27
36
  def accept_new_connection
28
37
  new_socket = @host.accept
29
- @connections.push(new_socket)
30
- newsock.write("Write QUIT to disconnect\n")
31
- str = sprintf "Client #{newsock.peeraddr[2]}:#{newsock.peeraddr[1]} joined.\n"
32
- broadcast_string(str,newsock)
33
- end
34
-
35
- # Writes out the clients information and chat string to both host and connected clients
36
- def write_out(string,sock)
37
- str = sprintf "[#{sock.peeraddr[2]}|#{sock.peeraddr[1]}]: #{string}"
38
- broadcast_string(str,sock)
38
+ @connections << new_socket
39
+ new_socket.write("Write QUIT to disconnect\n")
39
40
  end
40
41
 
41
42
  # Writes out when a client writes EOF and then outputs that information to host and clients
42
- def client_quit(sock)
43
- str = sprintf "Client #{sock.peeraddr[2]}:#{sock.peeraddr[1]} disconnected\n"
44
- broadcast_string(str,sock)
45
- sock.close
46
- @connections.delete(sock)
43
+ def client_quit(socket)
44
+ @connections.delete(socket)
45
+ socket.close
47
46
  end
48
47
 
49
48
  # Print the string to the open connected sockets
@@ -7,23 +7,35 @@ describe 'Host' do
7
7
  end
8
8
 
9
9
  it 'should find local ip address' do
10
- ip_from_google = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}
11
- @chatr.local_ip.should == ip_from_google
10
+ ip_regex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/
11
+ @chatr.local_ip.should match ip_regex
12
12
  end
13
13
 
14
- it 'should build a Socket connection' do
14
+ it 'should build an Array of socket connections' do
15
+ @chatr.grab_connections.class.should be Array
15
16
  end
16
17
 
17
- it 'should accept new connections' do
18
+ it 'should show the number of clients in chat' do
19
+ @chatr.room_size.class.should be Fixnum
18
20
  end
19
21
 
20
- it 'should broadcast information accross connections' do
22
+ # Tests that a TCPServer connection is built
23
+ it 'should build a Socket connection' do
24
+ @chatr.host.class.should be TCPServer
21
25
  end
22
26
 
23
- it 'should write chat lines accross connections' do
27
+ it 'should accept new connections' do
28
+ client = TCPSocket.new(@chatr.local_ip,'4242')
29
+ @chatr.accept_new_connection
30
+ @chatr.room_size.should eq(1)
31
+ @chatr.client_quit @chatr.connections.last
24
32
  end
25
33
 
26
34
  it 'should close a connection when a client quits' do
35
+ client = TCPSocket.new(@chatr.local_ip,'4242')
36
+ @chatr.accept_new_connection
37
+ @chatr.client_quit @chatr.connections.last
38
+ @chatr.room_size.should eq(0)
27
39
  end
28
40
 
29
41
  end
@@ -1,8 +1,4 @@
1
1
  require 'rubygems'
2
2
  require 'rspec'
3
3
 
4
- RSpec.configure do |config|
5
- config.order = 'random'
6
- end
7
-
8
4
  require File.expand_path("../../lib/chatr", __FILE__)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chatr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-09 00:00:00.000000000 Z
12
+ date: 2012-12-10 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: This gem is for my final project for UW Ruby Certificate course
15
15
  email: mail@benwoodall.com
@@ -52,11 +52,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
52
52
  version: '0'
53
53
  requirements: []
54
54
  rubyforge_project:
55
- rubygems_version: 1.8.21
55
+ rubygems_version: 1.8.11
56
56
  signing_key:
57
57
  specification_version: 3
58
58
  summary: Simple chat interface using Sockets
59
- test_files:
60
- - spec/lib/host_spec.rb
61
- - spec/spec_helper.rb
59
+ test_files: []
62
60
  has_rdoc: