public
Description: El Dorado is a full-stack community web application written in Ruby/Rails.
Homepage: http://almosteffortless.com/eldorado/
Clone URL: git://github.com/trevorturk/el-dorado.git
el-dorado / app / controllers / messages_controller.rb
100644 80 lines (72 sloc) 2.446 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
class MessagesController < ApplicationController
  
  before_filter :redirect_home, :only => [:new, :edit, :update]
  before_filter :require_login, :only => [:create]
  before_filter :can_edit, :only => [:destroy]
  skip_filter :update_online_at, :get_layout_vars, :only => [:create, :more, :refresh, :refresh_chatters]
  
  def index
    if logged_in?
      @messages = Message.get(current_user.chatting_at)
      current_user.update_attribute('chatting_at', Time.now.utc)
    else
      @messages = Message.get
    end
    @chatters = User.chatting
    unless @messages.empty?
      session[:message_id] = @messages.map(&:id).max
      @last_message = @messages.map(&:id).min
    end
  end
  
  def show
    @message = Message.find(params[:id])
  end
  
  def create
    @message = current_user.messages.build(params[:message])
    if @message.save
      render :update do |page|
        page.insert_html :top, 'messages-index', :partial => 'message', :object => @message
      end
    else
      render :nothing => true
    end
  end
  
  def destroy
    @message = Message.find(params[:id])
    @message.destroy
    redirect_to chat_path
  end
  
  def more
    @messages = Message.more(params[:id])
    @last_message = @messages.map(&:id).min unless @messages.empty?
    render :update do |page|
      page.insert_html :bottom, 'messages-index', :partial => 'messages', :object => @messages
      page.replace_html 'messages-more', :partial => 'more', :object => @last_message
      page.remove 'messages-more' if @messages.size < 100
    end
  end
  
  def refresh
    @messages = Message.refresh(session[:message_id], current_user)
    if !@messages.empty?
      session[:message_id] = @messages.map(&:id).max
      render :update do |page|
        @messages.each do |message|
          page << "if ($('message-#{message.id}')){"
          page << '}else{'
          page.insert_html :top, 'messages-index', :partial => 'messages', :object => message
          page << '}'
        end
      end
    else
      render :nothing => true
    end
  end
  
  def refresh_chatters
    current_user.update_attribute('chatting_at', Time.now.utc) if logged_in?
    @chatters = User.chatting
    if @chatters
      render :update do |page|
        # page.redirect_to logout_path if logged_in? && logged_out? # seems to cause problems...?
        page.replace_html 'chatters', :partial => 'chatters', :object => @chatters
      end
    end
  end
end