mad_chatter 0.2.9 → 0.3.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/.gitignore +2 -1
- data/.rvmrc +1 -0
- data/Gemfile.lock +1 -3
- data/README.md +25 -20
- data/lib/mad_chatter/actions/dsl.rb +4 -10
- data/lib/mad_chatter/actions.rb +29 -0
- data/lib/mad_chatter/channel.rb +56 -0
- data/lib/mad_chatter/config.rb +22 -5
- data/lib/mad_chatter/connection.rb +29 -0
- data/lib/mad_chatter/extensions.rb +12 -0
- data/lib/mad_chatter/markdown_renderer.rb +6 -0
- data/lib/mad_chatter/message.rb +39 -12
- data/lib/mad_chatter/message_history.rb +8 -5
- data/lib/mad_chatter/message_listener.rb +17 -0
- data/lib/mad_chatter/message_listeners/code.rb +30 -0
- data/lib/mad_chatter/message_listeners/image.rb +27 -0
- data/lib/mad_chatter/message_listeners/join.rb +30 -0
- data/lib/mad_chatter/message_listeners/markdown.rb +45 -0
- data/lib/mad_chatter/message_listeners/nick.rb +26 -0
- data/lib/mad_chatter/server.rb +0 -55
- data/lib/mad_chatter/servers/em_websocket.rb +5 -14
- data/lib/mad_chatter/user.rb +78 -0
- data/lib/mad_chatter/users.rb +32 -24
- data/lib/mad_chatter/version.rb +1 -1
- data/lib/mad_chatter.rb +98 -34
- data/mad_chatter.gemspec +1 -1
- data/screenshot.png +0 -0
- data/spec/actions_spec.rb +7 -0
- data/spec/message_history_spec.rb +12 -10
- data/spec/message_listeners/code_spec.rb +37 -0
- data/spec/message_listeners/join_spec.rb +34 -0
- data/spec/message_listeners/markdown_spec.rb +47 -0
- data/spec/message_spec.rb +28 -16
- data/spec/server_spec.rb +43 -0
- data/spec/users_spec.rb +23 -0
- data/templates/extensions/example.rb +1 -1
- data/templates/extensions.rb +16 -14
- data/templates/web/css/bootstrap.css +3363 -0
- data/templates/web/css/bootstrap.min.css +610 -0
- data/templates/web/css/bootstrap.min.responsive.css +3 -0
- data/templates/web/css/bootstrap.responsive.css +567 -0
- data/templates/web/css/mad_chatter.css +59 -0
- data/templates/web/{styles.css → css/styles.css} +26 -20
- data/templates/web/img/glyphicons-halflings-white.png +0 -0
- data/templates/web/img/glyphicons-halflings.png +0 -0
- data/templates/web/index.html +173 -40
- data/templates/web/js/bootstrap.js +1722 -0
- data/templates/web/js/bootstrap.min.js +1 -0
- data/templates/web/js/mad_chatter.js +292 -0
- data/templates/web/{mad_chatter_actions.js → js/mad_chatter_actions.js} +0 -0
- data/templates/web/js/mad_chatter_config.js +3 -0
- data/templates/web/js/swfobject.js +4 -0
- data/templates/web/js/web_socket.js +389 -0
- data/templates/web/swf/WebSocketMain.swf +0 -0
- metadata +65 -62
- data/TODO.txt +0 -10
- data/templates/web/mad_chatter.js +0 -161
- data/templates/web/mad_chatter_config.js +0 -1
- data/templates/web/markitup/jquery.markitup.js +0 -593
- data/templates/web/markitup/sets/markdown/images/bold.png +0 -0
- data/templates/web/markitup/sets/markdown/images/code.png +0 -0
- data/templates/web/markitup/sets/markdown/images/h1.png +0 -0
- data/templates/web/markitup/sets/markdown/images/h2.png +0 -0
- data/templates/web/markitup/sets/markdown/images/h3.png +0 -0
- data/templates/web/markitup/sets/markdown/images/h4.png +0 -0
- data/templates/web/markitup/sets/markdown/images/h5.png +0 -0
- data/templates/web/markitup/sets/markdown/images/h6.png +0 -0
- data/templates/web/markitup/sets/markdown/images/italic.png +0 -0
- data/templates/web/markitup/sets/markdown/images/link.png +0 -0
- data/templates/web/markitup/sets/markdown/images/list-bullet.png +0 -0
- data/templates/web/markitup/sets/markdown/images/list-numeric.png +0 -0
- data/templates/web/markitup/sets/markdown/images/picture.png +0 -0
- data/templates/web/markitup/sets/markdown/images/preview.png +0 -0
- data/templates/web/markitup/sets/markdown/images/quotes.png +0 -0
- data/templates/web/markitup/sets/markdown/readme.txt +0 -11
- data/templates/web/markitup/sets/markdown/style.css +0 -6
- data/templates/web/markitup/skins/mad_chatter/images/handle.png +0 -0
- data/templates/web/markitup/skins/mad_chatter/images/menu.png +0 -0
- data/templates/web/markitup/skins/mad_chatter/images/submenu.png +0 -0
- data/templates/web/markitup/skins/mad_chatter/style.css +0 -121
data/lib/mad_chatter/server.rb
CHANGED
@@ -1,15 +1,9 @@
|
|
1
1
|
module MadChatter
|
2
|
-
|
3
2
|
class Server
|
4
3
|
|
5
4
|
def initialize(config)
|
6
5
|
@config = config
|
7
6
|
@server = initialize_server
|
8
|
-
@subscribers = {};
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.main_channel
|
12
|
-
@main_channel ||= EventMachine::Channel.new
|
13
7
|
end
|
14
8
|
|
15
9
|
def initialize_server
|
@@ -28,55 +22,6 @@ module MadChatter
|
|
28
22
|
end
|
29
23
|
end
|
30
24
|
|
31
|
-
def register_connection(&send_message)
|
32
|
-
subscriber_id = MadChatter::Server.main_channel.subscribe(send_message)
|
33
|
-
token = generate_token
|
34
|
-
send_message.call(MadChatter::Message.new('token', token).to_json)
|
35
|
-
@subscribers[subscriber_id] = token
|
36
|
-
MadChatter::MessageHistory.all.each do |json|
|
37
|
-
send_message.call(json)
|
38
|
-
end
|
39
|
-
subscriber_id
|
40
|
-
end
|
41
|
-
|
42
|
-
def generate_token
|
43
|
-
Digest::SHA1.hexdigest(Time.now.to_s)
|
44
|
-
end
|
45
|
-
|
46
|
-
def connection_closed(id)
|
47
|
-
token = @subscribers.delete(id)
|
48
|
-
username = MadChatter::Users.find_username_by_token(token)
|
49
|
-
MadChatter::Server.main_channel.unsubscribe(id)
|
50
|
-
MadChatter::Users.remove(token)
|
51
|
-
MadChatter::Server.send_json(MadChatter::Message.new('status', "#{username} has left the chatroom").to_json)
|
52
|
-
MadChatter::Server.send_json(MadChatter::Message.new('users', MadChatter::Users.current).to_json)
|
53
|
-
end
|
54
|
-
|
55
|
-
def message_received(json)
|
56
|
-
msg = JSON.parse(json)
|
57
|
-
username = MadChatter::Users.find_username_by_token(msg['token'])
|
58
|
-
message = MadChatter::Message.new(msg['type'], msg['message'], msg['token'], username)
|
59
|
-
message.filter
|
60
|
-
|
61
|
-
if message.token.nil?
|
62
|
-
return # Token is required to send messages
|
63
|
-
end
|
64
|
-
|
65
|
-
begin
|
66
|
-
MadChatter.message_listeners.each do |listener|
|
67
|
-
listener.handle(message)
|
68
|
-
end
|
69
|
-
|
70
|
-
MadChatter::Server.send_json(message.to_json)
|
71
|
-
rescue RuntimeError
|
72
|
-
# dont need to do anything, just prevent any errors from stopping the server
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.send_json(json)
|
77
|
-
MadChatter::Server.main_channel.push(json)
|
78
|
-
end
|
79
|
-
|
80
25
|
end
|
81
26
|
|
82
27
|
end
|
@@ -14,21 +14,12 @@ module MadChatter
|
|
14
14
|
|
15
15
|
def start
|
16
16
|
EventMachine::WebSocket.start(@config) do |ws|
|
17
|
-
|
18
17
|
ws.onopen do
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
ws.onclose do
|
25
|
-
@main_server.connection_closed(connection_id)
|
26
|
-
end
|
27
|
-
|
28
|
-
ws.onmessage do |msg|
|
29
|
-
@main_server.message_received(msg)
|
30
|
-
end
|
31
|
-
|
18
|
+
user = MadChatter::User.new
|
19
|
+
user.on_send { |msg| ws.send(msg) }
|
20
|
+
ws.onclose { user.disconnected }
|
21
|
+
ws.onmessage { |msg| MadChatter.message_received(msg) }
|
22
|
+
user.connected
|
32
23
|
end
|
33
24
|
end
|
34
25
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module MadChatter
|
2
|
+
class User
|
3
|
+
|
4
|
+
attr_accessor :token, :username
|
5
|
+
|
6
|
+
def initialize(token = nil, username = nil)
|
7
|
+
@token = token
|
8
|
+
@username = username
|
9
|
+
end
|
10
|
+
|
11
|
+
def on_send(&blk)
|
12
|
+
@on_send = blk
|
13
|
+
end
|
14
|
+
|
15
|
+
def send(json)
|
16
|
+
@on_send.call(json) if @on_send
|
17
|
+
end
|
18
|
+
|
19
|
+
def connected
|
20
|
+
@token = generate_new_token unless @token
|
21
|
+
MadChatter.users << self
|
22
|
+
send_token
|
23
|
+
send_channels
|
24
|
+
end
|
25
|
+
|
26
|
+
def generate_new_token
|
27
|
+
Digest::SHA1.hexdigest(Time.now.to_s)
|
28
|
+
end
|
29
|
+
|
30
|
+
def send_token
|
31
|
+
send JSON.generate({
|
32
|
+
type: 'token',
|
33
|
+
text: @token,
|
34
|
+
})
|
35
|
+
end
|
36
|
+
|
37
|
+
def send_channels
|
38
|
+
channels = MadChatter.channels.collect do |c|
|
39
|
+
{:id => c.id, :name => c.name }
|
40
|
+
end
|
41
|
+
send JSON.generate({
|
42
|
+
type: 'channels',
|
43
|
+
json: channels,
|
44
|
+
})
|
45
|
+
end
|
46
|
+
|
47
|
+
def update_username(username)
|
48
|
+
old_username = @username
|
49
|
+
@username = username
|
50
|
+
send_users_list
|
51
|
+
MadChatter.channels.each do |channel|
|
52
|
+
channel.users.each do |user|
|
53
|
+
if user == self
|
54
|
+
channel.send_message MadChatter::Message.new('status', "#{old_username} is now known as #{@username}")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def send_users_list
|
61
|
+
MadChatter.channels.each do |channel|
|
62
|
+
channel.users.each do |user|
|
63
|
+
channel.send_users_list if user == self
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def disconnected
|
69
|
+
MadChatter.channels.each do |channel|
|
70
|
+
channel.remove_user(self)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def has_token?(token)
|
75
|
+
@token == token
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/mad_chatter/users.rb
CHANGED
@@ -1,31 +1,39 @@
|
|
1
1
|
module MadChatter
|
2
2
|
class Users
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
def initialize
|
5
|
+
@users = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def add(token, username = nil)
|
9
|
+
@users[token] = username
|
10
|
+
end
|
11
|
+
|
12
|
+
def update(token, username)
|
13
|
+
@users[token] = username
|
14
|
+
end
|
15
|
+
|
16
|
+
def remove(token)
|
17
|
+
@users.delete(token)
|
18
|
+
end
|
19
|
+
|
20
|
+
def find_username_by_token(token)
|
21
|
+
@users[token]
|
22
|
+
end
|
23
|
+
|
24
|
+
def current
|
25
|
+
@users.values
|
26
|
+
end
|
27
|
+
|
28
|
+
def token_exists?(token)
|
29
|
+
@users[token].exists?
|
30
|
+
end
|
9
31
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
MadChatter::Users.users.delete(token)
|
16
|
-
end
|
17
|
-
|
18
|
-
def find_username_by_token(token)
|
19
|
-
MadChatter::Users.users[token]
|
20
|
-
end
|
21
|
-
|
22
|
-
def current
|
23
|
-
MadChatter::Users.users.values
|
24
|
-
end
|
25
|
-
|
26
|
-
def token_exists?(token)
|
27
|
-
MadChatter::Users.users[token].exists?
|
28
|
-
end
|
32
|
+
def to_json
|
33
|
+
JSON.generate({
|
34
|
+
type: 'users',
|
35
|
+
json: current,
|
36
|
+
})
|
29
37
|
end
|
30
38
|
|
31
39
|
end
|
data/lib/mad_chatter/version.rb
CHANGED
data/lib/mad_chatter.rb
CHANGED
@@ -2,47 +2,111 @@ lib_dir = File.expand_path('..', __FILE__)
|
|
2
2
|
$:.unshift( lib_dir ) unless $:.include?( lib_dir )
|
3
3
|
|
4
4
|
require 'eventmachine'
|
5
|
-
require 'redcarpet'
|
6
5
|
require 'yaml'
|
7
6
|
require 'json'
|
8
7
|
require 'digest/sha1'
|
9
8
|
|
9
|
+
require 'mad_chatter/version'
|
10
|
+
require 'mad_chatter/config'
|
11
|
+
|
12
|
+
require 'mad_chatter/server'
|
13
|
+
require 'mad_chatter/servers/em_websocket'
|
14
|
+
|
15
|
+
require 'mad_chatter/channel'
|
16
|
+
require 'mad_chatter/user'
|
17
|
+
require 'mad_chatter/users'
|
18
|
+
|
19
|
+
require 'mad_chatter/message'
|
20
|
+
require 'mad_chatter/message_history'
|
21
|
+
|
22
|
+
require 'mad_chatter/actions'
|
23
|
+
require 'mad_chatter/message_listeners/join'
|
24
|
+
require 'mad_chatter/message_listeners/markdown'
|
25
|
+
require 'mad_chatter/message_listeners/nick'
|
26
|
+
require 'mad_chatter/message_listeners/image'
|
27
|
+
require 'mad_chatter/message_listeners/code'
|
28
|
+
|
29
|
+
require 'mad_chatter/extensions'
|
30
|
+
require 'mad_chatter/message_listener'
|
31
|
+
|
10
32
|
module MadChatter
|
11
33
|
|
12
|
-
|
13
|
-
@@message_listeners ||= []
|
14
|
-
end
|
15
|
-
|
16
|
-
require 'mad_chatter/config'
|
17
|
-
require 'mad_chatter/message'
|
18
|
-
require 'mad_chatter/message_history'
|
19
|
-
require 'mad_chatter/markdown_renderer'
|
20
|
-
require 'mad_chatter/server'
|
21
|
-
require 'mad_chatter/users'
|
22
|
-
require 'mad_chatter/version'
|
23
|
-
require 'mad_chatter/actions/dsl'
|
24
|
-
require 'mad_chatter/actions/base'
|
25
|
-
require 'mad_chatter/actions/join'
|
26
|
-
require 'mad_chatter/actions/rename'
|
27
|
-
|
28
|
-
require 'mad_chatter/servers/em_websocket'
|
34
|
+
# attr_accessor :users, :channels, :message_listeners
|
29
35
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
class << self
|
37
|
+
|
38
|
+
def users
|
39
|
+
@users ||= []
|
40
|
+
end
|
41
|
+
|
42
|
+
def users=(array)
|
43
|
+
@users = array
|
44
|
+
end
|
45
|
+
|
46
|
+
def find_user_by_token(token)
|
47
|
+
users.each do |user|
|
48
|
+
return user if user.token == token
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def channels
|
53
|
+
@channels ||= []
|
54
|
+
end
|
55
|
+
|
56
|
+
def channels=(array)
|
57
|
+
@channels = array
|
58
|
+
end
|
41
59
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
60
|
+
def find_channel_by_id(id)
|
61
|
+
channels.each do |channel|
|
62
|
+
return channel if channel.id == id
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def find_channel_by_name(name)
|
67
|
+
channels.each do |channel|
|
68
|
+
return channel if channel.name == name
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def message_listeners
|
73
|
+
@message_listeners ||= []
|
74
|
+
end
|
75
|
+
|
76
|
+
def message_listeners=(array)
|
77
|
+
@message_listeners = array
|
78
|
+
end
|
79
|
+
|
80
|
+
def start
|
81
|
+
config = MadChatter::Config.init
|
82
|
+
server = MadChatter::Server.new(config)
|
83
|
+
server.start
|
84
|
+
end
|
85
|
+
|
86
|
+
def message_received(json)
|
87
|
+
msg = JSON.parse(json)
|
88
|
+
|
89
|
+
if msg['token'].nil?
|
90
|
+
return # Token is required to send messages
|
91
|
+
end
|
92
|
+
|
93
|
+
message = MadChatter::Message.new('message', msg['message'], msg['token'], msg['channel'])
|
94
|
+
|
95
|
+
begin
|
96
|
+
message_listeners.each do |listener|
|
97
|
+
listener.handle(message)
|
98
|
+
end
|
99
|
+
send_message(message)
|
100
|
+
rescue RuntimeError
|
101
|
+
# dont need to do anything, just prevent any errors from stopping the server
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def send_message(message)
|
106
|
+
channels.each do |channel|
|
107
|
+
channel.send_message(message) if channel.id == message.channel
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
46
111
|
end
|
47
|
-
|
48
112
|
end
|
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
|
-
s.add_runtime_dependency "redcarpet"
|
24
|
+
# s.add_runtime_dependency "redcarpet"
|
25
25
|
s.add_runtime_dependency "daemons", "1.1.4"
|
26
26
|
|
27
27
|
s.add_development_dependency "rspec"
|
data/screenshot.png
ADDED
Binary file
|
@@ -2,28 +2,30 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe MadChatter::MessageHistory do
|
4
4
|
|
5
|
+
let (:history) { MadChatter::MessageHistory.new }
|
6
|
+
|
5
7
|
before(:each) do
|
6
|
-
|
8
|
+
|
9
|
+
# MadChatter::MessageHistory.clear
|
7
10
|
end
|
8
11
|
|
9
12
|
it 'should only keep 10 recent messages' do
|
10
13
|
15.times do
|
11
|
-
|
14
|
+
history.add MadChatter::Message.new('message', 'Here is a dummy chat message')
|
12
15
|
end
|
13
|
-
|
16
|
+
history.all.length.should == 10
|
14
17
|
end
|
15
18
|
|
16
19
|
it 'should allow you to clear the history' do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
history.add MadChatter::Message.new('message', 'Here is a dummy chat message')
|
21
|
+
history.all.length.should == 1
|
22
|
+
history.clear
|
23
|
+
history.all.length.should == 0
|
21
24
|
end
|
22
25
|
|
23
26
|
context '#all' do
|
24
|
-
it 'should still return an empty array if there is
|
25
|
-
history
|
26
|
-
history.should == []
|
27
|
+
it 'should still return an empty array if there is no chat history' do
|
28
|
+
history.all.should == []
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe MadChatter::MessageListeners::Code do
|
4
|
+
|
5
|
+
let (:server) { MadChatter::Server.new({'websocket_backend' => 'MadChatter::Servers::EventMachineWebSocket'}) }
|
6
|
+
let (:user) { MadChatter::User.new('usertoken') }
|
7
|
+
let (:channel) { MadChatter::Channel.new('myroom') }
|
8
|
+
let (:listener) { MadChatter::MessageListeners::Code.new }
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
MadChatter.users = []
|
12
|
+
MadChatter.channels = []
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should set html correctly' do
|
16
|
+
MadChatter.users << user
|
17
|
+
MadChatter.channels << channel
|
18
|
+
begin
|
19
|
+
message_text = <<-EOS
|
20
|
+
/code <?php
|
21
|
+
echo "multiline";
|
22
|
+
echo "code sample";
|
23
|
+
?>
|
24
|
+
EOS
|
25
|
+
message = MadChatter::Message.new('message', message_text, user.token, channel.id)
|
26
|
+
listener.handle(message)
|
27
|
+
message.html.should == <<-EOS
|
28
|
+
<pre><?php
|
29
|
+
echo "multiline";
|
30
|
+
echo "code sample";
|
31
|
+
?></pre>
|
32
|
+
EOS
|
33
|
+
rescue RuntimeError
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe MadChatter::MessageListeners::Join do
|
4
|
+
|
5
|
+
let (:server) { MadChatter::Server.new({'websocket_backend' => 'MadChatter::Servers::EventMachineWebSocket'}) }
|
6
|
+
let (:user) { MadChatter::User.new('usertoken') }
|
7
|
+
let (:channel) { MadChatter::Channel.new('myroom') }
|
8
|
+
let (:listener) { MadChatter::MessageListeners::Join.new }
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
MadChatter.users = []
|
12
|
+
MadChatter.channels = []
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should add user to list of users in server and channel' do
|
16
|
+
MadChatter.users << user
|
17
|
+
MadChatter.channels << channel
|
18
|
+
begin
|
19
|
+
MadChatter.users.include?(user).should be_true
|
20
|
+
MadChatter.find_channel_by_name('myroom').users.include?(user).should be_false
|
21
|
+
message = MadChatter::Message.new('message', '/join', user.token, channel.id)
|
22
|
+
listener.handle(message)
|
23
|
+
MadChatter.find_channel_by_name('myroom').users.include?(user).should be_true
|
24
|
+
rescue RuntimeError
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should parse messages correctly' do
|
29
|
+
message = MadChatter::Message.new('message', 'this /join should not count')
|
30
|
+
listener.handle(message)
|
31
|
+
# how to check that nothing happened?
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
require 'mad_chatter/message_listeners/markdown'
|
3
|
+
|
4
|
+
describe MadChatter::MessageListeners::Markdown do
|
5
|
+
|
6
|
+
let (:listener) { MadChatter::MessageListeners::Markdown.new }
|
7
|
+
|
8
|
+
it 'should autolink urls with target="_blank"' do
|
9
|
+
message = MadChatter::Message.new('message', 'here is a link: http://example.com.')
|
10
|
+
listener.handle(message)
|
11
|
+
message.html.should == 'here is a link: <a target="_blank" href="http://example.com">http://example.com</a>.'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should autolink email addresses' do
|
15
|
+
message = MadChatter::Message.new('message', "feel free to email me at madchatter@example.com")
|
16
|
+
listener.handle(message)
|
17
|
+
message.html.should == 'feel free to email me at <a href="mailto:madchatter@example.com">madchatter@example.com</a>'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should parse italics' do
|
21
|
+
message = MadChatter::Message.new('message', "_this_ should have emphasis but this_one_should_not")
|
22
|
+
listener.handle(message)
|
23
|
+
message.html.should == '<em>this</em> should have emphasis but this_one_should_not'
|
24
|
+
|
25
|
+
message = MadChatter::Message.new('message', "you can use *asterisks*")
|
26
|
+
listener.handle(message)
|
27
|
+
message.html.should == 'you can use <em>asterisks</em>'
|
28
|
+
|
29
|
+
message = MadChatter::Message.new('message', "this _doesnt count either")
|
30
|
+
listener.handle(message)
|
31
|
+
message.html.should == 'this _doesnt count either'
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should parse bold' do
|
35
|
+
message = MadChatter::Message.new('message', "here is a **strong** statement")
|
36
|
+
listener.handle(message)
|
37
|
+
message.html.should == 'here is a <strong>strong</strong> statement'
|
38
|
+
end
|
39
|
+
|
40
|
+
# TODO
|
41
|
+
# it 'should interpret markdown style links' do
|
42
|
+
# message = MadChatter::Message.new('message', "[link me up](http://www.example.com)")
|
43
|
+
# listener.handle(message)
|
44
|
+
# message.html.should == '<a target="_blank" href="http://www.example.com">link me up</a>'
|
45
|
+
# end
|
46
|
+
|
47
|
+
end
|
data/spec/message_spec.rb
CHANGED
@@ -1,37 +1,49 @@
|
|
1
1
|
require 'spec_helper' # see http://stackoverflow.com/q/5061179/314318
|
2
2
|
|
3
3
|
describe MadChatter::Message do
|
4
|
-
let (:message) { MadChatter::Message.new('joy', 'I am the model of the modern major general') }
|
5
4
|
|
5
|
+
before(:each) do
|
6
|
+
MadChatter.users = []
|
7
|
+
MadChatter.channels = []
|
8
|
+
end
|
9
|
+
|
6
10
|
it 'should have a well-known interface' do
|
11
|
+
message = MadChatter::Message.new('message', 'my chat message')
|
7
12
|
[:text, :to_json, :filter].each do |m|
|
8
13
|
message.should respond_to(m)
|
9
14
|
end
|
10
15
|
end
|
11
16
|
|
12
17
|
it 'should encode into JSON correctly' do
|
13
|
-
message.
|
18
|
+
message = MadChatter::Message.new('type', 'message', 'token', 'channel')
|
19
|
+
message.to_json.should ==
|
20
|
+
'{"type":"type","text":"message","html":"message","username":null,"channel":"channel","growl":"message"}'
|
14
21
|
end
|
15
|
-
|
16
|
-
context '#
|
17
|
-
|
18
|
-
|
19
|
-
end
|
22
|
+
|
23
|
+
context '#username' do
|
24
|
+
let (:user) { MadChatter::User.new('usertoken', 'myusername') }
|
25
|
+
let (:message) { MadChatter::Message.new('message', 'text', 'usertoken') }
|
20
26
|
|
21
|
-
it 'should
|
22
|
-
|
23
|
-
message.
|
27
|
+
it 'should find username correctly' do
|
28
|
+
MadChatter.users << user
|
29
|
+
message.username.should == 'myusername'
|
24
30
|
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context '#filter' do
|
34
|
+
|
35
|
+
let (:message) { MadChatter::Message.new('message', 'text') }
|
25
36
|
|
26
|
-
it 'should
|
27
|
-
|
28
|
-
message.filter.should
|
37
|
+
it 'should escape all html tags' do
|
38
|
+
html = "<strong>bold</strong><script>alert('text')</script>"
|
39
|
+
message.filter(html).should == "<strong>bold</strong><script>alert('text')</script>"
|
29
40
|
end
|
30
41
|
|
31
|
-
it 'should
|
32
|
-
|
33
|
-
message.filter.should
|
42
|
+
it 'should be able to handle messages made of empty space' do
|
43
|
+
text = " "
|
44
|
+
message.filter(text).should == ''
|
34
45
|
end
|
46
|
+
|
35
47
|
end
|
36
48
|
|
37
49
|
end
|