123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class Chat::Session < ApplicationModel
- include HasSearchIndexBackend
- include CanSelector
- include HasTags
- include Chat::Session::Search
- include Chat::Session::SearchIndex
- include Chat::Session::Assets
- # rubocop:disable Rails/InverseOf
- has_many :messages, class_name: 'Chat::Message', foreign_key: 'chat_session_id', dependent: :delete_all
- belongs_to :user, class_name: 'User', optional: true
- belongs_to :chat, class_name: 'Chat'
- # rubocop:enable Rails/InverseOf
- before_create :generate_session_id
- store :preferences
- def agent_user
- return if user_id.blank?
- user = User.lookup(id: user_id)
- return if user.blank?
- fullname = user.fullname
- chat_preferences = user.preferences[:chat] || {}
- if chat_preferences[:alternative_name].present?
- fullname = chat_preferences[:alternative_name]
- end
- url = nil
- if user.image && user.image != 'none' && chat_preferences[:avatar_state] != 'disabled'
- url = "#{Setting.get('http_type')}://#{Setting.get('fqdn')}/api/v1/users/image/#{user.image}"
- end
- {
- name: fullname,
- avatar: url,
- }
- end
- def generate_session_id
- self.session_id = Digest::MD5.hexdigest(SecureRandom.uuid)
- end
- def add_recipient(client_id, store = false)
- if !preferences[:participants]
- preferences[:participants] = []
- end
- return preferences[:participants] if preferences[:participants].include?(client_id)
- preferences[:participants].push client_id
- if store
- save
- end
- preferences[:participants]
- end
- def recipients_active?
- return true if !preferences
- return true if !preferences[:participants]
- count = 0
- preferences[:participants].each do |client_id|
- next if !Sessions.session_exists?(client_id)
- count += 1
- end
- return true if count >= 2
- false
- end
- def send_to_recipients(message, ignore_client_id = nil)
- preferences[:participants].each do |local_client_id|
- next if local_client_id == ignore_client_id
- Sessions.send(local_client_id, message)
- end
- true
- end
- def position
- return if state != 'waiting'
- position = 0
- Chat::Session.where(state: 'waiting').reorder(created_at: :asc).each do |chat_session|
- position += 1
- break if chat_session.id == id
- end
- position
- end
- def self.messages_by_session_id(session_id)
- chat_session = Chat::Session.find_by(session_id: session_id)
- return if !chat_session
- chat_session
- .messages
- .reorder(created_at: :asc)
- .map(&:attributes)
- end
- def self.active_chats_by_user_id(user_id)
- actice_sessions = []
- Chat::Session.where(state: 'running', user_id: user_id).reorder(created_at: :asc).each do |session|
- session_attributes = session.attributes
- session_attributes['messages'] = []
- Chat::Message.where(chat_session_id: session.id).reorder(created_at: :asc).each do |message|
- session_attributes['messages'].push message.attributes
- end
- actice_sessions.push session_attributes
- end
- actice_sessions
- end
- end
|