| Server IP : 146.59.209.152 / Your IP : 216.73.216.152 Web Server : Apache System : Linux webm009.cluster131.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64 User : monpetu ( 144298) PHP Version : 7.4.33 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/monpetu/www/ipprint/extensions/bookly-addon-pro/lib/ |
Upload File : |
<?php
namespace BooklyPro\Lib;
abstract class CodeGenerator
{
const ERROR_FULLY_GENERATED = 1;
const ERROR_NOT_ENOUGH_CODES = 2;
/** @var string */
protected static $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
/** @var int */
protected static $chars_count = 36;
/**
* Generate unique code for given mask.
*
* @param string $class
* @param string $mask
* @return string
* @throws \Exception
*/
public static function generateUniqueCode( $class, $mask )
{
$existing_codes = static::_getExistingCodes( $class, $mask );
if ( count( $existing_codes ) >= static::_getNumberOfPossibleCodes( $mask ) ) {
throw new \Exception( '', static::ERROR_FULLY_GENERATED );
}
return static::_generate( $mask, $existing_codes );
}
/**
* Generate unique code series for given mask.
*
* @param string $class
* @param string $mask
* @param int $amount
* @return array
* @throws \Exception
*/
public static function generateUniqueCodeSeries( $class, $mask, $amount )
{
$existing_codes = static::_getExistingCodes( $class, $mask );
if ( ( $remaining = static::_getNumberOfPossibleCodes( $mask ) - count( $existing_codes ) ) < $amount ) {
throw new \Exception( $remaining, static::ERROR_NOT_ENOUGH_CODES );
}
$res = array();
do {
$res[] = static::_generate( $mask, $existing_codes + array_flip( $res ) );
} while ( count( $res ) < $amount );
return $res;
}
/**
* Generate mask.
*
* @param string $mask
* @param array $existing_codes
* @return string
*/
private static function _generate( $mask, array $existing_codes )
{
// Generate.
$len = strlen( $mask );
do {
$res = '';
for ( $i = 0; $i < $len; ++ $i ) {
if ( $mask[ $i ] == '*' ) {
$rand = mt_rand( 0, static::$chars_count - 1 );
$res .= static::$chars[ $rand ];
} else {
$res .= $mask[ $i ];
}
}
} while ( $len && isset ( $existing_codes[ $res ] ) );
return $res;
}
/**
* Get number of possible codes for the mask.
*
* @param string $mask
* @return int
*/
private static function _getNumberOfPossibleCodes( $mask )
{
$asterisks_count = substr_count( $mask, '*' );
if ( $asterisks_count > 3 ) {
// There are more than 1679616 possible codes.
return PHP_INT_MAX;
}
return (int) pow( static::$chars_count, $asterisks_count );
}
/**
* Get existing codes that match given mask.
*
* @param string $class
* @param string $mask
* @return array
*/
private static function _getExistingCodes( $class, $mask )
{
return $class::query()
->select( 'DISTINCT `code`' )
->whereLike( 'code', str_replace( '*', '_', $mask ) )
->indexBy( 'code' )
->fetchArray();
}
}