mad_chatter 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +12 -0
  3. data/README.md +3 -5
  4. data/bin/mad_chatter +1 -1
  5. data/lib/mad_chatter.rb +22 -4
  6. data/lib/mad_chatter/config.rb +1 -6
  7. data/lib/mad_chatter/message.rb +5 -3
  8. data/lib/mad_chatter/message_listeners/channel_commands.rb +53 -0
  9. data/lib/mad_chatter/message_listeners/code.rb +0 -3
  10. data/lib/mad_chatter/message_listeners/markdown.rb +11 -5
  11. data/lib/mad_chatter/message_listeners/nick.rb +1 -1
  12. data/lib/mad_chatter/user.rb +1 -7
  13. data/lib/mad_chatter/version.rb +1 -1
  14. data/mad_chatter.gemspec +8 -7
  15. data/spec/mad_chatter_spec.rb +17 -0
  16. data/spec/message_listeners/{join_spec.rb → channel_commands_spec.rb} +17 -5
  17. data/spec/message_listeners/code_spec.rb +1 -1
  18. data/spec/message_listeners/markdown_spec.rb +12 -8
  19. data/spec/message_spec.rb +13 -3
  20. data/spec/spec_helper.rb +4 -7
  21. data/templates/web/css/mad_chatter.css +1 -1
  22. data/templates/web/index.html +35 -7
  23. data/templates/web/js/mad_chatter.js +33 -22
  24. data/templates/web/js/mad_chatter_config.js +1 -1
  25. metadata +28 -53
  26. data/Gemfile.lock +0 -53
  27. data/lib/mad_chatter/actions/base.rb +0 -26
  28. data/lib/mad_chatter/actions/dsl.rb +0 -38
  29. data/lib/mad_chatter/actions/join.rb +0 -23
  30. data/lib/mad_chatter/actions/rename.rb +0 -24
  31. data/lib/mad_chatter/connection.rb +0 -29
  32. data/lib/mad_chatter/markdown_renderer.rb +0 -16
  33. data/lib/mad_chatter/message_listeners/join.rb +0 -30
  34. data/lib/mad_chatter/servers/juggernaut.rb +0 -9
  35. data/lib/mad_chatter/servers/websocket_rack.rb +0 -9
  36. data/lib/mad_chatter/users.rb +0 -40
  37. data/spec/actions_spec.rb +0 -7
  38. data/spec/server_spec.rb +0 -43
  39. data/spec/users_spec.rb +0 -23
  40. data/templates/web/css/styles.css +0 -166
data/Gemfile.lock DELETED
@@ -1,53 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- mad_chatter (0.3.0)
5
- daemons (= 1.1.4)
6
- em-websocket
7
- eventmachine
8
- thor
9
-
10
- GEM
11
- remote: http://rubygems.org/
12
- specs:
13
- addressable (2.2.6)
14
- daemons (1.1.4)
15
- diff-lcs (1.1.3)
16
- em-websocket (0.3.6)
17
- addressable (>= 2.1.1)
18
- eventmachine (>= 0.12.9)
19
- eventmachine (0.12.10)
20
- guard (0.8.8)
21
- thor (~> 0.14.6)
22
- guard-rspec (0.5.10)
23
- guard (>= 0.8.4)
24
- multi_json (1.0.4)
25
- rb-fsevent (0.4.3.1)
26
- rspec (2.7.0)
27
- rspec-core (~> 2.7.0)
28
- rspec-expectations (~> 2.7.0)
29
- rspec-mocks (~> 2.7.0)
30
- rspec-core (2.7.1)
31
- rspec-expectations (2.7.0)
32
- diff-lcs (~> 1.1.2)
33
- rspec-mocks (2.7.0)
34
- ruby-growl (3.0)
35
- shoulda (2.11.3)
36
- simplecov (0.5.4)
37
- multi_json (~> 1.0.3)
38
- simplecov-html (~> 0.5.3)
39
- simplecov-html (0.5.3)
40
- thor (0.14.6)
41
-
42
- PLATFORMS
43
- ruby
44
-
45
- DEPENDENCIES
46
- guard
47
- guard-rspec
48
- mad_chatter!
49
- rb-fsevent
50
- rspec
51
- ruby-growl
52
- shoulda
53
- simplecov
@@ -1,26 +0,0 @@
1
- module MadChatter
2
- module Actions
3
- class Base
4
-
5
- include MadChatter::Actions::Dsl
6
-
7
- def initialize(regex = nil, block = nil)
8
- @regex = regex
9
- @block = block
10
- end
11
-
12
- def handle(message)
13
- if message.original_text =~ @regex
14
- args = @regex.match(message.original_text).captures
15
- @block.call(args)
16
- end
17
- end
18
-
19
- # used to register a class that extends MadChatter::Actions::Base
20
- def self.inherited(extension_class)
21
- MadChatter.message_listeners << extension_class.new
22
- end
23
-
24
- end
25
- end
26
- end
@@ -1,38 +0,0 @@
1
- module MadChatter
2
- module Actions
3
- module Dsl
4
-
5
- # Used to define a simple extension
6
- def on_message(regex, &block)
7
- MadChatter.message_listeners << MadChatter::Actions::Base.new(regex, block)
8
- end
9
-
10
- # Helper methods
11
-
12
- def stop_message_handling
13
- raise "Don't call any more message listeners"
14
- end
15
-
16
- def send_json(json)
17
- MadChatter::Server.send_json(json)
18
- end
19
-
20
- def send_message(text)
21
- MadChatter::Server.send_message MadChatter::Message.new('message', text)
22
- end
23
-
24
- def send_status_message(text)
25
- MadChatter::Server.send_message MadChatter::Message.new('status', text)
26
- end
27
-
28
- def send_users_list
29
- MadChatter::Server.send_message MadChatter::Message.new('users', MadChatter::Users.current)
30
- end
31
-
32
- def send_action(action, *args)
33
- MadChatter::Server.send_message MadChatter::Message.new('action', {function: action, args: args})
34
- end
35
-
36
- end
37
- end
38
- end
@@ -1,23 +0,0 @@
1
- module MadChatter
2
- module Actions
3
- class Join < MadChatter::Actions::Base
4
-
5
- @@regex = /\/join (.+)/
6
-
7
- def handle(message)
8
- if message.filtered_text =~ @@regex
9
- username = parse_username(message.filtered_text)
10
- MadChatter::Users.update(message.token, username)
11
- send_status_message "#{username} has joined the chatroom"
12
- send_users_list
13
- stop_message_handling
14
- end
15
- end
16
-
17
- def parse_username(text)
18
- @@regex.match(text).captures[0]
19
- end
20
-
21
- end
22
- end
23
- end
@@ -1,24 +0,0 @@
1
- module MadChatter
2
- module Actions
3
- class Rename < MadChatter::Actions::Base
4
-
5
- @@regex = /\/nick (.+)/
6
-
7
- def handle(message)
8
- if message.filtered_text =~ @@regex
9
- old_username = message.username
10
- username = parse_username(message.filtered_text)
11
- MadChatter::Users.update(message.token, username)
12
- send_status_message "#{old_username} is now known as #{username}"
13
- send_users_list
14
- stop_message_handling
15
- end
16
- end
17
-
18
- def parse_username(text)
19
- @@regex.match(text).captures[0]
20
- end
21
-
22
- end
23
- end
24
- end
@@ -1,29 +0,0 @@
1
- module MadChatter
2
- class Connection
3
-
4
- def register_connection(&send_message)
5
- subscriber_id = MadChatter::Server.main_channel.subscribe(send_message)
6
- token = generate_token
7
- send_message.call(MadChatter::Message.new('token', token).to_json)
8
- @subscribers[subscriber_id] = token
9
- MadChatter::MessageHistory.all.each do |json|
10
- send_message.call(json)
11
- end
12
- subscriber_id
13
- end
14
-
15
- def generate_new_token
16
- Digest::SHA1.hexdigest(Time.now.to_s)
17
- end
18
-
19
- def on_close
20
- token = @subscribers.delete(id)
21
- username = MadChatter::Users.find_username_by_token(token)
22
- MadChatter::Server.main_channel.unsubscribe(id)
23
- MadChatter::Users.remove(token)
24
- MadChatter::Server.send_json(MadChatter::Message.new('status', "#{username} has left the chatroom").to_json)
25
- MadChatter::Server.send_json(MadChatter::Message.new('users', MadChatter::Users.current).to_json)
26
- end
27
-
28
- end
29
- end
@@ -1,16 +0,0 @@
1
- module MadChatter
2
- class MarkdownRenderer < Redcarpet::Render::HTML
3
-
4
- def link(link, title, alt_text)
5
- "<a target=\"_blank\" href=\"#{link}\">#{alt_text}</a>"
6
- end
7
-
8
- def autolink(link, link_type)
9
- "<a target=\"_blank\" href=\"#{link}\">#{link}</a>"
10
- end
11
-
12
- def header(text, header_level)
13
- '#' + text
14
- end
15
- end
16
- end
@@ -1,30 +0,0 @@
1
- module MadChatter
2
- module MessageListeners
3
- class Join
4
-
5
- include MadChatter::Actions
6
-
7
- @@regex = %r{^/join$}
8
-
9
- def handle(message)
10
- if message.text =~ @@regex
11
- user = MadChatter.find_user_by_token(message.token)
12
-
13
- unless user && message.channel
14
- stop_message_handling # user should already exist, and channel id is required
15
- end
16
-
17
- channel = MadChatter.find_channel_by_id(message.channel)
18
-
19
- unless channel
20
- stop_message_handling # you cant join a channel that doesnt exist
21
- end
22
-
23
- channel.add_user(user)
24
- stop_message_handling
25
- end
26
- end
27
-
28
- end
29
- end
30
- end
@@ -1,9 +0,0 @@
1
- module MadChatter
2
- module Servers
3
- class Juggernaut
4
-
5
- # TODO
6
-
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- module MadChatter
2
- module Servers
3
- class WebSocketRack
4
-
5
- # TODO
6
-
7
- end
8
- end
9
- end
@@ -1,40 +0,0 @@
1
- module MadChatter
2
- class Users
3
-
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
31
-
32
- def to_json
33
- JSON.generate({
34
- type: 'users',
35
- json: current,
36
- })
37
- end
38
-
39
- end
40
- end
data/spec/actions_spec.rb DELETED
@@ -1,7 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe MadChatter::Actions do
4
-
5
- # TODO
6
-
7
- end
data/spec/server_spec.rb DELETED
@@ -1,43 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe MadChatter::Server do
4
-
5
- it 'should accept new connections' do
6
- # todo
7
- end
8
-
9
- it 'should allow me to join a room that already exists' do
10
- # todo
11
- end
12
-
13
- it 'should not allow me to join a room that doesnt exist, unless I create it' do
14
- # todo
15
- end
16
-
17
- # context '#send_message' do
18
- # it 'should add regular messages to the message history' do
19
- # MadChatter::MessageHistory.all.length.should == 0
20
- # message = MadChatter::Message.new('message', 'regular message');
21
- # MadChatter::Server.send_message message
22
- # MadChatter::MessageHistory.all.length.should == 1
23
- # end
24
- # it 'should add status messages to the message history' do
25
- # MadChatter::MessageHistory.all.length.should == 0
26
- # message = MadChatter::Message.new('status', 'status message');
27
- # MadChatter::Server.send_message message
28
- # MadChatter::MessageHistory.all.length.should == 1
29
- # end
30
- # it 'should not add action messages to the message history' do
31
- # MadChatter::MessageHistory.all.length.should == 0
32
- # message = MadChatter::Message.new('action', 'action message');
33
- # MadChatter::Server.send_message message
34
- # MadChatter::MessageHistory.all.length.should == 0
35
- # end
36
- # it 'should not add user list messages to the message history' do
37
- # MadChatter::MessageHistory.all.length.should == 0
38
- # message = MadChatter::Message.new('users', 'list of users');
39
- # MadChatter::Server.send_message message
40
- # MadChatter::MessageHistory.all.length.should == 0
41
- # end
42
- # end
43
- end
data/spec/users_spec.rb DELETED
@@ -1,23 +0,0 @@
1
- # require 'spec_helper'
2
- #
3
- # describe MadChatter::Users do
4
- #
5
- # it 'should have a well-known interface' do
6
- # [:users, :add, :update, :remove, :find_username_by_token, :current, :token_exists?].each do |m|
7
- # MadChatter::Users.should respond_to(m)
8
- # end
9
- # end
10
- #
11
- # it 'should store users and their usernames' do
12
- # MadChatter::Users.add 'token1', 'username1'
13
- # MadChatter::Users.add 'token2', 'username2'
14
- # MadChatter::Users.current.should == ['username1', 'username2']
15
- # end
16
- #
17
- # it 'should encode into JSON correctly' do
18
- # MadChatter::Users.add 'token1', 'username1'
19
- # MadChatter::Users.add 'token2', 'username2'
20
- # MadChatter::Users.to_json.should == '{"type":"users","json":["username1","username2"]}'
21
- # end
22
- #
23
- # end
@@ -1,166 +0,0 @@
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
- #login_screen header {
55
- padding: 150px 0 20px;
56
- color: #fff;
57
- background-color: #000;
58
- text-align: center;
59
- font: 25px Verdana, Geneva, Arial, Helvetica, sans-serif;
60
- }
61
-
62
- #login_screen #pick_a_username {
63
- text-align: center;
64
- background: #fff;
65
- padding: 5px 10px 10px;
66
- font: 18px Verdana, Geneva, Arial, Helvetica, sans-serif;
67
- }
68
-
69
- #login_screen #pick_a_username p {
70
- margin: 10px;
71
- }
72
- #login_screen #pick_a_username input, #login_screen #pick_a_username button {
73
- font: 14px Verdana, Geneva, Arial, Helvetica, sans-serif;
74
- padding: 5px;
75
- }
76
-
77
- #chat_wrapper {
78
- margin:0;
79
- padding:0 0 100px 200px;
80
- font: 12px Verdana, Geneva, Arial, Helvetica, sans-serif;
81
- }
82
-
83
- #chat_wrapper ul#tabs {
84
- float: left;
85
- background: green;
86
- }
87
-
88
- #chat_wrapper .sidebar{
89
- position:absolute;
90
- top:0;
91
- left:0;
92
- width:200px;
93
- height:100%;
94
- color: #fff;
95
- background-color: #000;
96
- padding: 20px 5px 0 15px;
97
- }
98
-
99
- #chat_wrapper .sidebar h2 {
100
- font: 14px Verdana, Geneva, Arial, Helvetica, sans-serif;
101
- margin-bottom: 10px;
102
- }
103
-
104
- #chat_wrapper .room ul.users li {
105
- margin-left: 1em;
106
- }
107
-
108
- #chat_wrapper .room .messages {
109
- padding: 20px 10px 0px 40px;
110
- }
111
-
112
- #chat_wrapper .room .messages p {
113
- padding: 0.25em;
114
- clear: both;
115
- }
116
-
117
- #chat_wrapper .room .messages strong { font-weight: bold; }
118
- #chat_wrapper .room .messages em { font-style: italic; }
119
-
120
- #chat_wrapper .room .messages p.message .username {
121
- font-weight: bold;
122
- }
123
-
124
- #chat_wrapper .room .messages p.message time,
125
- #chat_wrapper .room .messages p.status time {
126
- float: right;
127
- color: #999;
128
- }
129
-
130
- #chat_wrapper .room .messages p.status {
131
- text-align: center;
132
- color: #999;
133
- }
134
-
135
- #chat_wrapper .room .new_message {
136
- bottom: 0;
137
- left: 220px;
138
- width: 100%;
139
- background-color: #eee;
140
- padding: 0 10px;
141
- }
142
-
143
- #chat_wrapper .room .new_message input {
144
- width: 15%;
145
- padding: 5px;
146
- }
147
-
148
- @media screen{
149
- #chat_wrapper .sidebar { position:fixed; }
150
- #chat_wrapper .room .new_message { position:fixed; }
151
- }
152
-
153
- * html #chat_wrapper {
154
- overflow:hidden;
155
- }
156
-
157
- * html #chat_wrapper .room .messages {
158
- height:100%;
159
- overflow:auto;
160
- }
161
-
162
- pre, code {
163
- font: 12px 'Bitstream Vera Sans Mono','Courier',monospace;
164
- padding: 2px !important;
165
- background-color: #EEE !important;
166
- }