68 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\View\Components;
 | 
						|
 | 
						|
use Closure;
 | 
						|
use Illuminate\Contracts\View\View;
 | 
						|
use Illuminate\Support\Facades\Cache;
 | 
						|
use Illuminate\Support\Facades\Config;
 | 
						|
use Illuminate\Support\Facades\Http;
 | 
						|
use Illuminate\View\Component;
 | 
						|
 | 
						|
class DiscordStatus extends Component
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Create a new component instance.
 | 
						|
     */
 | 
						|
    public function __construct()
 | 
						|
    {
 | 
						|
        //
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns current Discord presence from Lanyard API
 | 
						|
     * @return array|mixed
 | 
						|
     */
 | 
						|
    public function getDiscordPresence(): mixed {
 | 
						|
        // If it's already cached just return that
 | 
						|
        if (Cache::has('discord_presence')) {
 | 
						|
            return Cache::get('discord_presence');
 | 
						|
        }
 | 
						|
 | 
						|
        $response = Http::get('https://api.lanyard.rest/v1/users/' . Config::get('services.lanyard.user_id'));
 | 
						|
        $data = $response->json();
 | 
						|
        if (!isset($data["data"])) return null;
 | 
						|
        $presence = $data["data"];
 | 
						|
        Cache::put('discord_presence', $presence, now()->addSeconds(60));
 | 
						|
        return $presence;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getOnlineStatus(): ?array {
 | 
						|
        $presence = $this->getDiscordPresence();
 | 
						|
        if ($presence == null) return null;
 | 
						|
        return match ($presence["discord_status"]) {
 | 
						|
            "online", "dnd" => [
 | 
						|
                "text" => "online",
 | 
						|
                "color" => "#02c83a"
 | 
						|
            ],
 | 
						|
            "idle" => [
 | 
						|
                "text" => "away",
 | 
						|
                "color" => "#d77c20"
 | 
						|
            ],
 | 
						|
            default => [
 | 
						|
                "text" => "offline",
 | 
						|
                "color" => "#ca3329"
 | 
						|
            ],
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the view / contents that represent the component.
 | 
						|
     */
 | 
						|
    public function render(): View|Closure|string
 | 
						|
    {
 | 
						|
        return view('components.discord-status', [
 | 
						|
            'status' => $this->getOnlineStatus(),
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
}
 |