]]),
worker(Pleroma.Web.Federator, []),
worker(Pleroma.Web.ChatChannel.ChatChannelState, []),
+ worker(Pleroma.Stats, []),
]
++ if Mix.env == :test, do: [], else: [worker(Pleroma.Web.Streamer, [])]
--- /dev/null
+defmodule Pleroma.Stats do
+ use Agent
+ import Ecto.Query
+ alias Pleroma.{User, Repo, Activity}
+
+ def start_link do
+ agent = Agent.start_link(fn -> %{} end, name: __MODULE__)
+ schedule_update()
+ agent
+ end
+
+ def get do
+ Agent.get(__MODULE__, fn stats -> stats end)
+ end
+
+ def schedule_update do
+ update_stats()
+ spawn(fn ->
+ Process.sleep(1000 * 60 * 60 * 1) # 1 hour
+ schedule_update()
+ end)
+ end
+
+ def update_stats do
+ peers = from(u in Pleroma.User,
+ select: fragment("?->'host'", u.info),
+ where: u.local != ^true)
+ |> Repo.all() |> Enum.uniq()
+ domain_count = Enum.count(peers)
+ status_query = from p in Activity,
+ where: p.local == ^true,
+ where: fragment("?->'object'->>'type' = ?", p.data, ^"Note")
+ status_count = Repo.aggregate(status_query, :count, :id)
+ Agent.update(__MODULE__, fn _ ->
+ %{peers: peers, domain_count: domain_count, status_count: status_count}
+ end)
+ end
+end
defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
use Pleroma.Web, :controller
- alias Pleroma.{Repo, Activity, User, Notification}
+ alias Pleroma.{Repo, Activity, User, Notification, Stats}
alias Pleroma.Web
alias Pleroma.Web.MastodonAPI.{StatusView, AccountView, MastodonView}
alias Pleroma.Web.ActivityPub.ActivityPub
def masto_instance(conn, _params) do
user_count = Repo.aggregate(User.local_user_query, :count, :id)
+ %{domain_count: domain_count, status_count: status_count} = Stats.get()
response = %{
uri: Web.base_url,
title: Keyword.get(@instance, :name),
streaming_api: String.replace(Web.base_url, ["http","https"], "wss")
},
stats: %{
- status_count: 2,
+ status_count: status_count,
user_count: user_count,
- domain_count: 3
+ domain_count: domain_count
},
max_toot_chars: Keyword.get(@instance, :limit)
}
json(conn, response)
end
+ def peers(conn, _params) do
+ %{peers: peers} = Stats.get()
+ json(conn, peers)
+ end
+
defp mastodonized_emoji do
Pleroma.Formatter.get_custom_emoji()
|> Enum.map(fn {shortcode, relative_url} ->
scope "/api/v1", Pleroma.Web.MastodonAPI do
pipe_through :api
get "/instance", MastodonAPIController, :masto_instance
+ get "/instance/peers", MastodonAPIController, :peers
post "/apps", MastodonAPIController, :create_app
get "/custom_emojis", MastodonAPIController, :custom_emojis