mad_chatter 0.1.3 → 0.2.0
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/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
|
-
}
|