mirror of
https://github.com/discourse/discourse-rewind.git
synced 2025-12-14 11:13:33 +00:00
83 lines
2.5 KiB
Ruby
83 lines
2.5 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
# Chat usage statistics
|
||
|
|
# Shows message counts, favorite channels, DM activity, etc.
|
||
|
|
module DiscourseRewind
|
||
|
|
module Action
|
||
|
|
class ChatUsage < BaseReport
|
||
|
|
def call
|
||
|
|
return if !enabled?
|
||
|
|
|
||
|
|
messages =
|
||
|
|
Chat::Message.where(user_id: user.id).where(created_at: date).where(deleted_at: nil)
|
||
|
|
|
||
|
|
total_messages = messages.count
|
||
|
|
return if total_messages == 0
|
||
|
|
|
||
|
|
# Get favorite channels (public channels)
|
||
|
|
channel_usage =
|
||
|
|
messages
|
||
|
|
.joins(:chat_channel)
|
||
|
|
.where(chat_channels: { type: "CategoryChannel" })
|
||
|
|
.group("chat_channels.id", "chat_channels.name")
|
||
|
|
.count
|
||
|
|
.sort_by { |_, count| -count }
|
||
|
|
.first(5)
|
||
|
|
.map do |(id, name), count|
|
||
|
|
{ channel_id: id, channel_name: name, message_count: count }
|
||
|
|
end
|
||
|
|
|
||
|
|
# DM statistics
|
||
|
|
dm_message_count =
|
||
|
|
messages.joins(:chat_channel).where(chat_channels: { type: "DirectMessageChannel" }).count
|
||
|
|
|
||
|
|
# Unique DM conversations
|
||
|
|
unique_dm_channels =
|
||
|
|
messages
|
||
|
|
.joins(:chat_channel)
|
||
|
|
.where(chat_channels: { type: "DirectMessageChannel" })
|
||
|
|
.distinct
|
||
|
|
.count(:chat_channel_id)
|
||
|
|
|
||
|
|
# Messages with reactions received
|
||
|
|
messages_with_reactions =
|
||
|
|
Chat::MessageReaction
|
||
|
|
.joins(:chat_message)
|
||
|
|
.where(chat_messages: { user_id: user.id })
|
||
|
|
.where(chat_messages: { created_at: date })
|
||
|
|
.distinct
|
||
|
|
.count(:chat_message_id)
|
||
|
|
|
||
|
|
# Total reactions received
|
||
|
|
total_reactions_received =
|
||
|
|
Chat::MessageReaction
|
||
|
|
.joins(:chat_message)
|
||
|
|
.where(chat_messages: { user_id: user.id })
|
||
|
|
.where(chat_messages: { created_at: date })
|
||
|
|
.count
|
||
|
|
|
||
|
|
# Average message length
|
||
|
|
avg_message_length =
|
||
|
|
messages.where("LENGTH(message) > 0").average("LENGTH(message)")&.to_f&.round(1) || 0
|
||
|
|
|
||
|
|
{
|
||
|
|
data: {
|
||
|
|
total_messages: total_messages,
|
||
|
|
favorite_channels: channel_usage,
|
||
|
|
dm_message_count: dm_message_count,
|
||
|
|
unique_dm_channels: unique_dm_channels,
|
||
|
|
messages_with_reactions: messages_with_reactions,
|
||
|
|
total_reactions_received: total_reactions_received,
|
||
|
|
avg_message_length: avg_message_length,
|
||
|
|
},
|
||
|
|
identifier: "chat-usage",
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
def enabled?
|
||
|
|
SiteSetting.chat_enabled
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|