* SPDX-FileCopyrightText: 2021 Harald Eilertsen * * SPDX-License-Identifier: AGPL-3.0-or-later */ /** * Abstract base class for a generator. */ abstract class GeneratorBase { /** * Return a generated string. * Must be implemented by derived classes */ abstract public function get() : string; /** * Return a random element from an array. * * @param array $arr an array of elements. */ protected function pick( array $arr ) : string { return $arr[ array_rand( $arr ) ]; } } /** * Generator for band names */ class BandNameGenerator extends GeneratorBase { /** * Prefixes. * * @var string[] * * @psalm-var array{0: string, 1: string, 2: string} */ private array $prefixes = array( '', 'a', 'the', ); /** * Adverbs. * * @var string[] * * @psalm-var array{0: string, 1: string, 2: string, 3: string, 4: string, 5: string, 6: string, 7: string} */ private array $adverbs = array( 'Bestial', 'Dead', 'Incongruent', 'Ladylike', 'Slimy', 'Dandy', 'Leftist', 'Flamboyant', ); /** * Verbs. * * @var string[] * * @psalm-var array{0: string, 1: string, 2: string, 3: string, 4: string, 5: string, 6: string} */ private array $verbs = array( 'Kill', 'Regurgitat', 'Destroy', 'Blasphem', 'Strangl', 'Terroriz', 'Mutilat', ); /** * Endings. * * @var string[] * * @psalm-var array{0: string, 1: string, 2: string, 3: string} */ private array $endings = array( 'er', 'ers', 'ing', 'ed', 'or', ); /** * Return a generated band name. */ public function get() : string { $parts = array( $this->pick( $this->prefixes ), $this->pick( $this->adverbs ), $this->pick( $this->verbs ), ); return trim( implode( ' ', $parts ) . $this->pick( $this->endings ) ); } } /** * Generator for venue names */ class VenueGenerator extends GeneratorBase { /** * Prefix 1. * * @var string[] * * @psalm-var array{0: string, 1: string, 2: string, 3: string, 4: string} */ private array $prefix1 = array( '', 'Royal', 'Shabby', 'Happy', 'Drunken', ); /** * Prefix 2. * * @var string[] * * @psalm-var array{0: string, 1: string, 2: string, 3: string, 4: string, 5: string} */ private array $prefix2 = array( '', 'Music', 'Fiddler', 'Rock', 'Metal', 'Mental', ); /** * Type of venue. * * @var string[] * * @psalm-var array{0: string, 1: string, 2: string, 3: string, 4: string, 5: string, 6: string} */ private array $type = array( 'Hall', 'Museum', 'Asylum', 'Stage', 'Cottage', 'Opera', 'Lighthouse', ); /** * Return a generated venue name. */ public function get() : string { $parts = array( $this->pick( $this->prefix1 ), $this->pick( $this->prefix2 ), $this->pick( $this->type ), ); return trim( implode( ' ', $parts ) ); } } /** * Generator for links (event and ticket links.) */ class LinkGenerator extends GeneratorBase { /** * Return a generated link. * * @return string */ public function get() : string { return 'https://example.com/' . bin2hex( random_bytes( 8 ) ); } } /** * Generator for cities */ class CityGenerator extends GeneratorBase { /** * A few cities, so we can test filtering for cities. * * @var array $cities The cities. */ private array $cities = array( 'Oslo', 'Trondheim', 'Støren', 'Velstandsbygd', 'Sommerhytta', ); /** * Return a random city. */ public function get() : string { return $this->pick( $this->cities ); } } $band = new BandNameGenerator(); $venue = new VenueGenerator(); $links = new LinkGenerator(); $city = new CityGenerator(); $date = new DateTime(); $prog = array_shift( $argv ); $num = intval( array_shift( $argv ) ) ?? 10; for ( $i = 0; $i < $num; $i++ ) { $date->add( new DateInterval( 'P' . random_int( 0, 60 ) . 'D' ) ); // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped echo implode( "\t", array( $band->get(), $venue->get(), $city->get(), $date->format( 'Y-m-d' ), $links->get(), $links->get() ) ) . "\n"; }