mad_chatter 0.2.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
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