// 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', ); /** * 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 ) ); } } $band = new BandNameGenerator(); $venue = new VenueGenerator(); $links = new LinkGenerator(); $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' ) ); echo implode( "\t", array( $band->get(), $venue->get(), "Oslo", $date->format( 'Y-m-d' ), $links->get(), $links->get() ) ) . "\n"; }