gnu-social/plugins/Nodeinfo/actions/nodeinfo_2_0.php

184 lines
4.8 KiB
PHP

<?php
if (!defined('GNUSOCIAL')) {
exit(1);
}
class Nodeinfo_2_0Action extends ApiAction
{
private $plugins;
protected function handle()
{
parent::handle();
$this->plugins = $this->getActivePluginList();
$this->showNodeInfo();
}
public function getActivePluginList()
{
$pluginversions = array();
$plugins = array();
Event::handle('PluginVersion', array(&$pluginversions));
foreach ($pluginversions as $plugin) {
$plugins[strtolower($plugin['name'])] = 1;
}
return $plugins;
}
/*
* Technically, the NodeInfo spec defines 'active' as 'signed in at least once',
* but GNU social doesn't keep track of when users last logged in, so let's return
* the number of users that 'posted at least once', I guess.
*/
public function showNodeInfo()
{
$openRegistrations = $this->getRegistrationsStatus();
$userCount = $this->getUserCount();
$postCount = $this->getPostCount();
$commentCount = $this->getCommentCount();
$usersActiveHalfyear = $this->getActiveUsers(180);
$usersActiveMonth = $this->getActiveUsers(30);
$protocols = $this->getProtocols();
$inboundServices = $this->getInboundServices();
$outboundServices = $this->getOutboundServices();
$json = json_encode([
'version' => '2.0',
'software' => [
'name' => 'gnusocial',
'version' => GNUSOCIAL_VERSION
],
'protocols' => $protocols,
// TODO: Have plugins register services
'services' => [
'inbound' => $inboundServices,
'outbound' => $outboundServices
],
'openRegistrations' => $openRegistrations,
'usage' => [
'users' => [
'total' => $userCount,
'activeHalfyear' => $usersActiveHalfyear,
'activeMonth' => $usersActiveMonth
],
'localPosts' => $postCount,
'localComments' => $commentCount
],
'metadata' => new stdClass()
]);
$this->initDocument('json');
print $json;
$this->endDocument('json');
}
public function getRegistrationsStatus()
{
$areRegistrationsClosed = (common_config('site', 'closed')) ? true : false;
$isSiteInviteOnly = (common_config('site', 'inviteonly')) ? true : false;
return !($areRegistrationsClosed || $isSiteInviteOnly);
}
public function getUserCount()
{
$users = new User();
$userCount = $users->count();
return $userCount;
}
public function getPostCount()
{
$notices = new Notice();
$notices->is_local = Notice::LOCAL_PUBLIC;
$notices->whereAdd('reply_to IS NULL');
$noticeCount = $notices->count();
return $noticeCount;
}
public function getCommentCount()
{
$notices = new Notice();
$notices->is_local = Notice::LOCAL_PUBLIC;
$notices->whereAdd('reply_to IS NOT NULL');
$commentCount = $notices->count();
return $commentCount;
}
public function getActiveUsers($days)
{
$notices = new Notice();
$notices->joinAdd(array('profile_id', 'user:id'));
$notices->whereAdd('notice.created >= NOW() - INTERVAL ' . $days . ' DAY');
$activeUsersCount = $notices->count('distinct profile_id');
return $activeUsersCount;
}
public function getProtocols()
{
$protocols = [];
Event::handle('NodeInfoProtocols', array(&$protocols));
return $protocols;
}
public function getInboundServices()
{
// FIXME: Are those always on?
$inboundServices = array('atom1.0', 'rss2.0');
if (array_key_exists('twitterbridge', $this->plugins) && $config['twitterimport']['enabled']) {
$inboundServices[] = 'twitter';
}
if (array_key_exists('ostatus', $this->plugins)) {
$inboundServices[] = 'gnusocial';
}
return $inboundServices;
}
public function getOutboundServices()
{
$xmppEnabled = (array_key_exists('xmpp', $this->plugins) && common_config('xmpp', 'enabled')) ? true : false;
// FIXME: Are those always on?
$outboundServices = array('atom1.0', 'rss2.0');
if (array_key_exists('twitterbridge', $this->plugins)) {
$outboundServices[] = 'twitter';
}
if (array_key_exists('ostatus', $this->plugins)) {
$outboundServices[] = 'gnusocial';
}
if ($xmppEnabled) {
$outboundServices[] = 'xmpp';
}
return $outboundServices;
}
}