mad_chatter 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +8 -1
- data/Gemfile.lock +4 -2
- data/README.md +2 -2
- data/TODO.txt +7 -2
- data/bin/mad_chatter +2 -3
- data/lib/mad_chatter/config.rb +3 -3
- data/lib/mad_chatter/server.rb +14 -1
- data/lib/mad_chatter/version.rb +1 -1
- data/lib/mad_chatter.rb +1 -0
- data/mad_chatter.gemspec +1 -1
- data/templates/extensions/example.rb +2 -1
- data/templates/extensions.rb +7 -2
- data/templates/web/index.html +1 -2
- data/templates/web/javascript.js +24 -16
- data/templates/web/{stylesheets/styles.css → styles.css} +63 -2
- metadata +24 -14
- data/templates/web/stylesheets/reset.css +0 -48
data/CHANGELOG.txt
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
Mad Chatter
|
2
2
|
|
3
|
-
Version 0.
|
3
|
+
Version 0.2.0
|
4
|
+
- Added a '/clear' command to client-side javascript to be able to clear all chat messages
|
5
|
+
- Fixed HTML injection vulnerability by adding markdown parsing and escaping all incoming html
|
6
|
+
- Created a MacRuby application as a GUI wrapper (still need to add a link to the github repo)
|
7
|
+
- Disabled extensions directory for now since example is no longer working.
|
8
|
+
- Finally added /youtube example mentioned in the readme
|
9
|
+
|
10
|
+
Version 0.1.1-3
|
4
11
|
- Added a 'preview' command to CLI to run both a web server and web socket server
|
5
12
|
- Fixed bug where user leaving chatroom didn't notify other users
|
6
13
|
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mad_chatter (0.
|
4
|
+
mad_chatter (0.2.0)
|
5
5
|
em-websocket
|
6
6
|
eventmachine
|
7
|
+
redcarpet
|
7
8
|
thor
|
8
9
|
|
9
10
|
GEM
|
@@ -11,10 +12,11 @@ GEM
|
|
11
12
|
specs:
|
12
13
|
addressable (2.2.6)
|
13
14
|
diff-lcs (1.1.3)
|
14
|
-
em-websocket (0.3.
|
15
|
+
em-websocket (0.3.6)
|
15
16
|
addressable (>= 2.1.1)
|
16
17
|
eventmachine (>= 0.12.9)
|
17
18
|
eventmachine (0.12.10)
|
19
|
+
redcarpet (2.0.1)
|
18
20
|
rspec (2.7.0)
|
19
21
|
rspec-core (~> 2.7.0)
|
20
22
|
rspec-expectations (~> 2.7.0)
|
data/README.md
CHANGED
@@ -16,7 +16,7 @@ This command will generate the following structure:
|
|
16
16
|
|
17
17
|
mychatroom/
|
18
18
|
config.rb
|
19
|
-
extensions
|
19
|
+
extensions.rb
|
20
20
|
web/
|
21
21
|
index.html
|
22
22
|
javascript.js
|
@@ -58,7 +58,7 @@ If you want to customize the html/css of your chatroom, you'll find them in the
|
|
58
58
|
|
59
59
|
There is an example config file that shows a few examples of things you can customize.
|
60
60
|
|
61
|
-
The extensions
|
61
|
+
The extensions.rb file is for you to create your own chat extensions. You will find an example in that file.
|
62
62
|
|
63
63
|
|
64
64
|
##Contributing
|
data/TODO.txt
CHANGED
data/bin/mad_chatter
CHANGED
@@ -15,11 +15,10 @@ module MadChatter
|
|
15
15
|
def new(name)
|
16
16
|
copy_file "templates/config.yml", "#{name}/config.yml"
|
17
17
|
copy_file "templates/extensions.rb", "#{name}/extensions.rb"
|
18
|
-
empty_directory "#{name}/extensions"
|
18
|
+
# empty_directory "#{name}/extensions"
|
19
19
|
copy_file "templates/web/index.html", "#{name}/web/index.html"
|
20
20
|
copy_file "templates/web/javascript.js", "#{name}/web/javascript.js"
|
21
|
-
copy_file "templates/web/
|
22
|
-
copy_file "templates/web/stylesheets/styles.css", "#{name}/web/stylesheets/styles.css"
|
21
|
+
copy_file "templates/web/styles.css", "#{name}/web/styles.css"
|
23
22
|
end
|
24
23
|
|
25
24
|
desc 'preview', 'Starts both a web server and the Mad Chatter chat server'
|
data/lib/mad_chatter/config.rb
CHANGED
@@ -39,9 +39,9 @@ module MadChatter
|
|
39
39
|
MadChatter::Extensions.load_simple_extensions(file_contents)
|
40
40
|
end
|
41
41
|
|
42
|
-
Dir[Dir.pwd + '/extensions/*.rb'].each do |file|
|
43
|
-
|
44
|
-
end
|
42
|
+
# Dir[Dir.pwd + '/extensions/*.rb'].each do |file|
|
43
|
+
# require file
|
44
|
+
# end
|
45
45
|
end
|
46
46
|
|
47
47
|
end
|
data/lib/mad_chatter/server.rb
CHANGED
@@ -52,7 +52,7 @@ module MadChatter
|
|
52
52
|
def message_received(json)
|
53
53
|
msg = JSON.parse(json)
|
54
54
|
username = MadChatter::Users.find_username_by_token(msg['token'])
|
55
|
-
message = MadChatter::Message.new(msg['type'], msg['message'], msg['token'], username)
|
55
|
+
message = MadChatter::Message.new(msg['type'], filter_message(msg['message']), msg['token'], username)
|
56
56
|
|
57
57
|
if message.token.nil?
|
58
58
|
return # Token is required to send messages
|
@@ -78,6 +78,19 @@ module MadChatter
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
+
def filter_message(text)
|
82
|
+
@markdown ||= Redcarpet::Markdown.new(
|
83
|
+
Redcarpet::Render::HTML.new(
|
84
|
+
:filter_html => true,
|
85
|
+
:hard_wrap => true
|
86
|
+
),
|
87
|
+
:autolink => true,
|
88
|
+
:no_intra_emphasis => true
|
89
|
+
)
|
90
|
+
filtered_text = @markdown.render(text)
|
91
|
+
filtered_text = /^<p>(.*)<\/p>$/.match(filtered_text)[1] # remove the <p> tags that markdown wraps by default
|
92
|
+
end
|
93
|
+
|
81
94
|
def self.send_json(json)
|
82
95
|
MadChatter::Server.main_channel.push(json)
|
83
96
|
end
|
data/lib/mad_chatter/version.rb
CHANGED
data/lib/mad_chatter.rb
CHANGED
data/mad_chatter.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_runtime_dependency "thor"
|
22
22
|
s.add_runtime_dependency "eventmachine"
|
23
23
|
s.add_runtime_dependency "em-websocket"
|
24
|
-
|
24
|
+
s.add_runtime_dependency "redcarpet"
|
25
25
|
|
26
26
|
s.add_development_dependency "rspec"
|
27
27
|
s.add_development_dependency "shoulda"
|
data/templates/extensions.rb
CHANGED
@@ -7,7 +7,12 @@
|
|
7
7
|
#
|
8
8
|
# Example:
|
9
9
|
#
|
10
|
-
# on_message /hey andrew: (.+)/ do |
|
10
|
+
# on_message /hey andrew: (.+)/ do |regex_capture|
|
11
11
|
# send_status_message 'Someone is talking to andrew'
|
12
12
|
# end
|
13
|
-
#
|
13
|
+
#
|
14
|
+
|
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
|
data/templates/web/index.html
CHANGED
@@ -2,8 +2,7 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title>Mad Chatter</title>
|
5
|
-
<link rel="stylesheet" href="
|
6
|
-
<link rel="stylesheet" href="stylesheets/styles.css">
|
5
|
+
<link rel="stylesheet" href="styles.css">
|
7
6
|
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js'></script>
|
8
7
|
<script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js'></script>
|
9
8
|
<script src='javascript.js'></script>
|
data/templates/web/javascript.js
CHANGED
@@ -1,15 +1,3 @@
|
|
1
|
-
function get_current_time(){
|
2
|
-
var time = new Date();
|
3
|
-
var hours = time.getHours();
|
4
|
-
var minutes = time.getMinutes();
|
5
|
-
var ampm = 'am';
|
6
|
-
if (hours > 11) { ampm = 'pm'; }
|
7
|
-
if (minutes < 10) { minutes = "0" + minutes; }
|
8
|
-
if (hours == 0) { hours = 12; }
|
9
|
-
if (hours > 12) { hours = hours - 12; }
|
10
|
-
return hours + ':' + minutes + ampm;
|
11
|
-
}
|
12
|
-
|
13
1
|
var MadChatter = {
|
14
2
|
|
15
3
|
init: function(ws_host){
|
@@ -52,7 +40,7 @@ var MadChatter = {
|
|
52
40
|
var keyboard = $("#keyboard input");
|
53
41
|
keyboard.keyup(function (event) {
|
54
42
|
if (event.keyCode == 13) { // The enter key.
|
55
|
-
|
43
|
+
MadChatter.send_message(keyboard.val());
|
56
44
|
keyboard.val('');
|
57
45
|
}
|
58
46
|
});
|
@@ -109,11 +97,11 @@ var MadChatter = {
|
|
109
97
|
},
|
110
98
|
|
111
99
|
display_status: function(message){
|
112
|
-
$("#messages").append("<p class='status'>" + message + "<time>" + get_current_time() + "</time></p>");
|
100
|
+
$("#messages").append("<p class='status'>" + message + "<time>" + MadChatter.get_current_time() + "</time></p>");
|
113
101
|
},
|
114
102
|
|
115
103
|
display_message: function(username, message){
|
116
|
-
$("#messages").append("<p class='message'><span class='username'>" + username + ":</span> " + message + "<time>" + get_current_time() + "</time></p>");
|
104
|
+
$("#messages").append("<p class='message'><span class='username'>" + username + ":</span> " + message + "<time>" + MadChatter.get_current_time() + "</time></p>");
|
117
105
|
},
|
118
106
|
|
119
107
|
scroll_to_bottom_of_chat: function(){
|
@@ -121,11 +109,31 @@ var MadChatter = {
|
|
121
109
|
},
|
122
110
|
|
123
111
|
send_message: function(message){
|
124
|
-
|
112
|
+
if (message == '/clear') {
|
113
|
+
MadChatter.clear_messages();
|
114
|
+
} else {
|
115
|
+
MadChatter.send_json('message', message);
|
116
|
+
}
|
125
117
|
},
|
126
118
|
|
127
119
|
send_json: function(type, msg){
|
128
120
|
var json = { type: type, token: MadChatter.client_token, message: msg };
|
129
121
|
MadChatter.ws.send(JSON.stringify(json));
|
122
|
+
},
|
123
|
+
|
124
|
+
clear_messages: function(){
|
125
|
+
$('#messages').empty();
|
126
|
+
},
|
127
|
+
|
128
|
+
get_current_time: function(){
|
129
|
+
var time = new Date();
|
130
|
+
var hours = time.getHours();
|
131
|
+
var minutes = time.getMinutes();
|
132
|
+
var ampm = 'am';
|
133
|
+
if (hours > 11) { ampm = 'pm'; }
|
134
|
+
if (minutes < 10) { minutes = "0" + minutes; }
|
135
|
+
if (hours == 0) { hours = 12; }
|
136
|
+
if (hours > 12) { hours = hours - 12; }
|
137
|
+
return hours + ':' + minutes + ampm;
|
130
138
|
}
|
131
139
|
};
|
@@ -1,3 +1,57 @@
|
|
1
|
+
/*
|
2
|
+
* CSS Reset Styles
|
3
|
+
* http://meyerweb.com/eric/tools/css/reset/
|
4
|
+
* v2.0 | 20110126
|
5
|
+
* License: none (public domain)
|
6
|
+
*/
|
7
|
+
html, body, div, span, applet, object, iframe,
|
8
|
+
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
9
|
+
a, abbr, acronym, address, big, cite, code,
|
10
|
+
del, dfn, em, img, ins, kbd, q, s, samp,
|
11
|
+
small, strike, strong, sub, sup, tt, var,
|
12
|
+
b, u, i, center,
|
13
|
+
dl, dt, dd, ol, ul, li,
|
14
|
+
fieldset, form, label, legend,
|
15
|
+
table, caption, tbody, tfoot, thead, tr, th, td,
|
16
|
+
article, aside, canvas, details, embed,
|
17
|
+
figure, figcaption, footer, header, hgroup,
|
18
|
+
menu, nav, output, ruby, section, summary,
|
19
|
+
time, mark, audio, video {
|
20
|
+
margin: 0;
|
21
|
+
padding: 0;
|
22
|
+
border: 0;
|
23
|
+
font-size: 100%;
|
24
|
+
font: inherit;
|
25
|
+
vertical-align: baseline;
|
26
|
+
}
|
27
|
+
/* HTML5 display-role reset for older browsers */
|
28
|
+
article, aside, details, figcaption, figure,
|
29
|
+
footer, header, hgroup, menu, nav, section {
|
30
|
+
display: block;
|
31
|
+
}
|
32
|
+
body {
|
33
|
+
line-height: 1;
|
34
|
+
}
|
35
|
+
ol, ul {
|
36
|
+
list-style: none;
|
37
|
+
}
|
38
|
+
blockquote, q {
|
39
|
+
quotes: none;
|
40
|
+
}
|
41
|
+
blockquote:before, blockquote:after,
|
42
|
+
q:before, q:after {
|
43
|
+
content: '';
|
44
|
+
content: none;
|
45
|
+
}
|
46
|
+
table {
|
47
|
+
border-collapse: collapse;
|
48
|
+
border-spacing: 0;
|
49
|
+
}
|
50
|
+
|
51
|
+
/*
|
52
|
+
* Mad Chatter Styles
|
53
|
+
*/
|
54
|
+
|
1
55
|
#login_screen header {
|
2
56
|
padding: 150px 0 20px;
|
3
57
|
color: #fff;
|
@@ -70,8 +124,7 @@
|
|
70
124
|
color: #999;
|
71
125
|
}
|
72
126
|
|
73
|
-
#keyboard{
|
74
|
-
/* position:absolute;*/
|
127
|
+
#keyboard {
|
75
128
|
bottom:0;
|
76
129
|
left:220px;
|
77
130
|
width:400%;
|
@@ -101,4 +154,12 @@
|
|
101
154
|
* html div#messages{
|
102
155
|
height:100%;
|
103
156
|
overflow:auto;
|
157
|
+
}
|
158
|
+
|
159
|
+
/* Message Markdown Styles */
|
160
|
+
.message pre, .message code {
|
161
|
+
font: 12px 'Bitstream Vera Sans Mono','Courier',monospace;
|
162
|
+
padding: 0!important;
|
163
|
+
background-color: #EEE!important;
|
164
|
+
border: 1px solid #DDD;
|
104
165
|
}
|
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.
|
4
|
+
version: 0.2.0
|
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:
|
12
|
+
date: 2012-01-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
16
|
-
requirement: &
|
16
|
+
requirement: &2169116300 !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: *
|
24
|
+
version_requirements: *2169116300
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: eventmachine
|
27
|
-
requirement: &
|
27
|
+
requirement: &2156007600 !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: *
|
35
|
+
version_requirements: *2156007600
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: em-websocket
|
38
|
-
requirement: &
|
38
|
+
requirement: &2156002260 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,21 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2156002260
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: redcarpet
|
49
|
+
requirement: &2164626100 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *2164626100
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: rspec
|
49
|
-
requirement: &
|
60
|
+
requirement: &2164625680 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ! '>='
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: '0'
|
55
66
|
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *2164625680
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: shoulda
|
60
|
-
requirement: &
|
71
|
+
requirement: &2164625260 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,7 +76,7 @@ dependencies:
|
|
65
76
|
version: '0'
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *2164625260
|
69
80
|
description: Mad Chatter is a fun, easy to customize chat server, utilizing HTML 5
|
70
81
|
Web Sockets
|
71
82
|
email:
|
@@ -104,8 +115,7 @@ files:
|
|
104
115
|
- templates/extensions/example.rb
|
105
116
|
- templates/web/index.html
|
106
117
|
- templates/web/javascript.js
|
107
|
-
- templates/web/
|
108
|
-
- templates/web/stylesheets/styles.css
|
118
|
+
- templates/web/styles.css
|
109
119
|
- test/helper.rb
|
110
120
|
- test/test_mad_chatter.rb
|
111
121
|
homepage: http://github.com/andrewhavens/mad_chatter
|
@@ -1,48 +0,0 @@
|
|
1
|
-
/* http://meyerweb.com/eric/tools/css/reset/
|
2
|
-
v2.0 | 20110126
|
3
|
-
License: none (public domain)
|
4
|
-
*/
|
5
|
-
|
6
|
-
html, body, div, span, applet, object, iframe,
|
7
|
-
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
8
|
-
a, abbr, acronym, address, big, cite, code,
|
9
|
-
del, dfn, em, img, ins, kbd, q, s, samp,
|
10
|
-
small, strike, strong, sub, sup, tt, var,
|
11
|
-
b, u, i, center,
|
12
|
-
dl, dt, dd, ol, ul, li,
|
13
|
-
fieldset, form, label, legend,
|
14
|
-
table, caption, tbody, tfoot, thead, tr, th, td,
|
15
|
-
article, aside, canvas, details, embed,
|
16
|
-
figure, figcaption, footer, header, hgroup,
|
17
|
-
menu, nav, output, ruby, section, summary,
|
18
|
-
time, mark, audio, video {
|
19
|
-
margin: 0;
|
20
|
-
padding: 0;
|
21
|
-
border: 0;
|
22
|
-
font-size: 100%;
|
23
|
-
font: inherit;
|
24
|
-
vertical-align: baseline;
|
25
|
-
}
|
26
|
-
/* HTML5 display-role reset for older browsers */
|
27
|
-
article, aside, details, figcaption, figure,
|
28
|
-
footer, header, hgroup, menu, nav, section {
|
29
|
-
display: block;
|
30
|
-
}
|
31
|
-
body {
|
32
|
-
line-height: 1;
|
33
|
-
}
|
34
|
-
ol, ul {
|
35
|
-
list-style: none;
|
36
|
-
}
|
37
|
-
blockquote, q {
|
38
|
-
quotes: none;
|
39
|
-
}
|
40
|
-
blockquote:before, blockquote:after,
|
41
|
-
q:before, q:after {
|
42
|
-
content: '';
|
43
|
-
content: none;
|
44
|
-
}
|
45
|
-
table {
|
46
|
-
border-collapse: collapse;
|
47
|
-
border-spacing: 0;
|
48
|
-
}
|