<?php
// SPDX-FileCopyrightText: 2021 Andrea Chirulescu <andrea.chirulescu@gmail.com>
// SPDX-FileCopyrightText: 2021 Harald Eilertsen <haraldei@anduin.net>
//
// 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";
}