فهرست منبع

Update note transformers, add custom emoji support

Daniel Supernault 3 سال پیش
والد
کامیت
b2016e6c21
3فایلهای تغییر یافته به همراه42 افزوده شده و 14 حذف شده
  1. 32 11
      app/Models/CustomEmoji.php
  2. 5 2
      app/Transformer/ActivityPub/Verb/CreateNote.php
  3. 5 1
      app/Transformer/ActivityPub/Verb/Note.php

+ 32 - 11
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();
 	}
 }

+ 5 - 2
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' => [

+ 5 - 1
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' => [