Nodeinfo.php 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. namespace App\Util\Site;
  3. use Cache;
  4. use App\{Like, Profile, Status, User};
  5. use Illuminate\Support\Str;
  6. class Nodeinfo {
  7. public static function get()
  8. {
  9. $res = Cache::remember('api:nodeinfo', now()->addMinutes(15), function () {
  10. $activeHalfYear = Cache::remember('api:nodeinfo:ahy', now()->addHours(12), function() {
  11. $count = collect([]);
  12. $likes = Like::select('profile_id')->with('actor')->where('created_at', '>', now()->subMonths(6)->toDateTimeString())->groupBy('profile_id')->get()->filter(function($like) {return $like->actor && $like->actor->domain == null;})->pluck('profile_id')->toArray();
  13. $count = $count->merge($likes);
  14. $statuses = Status::select('profile_id')->whereLocal(true)->where('created_at', '>', now()->subMonths(6)->toDateTimeString())->groupBy('profile_id')->pluck('profile_id')->toArray();
  15. $count = $count->merge($statuses);
  16. $profiles = Profile::select('id')->whereNull('domain')->where('created_at', '>', now()->subMonths(6)->toDateTimeString())->groupBy('id')->pluck('id')->toArray();
  17. $count = $count->merge($profiles);
  18. return $count->unique()->count();
  19. });
  20. $activeMonth = Cache::remember('api:nodeinfo:am', now()->addHours(12), function() {
  21. $count = collect([]);
  22. $likes = Like::select('profile_id')->where('created_at', '>', now()->subMonths(1)->toDateTimeString())->groupBy('profile_id')->get()->filter(function($like) {return $like->actor && $like->actor->domain == null;})->pluck('profile_id')->toArray();
  23. $count = $count->merge($likes);
  24. $statuses = Status::select('profile_id')->whereLocal(true)->where('created_at', '>', now()->subMonths(1)->toDateTimeString())->groupBy('profile_id')->pluck('profile_id')->toArray();
  25. $count = $count->merge($statuses);
  26. $profiles = Profile::select('id')->whereNull('domain')->where('created_at', '>', now()->subMonths(1)->toDateTimeString())->groupBy('id')->pluck('id')->toArray();
  27. $count = $count->merge($profiles);
  28. return $count->unique()->count();
  29. });
  30. return [
  31. 'metadata' => [
  32. 'nodeName' => config('pixelfed.domain.app'),
  33. 'software' => [
  34. 'homepage' => 'https://pixelfed.org',
  35. 'repo' => 'https://github.com/pixelfed/pixelfed',
  36. ],
  37. 'config' => \App\Util\Site\Config::get()
  38. ],
  39. 'protocols' => [
  40. 'activitypub',
  41. ],
  42. 'services' => [
  43. 'inbound' => [],
  44. 'outbound' => [],
  45. ],
  46. 'software' => [
  47. 'name' => 'pixelfed',
  48. 'version' => config('pixelfed.version'),
  49. ],
  50. 'usage' => [
  51. 'localPosts' => Status::whereLocal(true)->count(),
  52. 'localComments' => 0,
  53. 'users' => [
  54. 'total' => User::count(),
  55. 'activeHalfyear' => (int) $activeHalfYear,
  56. 'activeMonth' => (int) $activeMonth,
  57. ],
  58. ],
  59. 'version' => '2.0',
  60. ];
  61. });
  62. $res['openRegistrations'] = config('pixelfed.open_registration');
  63. return $res;
  64. }
  65. public static function wellKnown()
  66. {
  67. return [
  68. 'links' => [
  69. [
  70. 'href' => config('pixelfed.nodeinfo.url'),
  71. 'rel' => 'http://nodeinfo.diaspora.software/ns/schema/2.0',
  72. ],
  73. ],
  74. ];
  75. }
  76. }