spc-pleroma/lib/pleroma/stats.ex

60 lines
1.4 KiB
Elixir
Raw Normal View History

# Pleroma: A lightweight social networking server
2018-12-31 15:41:47 +00:00
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Stats do
import Ecto.Query
2019-02-09 15:16:26 +00:00
alias Pleroma.Repo
alias Pleroma.User
def start_link do
2018-01-14 06:15:11 +00:00
agent = Agent.start_link(fn -> {[], %{}} end, name: __MODULE__)
spawn(fn -> schedule_update() end)
agent
end
2018-01-14 06:15:11 +00:00
def get_stats do
Agent.get(__MODULE__, fn {_, stats} -> stats end)
end
def get_peers do
Agent.get(__MODULE__, fn {peers, _} -> peers end)
end
def schedule_update do
spawn(fn ->
2018-03-30 13:01:53 +00:00
# 1 hour
2019-02-03 17:44:18 +00:00
Process.sleep(1000 * 60 * 60)
schedule_update()
end)
2018-03-30 13:01:53 +00:00
update_stats()
end
def update_stats do
2018-03-30 13:01:53 +00:00
peers =
from(
u in User,
select: fragment("distinct split_part(?, '@', 2)", u.nickname),
2018-03-30 13:01:53 +00:00
where: u.local != ^true
)
|> Repo.all()
|> Enum.filter(& &1)
2018-03-30 13:01:53 +00:00
domain_count = Enum.count(peers)
2018-03-30 13:01:53 +00:00
status_query =
from(u in User.Query.build(%{local: true}),
select: fragment("sum((?->>'note_count')::int)", u.info)
)
2018-03-30 13:01:53 +00:00
2018-02-12 09:13:54 +00:00
status_count = Repo.one(status_query)
user_count = Repo.aggregate(User.Query.build(%{local: true, active: true}), :count, :id)
2018-03-30 13:01:53 +00:00
Agent.update(__MODULE__, fn _ ->
2018-01-14 06:15:11 +00:00
{peers, %{domain_count: domain_count, status_count: status_count, user_count: user_count}}
end)
end
end