. defined('GNUSOCIAL') || die(); // @todo FIXME: documentation needed. class SupAction extends Action { public function handle() { parent::handle(); $seconds = $this->trimmed('seconds'); if (!$seconds) { $seconds = 15; } $updates = $this->getUpdates($seconds); header('Content-Type: application/json; charset=utf-8'); print json_encode(array('updated_time' => date('c'), 'since_time' => date('c', time() - $seconds), 'available_periods' => $this->availablePeriods(), 'period' => $seconds, 'updates' => $updates)); } public function availablePeriods() { static $periods = array(86400, 43200, 21600, 7200, 3600, 1800, 600, 300, 120, 60, 30, 15); $available = array(); foreach ($periods as $period) { $available[$period] = common_local_url( 'sup', ['seconds' => $period] ); } return $available; } public function getUpdates($seconds) { $notice = new Notice(); // XXX: cache this. Depends on how big this protocol becomes; // Re-doing this query every 15 seconds isn't the end of the world. $divider = common_sql_date(time() - $seconds); $notice->selectAdd(); $notice->selectAdd('profile_id, MAX(id) AS max_id'); $notice->whereAdd("created > TIMESTAMP '{$divider}'"); $notice->groupBy('profile_id'); $updates = []; if ($notice->find()) { while ($notice->fetch()) { $updates[] = [$notice->profile_id, $notice->max_id]; } } return $updates; } public function isReadOnly($args) { return true; } }