mad_chatter 0.3.1 → 0.3.2
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 -0
- data/.travis.yml +12 -0
- data/README.md +3 -5
- data/bin/mad_chatter +1 -1
- data/lib/mad_chatter.rb +22 -4
- data/lib/mad_chatter/config.rb +1 -6
- data/lib/mad_chatter/message.rb +5 -3
- data/lib/mad_chatter/message_listeners/channel_commands.rb +53 -0
- data/lib/mad_chatter/message_listeners/code.rb +0 -3
- data/lib/mad_chatter/message_listeners/markdown.rb +11 -5
- data/lib/mad_chatter/message_listeners/nick.rb +1 -1
- data/lib/mad_chatter/user.rb +1 -7
- data/lib/mad_chatter/version.rb +1 -1
- data/mad_chatter.gemspec +8 -7
- data/spec/mad_chatter_spec.rb +17 -0
- data/spec/message_listeners/{join_spec.rb → channel_commands_spec.rb} +17 -5
- data/spec/message_listeners/code_spec.rb +1 -1
- data/spec/message_listeners/markdown_spec.rb +12 -8
- data/spec/message_spec.rb +13 -3
- data/spec/spec_helper.rb +4 -7
- data/templates/web/css/mad_chatter.css +1 -1
- data/templates/web/index.html +35 -7
- data/templates/web/js/mad_chatter.js +33 -22
- data/templates/web/js/mad_chatter_config.js +1 -1
- metadata +28 -53
- data/Gemfile.lock +0 -53
- data/lib/mad_chatter/actions/base.rb +0 -26
- data/lib/mad_chatter/actions/dsl.rb +0 -38
- data/lib/mad_chatter/actions/join.rb +0 -23
- data/lib/mad_chatter/actions/rename.rb +0 -24
- data/lib/mad_chatter/connection.rb +0 -29
- data/lib/mad_chatter/markdown_renderer.rb +0 -16
- data/lib/mad_chatter/message_listeners/join.rb +0 -30
- data/lib/mad_chatter/servers/juggernaut.rb +0 -9
- data/lib/mad_chatter/servers/websocket_rack.rb +0 -9
- data/lib/mad_chatter/users.rb +0 -40
- data/spec/actions_spec.rb +0 -7
- data/spec/server_spec.rb +0 -43
- data/spec/users_spec.rb +0 -23
- data/templates/web/css/styles.css +0 -166
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -77,17 +77,15 @@ Once you've got your chat server running and being used by other people, you mig
|
|
77
77
|
|
78
78
|
## Getting Help / Providing Feedback
|
79
79
|
|
80
|
-
Feel free to submit
|
80
|
+
Feel free to submit bug reports and feature requests to our [GitHub Issues page](https://github.com/andrewhavens/mad_chatter/issues), or post to the [Google Group](https://groups.google.com/group/mad-chatter), or send me a message on GitHub.
|
81
81
|
|
82
82
|
You can also vote on upcoming features: https://madchatter.uservoice.com
|
83
83
|
|
84
84
|
## Contributing
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
## TODO
|
86
|
+
[](http://travis-ci.org/andrewhavens/mad_chatter)
|
89
87
|
|
90
|
-
|
88
|
+
Please fork and send pull requests! Or submit issues if you have suggestions on how to improve.
|
91
89
|
|
92
90
|
##Copyright
|
93
91
|
|
data/bin/mad_chatter
CHANGED
@@ -11,7 +11,7 @@ module MadChatter
|
|
11
11
|
File.expand_path('../../', __FILE__)
|
12
12
|
end
|
13
13
|
|
14
|
-
desc "new [name]", "Generates a new Mad Chatter
|
14
|
+
desc "new [name]", "Generates a new Mad Chatter application"
|
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"
|
data/lib/mad_chatter.rb
CHANGED
@@ -14,13 +14,12 @@ require 'mad_chatter/servers/em_websocket'
|
|
14
14
|
|
15
15
|
require 'mad_chatter/channel'
|
16
16
|
require 'mad_chatter/user'
|
17
|
-
require 'mad_chatter/users'
|
18
17
|
|
19
18
|
require 'mad_chatter/message'
|
20
19
|
require 'mad_chatter/message_history'
|
21
20
|
|
22
21
|
require 'mad_chatter/actions'
|
23
|
-
require 'mad_chatter/message_listeners/
|
22
|
+
require 'mad_chatter/message_listeners/channel_commands'
|
24
23
|
require 'mad_chatter/message_listeners/markdown'
|
25
24
|
require 'mad_chatter/message_listeners/nick'
|
26
25
|
require 'mad_chatter/message_listeners/image'
|
@@ -31,8 +30,6 @@ require 'mad_chatter/message_listener'
|
|
31
30
|
|
32
31
|
module MadChatter
|
33
32
|
|
34
|
-
# attr_accessor :users, :channels, :message_listeners
|
35
|
-
|
36
33
|
class << self
|
37
34
|
|
38
35
|
def users
|
@@ -47,6 +44,7 @@ module MadChatter
|
|
47
44
|
users.each do |user|
|
48
45
|
return user if user.token == token
|
49
46
|
end
|
47
|
+
return nil
|
50
48
|
end
|
51
49
|
|
52
50
|
def channels
|
@@ -61,12 +59,14 @@ module MadChatter
|
|
61
59
|
channels.each do |channel|
|
62
60
|
return channel if channel.id == id
|
63
61
|
end
|
62
|
+
return nil
|
64
63
|
end
|
65
64
|
|
66
65
|
def find_channel_by_name(name)
|
67
66
|
channels.each do |channel|
|
68
67
|
return channel if channel.name == name
|
69
68
|
end
|
69
|
+
return nil
|
70
70
|
end
|
71
71
|
|
72
72
|
def message_listeners
|
@@ -85,6 +85,7 @@ module MadChatter
|
|
85
85
|
|
86
86
|
def message_received(json)
|
87
87
|
msg = JSON.parse(json)
|
88
|
+
# puts 'received: ' + msg['message']
|
88
89
|
|
89
90
|
if msg['token'].nil?
|
90
91
|
return # Token is required to send messages
|
@@ -108,5 +109,22 @@ module MadChatter
|
|
108
109
|
end
|
109
110
|
end
|
110
111
|
|
112
|
+
def send_channels_list
|
113
|
+
json = channels_list
|
114
|
+
users.each do |user|
|
115
|
+
user.send(json)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def channels_list
|
120
|
+
channels_hash = channels.collect do |c|
|
121
|
+
{:id => c.id, :name => c.name }
|
122
|
+
end
|
123
|
+
JSON.generate({
|
124
|
+
type: 'channels',
|
125
|
+
json: channels_hash,
|
126
|
+
})
|
127
|
+
end
|
128
|
+
|
111
129
|
end
|
112
130
|
end
|
data/lib/mad_chatter/config.rb
CHANGED
@@ -24,14 +24,9 @@ module MadChatter
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def init_default_message_listeners
|
27
|
-
%w{
|
27
|
+
%w{ ChannelCommands Nick Image Code Markdown }.each do |listener|
|
28
28
|
MadChatter.message_listeners << Object.const_get('MadChatter').const_get('MessageListeners').const_get(listener).new
|
29
29
|
end
|
30
|
-
# MadChatter.message_listeners << MadChatter::MessageListeners::Join.new
|
31
|
-
# MadChatter.message_listeners << MadChatter::MessageListeners::Nick.new
|
32
|
-
# MadChatter.message_listeners << MadChatter::MessageListeners::Image.new
|
33
|
-
# MadChatter.message_listeners << MadChatter::MessageListeners::Code.new
|
34
|
-
# MadChatter.message_listeners << MadChatter::MessageListeners::Markdown.new
|
35
30
|
end
|
36
31
|
|
37
32
|
def init_extensions
|
data/lib/mad_chatter/message.rb
CHANGED
@@ -3,9 +3,9 @@ require 'cgi'
|
|
3
3
|
module MadChatter
|
4
4
|
class Message
|
5
5
|
|
6
|
-
attr_accessor :type, :original_text, :filtered_text, :html, :token, :channel, :growl, :add_to_history
|
6
|
+
attr_accessor :type, :original_text, :filtered_text, :html, :token, :channel, :growl, :add_to_history, :timestamp
|
7
7
|
|
8
|
-
def initialize(type, text = nil, token = nil,
|
8
|
+
def initialize(type, text = nil, token = nil, channel_id = nil)
|
9
9
|
@type = type
|
10
10
|
if text
|
11
11
|
@original_text = text
|
@@ -14,8 +14,9 @@ module MadChatter
|
|
14
14
|
@growl = text
|
15
15
|
end
|
16
16
|
@token = token
|
17
|
-
@channel =
|
17
|
+
@channel = channel_id
|
18
18
|
@add_to_history = true
|
19
|
+
@timestamp = Time.now.to_i
|
19
20
|
end
|
20
21
|
|
21
22
|
def username=(username)
|
@@ -48,6 +49,7 @@ module MadChatter
|
|
48
49
|
username: username,
|
49
50
|
channel: @channel,
|
50
51
|
growl: @growl,
|
52
|
+
time: @timestamp
|
51
53
|
})
|
52
54
|
end
|
53
55
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module MadChatter
|
2
|
+
module MessageListeners
|
3
|
+
class ChannelCommands
|
4
|
+
|
5
|
+
include MadChatter::Actions
|
6
|
+
|
7
|
+
def handle(message)
|
8
|
+
@message = message
|
9
|
+
case @message.text
|
10
|
+
when '/join'
|
11
|
+
join_channel
|
12
|
+
stop_message_handling
|
13
|
+
when %r{^/channel create}
|
14
|
+
create_channel
|
15
|
+
stop_message_handling
|
16
|
+
when %r{^/channel rename}
|
17
|
+
rename_channel
|
18
|
+
stop_message_handling
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def join_channel
|
23
|
+
user = MadChatter.find_user_by_token(@message.token)
|
24
|
+
|
25
|
+
unless user && @message.channel
|
26
|
+
stop_message_handling # user should already exist, and channel id is required
|
27
|
+
end
|
28
|
+
|
29
|
+
channel = MadChatter.find_channel_by_id(@message.channel)
|
30
|
+
|
31
|
+
unless channel
|
32
|
+
stop_message_handling # you cant join a channel that doesnt exist
|
33
|
+
end
|
34
|
+
|
35
|
+
channel.add_user(user)
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_channel
|
39
|
+
channel_name = %r{^/channel create (.+)}.match(@message.text).captures[0]
|
40
|
+
MadChatter.channels << MadChatter::Channel.new(channel_name)
|
41
|
+
MadChatter.send_channels_list
|
42
|
+
end
|
43
|
+
|
44
|
+
def rename_channel
|
45
|
+
channel_name = %r{^/channel rename (.+)}.match(@message.text).captures[0]
|
46
|
+
channel = MadChatter.find_channel_by_id(@message.channel)
|
47
|
+
channel.name = channel_name
|
48
|
+
MadChatter.send_channels_list
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -8,9 +8,7 @@ module MadChatter
|
|
8
8
|
|
9
9
|
def handle(msg)
|
10
10
|
if msg.original_text =~ @@regex
|
11
|
-
# puts msg.original_text
|
12
11
|
code = parse(msg.original_text)
|
13
|
-
# puts code
|
14
12
|
message = MadChatter::Message.new('message', nil, msg.token, msg.channel)
|
15
13
|
message.html = "<pre>" + message.filter(code) + "</pre>"
|
16
14
|
message.growl = msg.username + ' has shared a code sample' if msg.username
|
@@ -22,7 +20,6 @@ module MadChatter
|
|
22
20
|
|
23
21
|
def parse(text)
|
24
22
|
text.sub!('/code', '')
|
25
|
-
# @@regex.match(message_text).captures[0]
|
26
23
|
end
|
27
24
|
|
28
25
|
end
|
@@ -14,6 +14,9 @@ module MadChatter
|
|
14
14
|
text.gsub!(/^[\w\<][^\n]*\n+/) do |x|
|
15
15
|
x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
|
16
16
|
end
|
17
|
+
|
18
|
+
# inline code (backticks)
|
19
|
+
text.gsub!(%r{(^|\s)(\`)(.+?)\2(\s|$)}, %{\\1<code>\\3</code>\\4})
|
17
20
|
|
18
21
|
# autolink email addresses
|
19
22
|
text.gsub!(/([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})/i) do |x|
|
@@ -24,18 +27,21 @@ module MadChatter
|
|
24
27
|
text.gsub!(/(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/(\S)+)?/i) do |x|
|
25
28
|
href = $&
|
26
29
|
# check if we're in a markdown link
|
27
|
-
|
30
|
+
if $` =~ /[(]/
|
28
31
|
x = href
|
29
|
-
|
32
|
+
else
|
30
33
|
x = %Q{<a target="_blank" href="#{href}">#{href}</a>}
|
31
|
-
|
34
|
+
end
|
32
35
|
end
|
33
36
|
|
37
|
+
# reference style links: [link text](http://link.url)
|
38
|
+
text.gsub!(%r{\[([^\]]+)\]\((\S+(?=\)))\)}, %{<a target="_blank" href="\\2">\\1</a>})
|
39
|
+
|
34
40
|
# bold (must come before italic)
|
35
|
-
text.gsub!(%r{(^|\s)(\*\*|__)(.+?)\2(\s|$)}
|
41
|
+
text.gsub!(%r{(^|\s)(\*\*|__)(.+?)\2(\s|$)}, %{\\1<strong>\\3</strong>\\4})
|
36
42
|
|
37
43
|
# italic
|
38
|
-
text.gsub!(%r{(^|\s)([*_])(.+?)\2(\s|$)}
|
44
|
+
text.gsub!(%r{(^|\s)([*_])(.+?)\2(\s|$)}, %{\\1<em>\\3</em>\\4})
|
39
45
|
|
40
46
|
return text
|
41
47
|
end
|
data/lib/mad_chatter/user.rb
CHANGED
@@ -35,13 +35,7 @@ module MadChatter
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def send_channels
|
38
|
-
|
39
|
-
{:id => c.id, :name => c.name }
|
40
|
-
end
|
41
|
-
send JSON.generate({
|
42
|
-
type: 'channels',
|
43
|
-
json: channels,
|
44
|
-
})
|
38
|
+
send MadChatter.channels_list
|
45
39
|
end
|
46
40
|
|
47
41
|
def update_username(username)
|
data/lib/mad_chatter/version.rb
CHANGED
data/mad_chatter.gemspec
CHANGED
@@ -21,14 +21,15 @@ 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"
|
25
24
|
s.add_runtime_dependency "daemons", "1.1.4"
|
26
25
|
|
27
26
|
s.add_development_dependency "rspec"
|
28
|
-
s.add_development_dependency "shoulda" # do we need this?
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
27
|
+
# s.add_development_dependency "shoulda" # do we need this?
|
28
|
+
unless ENV["CI"]
|
29
|
+
s.add_development_dependency 'simplecov'
|
30
|
+
s.add_development_dependency 'guard'
|
31
|
+
s.add_development_dependency 'guard-rspec'
|
32
|
+
s.add_development_dependency 'rb-fsevent'
|
33
|
+
s.add_development_dependency 'ruby-growl'
|
34
|
+
end
|
34
35
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MadChatter do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
MadChatter.users = []
|
7
|
+
MadChatter.channels = []
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should provide the ability to find a channel by name' do
|
11
|
+
channel = MadChatter::Channel.new('My special room')
|
12
|
+
MadChatter.channels << channel
|
13
|
+
MadChatter.find_channel_by_name('My special room').should == channel
|
14
|
+
MadChatter.find_channel_by_name('doesnt exist').should == nil
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
|
-
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
describe MadChatter::MessageListeners::
|
3
|
+
describe MadChatter::MessageListeners::ChannelCommands do
|
4
4
|
|
5
5
|
let (:server) { MadChatter::Server.new({'websocket_backend' => 'MadChatter::Servers::EventMachineWebSocket'}) }
|
6
6
|
let (:user) { MadChatter::User.new('usertoken') }
|
7
7
|
let (:channel) { MadChatter::Channel.new('myroom') }
|
8
|
-
let (:listener) { MadChatter::MessageListeners::
|
8
|
+
let (:listener) { MadChatter::MessageListeners::ChannelCommands.new }
|
9
9
|
|
10
10
|
before(:each) do
|
11
11
|
MadChatter.users = []
|
12
12
|
MadChatter.channels = []
|
13
13
|
end
|
14
14
|
|
15
|
-
it 'should
|
15
|
+
it 'should allow a user to join a channel' do
|
16
16
|
MadChatter.users << user
|
17
17
|
MadChatter.channels << channel
|
18
18
|
begin
|
@@ -25,10 +25,22 @@ describe MadChatter::MessageListeners::Join do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
it 'should
|
28
|
+
it 'should allow /join to exist in a normal message' do
|
29
29
|
message = MadChatter::Message.new('message', 'this /join should not count')
|
30
30
|
listener.handle(message)
|
31
31
|
# how to check that nothing happened?
|
32
32
|
end
|
33
33
|
|
34
|
+
it 'should allow a user to create a channel' do
|
35
|
+
MadChatter.users << user
|
36
|
+
MadChatter.channels << channel
|
37
|
+
begin
|
38
|
+
MadChatter.find_channel_by_name('Foobar Room').should be_nil
|
39
|
+
message = MadChatter::Message.new('message', '/channel create Foobar Room', user.token, channel.id)
|
40
|
+
listener.handle(message)
|
41
|
+
MadChatter.find_channel_by_name('Foobar Room').should_not be_nil
|
42
|
+
rescue RuntimeError
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
34
46
|
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
require 'mad_chatter/message_listeners/markdown'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
3
|
describe MadChatter::MessageListeners::Markdown do
|
5
4
|
|
@@ -37,11 +36,16 @@ describe MadChatter::MessageListeners::Markdown do
|
|
37
36
|
message.html.should == 'here is a <strong>strong</strong> statement'
|
38
37
|
end
|
39
38
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
39
|
+
it 'should parse backticks as inline code' do
|
40
|
+
message = MadChatter::Message.new('message', "this has `some code` in it")
|
41
|
+
listener.handle(message)
|
42
|
+
message.html.should == 'this has <code>some code</code> in it'
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should parse markdown style links' do
|
46
|
+
message = MadChatter::Message.new('message', "[link me up](http://www.example.com)")
|
47
|
+
listener.handle(message)
|
48
|
+
message.html.should == '<a target="_blank" href="http://www.example.com">link me up</a>'
|
49
|
+
end
|
46
50
|
|
47
51
|
end
|