<?php
/**
* Tool to generate random concert entries for importing into giglogadmin.
*
* @package giglogadmin
*
* 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',
'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";
}