Make some tweaks around dealing with replies

This commit is contained in:
Jonny Barnes 2022-12-03 20:12:39 +00:00
parent 4bea97df0c
commit 6c43363c78
Signed by: jonny
SSH key fingerprint: SHA256:CTuSlns5U7qlD9jqHvtnVmfYV3Zwl2Z7WnJ4/dqOaL8
7 changed files with 100 additions and 74 deletions

View file

@ -6,8 +6,8 @@ namespace App\Jobs;
use App\Models\Note; use App\Models\Note;
use GuzzleHttp\Client; use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Psr7\Header; use GuzzleHttp\Psr7\Header;
use GuzzleHttp\Psr7\Uri;
use GuzzleHttp\Psr7\UriResolver; use GuzzleHttp\Psr7\UriResolver;
use GuzzleHttp\Psr7\Utils; use GuzzleHttp\Psr7\Utils;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
@ -22,8 +22,7 @@ class SendWebMentions implements ShouldQueue
use Queueable; use Queueable;
use SerializesModels; use SerializesModels;
/** @var Note */ protected Note $note;
protected $note;
/** /**
* Create the job instance, inject dependencies. * Create the job instance, inject dependencies.
@ -39,15 +38,14 @@ class SendWebMentions implements ShouldQueue
* Execute the job. * Execute the job.
* *
* @return void * @return void
*
* @throws GuzzleException
*/ */
public function handle() public function handle(): void
{ {
//grab the URLs $urlsInReplyTo = explode(' ', $this->note->in_reply_to ?? '');
$inReplyTo = $this->note->in_reply_to ?? '';
// above so explode doesnt complain about null being passed in
$urlsInReplyTo = explode(' ', $inReplyTo);
$urlsNote = $this->getLinks($this->note->note); $urlsNote = $this->getLinks($this->note->note);
$urls = array_filter(array_merge($urlsInReplyTo, $urlsNote)); //filter out none URLs $urls = array_filter(array_merge($urlsInReplyTo, $urlsNote));
foreach ($urls as $url) { foreach ($urls as $url) {
$endpoint = $this->discoverWebmentionEndpoint($url); $endpoint = $this->discoverWebmentionEndpoint($url);
if ($endpoint !== null) { if ($endpoint !== null) {
@ -67,10 +65,12 @@ class SendWebMentions implements ShouldQueue
* *
* @param string $url * @param string $url
* @return string|null * @return string|null
*
* @throws GuzzleException
*/ */
public function discoverWebmentionEndpoint(string $url): ?string public function discoverWebmentionEndpoint(string $url): ?string
{ {
//lets not send webmentions to myself // lets not send webmentions to myself
if (parse_url($url, PHP_URL_HOST) === config('app.longurl')) { if (parse_url($url, PHP_URL_HOST) === config('app.longurl')) {
return null; return null;
} }
@ -80,6 +80,7 @@ class SendWebMentions implements ShouldQueue
$endpoint = null; $endpoint = null;
/** @var Client $guzzle */
$guzzle = resolve(Client::class); $guzzle = resolve(Client::class);
$response = $guzzle->get($url); $response = $guzzle->get($url);
//check HTTP Headers for webmention endpoint //check HTTP Headers for webmention endpoint
@ -134,8 +135,6 @@ class SendWebMentions implements ShouldQueue
/** /**
* Resolve a URI if necessary. * Resolve a URI if necessary.
* *
* @todo Update deprecated resolve method
*
* @param string $url * @param string $url
* @param string $base The base of the URL * @param string $base The base of the URL
* @return string * @return string

View file

@ -28,7 +28,7 @@ class NoteService extends Service
$note = Note::create( $note = Note::create(
[ [
'note' => $this->getDataByKey($request, 'content'), 'note' => $this->getDataByKey($request, 'content'),
'in_reply_to' => $this->getDataByKey($request, 'in-reploy-to'), 'in_reply_to' => $this->getDataByKey($request, 'in-reply-to'),
'client_id' => $client, 'client_id' => $client,
] ]
); );

View file

@ -212,6 +212,17 @@ EOF;
->where('id', $noteWithLongUrl->id) ->where('id', $noteWithLongUrl->id)
->update(['updated_at' => $now->toDateTimeString()]); ->update(['updated_at' => $now->toDateTimeString()]);
$now = Carbon::now();
$noteReplyingToMastodon = Note::create([
'note' => 'Yup, #DevOps is hard',
'in_reply_to' => 'https://mastodon.social/@Gargron/109381161123311795',
'created_at' => $now,
'client_id' => 'https://quill.p3k.io/',
]);
DB::table('notes')
->where('id', $noteReplyingToMastodon->id)
->update(['updated_at' => $now->toDateTimeString()]);
Note::factory(10)->create(); Note::factory(10)->create();
} }
} }

View file

@ -8,9 +8,7 @@
generating a name property for the h-feed --> generating a name property for the h-feed -->
<span class="p-name"></span> <span class="p-name"></span>
@foreach ($notes as $note) @foreach ($notes as $note)
<div class="h-entry"> @include('templates.note', ['note' => $note])
@include('templates.note', ['note' => $note])
</div>
@endforeach @endforeach
</div> </div>
{!! $notes->render() !!} {!! $notes->render() !!}

View file

@ -3,7 +3,6 @@
@section('title'){{ strip_tags($note->getOriginal('note')) }} « Notes « @stop @section('title'){{ strip_tags($note->getOriginal('note')) }} « Notes « @stop
@section('content') @section('content')
<div class="h-entry">
@include('templates.note', ['note' => $note]) @include('templates.note', ['note' => $note])
@foreach($note->webmentions->filter(function ($webmention) { @foreach($note->webmentions->filter(function ($webmention) {
return ($webmention->type == 'in-reply-to'); return ($webmention->type == 'in-reply-to');
@ -49,7 +48,6 @@
@endif @endif
<!-- this empty tags are for https://brid.gys publishing service --> <!-- this empty tags are for https://brid.gys publishing service -->
<a href="https://brid.gy/publish/twitter"></a> <a href="https://brid.gy/publish/twitter"></a>
</div>
@stop @stop
@section('scripts') @section('scripts')

View file

@ -1,55 +1,75 @@
@if ($note->twitter) <div class="h-entry">
{!! $note->twitter->html !!} @if ($note->twitter)
@elseif ($note->in_reply_to) {!! $note->twitter->html !!}
<div class="p-in-reply-to h-cite reply-to"> @elseif ($note->in_reply_to)
In reply to <a href="{{ $note->in_reply_to }}" class="u-url">{{ $note->in_reply_to }}</a> <div class="u-in-reply-to h-cite reply-to">
</div> In reply to <a href="{{ $note->in_reply_to }}" class="u-url">{{ $note->in_reply_to }}</a>
@endif </div>
<div class="note"> @endif
<div class="e-content p-name"> <div class="note">
{!! $note->note !!} <div class="e-content p-name">
@foreach($note->media as $media) {!! $note->note !!}
@if($media->type === 'image') <a class="naked-link" href="{{ $media->url }}"><img class="u-photo" src="{{ $media->url }}" alt="" @if($media->image_widths !== null) srcset="{{ $media->url }} {{ $media->image_widths }}w, {{ $media->mediumurl }} 1000w, {{ $media->smallurl }} 500w" sizes="80vh"@endif></a>@endif @foreach($note->media as $media)
@if($media->type === 'audio') <audio class="u-audio" src="{{ $media->url }}" controls>@endif @if($media->type === 'image')
@if($media->type === 'video') <video class="u-video" src="{{ $media->url }}" controls>@endif <a class="naked-link" href="{{ $media->url }}">
@if($media->type === 'download') <p><a class="u-attachment" href="{{ $media->url }}">Download the attached media</a></p>@endif <img class="u-photo" src="{{ $media->url }}" alt="" @if($media->image_widths !== null) srcset="{{ $media->url }} {{ $media->image_widths }}w, {{ $media->mediumurl }} 1000w, {{ $media->smallurl }} 500w" sizes="80vh"@endif>
@endforeach </a>
</div> @endif
@if ($note->twitter_content) @if($media->type === 'audio')
<div class="p-bridgy-twitter-content"> <audio class="u-audio" src="{{ $media->url }}" controls>
{!! $note->twitter_content !!} @endif
</div> @if($media->type === 'video')
@endif <video class="u-video" src="{{ $media->url }}" controls>
<div class="note-metadata"> @endif
<div> @if($media->type === 'download')
<a class="u-url" href="/notes/{{ $note->nb60id }}"><time class="dt-published" datetime="{{ $note->iso8601 }}" title="{{ $note->iso8601 }}">{{ $note->humandiff }}</time></a>@if($note->client) via <a class="client" href="{{ $note->client->client_url }}">{{ $note->client->client_name }}</a>@endif <p><a class="u-attachment" href="{{ $media->url }}">Download the attached media</a></p>
@if($note->place)@if($note->getOriginal('note')) in <span class="p-location h-card"><a class="p-name u-url" href="{{ $note->place->longurl }}">{{ $note->address }}</a><data class="p-latitude" value="{{ $note->place->latitude }}"></data><data class="p-longitude" value="{{ $note->place->longitude }}"></data></span>@endif @endif
@elseif($note->address) in <span class="p-location h-adr">{!! $note->address !!}<data class="p-latitude" value="{{ $note->latitude }}"></data><data class="p-longitude" value="{{ $note->longitude }}"></data></span>@endif @endforeach
</div>
</div> @if ($note->twitter_content)
<div class="syndication-links"> <div class="p-bridgy-twitter-content">
@if( {!! $note->twitter_content !!}
$note->tweet_id || </div>
$note->facebook_url || @endif
$note->swarm_url || <div class="note-metadata">
$note->instagram_url || <div>
$note->mastodon_url) <a class="u-url" href="/notes/{{ $note->nb60id }}">
@include('templates.social-links', [ <time class="dt-published" datetime="{{ $note->iso8601 }}" title="{{ $note->iso8601 }}">{{ $note->humandiff }}</time>
'tweet_id' => $note->tweet_id, </a>
'facebook_url' => $note->facebook_url, @if($note->client) via <a class="client" href="{{ $note->client->client_url }}">{{ $note->client->client_name }}</a>@endif
'swarm_url' => $note->swarm_url, @if($note->place)
'instagram_url' => $note->instagram_url, @if($note->getOriginal('note'))
'mastodon_url' => $note->mastodon_url, in <span class="p-location h-card"><a class="p-name u-url" href="{{ $note->place->longurl }}">{{ $note->address }}</a><data class="p-latitude" value="{{ $note->place->latitude }}"></data><data class="p-longitude" value="{{ $note->place->longitude }}"></data></span>
]) @endif
@endif @elseif($note->address)
in <span class="p-location h-adr">{!! $note->address !!}<data class="p-latitude" value="{{ $note->latitude }}"></data><data class="p-longitude" value="{{ $note->longitude }}"></data></span>
</div> @endif
</div> </div>
@if ($note->place) <div class="syndication-links">
<div class="map" @if(
data-latitude="{{ $note->place->latitude }}" $note->tweet_id ||
data-longitude="{{ $note->place->longitude }}" $note->facebook_url ||
data-name="{{ $note->place->name }}" $note->swarm_url ||
data-marker="{{ $note->place->icon }}"></div> $note->instagram_url ||
@endif $note->mastodon_url
</div> )
@include('templates.social-links', [
'tweet_id' => $note->tweet_id,
'facebook_url' => $note->facebook_url,
'swarm_url' => $note->swarm_url,
'instagram_url' => $note->instagram_url,
'mastodon_url' => $note->mastodon_url,
])
@endif
</div>
</div>
@if ($note->place)
<div class="map"
data-latitude="{{ $note->place->latitude }}"
data-longitude="{{ $note->place->longitude }}"
data-name="{{ $note->place->name }}"
data-marker="{{ $note->place->icon }}"
></div>
@endif
</div>
</div>

View file

@ -257,7 +257,7 @@ class NotesTest extends TestCase
/** @test */ /** @test */
public function reverseGeocodeACounty(): void public function reverseGeocodeACounty(): void
{ {
// Note Ive removed everything below county to test for querires where // Note Ive removed everything below county to test for queries where
// thats all that is returned // thats all that is returned
// phpcs:disable Generic.Files.LineLength.TooLong // phpcs:disable Generic.Files.LineLength.TooLong
$json = <<<JSON $json = <<<JSON