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/.gitignore
    CHANGED
    
    
    
        data/.rvmrc
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            rvm --create use 1.9.2@mad_chatter
         
     | 
    
        data/Gemfile.lock
    CHANGED
    
    | 
         @@ -1,11 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            PATH
         
     | 
| 
       2 
2 
     | 
    
         
             
              remote: .
         
     | 
| 
       3 
3 
     | 
    
         
             
              specs:
         
     | 
| 
       4 
     | 
    
         
            -
                mad_chatter (0. 
     | 
| 
      
 4 
     | 
    
         
            +
                mad_chatter (0.3.0)
         
     | 
| 
       5 
5 
     | 
    
         
             
                  daemons (= 1.1.4)
         
     | 
| 
       6 
6 
     | 
    
         
             
                  em-websocket
         
     | 
| 
       7 
7 
     | 
    
         
             
                  eventmachine
         
     | 
| 
       8 
     | 
    
         
            -
                  redcarpet
         
     | 
| 
       9 
8 
     | 
    
         
             
                  thor
         
     | 
| 
       10 
9 
     | 
    
         | 
| 
       11 
10 
     | 
    
         
             
            GEM
         
     | 
| 
         @@ -24,7 +23,6 @@ GEM 
     | 
|
| 
       24 
23 
     | 
    
         
             
                  guard (>= 0.8.4)
         
     | 
| 
       25 
24 
     | 
    
         
             
                multi_json (1.0.4)
         
     | 
| 
       26 
25 
     | 
    
         
             
                rb-fsevent (0.4.3.1)
         
     | 
| 
       27 
     | 
    
         
            -
                redcarpet (2.0.1)
         
     | 
| 
       28 
26 
     | 
    
         
             
                rspec (2.7.0)
         
     | 
| 
       29 
27 
     | 
    
         
             
                  rspec-core (~> 2.7.0)
         
     | 
| 
       30 
28 
     | 
    
         
             
                  rspec-expectations (~> 2.7.0)
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,10 +1,16 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Mad Chatter
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            Mad Chatter is a fun, easy to customize chat server. It's written in Ruby and utilizes HTML 5 Web Sockets for fast communication. 
     | 
| 
      
 3 
     | 
    
         
            +
            Mad Chatter is a fun, easy to customize chat server. It's written in Ruby and utilizes HTML 5 Web Sockets for fast communication.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            The goal of Mad Chatter is to basically become an open-source version of [Campfire](http://campfirenow.com/), [HipChat](https://www.hipchat.com), or [FlowDock](https://www.flowdock.com). Or at least use those as inspiration.
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            ## Getting Started
         
     | 
| 
       6 
8 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
      
 9 
     | 
    
         
            +
            Since Mad Chatter is written in Ruby, you'll need to install Ruby in order to continue. We have a wiki page to help you with that:
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            [How to install Ruby and RubyGems](https://github.com/andrewhavens/mad_chatter/wiki/How-to-install-Ruby-and-RubyGems)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            Once you have RubyGems installed, you can install the Mad Chatter gem:
         
     | 
| 
       8 
14 
     | 
    
         | 
| 
       9 
15 
     | 
    
         
             
                gem install mad_chatter
         
     | 
| 
       10 
16 
     | 
    
         | 
| 
         @@ -15,27 +21,27 @@ Then generate the directory where your chat application will live: 
     | 
|
| 
       15 
21 
     | 
    
         
             
            This command will generate the following structure:
         
     | 
| 
       16 
22 
     | 
    
         | 
| 
       17 
23 
     | 
    
         
             
                mychatroom/
         
     | 
| 
       18 
     | 
    
         
            -
                    config. 
     | 
| 
       19 
     | 
    
         
            -
                    extensions.rb
         
     | 
| 
       20 
     | 
    
         
            -
                    web/
         
     | 
| 
       21 
     | 
    
         
            -
                        index.html
         
     | 
| 
       22 
     | 
    
         
            -
                        styles.css
         
     | 
| 
       23 
     | 
    
         
            -
                        mad_chatter.js
         
     | 
| 
       24 
     | 
    
         
            -
                        mad_chatter_actions.js
         
     | 
| 
      
 24 
     | 
    
         
            +
                    config.yml      # for general configuration
         
     | 
| 
      
 25 
     | 
    
         
            +
                    extensions.rb   # for writing your own extensions
         
     | 
| 
      
 26 
     | 
    
         
            +
                    web/            # all of the html, css, and javascript live here
         
     | 
| 
       25 
27 
     | 
    
         | 
| 
       26 
28 
     | 
    
         
             
            To start your chat server, navigate to the directory that was just created and run...
         
     | 
| 
       27 
29 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
                mad_chatter  
     | 
| 
      
 30 
     | 
    
         
            +
                mad_chatter preview
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            This will start up the Mad Chatter chat server as well as a simple web server for you to preview/demo your new chat room. Now you can check it out by opening http://localhost:3000 in your browser. You should see something like this:
         
     | 
| 
       29 
33 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
      
 34 
     | 
    
         
            +
            
         
     | 
| 
       31 
35 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
      
 36 
     | 
    
         
            +
            When you're ready to have other people use your chat server (friends, family, co-workers, etc) you'll want to host the server and web directory some place that they can access (on a web server, for example, if it will be used outside your local network). You'll also want to start the chat server and leave it running for a long time in the background. This is known as a "daemon". Here are a few useful commands for that:
         
     | 
| 
       33 
37 
     | 
    
         | 
| 
      
 38 
     | 
    
         
            +
                mad_chatter start
         
     | 
| 
       34 
39 
     | 
    
         
             
                mad_chatter stop
         
     | 
| 
      
 40 
     | 
    
         
            +
                mad_chatter restart
         
     | 
| 
       35 
41 
     | 
    
         | 
| 
       36 
42 
     | 
    
         
             
            ## Chat Actions
         
     | 
| 
       37 
43 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
      
 44 
     | 
    
         
            +
            Mad Chatter can do some special things depending on the chat messages you send. Every chat message is parsed to see if it is a normal chat message, or if its a special action. These actions are much like IRC commands. For example, if I wanted to change my screen name from Andrew to Andy I could chat this message:
         
     | 
| 
       39 
45 
     | 
    
         | 
| 
       40 
46 
     | 
    
         
             
                /nick andy
         
     | 
| 
       41 
47 
     | 
    
         | 
| 
         @@ -49,25 +55,25 @@ Or if I wanted to shake everyone's chat window: 
     | 
|
| 
       49 
55 
     | 
    
         | 
| 
       50 
56 
     | 
    
         
             
                /earthquake
         
     | 
| 
       51 
57 
     | 
    
         | 
| 
       52 
     | 
    
         
            -
            You can  
     | 
| 
      
 58 
     | 
    
         
            +
            You can even create your own actions!
         
     | 
| 
       53 
59 
     | 
    
         | 
| 
       54 
60 
     | 
    
         | 
| 
       55 
61 
     | 
    
         
             
            ## Customizing
         
     | 
| 
       56 
62 
     | 
    
         | 
| 
       57 
63 
     | 
    
         
             
            The goal of Mad Chatter is to make it easy to create, host, and customize your own chat server. Let's take a look at the different ways you can customize your new chat server.
         
     | 
| 
       58 
64 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
            If you want to customize the html/css of your chatroom, you'll find it in the web directory.
         
     | 
| 
      
 65 
     | 
    
         
            +
            If you want to customize the html/css of your chatroom, you'll find it in the `web` directory.
         
     | 
| 
       60 
66 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
      
 67 
     | 
    
         
            +
            In the `config.yml` file you can see a few things you can customize.
         
     | 
| 
       62 
68 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
            The extensions.rb file is for you to create your own chat extensions. You will find a few examples in that file.
         
     | 
| 
      
 69 
     | 
    
         
            +
            The `extensions.rb` file is for you to create your own chat extensions. You will find a few examples in that file.
         
     | 
| 
       64 
70 
     | 
    
         | 
| 
       65 
71 
     | 
    
         | 
| 
       66 
72 
     | 
    
         
             
            ## Mac, Windows, and Linux Wrappers
         
     | 
| 
       67 
73 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
            Once you've got your chat server running and being used by other people, you might be interested in using/distributing an installable application 
     | 
| 
      
 74 
     | 
    
         
            +
            Once you've got your chat server running and being used by other people, you might be interested in using/distributing an installable application so your users have the convenience of clicking on an icon, receiving growl notifications, etc. Here's a list of the currently available "wrapper" applications:
         
     | 
| 
       69 
75 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
             * [Mad Chatter for Mac](https://github.com/andrewhavens/mad_chatter_for_mac) 
     | 
| 
      
 76 
     | 
    
         
            +
             * [Mad Chatter for Mac](https://github.com/andrewhavens/mad_chatter_for_mac)
         
     | 
| 
       71 
77 
     | 
    
         | 
| 
       72 
78 
     | 
    
         
             
            ## Getting Help / Providing Feedback
         
     | 
| 
       73 
79 
     | 
    
         | 
| 
         @@ -82,7 +88,6 @@ Please fork and send pull requests! Or submit issues if you have suggestions on 
     | 
|
| 
       82 
88 
     | 
    
         
             
            ## TODO
         
     | 
| 
       83 
89 
     | 
    
         | 
| 
       84 
90 
     | 
    
         
             
             - Maybe add support for alternative web socket servers like Juggernaut, Socket.io, or Cramp and web-socket-js
         
     | 
| 
       85 
     | 
    
         
            -
             - Add tests! (I'm new to this, so I need help)
         
     | 
| 
       86 
91 
     | 
    
         | 
| 
       87 
92 
     | 
    
         
             
            ##Copyright
         
     | 
| 
       88 
93 
     | 
    
         | 
| 
         @@ -18,25 +18,19 @@ module MadChatter 
     | 
|
| 
       18 
18 
     | 
    
         
             
                  end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                  def send_message(text)
         
     | 
| 
       21 
     | 
    
         
            -
                     
     | 
| 
       22 
     | 
    
         
            -
                    send_json(json)
         
     | 
| 
       23 
     | 
    
         
            -
                    MadChatter::MessageHistory.add(json)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    MadChatter::Server.send_message MadChatter::Message.new('message', text)
         
     | 
| 
       24 
22 
     | 
    
         
             
                  end
         
     | 
| 
       25 
23 
     | 
    
         | 
| 
       26 
24 
     | 
    
         
             
                  def send_status_message(text)
         
     | 
| 
       27 
     | 
    
         
            -
                     
     | 
| 
       28 
     | 
    
         
            -
                    send_json(json)
         
     | 
| 
       29 
     | 
    
         
            -
                    MadChatter::MessageHistory.add(json)
         
     | 
| 
      
 25 
     | 
    
         
            +
                    MadChatter::Server.send_message MadChatter::Message.new('status', text)
         
     | 
| 
       30 
26 
     | 
    
         
             
                  end
         
     | 
| 
       31 
27 
     | 
    
         | 
| 
       32 
28 
     | 
    
         
             
                  def send_users_list
         
     | 
| 
       33 
     | 
    
         
            -
                     
     | 
| 
       34 
     | 
    
         
            -
                    send_json(message.to_json)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    MadChatter::Server.send_message MadChatter::Message.new('users', MadChatter::Users.current)
         
     | 
| 
       35 
30 
     | 
    
         
             
                  end
         
     | 
| 
       36 
31 
     | 
    
         | 
| 
       37 
32 
     | 
    
         
             
                  def send_action(action, *args)
         
     | 
| 
       38 
     | 
    
         
            -
                     
     | 
| 
       39 
     | 
    
         
            -
                    send_json(message.to_json)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    MadChatter::Server.send_message MadChatter::Message.new('action', {function: action, args: args})
         
     | 
| 
       40 
34 
     | 
    
         
             
                  end
         
     | 
| 
       41 
35 
     | 
    
         | 
| 
       42 
36 
     | 
    
         
             
                end
         
     | 
| 
         @@ -0,0 +1,29 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module MadChatter
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Actions
         
     | 
| 
      
 3 
     | 
    
         
            +
                
         
     | 
| 
      
 4 
     | 
    
         
            +
                def stop_message_handling
         
     | 
| 
      
 5 
     | 
    
         
            +
                  raise "Don't call any more message listeners"
         
     | 
| 
      
 6 
     | 
    
         
            +
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
              
         
     | 
| 
      
 8 
     | 
    
         
            +
                # def send_json(json)
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   MadChatter.send_json(json)
         
     | 
| 
      
 10 
     | 
    
         
            +
                # end
         
     | 
| 
      
 11 
     | 
    
         
            +
              
         
     | 
| 
      
 12 
     | 
    
         
            +
                def send_message(text, from)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  MadChatter.send_message MadChatter::Message.new('message', text, from)
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              
         
     | 
| 
      
 16 
     | 
    
         
            +
                def send_status_message(text)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  MadChatter.send_message MadChatter::Message.new('status', text)
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
              
         
     | 
| 
      
 20 
     | 
    
         
            +
                # def send_users_list
         
     | 
| 
      
 21 
     | 
    
         
            +
                #   send_json MadChatter::Users.to_json
         
     | 
| 
      
 22 
     | 
    
         
            +
                # end
         
     | 
| 
      
 23 
     | 
    
         
            +
              
         
     | 
| 
      
 24 
     | 
    
         
            +
                def send_action(action, *args)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  MadChatter.send_message MadChatter::Message.new('action', {function: action, args: args})
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
                
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module MadChatter
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Channel
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
                attr_accessor :id, :name, :users, :message_history
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                def initialize(name = nil)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @id = MadChatter.channels.count.to_s
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @name = name
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @users = []
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @message_history = MadChatter::MessageHistory.new
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
                
         
     | 
| 
      
 13 
     | 
    
         
            +
                def add_user(user)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @users << user
         
     | 
| 
      
 15 
     | 
    
         
            +
                  send_users_list
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @message_history.all.each do |json|
         
     | 
| 
      
 17 
     | 
    
         
            +
                    user.send(json)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
                  send_message MadChatter::Message.new('status', "#{user.username} has joined the chatroom")
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
                
         
     | 
| 
      
 22 
     | 
    
         
            +
                def remove_user(user)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  if @users.delete(user)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    send_message MadChatter::Message.new('status', "#{user.username} has left the chatroom")
         
     | 
| 
      
 25 
     | 
    
         
            +
                    send_users_list
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
                
         
     | 
| 
      
 29 
     | 
    
         
            +
                def send_users_list
         
     | 
| 
      
 30 
     | 
    
         
            +
                  usernames = []
         
     | 
| 
      
 31 
     | 
    
         
            +
                  @users.each do |user|
         
     | 
| 
      
 32 
     | 
    
         
            +
                    usernames << user.username
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                  json = JSON.generate({
         
     | 
| 
      
 35 
     | 
    
         
            +
                    type: 'users',
         
     | 
| 
      
 36 
     | 
    
         
            +
                    json: usernames,
         
     | 
| 
      
 37 
     | 
    
         
            +
                    channel: @id,
         
     | 
| 
      
 38 
     | 
    
         
            +
                  })
         
     | 
| 
      
 39 
     | 
    
         
            +
                  send_json(json)
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
                
         
     | 
| 
      
 42 
     | 
    
         
            +
                def send_message(message)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  message.channel = @id
         
     | 
| 
      
 44 
     | 
    
         
            +
                  json = message.to_json
         
     | 
| 
      
 45 
     | 
    
         
            +
                  send_json(json)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  @message_history.add(json) if message.add_to_history?
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
                
         
     | 
| 
      
 49 
     | 
    
         
            +
                def send_json(json)
         
     | 
| 
      
 50 
     | 
    
         
            +
                  @users.each do |user|
         
     | 
| 
      
 51 
     | 
    
         
            +
                    user.send(json)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
                
         
     | 
| 
      
 55 
     | 
    
         
            +
              end
         
     | 
| 
      
 56 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/mad_chatter/config.rb
    CHANGED
    
    | 
         @@ -4,12 +4,14 @@ module MadChatter 
     | 
|
| 
       4 
4 
     | 
    
         
             
                class << self
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
                  def init
         
     | 
| 
       7 
     | 
    
         
            -
                    config =  
     | 
| 
       8 
     | 
    
         
            -
                     
     | 
| 
      
 7 
     | 
    
         
            +
                    config = init_config
         
     | 
| 
      
 8 
     | 
    
         
            +
                    init_default_message_listeners
         
     | 
| 
      
 9 
     | 
    
         
            +
                    init_extensions
         
     | 
| 
      
 10 
     | 
    
         
            +
                    init_default_channels
         
     | 
| 
       9 
11 
     | 
    
         
             
                    return config
         
     | 
| 
       10 
12 
     | 
    
         
             
                  end
         
     | 
| 
       11 
13 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
                  def  
     | 
| 
      
 14 
     | 
    
         
            +
                  def init_config
         
     | 
| 
       13 
15 
     | 
    
         
             
                    config_file = File.join(Dir.pwd, 'config.yml')
         
     | 
| 
       14 
16 
     | 
    
         
             
                    abort 'Could not find Mad Chatter config.yml file' unless File.exist?(config_file)
         
     | 
| 
       15 
17 
     | 
    
         | 
| 
         @@ -20,12 +22,23 @@ module MadChatter 
     | 
|
| 
       20 
22 
     | 
    
         
             
                    }
         
     | 
| 
       21 
23 
     | 
    
         
             
                    @config = defaults.merge!(config)
         
     | 
| 
       22 
24 
     | 
    
         
             
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  
         
     | 
| 
      
 26 
     | 
    
         
            +
                  def init_default_message_listeners
         
     | 
| 
      
 27 
     | 
    
         
            +
                    %w{ Join Nick Image Code Markdown }.each do |listener|
         
     | 
| 
      
 28 
     | 
    
         
            +
                      MadChatter.message_listeners << Object.const_get('MadChatter').const_get('MessageListeners').const_get(listener).new
         
     | 
| 
      
 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 
     | 
    
         
            +
                  end
         
     | 
| 
       23 
36 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                  def  
     | 
| 
      
 37 
     | 
    
         
            +
                  def init_extensions
         
     | 
| 
       25 
38 
     | 
    
         
             
                    simple_extensions_file = File.join(Dir.pwd, 'extensions.rb')
         
     | 
| 
       26 
39 
     | 
    
         
             
                    if File.exist?(simple_extensions_file)
         
     | 
| 
       27 
40 
     | 
    
         
             
                      file_contents = File.read(simple_extensions_file)
         
     | 
| 
       28 
     | 
    
         
            -
                      MadChatter:: 
     | 
| 
      
 41 
     | 
    
         
            +
                      # MadChatter::Extensions.module_eval file_contents
         
     | 
| 
       29 
42 
     | 
    
         
             
                    end
         
     | 
| 
       30 
43 
     | 
    
         | 
| 
       31 
44 
     | 
    
         
             
                    # Dir[Dir.pwd + '/extensions/*.rb'].each do |file|
         
     | 
| 
         @@ -33,6 +46,10 @@ module MadChatter 
     | 
|
| 
       33 
46 
     | 
    
         
             
                    # end
         
     | 
| 
       34 
47 
     | 
    
         
             
                  end
         
     | 
| 
       35 
48 
     | 
    
         | 
| 
      
 49 
     | 
    
         
            +
                  def init_default_channels
         
     | 
| 
      
 50 
     | 
    
         
            +
                    MadChatter.channels << MadChatter::Channel.new('default')
         
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
                  
         
     | 
| 
       36 
53 
     | 
    
         
             
                end
         
     | 
| 
       37 
54 
     | 
    
         
             
              end
         
     | 
| 
       38 
55 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,29 @@ 
     | 
|
| 
      
 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,10 +1,16 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module MadChatter
         
     | 
| 
       2 
2 
     | 
    
         
             
              class MarkdownRenderer < Redcarpet::Render::HTML
         
     | 
| 
      
 3 
     | 
    
         
            +
                
         
     | 
| 
       3 
4 
     | 
    
         
             
                def link(link, title, alt_text)
         
     | 
| 
       4 
5 
     | 
    
         
             
                  "<a target=\"_blank\" href=\"#{link}\">#{alt_text}</a>"
         
     | 
| 
       5 
6 
     | 
    
         
             
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
                
         
     | 
| 
       6 
8 
     | 
    
         
             
                def autolink(link, link_type)
         
     | 
| 
       7 
9 
     | 
    
         
             
                  "<a target=\"_blank\" href=\"#{link}\">#{link}</a>"
         
     | 
| 
       8 
10 
     | 
    
         
             
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
                
         
     | 
| 
      
 12 
     | 
    
         
            +
                def header(text, header_level)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  '#' + text
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
       9 
15 
     | 
    
         
             
              end
         
     | 
| 
       10 
16 
     | 
    
         
             
            end
         
     | 
    
        data/lib/mad_chatter/message.rb
    CHANGED
    
    | 
         @@ -1,16 +1,40 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'cgi'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            module MadChatter
         
     | 
| 
       2 
4 
     | 
    
         
             
              class Message
         
     | 
| 
       3 
5 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
                attr_accessor :type, :original_text, :filtered_text, :token, : 
     | 
| 
      
 6 
     | 
    
         
            +
                attr_accessor :type, :original_text, :filtered_text, :html, :token, :channel, :growl, :add_to_history
         
     | 
| 
       5 
7 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
                def initialize(type,  
     | 
| 
      
 8 
     | 
    
         
            +
                def initialize(type, text = nil, token = nil, channel = nil)
         
     | 
| 
       7 
9 
     | 
    
         
             
                  @type = type
         
     | 
| 
       8 
     | 
    
         
            -
                   
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
      
 10 
     | 
    
         
            +
                  if text
         
     | 
| 
      
 11 
     | 
    
         
            +
                    @original_text = text
         
     | 
| 
      
 12 
     | 
    
         
            +
                    @filtered_text = filter(text)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    @html = @filtered_text
         
     | 
| 
      
 14 
     | 
    
         
            +
                    @growl = text
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
       10 
16 
     | 
    
         
             
                  @token = token
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @channel = channel
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @add_to_history = true
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
                
         
     | 
| 
      
 21 
     | 
    
         
            +
                def username=(username)
         
     | 
| 
       11 
22 
     | 
    
         
             
                  @username = username
         
     | 
| 
       12 
23 
     | 
    
         
             
                end
         
     | 
| 
       13 
24 
     | 
    
         | 
| 
      
 25 
     | 
    
         
            +
                def username
         
     | 
| 
      
 26 
     | 
    
         
            +
                  unless @username
         
     | 
| 
      
 27 
     | 
    
         
            +
                    MadChatter.users.each do |user|
         
     | 
| 
      
 28 
     | 
    
         
            +
                      @username = user.username if user.has_token?(@token)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    end
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                  @username
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
                
         
     | 
| 
      
 34 
     | 
    
         
            +
                def user
         
     | 
| 
      
 35 
     | 
    
         
            +
                  MadChatter.find_user_by_token(@token) if @token
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
                
         
     | 
| 
       14 
38 
     | 
    
         
             
                # Helper method for returning filtered text.
         
     | 
| 
       15 
39 
     | 
    
         
             
                def text
         
     | 
| 
       16 
40 
     | 
    
         
             
                  @filtered_text
         
     | 
| 
         @@ -19,17 +43,20 @@ module MadChatter 
     | 
|
| 
       19 
43 
     | 
    
         
             
                def to_json
         
     | 
| 
       20 
44 
     | 
    
         
             
                  JSON.generate({
         
     | 
| 
       21 
45 
     | 
    
         
             
                    type: @type,
         
     | 
| 
       22 
     | 
    
         
            -
                     
     | 
| 
       23 
     | 
    
         
            -
                     
     | 
| 
      
 46 
     | 
    
         
            +
                    text: @original_text,
         
     | 
| 
      
 47 
     | 
    
         
            +
                    html: @html,
         
     | 
| 
      
 48 
     | 
    
         
            +
                    username: username,
         
     | 
| 
      
 49 
     | 
    
         
            +
                    channel: @channel,
         
     | 
| 
      
 50 
     | 
    
         
            +
                    growl: @growl,
         
     | 
| 
       24 
51 
     | 
    
         
             
                  })
         
     | 
| 
       25 
52 
     | 
    
         
             
                end
         
     | 
| 
       26 
53 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                def filter
         
     | 
| 
       28 
     | 
    
         
            -
                   
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                  @ 
     | 
| 
      
 54 
     | 
    
         
            +
                def filter(text)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  CGI::escapeHTML(text).strip
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
                
         
     | 
| 
      
 58 
     | 
    
         
            +
                def add_to_history?
         
     | 
| 
      
 59 
     | 
    
         
            +
                  @add_to_history
         
     | 
| 
       33 
60 
     | 
    
         
             
                end
         
     | 
| 
       34 
61 
     | 
    
         | 
| 
       35 
62 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1,17 +1,20 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module MadChatter
         
     | 
| 
       2 
2 
     | 
    
         
             
              class MessageHistory
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
                def  
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
      
 4 
     | 
    
         
            +
                def initialize
         
     | 
| 
      
 5 
     | 
    
         
            +
                   @stack = []
         
     | 
| 
      
 6 
     | 
    
         
            +
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
                
         
     | 
| 
      
 8 
     | 
    
         
            +
                def add(message)
         
     | 
| 
       6 
9 
     | 
    
         
             
                  @stack << message
         
     | 
| 
       7 
10 
     | 
    
         
             
                  @stack = @stack.pop(10) if @stack.length > 10
         
     | 
| 
       8 
11 
     | 
    
         
             
                end
         
     | 
| 
       9 
12 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                def  
     | 
| 
       11 
     | 
    
         
            -
                  @stack 
     | 
| 
      
 13 
     | 
    
         
            +
                def all
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @stack
         
     | 
| 
       12 
15 
     | 
    
         
             
                end
         
     | 
| 
       13 
16 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
                def  
     | 
| 
      
 17 
     | 
    
         
            +
                def clear
         
     | 
| 
       15 
18 
     | 
    
         
             
                  @stack = []
         
     | 
| 
       16 
19 
     | 
    
         
             
                end
         
     | 
| 
       17 
20 
     | 
    
         | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module MadChatter
         
     | 
| 
      
 2 
     | 
    
         
            +
              class MessageListener
         
     | 
| 
      
 3 
     | 
    
         
            +
                include MadChatter::Actions
         
     | 
| 
      
 4 
     | 
    
         
            +
                
         
     | 
| 
      
 5 
     | 
    
         
            +
                def initialize(regex = nil, block = nil)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  @regex = regex
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @block = block
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
              
         
     | 
| 
      
 10 
     | 
    
         
            +
                def handle(message)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  if message.original_text =~ @regex
         
     | 
| 
      
 12 
     | 
    
         
            +
                    args = @regex.match(message.original_text).captures
         
     | 
| 
      
 13 
     | 
    
         
            +
                    @block.call(args)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module MadChatter
         
     | 
| 
      
 2 
     | 
    
         
            +
              module MessageListeners
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Code
         
     | 
| 
      
 4 
     | 
    
         
            +
                  
         
     | 
| 
      
 5 
     | 
    
         
            +
                  include MadChatter::Actions
         
     | 
| 
      
 6 
     | 
    
         
            +
                  
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @@regex = %r{^/code (.+)}
         
     | 
| 
      
 8 
     | 
    
         
            +
                  
         
     | 
| 
      
 9 
     | 
    
         
            +
                  def handle(msg)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    if msg.original_text =~ @@regex
         
     | 
| 
      
 11 
     | 
    
         
            +
                      # puts msg.original_text
         
     | 
| 
      
 12 
     | 
    
         
            +
                      code = parse(msg.original_text)
         
     | 
| 
      
 13 
     | 
    
         
            +
                      # puts code
         
     | 
| 
      
 14 
     | 
    
         
            +
                      message = MadChatter::Message.new('message', nil, msg.token, msg.channel)
         
     | 
| 
      
 15 
     | 
    
         
            +
                      message.html = "<pre>" + message.filter(code) + "</pre>"
         
     | 
| 
      
 16 
     | 
    
         
            +
                      message.growl = msg.username + ' has shared a code sample' if msg.username
         
     | 
| 
      
 17 
     | 
    
         
            +
                      channel = MadChatter::find_channel_by_id(msg.channel)
         
     | 
| 
      
 18 
     | 
    
         
            +
                      channel.send_message(message)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      stop_message_handling
         
     | 
| 
      
 20 
     | 
    
         
            +
                    end
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                  
         
     | 
| 
      
 23 
     | 
    
         
            +
                  def parse(text)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    text.sub!('/code', '')
         
     | 
| 
      
 25 
     | 
    
         
            +
                    # @@regex.match(message_text).captures[0]
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                  
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module MadChatter
         
     | 
| 
      
 2 
     | 
    
         
            +
              module MessageListeners
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Image
         
     | 
| 
      
 4 
     | 
    
         
            +
                  
         
     | 
| 
      
 5 
     | 
    
         
            +
                  include MadChatter::Actions
         
     | 
| 
      
 6 
     | 
    
         
            +
                  
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @@regex = %r{^/img (.+)}
         
     | 
| 
      
 8 
     | 
    
         
            +
                  
         
     | 
| 
      
 9 
     | 
    
         
            +
                  def handle(message)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    if message.text =~ @@regex
         
     | 
| 
      
 11 
     | 
    
         
            +
                      img_url = parse_url(message.text)
         
     | 
| 
      
 12 
     | 
    
         
            +
                      img_msg = MadChatter::Message.new('message', img_url, message.token, message.channel)
         
     | 
| 
      
 13 
     | 
    
         
            +
                      img_msg.html = "<img src='#{img_url}'>"
         
     | 
| 
      
 14 
     | 
    
         
            +
                      img_msg.growl = message.username + ' has shared an image'
         
     | 
| 
      
 15 
     | 
    
         
            +
                      channel = MadChatter::find_channel_by_id(message.channel)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      channel.send_message(img_msg)
         
     | 
| 
      
 17 
     | 
    
         
            +
                      stop_message_handling
         
     | 
| 
      
 18 
     | 
    
         
            +
                    end
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
                  
         
     | 
| 
      
 21 
     | 
    
         
            +
                  def parse_url(message_text)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    @@regex.match(message_text).captures[0]
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                  
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 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
         
     | 
| 
         @@ -0,0 +1,45 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module MadChatter
         
     | 
| 
      
 2 
     | 
    
         
            +
              module MessageListeners
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Markdown
         
     | 
| 
      
 4 
     | 
    
         
            +
                  
         
     | 
| 
      
 5 
     | 
    
         
            +
                  # Apply markdown to all messages that pass through
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def handle(message)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    message.html = apply_markdown(message.filtered_text)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    return message
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
                  
         
     | 
| 
      
 11 
     | 
    
         
            +
                  def apply_markdown(text)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    # in very clear cases, let newlines become <br /> tags
         
     | 
| 
      
 14 
     | 
    
         
            +
                    text.gsub!(/^[\w\<][^\n]*\n+/) do |x|
         
     | 
| 
      
 15 
     | 
    
         
            +
                      x =~ /\n{2}/ ? x : (x.strip!; x << "  \n")
         
     | 
| 
      
 16 
     | 
    
         
            +
                    end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                    # autolink email addresses
         
     | 
| 
      
 19 
     | 
    
         
            +
                    text.gsub!(/([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})/i) do |x|
         
     | 
| 
      
 20 
     | 
    
         
            +
                      x = %Q{<a href="mailto:#{$&}">#{$&}</a>}
         
     | 
| 
      
 21 
     | 
    
         
            +
                    end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                    # autolink urls
         
     | 
| 
      
 24 
     | 
    
         
            +
                    text.gsub!(/(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/(\S)+)?/i) do |x|
         
     | 
| 
      
 25 
     | 
    
         
            +
                      href = $&
         
     | 
| 
      
 26 
     | 
    
         
            +
                       # check if we're in a markdown link
         
     | 
| 
      
 27 
     | 
    
         
            +
                       if $` =~ /[(]/
         
     | 
| 
      
 28 
     | 
    
         
            +
                        x = href
         
     | 
| 
      
 29 
     | 
    
         
            +
                       else
         
     | 
| 
      
 30 
     | 
    
         
            +
                        x = %Q{<a target="_blank" href="#{href}">#{href}</a>}
         
     | 
| 
      
 31 
     | 
    
         
            +
                       end
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
                    
         
     | 
| 
      
 34 
     | 
    
         
            +
                    # bold (must come before italic)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    text.gsub!(%r{(^|\s)(\*\*|__)(.+?)\2(\s|$)}x, %{\\1<strong>\\3</strong>\\4})
         
     | 
| 
      
 36 
     | 
    
         
            +
                    
         
     | 
| 
      
 37 
     | 
    
         
            +
                    # italic
         
     | 
| 
      
 38 
     | 
    
         
            +
                    text.gsub!(%r{(^|\s)([*_])(.+?)\2(\s|$)}x, %{\\1<em>\\3</em>\\4})
         
     | 
| 
      
 39 
     | 
    
         
            +
                    
         
     | 
| 
      
 40 
     | 
    
         
            +
                    return text
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
                  
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module MadChatter
         
     | 
| 
      
 2 
     | 
    
         
            +
              module MessageListeners
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Nick
         
     | 
| 
      
 4 
     | 
    
         
            +
                  
         
     | 
| 
      
 5 
     | 
    
         
            +
                  include MadChatter::Actions
         
     | 
| 
      
 6 
     | 
    
         
            +
                  
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @@regex = %r{^/nick (.+)}
         
     | 
| 
      
 8 
     | 
    
         
            +
                  
         
     | 
| 
      
 9 
     | 
    
         
            +
                  def handle(message)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    if message.text =~ @@regex
         
     | 
| 
      
 11 
     | 
    
         
            +
                      username = parse_username(message.text)
         
     | 
| 
      
 12 
     | 
    
         
            +
                      user = message.user
         
     | 
| 
      
 13 
     | 
    
         
            +
                      if user
         
     | 
| 
      
 14 
     | 
    
         
            +
                        user.update_username(username)
         
     | 
| 
      
 15 
     | 
    
         
            +
                      end
         
     | 
| 
      
 16 
     | 
    
         
            +
                      stop_message_handling
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
                  
         
     | 
| 
      
 20 
     | 
    
         
            +
                  def parse_username(text)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    @@regex.match(text).captures[0]
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                  
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     |