mad_chatter 0.2.7 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mad_chatter (0.2.6)
4
+ mad_chatter (0.2.7)
5
5
  daemons (= 1.1.4)
6
6
  em-websocket
7
7
  eventmachine
@@ -23,6 +23,7 @@ GEM
23
23
  guard-rspec (0.5.10)
24
24
  guard (>= 0.8.4)
25
25
  multi_json (1.0.4)
26
+ rb-fsevent (0.4.3.1)
26
27
  redcarpet (2.0.1)
27
28
  rspec (2.7.0)
28
29
  rspec-core (~> 2.7.0)
@@ -32,6 +33,7 @@ GEM
32
33
  rspec-expectations (2.7.0)
33
34
  diff-lcs (~> 1.1.2)
34
35
  rspec-mocks (2.7.0)
36
+ ruby-growl (3.0)
35
37
  shoulda (2.11.3)
36
38
  simplecov (0.5.4)
37
39
  multi_json (~> 1.0.3)
@@ -46,6 +48,8 @@ DEPENDENCIES
46
48
  guard
47
49
  guard-rspec
48
50
  mad_chatter!
51
+ rb-fsevent
49
52
  rspec
53
+ ruby-growl
50
54
  shoulda
51
55
  simplecov
@@ -0,0 +1,19 @@
1
+ module MadChatter
2
+ class MessageHistory
3
+
4
+ def self.add(message)
5
+ @stack ||= []
6
+ @stack << message
7
+ @stack = @stack.pop(10) if @stack.length > 10
8
+ end
9
+
10
+ def self.all
11
+ @stack ||= []
12
+ end
13
+
14
+ def self.clear
15
+ @stack = []
16
+ end
17
+
18
+ end
19
+ end
@@ -33,6 +33,9 @@ module MadChatter
33
33
  token = generate_token
34
34
  send_message.call(MadChatter::Message.new('token', token).to_json)
35
35
  @subscribers[subscriber_id] = token
36
+ MadChatter::MessageHistory.all.each do |json|
37
+ send_message.call(json)
38
+ end
36
39
  subscriber_id
37
40
  end
38
41
 
@@ -72,6 +75,7 @@ module MadChatter
72
75
 
73
76
  def self.send_json(json)
74
77
  MadChatter::Server.main_channel.push(json)
78
+ MadChatter::MessageHistory.add(json)
75
79
  end
76
80
 
77
81
  end
@@ -1,5 +1,5 @@
1
1
  module MadChatter
2
2
 
3
- VERSION = '0.2.7'
3
+ VERSION = '0.2.8'
4
4
 
5
5
  end
data/lib/mad_chatter.rb CHANGED
@@ -15,6 +15,7 @@ module MadChatter
15
15
 
16
16
  require 'mad_chatter/config'
17
17
  require 'mad_chatter/message'
18
+ require 'mad_chatter/message_history'
18
19
  require 'mad_chatter/server'
19
20
  require 'mad_chatter/users'
20
21
  require 'mad_chatter/version'
data/mad_chatter.gemspec CHANGED
@@ -25,8 +25,10 @@ Gem::Specification.new do |s|
25
25
  s.add_runtime_dependency "daemons", "1.1.4"
26
26
 
27
27
  s.add_development_dependency "rspec"
28
- s.add_development_dependency "shoulda"
28
+ s.add_development_dependency "shoulda" # do we need this?
29
+ s.add_development_dependency 'simplecov'
29
30
  s.add_development_dependency 'guard'
30
31
  s.add_development_dependency 'guard-rspec'
31
- s.add_development_dependency 'simplecov'
32
+ s.add_development_dependency 'rb-fsevent'
33
+ s.add_development_dependency 'ruby-growl'
32
34
  end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe MadChatter::MessageHistory do
4
+
5
+ before(:each) do
6
+ MadChatter::MessageHistory.clear
7
+ end
8
+
9
+ it 'should only keep 10 recent messages' do
10
+ 15.times do
11
+ MadChatter::MessageHistory.add MadChatter::Message.new('message', 'Here is a dummy chat message')
12
+ end
13
+ MadChatter::MessageHistory.all.length.should == 10
14
+ end
15
+
16
+ it 'should allow you to clear the history' do
17
+ MadChatter::MessageHistory.add MadChatter::Message.new('message', 'Here is a dummy chat message')
18
+ MadChatter::MessageHistory.all.length.should == 1
19
+ MadChatter::MessageHistory.clear
20
+ MadChatter::MessageHistory.all.length.should == 0
21
+ end
22
+
23
+ context '#all' do
24
+ it 'should still return an empty array if there is message chat history' do
25
+ history = MadChatter::MessageHistory.all
26
+ history.should == []
27
+ end
28
+ end
29
+
30
+ end
@@ -2,22 +2,23 @@
2
2
  <html>
3
3
  <head>
4
4
  <title>Mad Chatter</title>
5
- <link rel="stylesheet" href="styles.css">
6
5
  <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js'></script>
7
6
  <script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js'></script>
8
- <script src='mad_chatter.js'></script>
9
- <script src='mad_chatter_actions.js'></script>
10
7
 
11
- <!-- markItUp! -->
8
+ <!-- markdown editor -->
12
9
  <script type="text/javascript" src="markitup/jquery.markitup.js"></script>
13
- <script type="text/javascript" src="markitup/sets/markdown/set.js"></script>
14
10
  <link rel="stylesheet" type="text/css" href="markitup/skins/mad_chatter/style.css" />
15
11
  <link rel="stylesheet" type="text/css" href="markitup/sets/markdown/style.css" />
16
12
 
13
+ <!-- Mad Chatter -->
14
+ <script src='mad_chatter.js'></script>
15
+ <script src='mad_chatter_actions.js'></script>
16
+ <script src='mad_chatter_config.js'></script>
17
+ <link rel="stylesheet" href="styles.css">
18
+
17
19
  <script>
18
20
  $(document).ready(function(){
19
- MadChatter.init('ws://localhost:8100');
20
- $('#keyboard textarea').markItUp(mySettings);
21
+ MadChatter.init(mad_chatter_config);
21
22
  });
22
23
  </script>
23
24
  </head>
@@ -8,7 +8,7 @@ var MadChatter = {
8
8
  MadChatter.init_websocket(ws_host);
9
9
  $('#chatroom').hide();
10
10
  MadChatter.wait_for_join();
11
- MadChatter.wait_for_chat_submit();
11
+ MadChatter.add_markdown_editor();
12
12
  },
13
13
 
14
14
  init_websocket: function(ws_host){
@@ -36,14 +36,23 @@ var MadChatter = {
36
36
  });
37
37
  },
38
38
 
39
- wait_for_chat_submit: function(){
40
- var keyboard = $("#keyboard textarea");
41
- keyboard.keyup(function (event) {
42
- if (event.keyCode == 13) { // The enter key.
43
- MadChatter.send_message(keyboard.val());
44
- keyboard.val('');
45
- }
46
- });
39
+ add_markdown_editor: function(){
40
+ var config = {
41
+ previewParserPath: '',
42
+ onEnter: {keepDefault:false, afterInsert: MadChatter.submit_chat },
43
+ onShiftEnter: {keepDefault:false, openWith:'\n\n'},
44
+ markupSet: [
45
+ {name:'Bold', key:'B', openWith:'**', closeWith:'**'},
46
+ {name:'Italic', key:'I', openWith:'_', closeWith:'_'},
47
+ {separator:'---------------' },
48
+ {name:'Picture', key:'P', replaceWith:'![[![Alternative text]!]]([![Url:!:http://]!])'},
49
+ {name:'Link', key:'L', openWith:'[', closeWith:']([![Url:!:http://]!])', placeHolder:'Your text to link here...' },
50
+ {separator:'---------------'},
51
+ {name:'Quotes', openWith:'> '},
52
+ {name:'Code Block / Code', openWith:'(!(\t|!|`)!)', closeWith:'(!(`)!)'}
53
+ ]
54
+ };
55
+ $('#keyboard textarea').markItUp(config);
47
56
  },
48
57
 
49
58
  join_chat: function(){
@@ -57,6 +66,14 @@ var MadChatter = {
57
66
  $('#chatroom').show();
58
67
  },
59
68
 
69
+ submit_chat: function(){
70
+ var keyboard = $("#keyboard textarea"), message = keyboard.val();
71
+ if ($.trim(message) != '') {
72
+ MadChatter.send_message(message);
73
+ keyboard.val('');
74
+ }
75
+ },
76
+
60
77
  message_received: function(type, username, message){
61
78
  if (type == 'error') {
62
79
  console.log('Client error: ' + message)
@@ -101,7 +118,7 @@ var MadChatter = {
101
118
  },
102
119
 
103
120
  display_message: function(username, message){
104
- $("#messages").append("<p class='message'><span class='username'>" + username + ":</span> " + message + "<time>" + MadChatter.get_current_time() + "</time></p>");
121
+ $("#messages").append("<p class='message'><time>" + MadChatter.get_current_time() + "</time><span class='username'>" + username + ":</span> " + message + "</p>");
105
122
  },
106
123
 
107
124
  scroll_to_bottom_of_chat: function(){
@@ -0,0 +1 @@
1
+ var mad_chatter_config = 'ws://localhost:8100';
@@ -1,58 +1,3 @@
1
- /* -------------------------------------------------------------------
2
- // markItUp!
3
- // By Jay Salvat - http://markitup.jaysalvat.com/
4
- // ------------------------------------------------------------------*/
5
- /*.markItUp .markItUpButton1 a {
6
- background-image:url(images/h1.png);
7
- }
8
- .markItUp .markItUpButton2 a {
9
- background-image:url(images/h2.png);
10
- }
11
- .markItUp .markItUpButton3 a {
12
- background-image:url(images/h3.png);
13
- }
14
- .markItUp .markItUpButton4 a {
15
- background-image:url(images/h4.png);
16
- }
17
- .markItUp .markItUpButton5 a {
18
- background-image:url(images/h5.png);
19
- }
20
- .markItUp .markItUpButton6 a {
21
- background-image:url(images/h6.png);
22
- }
23
-
24
- .markItUp .markItUpButton7 a {
25
- background-image:url(images/bold.png);
26
- }
27
- .markItUp .markItUpButton8 a {
28
- background-image:url(images/italic.png);
29
- }
30
-
31
- .markItUp .markItUpButton9 a {
32
- background-image:url(images/list-bullet.png);
33
- }
34
- .markItUp .markItUpButton10 a {
35
- background-image:url(images/list-numeric.png);
36
- }
37
-
38
- .markItUp .markItUpButton11 a {
39
- background-image:url(images/picture.png);
40
- }
41
- .markItUp .markItUpButton12 a {
42
- background-image:url(images/link.png);
43
- }
44
-
45
- .markItUp .markItUpButton13 a {
46
- background-image:url(images/quotes.png);
47
- }
48
- .markItUp .markItUpButton14 a {
49
- background-image:url(images/code.png);
50
- }
51
-
52
- .markItUp .preview a {
53
- background-image:url(images/preview.png);
54
- }*/
55
-
56
1
  .markItUp .markItUpButton1 a { background-image:url(images/bold.png); }
57
2
  .markItUp .markItUpButton2 a { background-image:url(images/italic.png); }
58
3
  .markItUp .markItUpButton3 a { background-image:url(images/picture.png); }
@@ -48,9 +48,8 @@ table {
48
48
  border-spacing: 0;
49
49
  }
50
50
 
51
- /*
52
- * Mad Chatter Styles
53
- */
51
+
52
+ /***************** Mad Chatter Styles *****************/
54
53
 
55
54
  #login_screen header {
56
55
  padding: 150px 0 20px;
@@ -131,7 +130,6 @@ table {
131
130
  bottom: 0;
132
131
  left: 220px;
133
132
  width: 100%;
134
- /* height:50px;*/
135
133
  background-color: #eee;
136
134
  padding: 0 10px;
137
135
  }
@@ -155,10 +153,8 @@ table {
155
153
  overflow:auto;
156
154
  }
157
155
 
158
- /* Message Markdown Styles */
159
- .message pre, .message code {
156
+ pre, code {
160
157
  font: 12px 'Bitstream Vera Sans Mono','Courier',monospace;
161
- padding: 0!important;
162
- background-color: #EEE!important;
163
- border: 1px solid #DDD;
158
+ padding: 2px !important;
159
+ background-color: #EEE !important;
164
160
  }
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.7
4
+ version: 0.2.8
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-05 00:00:00.000000000 Z
12
+ date: 2012-01-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
16
- requirement: &2156378440 !ruby/object:Gem::Requirement
16
+ requirement: &2168902960 !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: *2156378440
24
+ version_requirements: *2168902960
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: eventmachine
27
- requirement: &2156395540 !ruby/object:Gem::Requirement
27
+ requirement: &2168902340 !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: *2156395540
35
+ version_requirements: *2168902340
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: em-websocket
38
- requirement: &2156391200 !ruby/object:Gem::Requirement
38
+ requirement: &2168901700 !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: *2156391200
46
+ version_requirements: *2168901700
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: redcarpet
49
- requirement: &2156389920 !ruby/object:Gem::Requirement
49
+ requirement: &2168901060 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2156389920
57
+ version_requirements: *2168901060
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: daemons
60
- requirement: &2156399600 !ruby/object:Gem::Requirement
60
+ requirement: &2168900260 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - =
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.1.4
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *2156399600
68
+ version_requirements: *2168900260
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
- requirement: &2156422500 !ruby/object:Gem::Requirement
71
+ requirement: &2168899840 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2156422500
79
+ version_requirements: *2168899840
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: shoulda
82
- requirement: &2156417980 !ruby/object:Gem::Requirement
82
+ requirement: &2168899380 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,21 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2156417980
90
+ version_requirements: *2168899380
91
+ - !ruby/object:Gem::Dependency
92
+ name: simplecov
93
+ requirement: &2168898960 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *2168898960
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: guard
93
- requirement: &2156460260 !ruby/object:Gem::Requirement
104
+ requirement: &2168898540 !ruby/object:Gem::Requirement
94
105
  none: false
95
106
  requirements:
96
107
  - - ! '>='
@@ -98,10 +109,10 @@ dependencies:
98
109
  version: '0'
99
110
  type: :development
100
111
  prerelease: false
101
- version_requirements: *2156460260
112
+ version_requirements: *2168898540
102
113
  - !ruby/object:Gem::Dependency
103
114
  name: guard-rspec
104
- requirement: &2156459480 !ruby/object:Gem::Requirement
115
+ requirement: &2168898100 !ruby/object:Gem::Requirement
105
116
  none: false
106
117
  requirements:
107
118
  - - ! '>='
@@ -109,10 +120,21 @@ dependencies:
109
120
  version: '0'
110
121
  type: :development
111
122
  prerelease: false
112
- version_requirements: *2156459480
123
+ version_requirements: *2168898100
113
124
  - !ruby/object:Gem::Dependency
114
- name: simplecov
115
- requirement: &2156458560 !ruby/object:Gem::Requirement
125
+ name: rb-fsevent
126
+ requirement: &2168897680 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *2168897680
135
+ - !ruby/object:Gem::Dependency
136
+ name: ruby-growl
137
+ requirement: &2168897260 !ruby/object:Gem::Requirement
116
138
  none: false
117
139
  requirements:
118
140
  - - ! '>='
@@ -120,7 +142,7 @@ dependencies:
120
142
  version: '0'
121
143
  type: :development
122
144
  prerelease: false
123
- version_requirements: *2156458560
145
+ version_requirements: *2168897260
124
146
  description: Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5
125
147
  Web Sockets
126
148
  email:
@@ -148,6 +170,7 @@ files:
148
170
  - lib/mad_chatter/config.rb
149
171
  - lib/mad_chatter/daemon.rb
150
172
  - lib/mad_chatter/message.rb
173
+ - lib/mad_chatter/message_history.rb
151
174
  - lib/mad_chatter/server.rb
152
175
  - lib/mad_chatter/servers/em_websocket.rb
153
176
  - lib/mad_chatter/servers/juggernaut.rb
@@ -156,6 +179,7 @@ files:
156
179
  - lib/mad_chatter/version.rb
157
180
  - lib/mad_chatter/web_server.rb
158
181
  - mad_chatter.gemspec
182
+ - spec/message_history_spec.rb
159
183
  - spec/message_spec.rb
160
184
  - spec/spec_helper.rb
161
185
  - templates/config.yml
@@ -164,6 +188,7 @@ files:
164
188
  - templates/web/index.html
165
189
  - templates/web/mad_chatter.js
166
190
  - templates/web/mad_chatter_actions.js
191
+ - templates/web/mad_chatter_config.js
167
192
  - templates/web/markitup/jquery.markitup.js
168
193
  - templates/web/markitup/sets/markdown/images/bold.png
169
194
  - templates/web/markitup/sets/markdown/images/code.png
@@ -181,7 +206,6 @@ files:
181
206
  - templates/web/markitup/sets/markdown/images/preview.png
182
207
  - templates/web/markitup/sets/markdown/images/quotes.png
183
208
  - templates/web/markitup/sets/markdown/readme.txt
184
- - templates/web/markitup/sets/markdown/set.js
185
209
  - templates/web/markitup/sets/markdown/style.css
186
210
  - templates/web/markitup/skins/mad_chatter/images/handle.png
187
211
  - templates/web/markitup/skins/mad_chatter/images/menu.png
@@ -214,5 +238,6 @@ specification_version: 3
214
238
  summary: Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5 Web
215
239
  Sockets
216
240
  test_files:
241
+ - spec/message_history_spec.rb
217
242
  - spec/message_spec.rb
218
243
  - spec/spec_helper.rb
@@ -1,52 +0,0 @@
1
- // -------------------------------------------------------------------
2
- // markItUp!
3
- // -------------------------------------------------------------------
4
- // Copyright (C) 2008 Jay Salvat
5
- // http://markitup.jaysalvat.com/
6
- // -------------------------------------------------------------------
7
- // MarkDown tags example
8
- // http://en.wikipedia.org/wiki/Markdown
9
- // http://daringfireball.net/projects/markdown/
10
- // -------------------------------------------------------------------
11
- // Feel free to add more tags
12
- // -------------------------------------------------------------------
13
- mySettings = {
14
- previewParserPath: '',
15
- onShiftEnter: {keepDefault:false, openWith:'\n\n'},
16
- markupSet: [
17
- // {name:'First Level Heading', key:'1', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '=') } },
18
- // {name:'Second Level Heading', key:'2', placeHolder:'Your title here...', closeWith:function(markItUp) { return miu.markdownTitle(markItUp, '-') } },
19
- // {name:'Heading 3', key:'3', openWith:'### ', placeHolder:'Your title here...' },
20
- // {name:'Heading 4', key:'4', openWith:'#### ', placeHolder:'Your title here...' },
21
- // {name:'Heading 5', key:'5', openWith:'##### ', placeHolder:'Your title here...' },
22
- // {name:'Heading 6', key:'6', openWith:'###### ', placeHolder:'Your title here...' },
23
- // {separator:'---------------' },
24
- {name:'Bold', key:'B', openWith:'**', closeWith:'**'},
25
- {name:'Italic', key:'I', openWith:'_', closeWith:'_'},
26
- {separator:'---------------' },
27
- // {name:'Bulleted List', openWith:'- ' },
28
- // {name:'Numeric List', openWith:function(markItUp) {
29
- // return markItUp.line+'. ';
30
- // }},
31
- // {separator:'---------------' },
32
- {name:'Picture', key:'P', replaceWith:'![[![Alternative text]!]]([![Url:!:http://]!] "[![Title]!]")'},
33
- {name:'Link', key:'L', openWith:'[', closeWith:']([![Url:!:http://]!] "[![Title]!]")', placeHolder:'Your text to link here...' },
34
- {separator:'---------------'},
35
- {name:'Quotes', openWith:'> '},
36
- {name:'Code Block / Code', openWith:'(!(\t|!|`)!)', closeWith:'(!(`)!)'}
37
- // {separator:'---------------'},
38
- // {name:'Preview', call:'preview', className:"preview"}
39
- ]
40
- }
41
-
42
- // mIu nameSpace to avoid conflict.
43
- miu = {
44
- markdownTitle: function(markItUp, char) {
45
- heading = '';
46
- n = $.trim(markItUp.selection||markItUp.placeHolder).length;
47
- for(i = 0; i < n; i++) {
48
- heading += char;
49
- }
50
- return '\n'+heading;
51
- }
52
- }