chatr 0.3.5
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/.gitignore +18 -0
- data/.travis.yml +8 -0
- data/Gemfile +6 -0
- data/Manifest.txt +0 -0
- data/README.md +2 -0
- data/Rakefile +6 -0
- data/bin/chatr_host +32 -0
- data/chatr.gemspec +21 -0
- data/chatr_version +1 -0
- data/lib/chatr.rb +7 -0
- data/lib/chatr/host.rb +60 -0
- data/spec/lib/host_spec.rb +29 -0
- data/spec/spec_helper.rb +8 -0
- metadata +62 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Manifest.txt
ADDED
File without changes
|
data/README.md
ADDED
data/Rakefile
ADDED
data/bin/chatr_host
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'chatr'
|
4
|
+
|
5
|
+
# grab the first arguement from chatr_host
|
6
|
+
port = ARGV[0]
|
7
|
+
|
8
|
+
chatr = Chatr::Host.new port
|
9
|
+
|
10
|
+
puts "Chat server initiated at #{chatr.local_ip} on port #{port}"
|
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)
|
17
|
+
if session != nil
|
18
|
+
session[0].each do |socket|
|
19
|
+
if socket == host
|
20
|
+
chatr.accept_new_connection
|
21
|
+
else
|
22
|
+
input = socket.gets
|
23
|
+
if input.chomp == "QUIT"
|
24
|
+
chatr.client_quit socket
|
25
|
+
else
|
26
|
+
chatr.write_out input, socket
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
data/chatr.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
version = File.read(File.expand_path("../chatr_version",__FILE__)).strip
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = 'chatr'
|
5
|
+
s.version = version
|
6
|
+
|
7
|
+
s.summary = "Simple chat interface using Sockets"
|
8
|
+
s.description = "This gem is for my final project for UW Ruby Certificate course"
|
9
|
+
|
10
|
+
s.authors = ["Ben Woodall"]
|
11
|
+
s.email = 'mail@benwoodall.com'
|
12
|
+
s.homepage = 'http://github.com/benwoody/chatr'
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.extra_rdoc_files = ["README.md"]
|
20
|
+
|
21
|
+
end
|
data/chatr_version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.3.5
|
data/lib/chatr.rb
ADDED
data/lib/chatr/host.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
module Chatr
|
2
|
+
class Host
|
3
|
+
|
4
|
+
def initialize(port=4242)
|
5
|
+
@host = build_connection local_ip, port
|
6
|
+
@connections = grab_connections
|
7
|
+
end
|
8
|
+
|
9
|
+
# Find local ip
|
10
|
+
def local_ip
|
11
|
+
Socket.ip_address_list.last.ip_address
|
12
|
+
end
|
13
|
+
|
14
|
+
# Start Socket connection
|
15
|
+
def build_connection(ip,port)
|
16
|
+
TCPServer.new(ip,port)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Builds an Array to store connections, adds current socket in 0
|
20
|
+
def grab_connections
|
21
|
+
connections = []
|
22
|
+
connections << @host
|
23
|
+
end
|
24
|
+
|
25
|
+
# Take new socket from remote connection.
|
26
|
+
# This will write out new information to the client and output this to the host as well
|
27
|
+
def accept_new_connection
|
28
|
+
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)
|
39
|
+
end
|
40
|
+
|
41
|
+
# 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)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Print the string to the open connected sockets
|
50
|
+
def broadcast_string(string,origin)
|
51
|
+
@connections.each do |client|
|
52
|
+
if client != @host && client != origin
|
53
|
+
client.write(string)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
print(string)
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Host' do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@chatr = Chatr::Host.new
|
7
|
+
end
|
8
|
+
|
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
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should build a Socket connection' do
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should accept new connections' do
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should broadcast information accross connections' do
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should write chat lines accross connections' do
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should close a connection when a client quits' do
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: chatr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.5
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ben Woodall
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-09 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: This gem is for my final project for UW Ruby Certificate course
|
15
|
+
email: mail@benwoodall.com
|
16
|
+
executables:
|
17
|
+
- chatr_host
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files:
|
20
|
+
- README.md
|
21
|
+
files:
|
22
|
+
- .gitignore
|
23
|
+
- .travis.yml
|
24
|
+
- Gemfile
|
25
|
+
- Manifest.txt
|
26
|
+
- README.md
|
27
|
+
- Rakefile
|
28
|
+
- bin/chatr_host
|
29
|
+
- chatr.gemspec
|
30
|
+
- chatr_version
|
31
|
+
- lib/chatr.rb
|
32
|
+
- lib/chatr/host.rb
|
33
|
+
- spec/lib/host_spec.rb
|
34
|
+
- spec/spec_helper.rb
|
35
|
+
homepage: http://github.com/benwoody/chatr
|
36
|
+
licenses: []
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 1.8.21
|
56
|
+
signing_key:
|
57
|
+
specification_version: 3
|
58
|
+
summary: Simple chat interface using Sockets
|
59
|
+
test_files:
|
60
|
+
- spec/lib/host_spec.rb
|
61
|
+
- spec/spec_helper.rb
|
62
|
+
has_rdoc:
|