kopia lustrzana https://github.com/pixelfed/pixelfed
				
				
				
			
		
			
				
	
	
		
			200 wiersze
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			200 wiersze
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
 | 
						|
namespace App\Console\Commands;
 | 
						|
 | 
						|
use Illuminate\Console\Command;
 | 
						|
use App\Avatar;
 | 
						|
use App\Profile;
 | 
						|
use App\Jobs\AvatarPipeline\RemoteAvatarFetch;
 | 
						|
use App\Util\ActivityPub\Helpers;
 | 
						|
use Illuminate\Support\Facades\DB;
 | 
						|
use Illuminate\Support\Str;
 | 
						|
 | 
						|
class AvatarSync extends Command
 | 
						|
{
 | 
						|
	/**
 | 
						|
	 * The name and signature of the console command.
 | 
						|
	 *
 | 
						|
	 * @var string
 | 
						|
	 */
 | 
						|
	protected $signature = 'avatars:sync';
 | 
						|
 | 
						|
	/**
 | 
						|
	 * The console command description.
 | 
						|
	 *
 | 
						|
	 * @var string
 | 
						|
	 */
 | 
						|
	protected $description = 'Perform actions on avatars';
 | 
						|
 | 
						|
	public $found = 0;
 | 
						|
	public $notFetched = 0;
 | 
						|
	public $fixed = 0;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Create a new command instance.
 | 
						|
	 *
 | 
						|
	 * @return void
 | 
						|
	 */
 | 
						|
	public function __construct()
 | 
						|
	{
 | 
						|
	    parent::__construct();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Execute the console command.
 | 
						|
	 *
 | 
						|
	 * @return int
 | 
						|
	 */
 | 
						|
	public function handle()
 | 
						|
	{
 | 
						|
		$this->info('Welcome to the avatar sync manager');
 | 
						|
		$this->line(' ');
 | 
						|
		$this->line(' ');
 | 
						|
		$this->error('This command is deprecated and will be removed in a future version');
 | 
						|
		$this->error('You should use the following command instead: ');
 | 
						|
		$this->line(' ');
 | 
						|
		$this->info('php artisan avatar:storage');
 | 
						|
		$this->line(' ');
 | 
						|
 | 
						|
		$confirm = $this->confirm('Are you sure you want to use this deprecated command even though it is no longer supported?');
 | 
						|
		if(!$confirm) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		$actions = [
 | 
						|
			'Analyze',
 | 
						|
			'Full Analyze',
 | 
						|
			'Fetch - Fetch missing remote avatars',
 | 
						|
			'Fix - Fix remote accounts without avatar record',
 | 
						|
			'Sync - Store latest remote avatars',
 | 
						|
		];
 | 
						|
 | 
						|
		$name = $this->choice(
 | 
						|
			'Select an action',
 | 
						|
			$actions,
 | 
						|
			0,
 | 
						|
			1,
 | 
						|
			false
 | 
						|
		);
 | 
						|
 | 
						|
		$this->info('Selected: ' . $name);
 | 
						|
 | 
						|
		switch($name) {
 | 
						|
			case $actions[0]:
 | 
						|
				$this->analyze();
 | 
						|
			break;
 | 
						|
 | 
						|
			case $actions[1]:
 | 
						|
				$this->fullAnalyze();
 | 
						|
			break;
 | 
						|
 | 
						|
			case $actions[2]:
 | 
						|
				$this->fetch();
 | 
						|
			break;
 | 
						|
 | 
						|
			case $actions[3]:
 | 
						|
				$this->fix();
 | 
						|
			break;
 | 
						|
 | 
						|
			case $actions[4]:
 | 
						|
				$this->sync();
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	    return Command::SUCCESS;
 | 
						|
	}
 | 
						|
 | 
						|
	protected function incr($name)
 | 
						|
	{
 | 
						|
		switch($name) {
 | 
						|
			case 'found':
 | 
						|
				$this->found = $this->found + 1;
 | 
						|
			break;
 | 
						|
 | 
						|
			case 'notFetched':
 | 
						|
				$this->notFetched = $this->notFetched + 1;
 | 
						|
			break;
 | 
						|
 | 
						|
			case 'fixed':
 | 
						|
				$this->fixed++;
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	protected function analyze()
 | 
						|
	{
 | 
						|
		$count = Avatar::whereIsRemote(true)->whereNull('cdn_url')->count();
 | 
						|
		$this->info('Found ' . $count . ' profiles with blank avatars.');
 | 
						|
		$this->line(' ');
 | 
						|
		$this->comment('We suggest running php artisan avatars:sync again and selecting the sync option');
 | 
						|
		$this->line(' ');
 | 
						|
	}
 | 
						|
 | 
						|
	protected function fullAnalyze()
 | 
						|
	{
 | 
						|
		$count = Profile::count();
 | 
						|
		$bar = $this->output->createProgressBar($count);
 | 
						|
		$bar->start();
 | 
						|
 | 
						|
		Profile::chunk(50, function($profiles) use ($bar) {
 | 
						|
			foreach($profiles as $profile) {
 | 
						|
				if($profile->domain == null) {
 | 
						|
					$bar->advance();
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				$avatar = Avatar::whereProfileId($profile->id)->first();
 | 
						|
				if(!$avatar || $avatar->cdn_url == null) {
 | 
						|
					$this->incr('notFetched');
 | 
						|
				}
 | 
						|
				$this->incr('found');
 | 
						|
				$bar->advance();
 | 
						|
			}
 | 
						|
		});
 | 
						|
 | 
						|
		$this->line(' ');
 | 
						|
		$this->line(' ');
 | 
						|
		$this->info('Found ' . $this->found . ' remote accounts');
 | 
						|
		$this->info('Found ' . $this->notFetched . ' remote avatars to fetch');
 | 
						|
	}
 | 
						|
 | 
						|
	protected function fetch()
 | 
						|
	{
 | 
						|
		$this->error('This action has been deprecated, please run the following command instead:');
 | 
						|
		$this->line(' ');
 | 
						|
		$this->info('php artisan avatar:storage');
 | 
						|
		$this->line(' ');
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	protected function fix()
 | 
						|
	{
 | 
						|
		Profile::chunk(5000, function($profiles) {
 | 
						|
			foreach($profiles as $profile) {
 | 
						|
				if($profile->domain == null || $profile->private_key) {
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				$avatar = Avatar::whereProfileId($profile->id)->first();
 | 
						|
				if($avatar) {
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				$avatar = new Avatar;
 | 
						|
				$avatar->is_remote = true;
 | 
						|
				$avatar->profile_id = $profile->id;
 | 
						|
				$avatar->save();
 | 
						|
				$this->incr('fixed');
 | 
						|
			}
 | 
						|
		});
 | 
						|
		$this->line(' ');
 | 
						|
		$this->line(' ');
 | 
						|
		$this->info('Fixed ' . $this->fixed . ' accounts with a blank avatar');
 | 
						|
	}
 | 
						|
 | 
						|
	protected function sync()
 | 
						|
	{
 | 
						|
		$this->error('This action has been deprecated, please run the following command instead:');
 | 
						|
		$this->line(' ');
 | 
						|
		$this->info('php artisan avatar:storage');
 | 
						|
		$this->line(' ');
 | 
						|
		return;
 | 
						|
	}
 | 
						|
}
 |