mastodon_algorithm_server/functions/suggestions/src/Suggestions.php

103 lines
3.2 KiB
PHP

<?php
namespace Mastodon;
require_once 'vendor/autoload.php';
use Appwrite\Client;
use Appwrite\Services\Databases;
use Appwrite\Query;
class Suggestions {
public static function crawlFederatedFeed($user, $client) {
$request = new \GuzzleHttp\Client(['base_uri' => $user['prefs']['user_server_uri']]);
try {
$response = $request->request('GET', "/api/v1/timelines/public", [
'headers' => [
'Authorization' => 'Bearer ' . $user['prefs']['user_token']
]
]);
$responseBody = (string)$response->getBody();
$responseBody = json_decode($responseBody);
$statuses = [];
foreach($responseBody as $status) {
if(count($status->tags) == 0) {
continue;
}
$points = self::scoreStatus($status, $user, $client);
if($points['points'] !== 0) {
$statuses[] = $points;
}
}
usort($statuses, function ($a, $b) {
var_dump($a);
// return 0 <=> 0;
return $b['points'] <=> $a['points'];
});
$database = new Databases($client);
foreach($statuses as $status) {
$response = $request->request('GET', "/api/v2/search?type=statuses&resolve=true&q=" . $status['post'], [
'headers' => [
'Authorization' => 'Bearer ' . $user['prefs']['user_token']
]
]);
$responseBody = (string)$response->getBody();
$responseBody = json_decode($responseBody);
$result = $responseBody->statuses;
if(isset($result[0])) {
$result = $result[0];
var_dump($result);
$database->createDocument(getenv('APPWRITE_DATABASE_ID'), 'suggested', 'unique()', [
'post_link' => $status['post'],
'points' => $status['points'],
'local_link' => $user['prefs']['user_server_uri'] . "/@" . $result->account->acct . "/" . $result->id,
'user_id' => $user['$id']
], [
\Appwrite\Permission::read(\Appwrite\Role::user($user['$id']))
]);
}
}
return $statuses;
} catch (\GuzzleHttp\Exception\ClientException $e) {
return [$e->getMessage()];
}
}
public static function scoreStatus($status, $user, $client) {
$database = new Databases($client);
$query = new Query();
$points = 0;
foreach($status->tags as $tag) {
$record = $database->listDocuments(getenv('APPWRITE_DATABASE_ID'), 'hashtags', [
$query->equal('user', $user['$id']),
$query->equal('hashtag', $tag->name)
])['documents'];
if(isset($record[0])) {
$points += $record[0]['points'];
}
}
return [
'post' => $status->url,
'points' => $points
];
}
}