clients_controller.rb 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. class ClientsController < ApplicationController
  2. before_filter :authenticate_client , :except => [ :create ]
  3. def create
  4. begin
  5. @client = Client.create client_params
  6. secret = @client.secret
  7. room_secret = @client.room.secret unless @client.new_record?
  8. rescue ActiveRecord::RecordNotUnique
  9. client = Client.find_by_name URI.escape client_params[:name]
  10. secret = DUPLICATE_CLIENT_SECRET
  11. room_secret = client.room.secret
  12. end
  13. (fail 420) and return if (@client.nil? || @client.new_record?) &&
  14. secret != DUPLICATE_CLIENT_SECRET
  15. render :json => { :secret => secret , :room_secret => room_secret }
  16. end
  17. def ping ; render :json => { :pong => 'ok' } ; end ;
  18. def rooms
  19. rooms = Room.where "id != ? AND is_public = ?" , @client.room.id , true
  20. (fail 420) and return if rooms.nil?
  21. rooms_resp = rooms.map do | room |
  22. { :secret => room.secret ,
  23. :clients => room.clients_csv }
  24. end
  25. render :json => { :rooms => rooms_resp }
  26. end
  27. def bridge
  28. bridge_room = Room.find_by_secret bridge_params[:room_secret]
  29. if bridge_room.present? && bridge_room != @client.room
  30. @client.room.destroy if @client.room.clients.count == 1
  31. @client.room = bridge_room
  32. @client.save
  33. end
  34. (fail 420) and return if bridge_room.nil?
  35. render :json => { :room_secret => @client.room.secret ,
  36. :clients => @client.room.clients_csv }
  37. end
  38. def message
  39. message = @client.room.messages.create message_params
  40. (fail 420) and return if message.nil? || message.new_record?
  41. @client.room.messages.first.delete
  42. render :json => { :message => 'ok' }
  43. end
  44. def messages
  45. begin
  46. last_id = messages_params[:last_id]
  47. messages = (@client.room.messages.where "id > ?" , last_id) unless last_id.blank?
  48. rescue ArgumentError
  49. end
  50. (fail 420) and return if messages.nil?
  51. render :json => { :messages => messages }
  52. end
  53. def fail status ; render :text => 'NFG' , :status => status ; end ;
  54. private
  55. def authenticate_client
  56. begin
  57. params = auth_params
  58. name = params[:name ] || ''
  59. secret = params[:secret]
  60. client = (Client.find_by_name name ) ||
  61. (Client.find_by_name URI.escape name)
  62. rescue ActionController::ParameterMissing
  63. end
  64. @client = client if client.present? && client.secret == secret
  65. (fail 401) and return unless @client.present?
  66. @client.touch
  67. end
  68. def auth_params
  69. begin
  70. { :name => (params.require :name ) ,
  71. :secret => (params.require :client).require(:secret) }
  72. rescue ActionController::ParameterMissing
  73. { :name => '' , :secret => '' }
  74. end
  75. end
  76. def client_params
  77. begin
  78. client = params.require :client
  79. { :name => (client.require :name ) ,
  80. :nicks => (client.require :nicks) ,
  81. :type => (client.require :type ) }
  82. rescue ActionController::ParameterMissing
  83. { :name => '' , :nicks => '' , :type => '' }
  84. end
  85. end
  86. def bridge_params
  87. begin
  88. { :room_secret => (params.require :room_secret) }
  89. rescue ActionController::ParameterMissing
  90. { :room_secret => '' }
  91. end
  92. end
  93. def message_params
  94. begin
  95. message = params.require :message
  96. { :nick => (message.require :nick) ,
  97. :text => (message.require :text) }
  98. rescue ActionController::ParameterMissing
  99. { :nick => '' , :text => '' }
  100. end
  101. end
  102. def messages_params
  103. begin
  104. { :last_id => (params.require :last_id) }
  105. rescue ActionController::ParameterMissing
  106. { :last_id => '' }
  107. end
  108. end
  109. end