pixelfed/pixelfed

View on GitHub
app/Models/CustomEmoji.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;

class CustomEmoji extends Model
{
    use HasFactory;

    const SCAN_RE = "/(?<=[^[:alnum:]:]|\n|^):([a-zA-Z0-9_]{2,}):(?=[^[:alnum:]:]|$)/x";
    const CACHE_KEY = "pf:custom_emoji:";

    protected $guarded = [];

    public static function scan($text, $activitypub = false)
    {
        if((bool) config_cache('federation.custom_emoji.enabled') == false) {
            return [];
        }

        return Str::of($text)
        ->matchAll(self::SCAN_RE)
        ->map(function($match) use($activitypub) {
            $tag = Cache::remember(self::CACHE_KEY . $match, 14400, function() use($match) {
                return self::orderBy('id')->whereDisabled(false)->whereShortcode(':' . $match . ':')->first();
            });

            if($tag) {
                $url = url('/storage/' . $tag->media_path);

                if($activitypub == true) {
                    $mediaType = Str::endsWith($url, '.png') ? 'image/png' : 'image/jpg';
                    return [
                        'id' => url('emojis/' . $tag->id),
                        'type' => 'Emoji',
                        'name' => $tag->shortcode,
                        'updated' => $tag->updated_at->toAtomString(),
                        'icon' => [
                            'type' => 'Image',
                            'mediaType' => $mediaType,
                            'url' => $url
                        ]
                    ];
                } else {
                    return [
                        'shortcode' => $match,
                        'url' => $url,
                        'static_url' => $url,
                        'visible_in_picker' => $tag->disabled == false
                    ];
                }
            }
        })
        ->filter(function($tag) use($activitypub) {
            if($activitypub == true) {
                return $tag && isset($tag['icon']);
            } else {
                return $tag && isset($tag['static_url']);
            }
        })
        ->values()
        ->toArray();
    }
}