discourse/plugins/chat/lib/chat/statistics.rb
Andrei Prigorshnev 93ca13e534
DEV: Add new chat metrics (#23872)
This adds the following chat metrics:

- _chat_open_channels_with_threads_enabled_ — a count of open channels 
where threading is enabled.
- _chat_channel_messages_ — a count of messages sent in a chat channel 
(i.e. not a personal chat / direct message), within a thread or outside of a thread.
- _chat_threaded_messages_ — a count of messages sent within a thread 
in a chat channel (i.e. not a personal chat / direct messages).
- _chat_direct_messages_ — a count of messages sent in a personal chat / direct messages.

The metrics added using the plugin API introduced in 098ab29d, 
and extended in d91456fd.

Note that these stats won't be exposed at the `about.json` 
and the `site/statistics.json` routes.
2024-01-04 16:10:03 +04:00

98 lines
3.7 KiB
Ruby

# frozen_string_literal: true
module Chat
class Statistics
def self.about_messages
{
last_day: Chat::Message.where("created_at > ?", 1.days.ago).count,
"7_days": Chat::Message.where("created_at > ?", 7.days.ago).count,
"30_days": Chat::Message.where("created_at > ?", 30.days.ago).count,
previous_30_days:
Chat::Message.where("created_at BETWEEN ? AND ?", 60.days.ago, 30.days.ago).count,
count: Chat::Message.count,
}
end
def self.about_channels
{
last_day: Chat::Channel.where(status: :open).where("created_at > ?", 1.days.ago).count,
"7_days": Chat::Channel.where(status: :open).where("created_at > ?", 7.days.ago).count,
"30_days": Chat::Channel.where(status: :open).where("created_at > ?", 30.days.ago).count,
previous_30_days:
Chat::Channel
.where(status: :open)
.where("created_at BETWEEN ? AND ?", 60.days.ago, 30.days.ago)
.count,
count: Chat::Channel.where(status: :open).count,
}
end
def self.about_users
{
last_day: Chat::Message.where("created_at > ?", 1.days.ago).distinct.count(:user_id),
"7_days": Chat::Message.where("created_at > ?", 7.days.ago).distinct.count(:user_id),
"30_days": Chat::Message.where("created_at > ?", 30.days.ago).distinct.count(:user_id),
previous_30_days:
Chat::Message
.where("created_at BETWEEN ? AND ?", 60.days.ago, 30.days.ago)
.distinct
.count(:user_id),
count: Chat::Message.distinct.count(:user_id),
}
end
def self.channel_messages
query =
Chat::Message.joins(:chat_channel).where.not(chat_channel: { type: "DirectMessageChannel" })
{
last_day: query.where("chat_messages.created_at > ?", 1.days.ago).count,
"7_days": query.where("chat_messages.created_at > ?", 7.days.ago).count,
"28_days": query.where("chat_messages.created_at > ?", 28.days.ago).count,
"30_days": query.where("chat_messages.created_at > ?", 30.days.ago).count,
count: query.count,
}
end
def self.direct_messages
query =
Chat::Message.joins(:chat_channel).where(chat_channel: { type: "DirectMessageChannel" })
{
last_day: query.where("chat_messages.created_at > ?", 1.days.ago).count,
"7_days": query.where("chat_messages.created_at > ?", 7.days.ago).count,
"28_days": query.where("chat_messages.created_at > ?", 28.days.ago).count,
"30_days": query.where("chat_messages.created_at > ?", 30.days.ago).count,
count: query.count,
}
end
def self.open_channels_with_threads_enabled
query = Chat::Channel.where(threading_enabled: true, status: :open)
{ last_day: 0, "7_days": 0, "28_days": 0, "30_days": 0, count: query.count }
end
def self.threaded_messages
query = Chat::Message.where.not(thread: nil)
{
last_day: query.where("chat_messages.created_at > ?", 1.days.ago).count,
"7_days": query.where("chat_messages.created_at > ?", 7.days.ago).count,
"28_days": query.where("chat_messages.created_at > ?", 28.days.ago).count,
"30_days": query.where("chat_messages.created_at > ?", 30.days.ago).count,
count: query.count,
}
end
def self.monthly
start_of_month = Time.zone.now.beginning_of_month
{
messages: Chat::Message.where("created_at > ?", start_of_month).count,
channels: Chat::Channel.where(status: :open).where("created_at > ?", start_of_month).count,
users: Chat::Message.where("created_at > ?", start_of_month).distinct.count(:user_id),
}
end
end
end