diff --git a/app/Models/CustomEmoji.php b/app/Models/CustomEmoji.php index fdd8ac196..3b7c38a1d 100644 --- a/app/Models/CustomEmoji.php +++ b/app/Models/CustomEmoji.php @@ -14,7 +14,7 @@ class CustomEmoji extends Model const SCAN_RE = "/(?<=[^[:alnum:]:]|\n|^):([a-zA-Z0-9_]{2,}):(?=[^[:alnum:]:]|$)/x"; const CACHE_KEY = "pf:custom_emoji:"; - public static function scan($text) + public static function scan($text, $activitypub = false) { if(config('federation.custom_emoji.enabled') == false) { return []; @@ -22,24 +22,45 @@ class CustomEmoji extends Model return Str::of($text) ->matchAll(self::SCAN_RE) - ->map(function($match) { + ->map(function($match) use($activitypub) { $tag = Cache::remember(self::CACHE_KEY . $match, 14400, function() use($match) { return self::whereShortcode(':' . $match . ':')->first(); }); if($tag) { $url = url('/storage/' . $tag->media_path); - return [ - 'shortcode' => $match, - 'url' => $url, - 'static_path' => $url, - 'visible_in_picker' => $tag->disabled == false - ]; + + if($activitypub == true) { + $mediaType = Str::endsWith($url, '.png') ? 'image/png' : 'image/jpeg'; + 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_path' => $url, + 'visible_in_picker' => $tag->disabled == false + ]; + } } }) - ->filter(function($tag) { - return $tag && isset($tag['static_path']); + ->filter(function($tag) use($activitypub) { + if($activitypub == true) { + return $tag && isset($tag['icon']); + } else { + return $tag && isset($tag['static_path']); + } }) - ->values(); + ->values() + ->toArray(); } } diff --git a/app/Transformer/ActivityPub/Verb/CreateNote.php b/app/Transformer/ActivityPub/Verb/CreateNote.php index 5bd712849..09c4ab66d 100644 --- a/app/Transformer/ActivityPub/Verb/CreateNote.php +++ b/app/Transformer/ActivityPub/Verb/CreateNote.php @@ -4,13 +4,13 @@ namespace App\Transformer\ActivityPub\Verb; use App\Status; use League\Fractal; +use App\Models\CustomEmoji; use Illuminate\Support\Str; class CreateNote extends Fractal\TransformerAbstract { public function transform(Status $status) { - $mentions = $status->mentions->map(function ($mention) { $webfinger = $mention->emailUrl(); $name = Str::startsWith($webfinger, '@') ? @@ -46,7 +46,10 @@ class CreateNote extends Fractal\TransformerAbstract 'name' => "#{$hashtag->name}", ]; })->toArray(); - $tags = array_merge($mentions, $hashtags); + + $emojis = CustomEmoji::scan($status->caption, true) ?? []; + $emoji = array_merge($emojis, $mentions); + $tags = array_merge($emoji, $hashtags); return [ '@context' => [ diff --git a/app/Transformer/ActivityPub/Verb/Note.php b/app/Transformer/ActivityPub/Verb/Note.php index f63c9cc5e..e30848a01 100644 --- a/app/Transformer/ActivityPub/Verb/Note.php +++ b/app/Transformer/ActivityPub/Verb/Note.php @@ -4,6 +4,7 @@ namespace App\Transformer\ActivityPub\Verb; use App\Status; use League\Fractal; +use App\Models\CustomEmoji; use Illuminate\Support\Str; class Note extends Fractal\TransformerAbstract @@ -46,7 +47,10 @@ class Note extends Fractal\TransformerAbstract 'name' => "#{$hashtag->name}", ]; })->toArray(); - $tags = array_merge($mentions, $hashtags); + + $emojis = CustomEmoji::scan($status->caption, true) ?? []; + $emoji = array_merge($emojis, $mentions); + $tags = array_merge($emoji, $hashtags); return [ '@context' => [