mad_chatter 0.1.0 → 0.1.1

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 ADDED
@@ -0,0 +1,3 @@
1
+ *.gem
2
+ .bundle
3
+ pkg/*
data/CHANGELOG.txt CHANGED
@@ -1,9 +1,14 @@
1
1
  Mad Chatter
2
2
 
3
+ Version 0.1.1
4
+ - Added a 'preview' command to CLI to run both a web server and web socket server
5
+ - Fixed bug where user leaving chatroom didn't notify other users
6
+
3
7
  Version 0.1.0
4
8
  - Refactored extension architecture. Much nicer syntax now.
5
9
  - Moved some of the main configuration to a config.yml file (which is generated when you use the 'new' command)
6
10
  - Created skeleton classes for alternative web socket server implementations and moved the default implementation into its own class
11
+ - Switched to using Bundler (instead of Jeweler) for gem deployments, thanks to this article: http://mlomnicki.com/ruby/rubygems/2011/01/22/jeweler-vs-bundler.html
7
12
 
8
13
  Versions < 0.1.0
9
14
  - Some of the features were implemented, but there were many holes that needed to be filled
data/Gemfile CHANGED
@@ -1,14 +1,3 @@
1
1
  source :rubygems
2
2
 
3
- # Gem dependencies
4
- gem 'thor'
5
- gem 'eventmachine', '0.12.10'
6
- gem 'em-websocket'
7
-
8
- # Development dependencies
9
- group :development do
10
- gem "shoulda", ">= 0"
11
- gem "bundler", "~> 1.0.0"
12
- gem "jeweler", "~> 1.6.4"
13
- gem "rcov", ">= 0"
14
- end
3
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,18 +1,28 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mad_chatter (0.1.1)
5
+ em-websocket
6
+ eventmachine
7
+ thor
8
+
1
9
  GEM
2
10
  remote: http://rubygems.org/
3
11
  specs:
4
12
  addressable (2.2.6)
13
+ diff-lcs (1.1.3)
5
14
  em-websocket (0.3.5)
6
15
  addressable (>= 2.1.1)
7
16
  eventmachine (>= 0.12.9)
8
17
  eventmachine (0.12.10)
9
- git (1.2.5)
10
- jeweler (1.6.4)
11
- bundler (~> 1.0)
12
- git (>= 1.2.5)
13
- rake
14
- rake (0.9.2.2)
15
- rcov (0.9.11)
18
+ rspec (2.7.0)
19
+ rspec-core (~> 2.7.0)
20
+ rspec-expectations (~> 2.7.0)
21
+ rspec-mocks (~> 2.7.0)
22
+ rspec-core (2.7.1)
23
+ rspec-expectations (2.7.0)
24
+ diff-lcs (~> 1.1.2)
25
+ rspec-mocks (2.7.0)
16
26
  shoulda (2.11.3)
17
27
  thor (0.14.6)
18
28
 
@@ -20,10 +30,6 @@ PLATFORMS
20
30
  ruby
21
31
 
22
32
  DEPENDENCIES
23
- bundler (~> 1.0.0)
24
- em-websocket
25
- eventmachine (= 0.12.10)
26
- jeweler (~> 1.6.4)
27
- rcov
33
+ mad_chatter!
34
+ rspec
28
35
  shoulda
29
- thor
data/Rakefile CHANGED
@@ -1,55 +1 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
- require 'rake'
13
-
14
- require 'jeweler'
15
- require './lib/mad_chatter/version.rb'
16
- Jeweler::Tasks.new do |gem|
17
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
18
- gem.name = "mad_chatter"
19
- gem.version = MadChatter::VERSION
20
- gem.homepage = "http://github.com/andrewhavens/mad_chatter"
21
- gem.license = "MIT"
22
- gem.summary = %Q{Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5 Web Sockets}
23
- gem.description = %Q{Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5 Web Sockets}
24
- gem.email = "email@andrewhavens.com"
25
- gem.authors = ["Andrew Havens"]
26
- # dependencies defined in Gemfile
27
- end
28
- Jeweler::RubygemsDotOrgTasks.new
29
-
30
- require 'rake/testtask'
31
- Rake::TestTask.new(:test) do |test|
32
- test.libs << 'lib' << 'test'
33
- test.pattern = 'test/**/test_*.rb'
34
- test.verbose = true
35
- end
36
-
37
- require 'rcov/rcovtask'
38
- Rcov::RcovTask.new do |test|
39
- test.libs << 'test'
40
- test.pattern = 'test/**/test_*.rb'
41
- test.verbose = true
42
- test.rcov_opts << '--exclude "gems/*"'
43
- end
44
-
45
- task :default => :test
46
-
47
- require 'rake/rdoctask'
48
- Rake::RDocTask.new do |rdoc|
49
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
50
-
51
- rdoc.rdoc_dir = 'rdoc'
52
- rdoc.title = "mad_chatter #{version}"
53
- rdoc.rdoc_files.include('README*')
54
- rdoc.rdoc_files.include('lib/**/*.rb')
55
- end
1
+ require "bundler/gem_tasks"
data/TODO.txt ADDED
@@ -0,0 +1,5 @@
1
+ Goal: to become an open-source version of https://www.hipchat.com/
2
+
3
+ TODO:
4
+ Fix 'leave chatroom' functionality
5
+ Fix 'HTML injection' security vulnerability
data/bin/mad_chatter CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # lib_dir = File.expand_path('../lib', __FILE__)
3
+ # $:.unshift( lib_dir ) unless $:.include?( lib_dir )
2
4
 
3
5
  require 'thor'
4
- require File.expand_path('../../lib/mad_chatter', __FILE__)
5
6
 
6
7
  module MadChatter
7
8
 
@@ -23,8 +24,16 @@ module MadChatter
23
24
  copy_file "templates/web/stylesheets/styles.css", "#{name}/web/stylesheets/styles.css"
24
25
  end
25
26
 
27
+ desc 'preview', 'Starts both a web server and the Mad Chatter chat server'
28
+ def preview
29
+ t1 = Thread.new { require 'mad_chatter/web_server' }
30
+ t2 = Thread.new { require 'mad_chatter'; MadChatter.start }
31
+ t2.join()
32
+ end
33
+
26
34
  desc 'start', 'Starts the chat server'
27
35
  def start
36
+ require 'mad_chatter'
28
37
  MadChatter.start
29
38
  end
30
39
 
@@ -42,6 +51,7 @@ module MadChatter
42
51
 
43
52
  desc 'version', 'Displays the current version number'
44
53
  def version
54
+ require "mad_chatter/version"
45
55
  puts MadChatter::VERSION
46
56
  end
47
57
 
@@ -5,6 +5,7 @@ module MadChatter
5
5
  def initialize(config)
6
6
  @config = config
7
7
  @server = initialize_server
8
+ @subscribers = {};
8
9
  end
9
10
 
10
11
  def self.main_channel
@@ -14,7 +15,7 @@ module MadChatter
14
15
  def initialize_server
15
16
  # TODO: Figure out a better (more flexible/dynamic) way to initialize the server class
16
17
  if @config['websocket_backend'] && @config['websocket_backend'] == 'MadChatter::Servers::EventMachineWebSocket'
17
- return MadChatter::Servers::EventMachineWebSocket.new(self, @config['websocket_port'])
18
+ return MadChatter::Servers::EventMachineWebSocket.new(@config['websocket_port'], self)
18
19
  end
19
20
 
20
21
  raise 'You did not specify a valid class name for websocket_backend'
@@ -27,18 +28,25 @@ module MadChatter
27
28
  end
28
29
  end
29
30
 
30
- def register_connection(&send_client_message_block)
31
- subscriber_id = MadChatter::Server.main_channel.subscribe(send_client_message_block)
32
- send_client_message_block.call(connection_token)
31
+ def register_connection(&send_message)
32
+ subscriber_id = MadChatter::Server.main_channel.subscribe(send_message)
33
+ token = generate_token
34
+ send_message.call(MadChatter::Message.new('token', token).to_s)
35
+ @subscribers[subscriber_id] = token
36
+ subscriber_id
33
37
  end
34
38
 
35
- def connection_token
36
- token = Digest::SHA1.hexdigest Time.now.to_s
37
- MadChatter::Message.new('token', token).to_s
39
+ def generate_token
40
+ Digest::SHA1.hexdigest(Time.now.to_s)
38
41
  end
39
42
 
40
43
  def connection_closed(id)
44
+ token = @subscribers.delete(id)
45
+ username = MadChatter::Users.find_username_by_token(token)
41
46
  MadChatter::Server.main_channel.unsubscribe(id)
47
+ MadChatter::Users.remove(token)
48
+ MadChatter::Server.send_json(MadChatter::Message.new('status', "#{username} has left the chatroom").to_s)
49
+ MadChatter::Server.send_json(MadChatter::Message.new('users', MadChatter::Users.current).to_s)
42
50
  end
43
51
 
44
52
  def message_received(json)
@@ -4,7 +4,7 @@ module MadChatter
4
4
  module Servers
5
5
  class EventMachineWebSocket
6
6
 
7
- def initialize(main_server, port)
7
+ def initialize(port, main_server)
8
8
  @main_server = main_server
9
9
  @config = {
10
10
  :host => '0.0.0.0',
@@ -1,5 +1,5 @@
1
1
  module MadChatter
2
2
 
3
- VERSION = '0.1.0'
3
+ VERSION = '0.1.1'
4
4
 
5
5
  end
@@ -0,0 +1,3 @@
1
+ require 'webrick'
2
+ web_server = WEBrick::HTTPServer.new(:Port => 3000, :DocumentRoot => Dir.pwd + '/web')
3
+ web_server.start
data/lib/mad_chatter.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  lib_dir = File.expand_path('..', __FILE__)
2
2
  $:.unshift( lib_dir ) unless $:.include?( lib_dir )
3
3
 
4
- require 'bundler/setup'
5
4
  require 'eventmachine'
5
+ require 'yaml'
6
6
  require 'json'
7
7
  require 'digest/sha1'
8
8
 
@@ -12,6 +12,7 @@ require 'mad_chatter/extensions'
12
12
  require 'mad_chatter/message'
13
13
  require 'mad_chatter/server'
14
14
  require 'mad_chatter/users'
15
+ require 'mad_chatter/version'
15
16
 
16
17
  require 'mad_chatter/actions/join'
17
18
  require 'mad_chatter/actions/rename'
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "mad_chatter/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "mad_chatter"
7
+ s.version = MadChatter::VERSION
8
+ s.authors = ["Andrew Havens"]
9
+ s.email = ["email@andrewhavens.com"]
10
+ s.homepage = "http://github.com/andrewhavens/mad_chatter"
11
+ s.summary = %q{Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5 Web Sockets}
12
+ s.description = %q{Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5 Web Sockets}
13
+
14
+ # s.rubyforge_project = "mad_chatter"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_runtime_dependency "thor"
22
+ s.add_runtime_dependency "eventmachine"
23
+ s.add_runtime_dependency "em-websocket"
24
+ # s.add_runtime_dependency "sinatra"
25
+
26
+ s.add_development_dependency "rspec"
27
+ s.add_development_dependency "shoulda"
28
+ end
@@ -0,0 +1,15 @@
1
+ class Example
2
+
3
+ # include MadChatter::Extension
4
+
5
+ def handle(message)
6
+ if message.text == 'show me an example'
7
+ send_status_message "#{message.username} really wants an example"
8
+ send_message 'I said...I want an example!!!'
9
+ stop_message_handling # and don't let any other extensions handle it
10
+ else
11
+ # let other extensions handle it
12
+ end
13
+ end
14
+
15
+ end
@@ -8,6 +8,6 @@
8
8
  # Example:
9
9
  #
10
10
  # on_message /hey andrew: (.+)/ do |msg|
11
- # send_status_message 'Someone sent andrew a chat message'
11
+ # send_status_message 'Someone is talking to andrew'
12
12
  # end
13
13
  #
@@ -90,6 +90,9 @@ var MadChatter = {
90
90
  }
91
91
  if (type == 'message') {
92
92
  MadChatter.display_message(username, message);
93
+ if (!document.hasFocus) {
94
+ console.log(window.fluid);
95
+ }
93
96
  }
94
97
  MadChatter.scroll_to_bottom_of_chat();
95
98
  },
@@ -53,6 +53,7 @@
53
53
 
54
54
  #messages p {
55
55
  padding: 0.25em;
56
+ clear: both;
56
57
  }
57
58
 
58
59
  #messages p.message .username {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mad_chatter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-07 00:00:00.000000000Z
12
+ date: 2011-12-13 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
16
- requirement: &2159049300 !ruby/object:Gem::Requirement
16
+ requirement: &2161151040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,21 +21,21 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2159049300
24
+ version_requirements: *2161151040
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: eventmachine
27
- requirement: &2159048600 !ruby/object:Gem::Requirement
27
+ requirement: &2161150480 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
- - - =
30
+ - - ! '>='
31
31
  - !ruby/object:Gem::Version
32
- version: 0.12.10
32
+ version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2159048600
35
+ version_requirements: *2161150480
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: em-websocket
38
- requirement: &2159031280 !ruby/object:Gem::Requirement
38
+ requirement: &2161149460 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2159031280
46
+ version_requirements: *2161149460
47
47
  - !ruby/object:Gem::Dependency
48
- name: shoulda
49
- requirement: &2159030600 !ruby/object:Gem::Requirement
48
+ name: rspec
49
+ requirement: &2161148320 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,32 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2159030600
58
- - !ruby/object:Gem::Dependency
59
- name: bundler
60
- requirement: &2159029860 !ruby/object:Gem::Requirement
61
- none: false
62
- requirements:
63
- - - ~>
64
- - !ruby/object:Gem::Version
65
- version: 1.0.0
66
- type: :development
67
- prerelease: false
68
- version_requirements: *2159029860
69
- - !ruby/object:Gem::Dependency
70
- name: jeweler
71
- requirement: &2159028900 !ruby/object:Gem::Requirement
72
- none: false
73
- requirements:
74
- - - ~>
75
- - !ruby/object:Gem::Version
76
- version: 1.6.4
77
- type: :development
78
- prerelease: false
79
- version_requirements: *2159028900
57
+ version_requirements: *2161148320
80
58
  - !ruby/object:Gem::Dependency
81
- name: rcov
82
- requirement: &2159027800 !ruby/object:Gem::Requirement
59
+ name: shoulda
60
+ requirement: &2161147460 !ruby/object:Gem::Requirement
83
61
  none: false
84
62
  requirements:
85
63
  - - ! '>='
@@ -87,23 +65,24 @@ dependencies:
87
65
  version: '0'
88
66
  type: :development
89
67
  prerelease: false
90
- version_requirements: *2159027800
68
+ version_requirements: *2161147460
91
69
  description: Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5
92
70
  Web Sockets
93
- email: email@andrewhavens.com
71
+ email:
72
+ - email@andrewhavens.com
94
73
  executables:
95
74
  - mad_chatter
96
75
  extensions: []
97
- extra_rdoc_files:
98
- - LICENSE.txt
99
- - README.md
76
+ extra_rdoc_files: []
100
77
  files:
78
+ - .gitignore
101
79
  - CHANGELOG.txt
102
80
  - Gemfile
103
81
  - Gemfile.lock
104
82
  - LICENSE.txt
105
83
  - README.md
106
84
  - Rakefile
85
+ - TODO.txt
107
86
  - bin/mad_chatter
108
87
  - lib/mad_chatter.rb
109
88
  - lib/mad_chatter/action.rb
@@ -118,8 +97,11 @@ files:
118
97
  - lib/mad_chatter/servers/websocket_rack.rb
119
98
  - lib/mad_chatter/users.rb
120
99
  - lib/mad_chatter/version.rb
100
+ - lib/mad_chatter/web_server.rb
101
+ - mad_chatter.gemspec
121
102
  - templates/config.yml
122
103
  - templates/extensions.rb
104
+ - templates/extensions/example.rb
123
105
  - templates/web/index.html
124
106
  - templates/web/javascript.js
125
107
  - templates/web/stylesheets/reset.css
@@ -127,8 +109,7 @@ files:
127
109
  - test/helper.rb
128
110
  - test/test_mad_chatter.rb
129
111
  homepage: http://github.com/andrewhavens/mad_chatter
130
- licenses:
131
- - MIT
112
+ licenses: []
132
113
  post_install_message:
133
114
  rdoc_options: []
134
115
  require_paths:
@@ -139,9 +120,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
139
120
  - - ! '>='
140
121
  - !ruby/object:Gem::Version
141
122
  version: '0'
142
- segments:
143
- - 0
144
- hash: -79813361519807005
145
123
  required_rubygems_version: !ruby/object:Gem::Requirement
146
124
  none: false
147
125
  requirements:
@@ -155,4 +133,6 @@ signing_key:
155
133
  specification_version: 3
156
134
  summary: Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5 Web
157
135
  Sockets
158
- test_files: []
136
+ test_files:
137
+ - test/helper.rb
138
+ - test/test_mad_chatter.rb