mad_chatter 0.2.1 → 0.2.3

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 CHANGED
@@ -1,3 +1,4 @@
1
1
  *.gem
2
2
  .bundle
3
- pkg/*
3
+ pkg/*
4
+ .daemon
data/CHANGELOG.txt CHANGED
@@ -1,5 +1,11 @@
1
1
  Mad Chatter
2
2
 
3
+ Version 0.2.3
4
+ - Finally got extensions working by refactoring a bunch of stuff
5
+
6
+ Version 0.2.2
7
+ - Added daemonization so you can start, stop, restart Mad Chatter
8
+
3
9
  Version 0.2.1
4
10
  - Realized the simple extensions aren't actually working. This is why we need tests. :(
5
11
  - Also, fixed some styles that weren't being applied.
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mad_chatter (0.2.0)
4
+ mad_chatter (0.2.3)
5
+ daemons (= 1.1.4)
5
6
  em-websocket
6
7
  eventmachine
7
8
  redcarpet
@@ -11,6 +12,7 @@ GEM
11
12
  remote: http://rubygems.org/
12
13
  specs:
13
14
  addressable (2.2.6)
15
+ daemons (1.1.4)
14
16
  diff-lcs (1.1.3)
15
17
  em-websocket (0.3.6)
16
18
  addressable (>= 2.1.1)
data/bin/mad_chatter CHANGED
@@ -30,25 +30,22 @@ module MadChatter
30
30
 
31
31
  desc 'start', 'Starts the chat server'
32
32
  def start
33
- require 'mad_chatter'
34
- MadChatter.start
33
+ require 'mad_chatter/daemon'
35
34
  end
36
35
 
37
36
  desc 'stop', 'Stops the chat server'
38
37
  def stop
39
- # stop the currently running daemon
40
- # not sure how to best implement this part yet
38
+ require 'mad_chatter/daemon'
41
39
  end
42
40
 
43
41
  desc 'restart', 'Restarts the chat server'
44
42
  def restart
45
- # restarts the currently running daemon
46
- # not sure how to best implement this part yet
43
+ require 'mad_chatter/daemon'
47
44
  end
48
45
 
49
46
  desc 'version', 'Displays the current version number'
50
47
  def version
51
- require "mad_chatter/version"
48
+ require 'mad_chatter/version'
52
49
  puts MadChatter::VERSION
53
50
  end
54
51
 
@@ -0,0 +1,26 @@
1
+ module MadChatter
2
+ module Actions
3
+ class Base
4
+
5
+ include MadChatter::Actions::Dsl
6
+
7
+ def initialize(regex = nil, block = nil)
8
+ @regex = regex
9
+ @block = block
10
+ end
11
+
12
+ def handle(message)
13
+ if message.original_text =~ @regex
14
+ args = @regex.match(message.original_text).captures
15
+ @block.call(args)
16
+ end
17
+ end
18
+
19
+ # used to register a class that extends MadChatter::Actions::Base
20
+ def self.inherited(extension_class)
21
+ MadChatter.message_listeners << extension_class.new
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ module MadChatter
2
+ module Actions
3
+ module Dsl
4
+
5
+ # Used to define a simple extension
6
+ def on_message(regex, &block)
7
+ MadChatter.message_listeners << MadChatter::Actions::Base.new(regex, block)
8
+ end
9
+
10
+ # Helper methods
11
+
12
+ def stop_message_handling
13
+ raise "Don't call any more message listeners"
14
+ end
15
+
16
+ def send_json(json)
17
+ MadChatter::Server.send_json(json)
18
+ end
19
+
20
+ def send_message(text)
21
+ message = MadChatter::Message.new('message', text)
22
+ send_json(message.to_json)
23
+ end
24
+
25
+ def send_status_message(text)
26
+ message = MadChatter::Message.new('status', text)
27
+ send_json(message.to_json)
28
+ end
29
+
30
+ def send_users_list
31
+ message = MadChatter::Message.new('users', MadChatter::Users.current)
32
+ send_json(message.to_json)
33
+ end
34
+
35
+ def send_action(action, *args)
36
+ message = MadChatter::Message.new('action', {function: action, args: args})
37
+ send_json(message.to_json)
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -1,12 +1,12 @@
1
1
  module MadChatter
2
2
  module Actions
3
- class Join < MadChatter::Action
3
+ class Join < MadChatter::Actions::Base
4
4
 
5
5
  @@regex = /\/join (.+)/
6
6
 
7
7
  def handle(message)
8
- if message.text =~ @@regex
9
- username = parse_username(message.text)
8
+ if message.filtered_text =~ @@regex
9
+ username = parse_username(message.filtered_text)
10
10
  MadChatter::Users.update(message.token, username)
11
11
  send_status_message "#{username} has joined the chatroom"
12
12
  send_users_list
@@ -1,13 +1,13 @@
1
1
  module MadChatter
2
2
  module Actions
3
- class Rename < MadChatter::Action
3
+ class Rename < MadChatter::Actions::Base
4
4
 
5
5
  @@regex = /\/nick (.+)/
6
6
 
7
7
  def handle(message)
8
- if message.text =~ @@regex
8
+ if message.filtered_text =~ @@regex
9
9
  old_username = message.username
10
- username = parse_username(message.text)
10
+ username = parse_username(message.filtered_text)
11
11
  MadChatter::Users.update(message.token, username)
12
12
  send_status_message "#{old_username} is now known as #{username}"
13
13
  send_users_list
@@ -1,13 +1,5 @@
1
1
  module MadChatter
2
2
 
3
- def self.simple_extensions
4
- @@simple_extensions ||= []
5
- end
6
-
7
- def self.extension_classes
8
- @@extension_classes ||= []
9
- end
10
-
11
3
  module Config
12
4
  class << self
13
5
 
@@ -19,10 +11,7 @@ module MadChatter
19
11
 
20
12
  def initialize_config
21
13
  config_file = File.join(Dir.pwd, 'config.yml')
22
-
23
- unless File.exist?(config_file)
24
- abort 'Could not find Mad Chatter config.yml file'
25
- end
14
+ abort 'Could not find Mad Chatter config.yml file' unless File.exist?(config_file)
26
15
 
27
16
  config = YAML::load(File.open(config_file))
28
17
  defaults = {
@@ -36,7 +25,7 @@ module MadChatter
36
25
  simple_extensions_file = File.join(Dir.pwd, 'extensions.rb')
37
26
  if File.exist?(simple_extensions_file)
38
27
  file_contents = File.read(simple_extensions_file)
39
- MadChatter::Extensions.load_simple_extensions(file_contents)
28
+ MadChatter::Actions::Base.new.instance_eval file_contents
40
29
  end
41
30
 
42
31
  # Dir[Dir.pwd + '/extensions/*.rb'].each do |file|
@@ -0,0 +1,16 @@
1
+ require 'daemons'
2
+
3
+ daemon_dir = Dir.pwd + '/.daemon'
4
+ Dir::mkdir(daemon_dir) unless File.directory?(daemon_dir)
5
+
6
+ options = {
7
+ :dir => daemon_dir,
8
+ :log_output => true,
9
+ :multiple => false, # only allow one daemon to run at a time
10
+ :monitor => true
11
+ }
12
+
13
+ Daemons.run_proc('Mad Chatter', options) do
14
+ require 'mad_chatter'
15
+ MadChatter.start
16
+ end
@@ -1,22 +1,33 @@
1
1
  module MadChatter
2
2
  class Message
3
3
 
4
- attr_accessor :type, :text, :token, :username
4
+ attr_accessor :type, :original_text, :filtered_text, :token, :username
5
5
 
6
- def initialize(type, message_text, token = nil, username = nil)
6
+ def initialize(type, original_text, token = nil, username = nil)
7
7
  @type = type
8
- @text = message_text
8
+ @original_text = original_text
9
+ @filtered_text = original_text # if filter is never called, message will be original text
9
10
  @token = token
10
11
  @username = username
11
12
  end
12
13
 
13
- def to_s
14
+ # Helper method for returning filtered text.
15
+ def text
16
+ @filtered_text
17
+ end
18
+
19
+ def to_json
14
20
  JSON.generate({
15
21
  type: @type,
16
- message: @text,
22
+ message: @filtered_text,
17
23
  username: @username,
18
24
  })
19
25
  end
20
26
 
27
+ def filter
28
+ @filtered_text = MadChatter.markdown.render(@original_text)
29
+ @filtered_text = /^<p>(.*)<\/p>$/.match(@filtered_text)[1] # remove the <p> tags that markdown wraps by default
30
+ end
31
+
21
32
  end
22
33
  end
@@ -31,7 +31,7 @@ module MadChatter
31
31
  def register_connection(&send_message)
32
32
  subscriber_id = MadChatter::Server.main_channel.subscribe(send_message)
33
33
  token = generate_token
34
- send_message.call(MadChatter::Message.new('token', token).to_s)
34
+ send_message.call(MadChatter::Message.new('token', token).to_json)
35
35
  @subscribers[subscriber_id] = token
36
36
  subscriber_id
37
37
  end
@@ -45,54 +45,31 @@ module MadChatter
45
45
  username = MadChatter::Users.find_username_by_token(token)
46
46
  MadChatter::Server.main_channel.unsubscribe(id)
47
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)
48
+ MadChatter::Server.send_json(MadChatter::Message.new('status', "#{username} has left the chatroom").to_json)
49
+ MadChatter::Server.send_json(MadChatter::Message.new('users', MadChatter::Users.current).to_json)
50
50
  end
51
51
 
52
52
  def message_received(json)
53
53
  msg = JSON.parse(json)
54
54
  username = MadChatter::Users.find_username_by_token(msg['token'])
55
- original_message = msg['message']
56
- filtered_message = filter_message(original_message)
57
- message = MadChatter::Message.new(msg['type'], filtered_message, msg['token'], username)
55
+ message = MadChatter::Message.new(msg['type'], msg['message'], msg['token'], username)
56
+ message.filter
58
57
 
59
58
  if message.token.nil?
60
59
  return # Token is required to send messages
61
60
  end
62
61
 
63
62
  begin
64
- MadChatter.simple_extensions.each do |extension|
65
- if original_message =~ extension[:regex]
66
- MadChatter::Action.instance_exec do
67
- args = extension[:regex].match(original_message).captures
68
- extension[:block].call(args)
69
- end
70
- end
71
- end
72
-
73
- MadChatter.extension_classes.each do |extension|
74
- extension.handle(message)
63
+ MadChatter.message_listeners.each do |listener|
64
+ listener.handle(message)
75
65
  end
76
66
 
77
- MadChatter::Server.send_json(message.to_s)
67
+ MadChatter::Server.send_json(message.to_json)
78
68
  rescue RuntimeError
79
69
  # dont need to do anything, just prevent any errors from stopping the server
80
70
  end
81
71
  end
82
-
83
- def filter_message(text)
84
- @markdown ||= Redcarpet::Markdown.new(
85
- Redcarpet::Render::HTML.new(
86
- :filter_html => true,
87
- :hard_wrap => true
88
- ),
89
- :autolink => true,
90
- :no_intra_emphasis => true
91
- )
92
- filtered_text = @markdown.render(text)
93
- filtered_text = /^<p>(.*)<\/p>$/.match(filtered_text)[1] # remove the <p> tags that markdown wraps by default
94
- end
95
-
72
+
96
73
  def self.send_json(json)
97
74
  MadChatter::Server.main_channel.push(json)
98
75
  end
@@ -1,5 +1,5 @@
1
1
  module MadChatter
2
2
 
3
- VERSION = '0.2.1'
3
+ VERSION = '0.2.3'
4
4
 
5
5
  end
data/lib/mad_chatter.rb CHANGED
@@ -7,20 +7,34 @@ require 'yaml'
7
7
  require 'json'
8
8
  require 'digest/sha1'
9
9
 
10
- require 'mad_chatter/action'
11
- require 'mad_chatter/config'
12
- require 'mad_chatter/extensions'
13
- require 'mad_chatter/message'
14
- require 'mad_chatter/server'
15
- require 'mad_chatter/users'
16
- require 'mad_chatter/version'
17
-
18
- require 'mad_chatter/actions/join'
19
- require 'mad_chatter/actions/rename'
20
-
21
- require 'mad_chatter/servers/em_websocket'
22
-
23
10
  module MadChatter
11
+
12
+ def self.message_listeners
13
+ @@message_listeners ||= []
14
+ end
15
+
16
+ require 'mad_chatter/config'
17
+ require 'mad_chatter/message'
18
+ require 'mad_chatter/server'
19
+ require 'mad_chatter/users'
20
+ require 'mad_chatter/version'
21
+ require 'mad_chatter/actions/dsl'
22
+ require 'mad_chatter/actions/base'
23
+ require 'mad_chatter/actions/join'
24
+ require 'mad_chatter/actions/rename'
25
+
26
+ require 'mad_chatter/servers/em_websocket'
27
+
28
+ def self.markdown
29
+ @markdown ||= Redcarpet::Markdown.new(
30
+ Redcarpet::Render::HTML.new(
31
+ :filter_html => true,
32
+ :hard_wrap => true
33
+ ),
34
+ :autolink => true,
35
+ :no_intra_emphasis => true
36
+ )
37
+ end
24
38
 
25
39
  def self.start
26
40
  config = MadChatter::Config.init
data/mad_chatter.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.add_runtime_dependency "eventmachine"
23
23
  s.add_runtime_dependency "em-websocket"
24
24
  s.add_runtime_dependency "redcarpet"
25
+ s.add_runtime_dependency "daemons", "1.1.4"
25
26
 
26
27
  s.add_development_dependency "rspec"
27
28
  s.add_development_dependency "shoulda"
@@ -12,8 +12,11 @@
12
12
  # end
13
13
  #
14
14
 
15
- # this still doesnt work yet. hopefully soon
16
- # on_message %r{/youtube http://youtu.be/(.*)} do |youtube_id|
17
- # send_message "<iframe width='560' height='315' src='http://www.youtube.com/embed/#{youtube_id}' frameborder='0' allowfullscreen></iframe>"
18
- # stop_message_handling
19
- # end
15
+ on_message %r{/youtube http://youtu.be/(.*)} do |youtube_id|
16
+ send_message "<iframe width='560' height='315' src='http://www.youtube.com/embed/#{youtube_id}' frameborder='0' allowfullscreen></iframe>"
17
+ stop_message_handling
18
+ end
19
+
20
+ on_message %r{/alert (.*)} do |alert_message|
21
+ send_action 'show_alert', alert_message
22
+ end
@@ -5,7 +5,8 @@
5
5
  <link rel="stylesheet" href="styles.css">
6
6
  <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js'></script>
7
7
  <script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js'></script>
8
- <script src='javascript.js'></script>
8
+ <script src='/mad_chatter.js'></script>
9
+ <script src='/mad_chatter_actions.js'></script>
9
10
  <script>
10
11
  $(document).ready(function(){
11
12
  MadChatter.init('ws://localhost:8100');
@@ -74,7 +74,7 @@ var MadChatter = {
74
74
  MadChatter.display_status(message);
75
75
  }
76
76
  if (type == 'action') {
77
- MadChatter.run_action(message);
77
+ MadChatter.exec_action(message);
78
78
  }
79
79
  if (type == 'message') {
80
80
  MadChatter.display_message(username, message);
@@ -92,8 +92,8 @@ var MadChatter = {
92
92
  });
93
93
  },
94
94
 
95
- run_action: function(action){
96
- eval(action);
95
+ exec_action: function(message){
96
+ window[message.function].apply(window, message.args);
97
97
  },
98
98
 
99
99
  display_status: function(message){
@@ -0,0 +1,4 @@
1
+ // This function is called when '/alert' is sent in a chat message
2
+ function show_alert(message) {
3
+ alert(message);
4
+ }
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.2.1
4
+ version: 0.2.3
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: 2012-01-02 00:00:00.000000000 Z
12
+ date: 2012-01-03 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
16
- requirement: &2169907800 !ruby/object:Gem::Requirement
16
+ requirement: &2165825680 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2169907800
24
+ version_requirements: *2165825680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: eventmachine
27
- requirement: &2169907380 !ruby/object:Gem::Requirement
27
+ requirement: &2165825260 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2169907380
35
+ version_requirements: *2165825260
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: em-websocket
38
- requirement: &2169906960 !ruby/object:Gem::Requirement
38
+ requirement: &2165824840 !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: *2169906960
46
+ version_requirements: *2165824840
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: redcarpet
49
- requirement: &2156004680 !ruby/object:Gem::Requirement
49
+ requirement: &2165824420 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,21 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2156004680
57
+ version_requirements: *2165824420
58
+ - !ruby/object:Gem::Dependency
59
+ name: daemons
60
+ requirement: &2165823920 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - =
64
+ - !ruby/object:Gem::Version
65
+ version: 1.1.4
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *2165823920
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: rspec
60
- requirement: &2152011900 !ruby/object:Gem::Requirement
71
+ requirement: &2165823500 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *2152011900
79
+ version_requirements: *2165823500
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: shoulda
71
- requirement: &2152011480 !ruby/object:Gem::Requirement
82
+ requirement: &2165823040 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,7 +87,7 @@ dependencies:
76
87
  version: '0'
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *2152011480
90
+ version_requirements: *2165823040
80
91
  description: Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5
81
92
  Web Sockets
82
93
  email:
@@ -96,11 +107,12 @@ files:
96
107
  - TODO.txt
97
108
  - bin/mad_chatter
98
109
  - lib/mad_chatter.rb
99
- - lib/mad_chatter/action.rb
110
+ - lib/mad_chatter/actions/base.rb
111
+ - lib/mad_chatter/actions/dsl.rb
100
112
  - lib/mad_chatter/actions/join.rb
101
113
  - lib/mad_chatter/actions/rename.rb
102
114
  - lib/mad_chatter/config.rb
103
- - lib/mad_chatter/extensions.rb
115
+ - lib/mad_chatter/daemon.rb
104
116
  - lib/mad_chatter/message.rb
105
117
  - lib/mad_chatter/server.rb
106
118
  - lib/mad_chatter/servers/em_websocket.rb
@@ -114,7 +126,8 @@ files:
114
126
  - templates/extensions.rb
115
127
  - templates/extensions/example.rb
116
128
  - templates/web/index.html
117
- - templates/web/javascript.js
129
+ - templates/web/mad_chatter.js
130
+ - templates/web/mad_chatter_actions.js
118
131
  - templates/web/styles.css
119
132
  - test/helper.rb
120
133
  - test/test_mad_chatter.rb
@@ -138,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
151
  version: '0'
139
152
  requirements: []
140
153
  rubyforge_project:
141
- rubygems_version: 1.8.10
154
+ rubygems_version: 1.8.6
142
155
  signing_key:
143
156
  specification_version: 3
144
157
  summary: Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5 Web
@@ -1,34 +0,0 @@
1
- module MadChatter
2
- class Action
3
-
4
- def self.inherited(extension_class)
5
- MadChatter.extension_classes << extension_class.new
6
- end
7
-
8
- # Helper methods
9
-
10
- def stop_message_handling
11
- raise 'Dont call anymore message listeners'
12
- end
13
-
14
- def send_json(json)
15
- MadChatter::Server.send_json(json)
16
- end
17
-
18
- def send_message(text)
19
- message = MadChatter::Message.new('message', text)
20
- send_json(message.to_s)
21
- end
22
-
23
- def send_status_message(text)
24
- message = MadChatter::Message.new('status', text)
25
- send_json(message.to_s)
26
- end
27
-
28
- def send_users_list
29
- message = MadChatter::Message.new('users', MadChatter::Users.current)
30
- send_json(message.to_s)
31
- end
32
-
33
- end
34
- end
@@ -1,13 +0,0 @@
1
- module MadChatter
2
- class Extensions
3
-
4
- def self.load_simple_extensions(extensions)
5
- instance_eval extensions, __FILE__, __LINE__
6
- end
7
-
8
- def self.on_message(regex, &block)
9
- MadChatter.simple_extensions << { regex: regex, block: block }
10
- end
11
-
12
- end
13
- end