session.rb 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. class Chat::Session < ApplicationModel
  2. include HasSearchIndexBackend
  3. include HasTags
  4. extend Chat::Session::Search
  5. load 'chat/session/search_index.rb'
  6. include Chat::Session::SearchIndex
  7. load 'chat/session/assets.rb'
  8. include Chat::Session::Assets
  9. # rubocop:disable Rails/InverseOf
  10. has_many :messages, class_name: 'Chat::Message', foreign_key: 'chat_session_id'
  11. # rubocop:enable Rails/InverseOf
  12. before_create :generate_session_id
  13. store :preferences
  14. def generate_session_id
  15. self.session_id = Digest::MD5.hexdigest(Time.zone.now.to_s + rand(99_999_999_999_999).to_s)
  16. end
  17. def add_recipient(client_id, store = false)
  18. if !preferences[:participants]
  19. preferences[:participants] = []
  20. end
  21. return preferences[:participants] if preferences[:participants].include?(client_id)
  22. preferences[:participants].push client_id
  23. if store
  24. save
  25. end
  26. preferences[:participants]
  27. end
  28. def recipients_active?
  29. return true if !preferences
  30. return true if !preferences[:participants]
  31. count = 0
  32. preferences[:participants].each do |client_id|
  33. next if !Sessions.session_exists?(client_id)
  34. count += 1
  35. end
  36. return true if count >= 2
  37. false
  38. end
  39. def send_to_recipients(message, ignore_client_id = nil)
  40. preferences[:participants].each do |local_client_id|
  41. next if local_client_id == ignore_client_id
  42. Sessions.send(local_client_id, message)
  43. end
  44. true
  45. end
  46. def position
  47. return if state != 'waiting'
  48. position = 0
  49. Chat::Session.where(state: 'waiting').order(created_at: :asc).each do |chat_session|
  50. position += 1
  51. break if chat_session.id == id
  52. end
  53. position
  54. end
  55. def self.messages_by_session_id(session_id)
  56. chat_session = Chat::Session.find_by(session_id: session_id)
  57. return if !chat_session
  58. session_attributes = []
  59. Chat::Message.where(chat_session_id: chat_session.id).order(created_at: :asc).each do |message|
  60. session_attributes.push message.attributes
  61. end
  62. session_attributes
  63. end
  64. def self.active_chats_by_user_id(user_id)
  65. actice_sessions = []
  66. Chat::Session.where(state: 'running', user_id: user_id).order(created_at: :asc).each do |session|
  67. session_attributes = session.attributes
  68. session_attributes['messages'] = []
  69. Chat::Message.where(chat_session_id: session.id).order(created_at: :asc).each do |message|
  70. session_attributes['messages'].push message.attributes
  71. end
  72. actice_sessions.push session_attributes
  73. end
  74. actice_sessions
  75. end
  76. end