our_address = our_address($ao->zone->domain)->first(); $this->now = Carbon::now(); $this->name = sprintf('z%dn%d.%d', $this->our_address->zone->zone_id, $this->our_address->host_id, $this->now->format('z'), ); Log::debug(sprintf('%s:- Generating Nodelist for [%s] from [%s] as [%s] with arguments',self::LOGKEY,$ao->ftn,$this->our_address->ftn,$this->our_address->role_name),['args'=>$arg]); } public function __toString(): string { return $this->crc($this->generate($this->our_address)); } private function crc(string $text): string { return sprintf(";A %s Nodelist for %s -- Day number %d : %s\r\n", $this->our_address->role_name, $this->now->format('l, M d, Y'), $this->now->format('z'), crc16($text) ).$text; } private function flags(Address $ao): Collection { $result = collect(); if (($ao->system->pollmode === TRUE) || in_array($ao->role_name,['ZC','RC','NC','HC'])) $result->push('CM'); if ($ao->system->address) { $result->push(sprintf('INA:%s',our_address($ao->domain)->contains($ao->id) ? our_hostname($ao) : $ao->system->address)); if (($x=$ao->system->mailers->pluck('name')->search('BINKP')) !== FALSE) $result->push(sprintf('IBN%s',(($y=$ao->system->mailers->get($x)->pivot->port) !== 24554) ? ':'.$y : '')); if (($x=$ao->system->mailers->pluck('name')->search('EMSI')) !== FALSE) $result->push(sprintf('ITN%s',(($y=$ao->system->mailers->get($x)->pivot->port) !== 23) ? ':'.$y : '')); } return $result; } private function entry(Address $ao): string { $format = '%s,%d,%s,%s,%s,%s,300'; $prefix = ''; $address = $ao->node_id; if ((! $ao->system->address) || $ao->isPrivate) { $prefix = 'Pvt'; } elseif ($ao->isHold) { $prefix = 'Hold'; } elseif ($ao->isDown) { $prefix = 'Down'; } else switch ($ao->role_id) { case Address::NODE_ZC: $prefix = 'Zone'; $address = $ao->zone->zone_id; break; case Address::NODE_RC: $prefix = 'Region'; $address = $ao->region_id; break; case Address::NODE_NC: $prefix = 'Host'; $address = $ao->host_id; break; case Address::NODE_HC: $prefix = 'Hub'; break; case Address::NODE_NN: break; case Address::NODE_POINT: throw new \Exception(sprintf('We have no method to include points in the nodelist [%s]',$ao->ftn)); default: throw new \Exception(sprintf('Unknown role [%d] for [%s]',$ao->role,$ao->ftn)); } return sprintf($format, $prefix, $address, $this->format($ao->system->name), $this->format($ao->system->location), $this->format($ao->system->sysop), $ao->system->phone ?: '-Unpublished-', ).(($x=$this->flags($ao)->join(',')) ? sprintf(',%s',$x) : ''); } private function format(string $string): string { return str_replace(' ','_',str_replace(',','',$string)); } private function generate(Address $ao): string { $result = collect(); $so = System::createUnknownSystem(); $result->push($this->entry($ao)); foreach ($ao->children() as $oo) { // We dont include points in the ndoelist if ($oo->point_id) continue; // We exclude discovered systems if ($oo->system_id == $so->id) continue; $result->push($this->generate($oo) ?: $this->entry($oo)); } return $result->join("\n"); } public function getName(): string { return $this->name; } }