From f0c294230a4619abed8c87bbef5eba36777ecc00 Mon Sep 17 00:00:00 2001 From: Deon George Date: Thu, 23 May 2024 15:16:47 +1000 Subject: [PATCH] Fix sorting of seenby/path items in echomail/netmail. Add rogue_seenby to seenby in echomail --- app/Classes/FTN/Message.php | 22 +++++++++++++++++----- app/Models/Address.php | 16 ++++++++++++++++ app/Models/Echomail.php | 3 ++- app/Models/Netmail.php | 1 + 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/app/Classes/FTN/Message.php b/app/Classes/FTN/Message.php index 6ceac6d..d53e99e 100644 --- a/app/Classes/FTN/Message.php +++ b/app/Classes/FTN/Message.php @@ -571,11 +571,23 @@ class Message extends FTNBase } else { // FTS-0004.001/FSC-0068.001 The message SEEN-BY lines // FTS-0004.001/FSC-0068.001 The message PATH lines - // @todo we need to include our rogue_seenbys - // @todo make sure a point is NOT in the seenby/path when exporting - // @todo automatically include our address in the seenby/path - $return .= $this->aka_trim($this->mo->seenby,'SEEN-BY:')."\r"; - $return .= "\x01".$this->aka_trim($this->mo->path,'PATH:')."\r"; + + $path = $this->mo->path->push($this->us)->filter(fn($item)=>($item->point_id === 0)); + + // Create our rogue seenby objects + $seenby = $this->mo->seenby; + + foreach ($this->mo->rogue_seenby as $item) + $seenby->push(Address::newFTN($item)); + + $seenby = $seenby + ->push($this->us) + ->filter(fn($item)=>($item->point_id === 0)) + ->unique('ftn') + ->sortBy(function($item) { return sprintf('%05d%05d',$item->host_id,$item->node_id);}); + + $return .= $this->aka_trim($seenby,'SEEN-BY:')."\r"; + $return .= "\x01".$this->aka_trim($path,'PATH:')."\r"; } $return .= "\00"; diff --git a/app/Models/Address.php b/app/Models/Address.php index e3cf3e5..ba6b117 100644 --- a/app/Models/Address.php +++ b/app/Models/Address.php @@ -242,6 +242,22 @@ class Address extends Model return ($o && $o->system->active) ? $o : NULL; } + public static function newFTN(string $address): self + { + $ftn = self::parseFTN($address); + $o = new self; + + $zo = Zone::where('zone_id',$ftn['z'])->single(); + + $o->zone_id = $zo?->id; + $o->region_id = $ftn['r']; + $o->host_id = $ftn['n']; + $o->node_id = $ftn['f']; + $o->point_id = $ftn['p']; + + return $o; + } + /** * This is to find an address for a domain (like fidonet), which is technically 2D even though it uses multiple zones. * diff --git a/app/Models/Echomail.php b/app/Models/Echomail.php index fe92ef7..7f8dec9 100644 --- a/app/Models/Echomail.php +++ b/app/Models/Echomail.php @@ -222,7 +222,8 @@ final class Echomail extends Model implements Packet public function path() { return $this->belongsToMany(Address::class,'echomail_path') - ->withPivot(['id','parent_id','recv_pkt','recv_at']); + ->withPivot(['id','parent_id','recv_pkt','recv_at']) + ->orderBy('id','DESC'); } /* ATTRIBUTES */ diff --git a/app/Models/Netmail.php b/app/Models/Netmail.php index acded05..09308a5 100644 --- a/app/Models/Netmail.php +++ b/app/Models/Netmail.php @@ -179,6 +179,7 @@ final class Netmail extends Model implements Packet { return $this->belongsToMany(Address::class,'netmail_path') ->withPivot(['id','parent_id','datetime','program','recv_pkt','recv_id']) + ->orderBy('netmail_path.id') ->using(ViaPivot::class); }