0)
{
$DateParts = explode('.', $Parts[0]);
if (count($DateParts) == 1) $DateParts[1] = '0';
if (count($DateParts) == 2) $DateParts[2] = '0';
} else return NULL;
if (count($Parts) > 1)
{
$TimeParts = explode(':', $Parts[1]);
if (count($TimeParts) == 1) $TimeParts[1] = '0';
if (count($TimeParts) == 2) $TimeParts[2] = '0';
} else $TimeParts = array(0, 0, 0);
$Result = mktime($TimeParts[0], $TimeParts[1], $TimeParts[2], $DateParts[1], $DateParts[0], $DateParts[2]);
return $Result;
}
function HumanDateToTime(string $Date): ?int
{
if ($Date == '') return NULL;
return HumanDateTimeToTime($Date.' 0:0:0');
}
function DecodeHtmlEnt(string $str): string
{
$prefix = '';
$suffix = ';';
$hexchar = 'x';
$ret = html_entity_decode($str, ENT_COMPAT, 'UTF-8');
$p2 = 0;
for (;;)
{
$p = strpos($ret, $prefix, $p2);
if ($p === FALSE)
break;
$p2 = strpos($ret, $suffix, $p);
if ($p2 === FALSE)
{
$p2 = $p + strlen($prefix);
while (($p2 < strlen($ret)) and is_numeric($ret[$p2]))
$p2++;
if ($p2 <= ($p + strlen($prefix))) break;
$add = 0;
} else $add = 1;
if (substr($ret, $p + strlen($prefix), strlen($hexchar)) == $hexchar)
$char = hexdec(substr($ret, $p + strlen($prefix) + strlen($hexchar), $p2 - $p - strlen($prefix) - strlen($hexchar)));
else
$char = intval(substr($ret, $p + strlen($prefix), $p2 - $p - strlen($prefix)));
$newchar = iconv(
'UCS-4', 'UTF-8',
chr(($char >> 24) & 0xFF).chr(($char >> 16) & 0xFF).chr(($char >> 8) & 0xFF).chr($char & 0xFF)
);
$ret = substr_replace($ret, $newchar, $p, $add + $p2 - $p);
$p2 = $p + strlen($newchar) + $add;
}
return $ret;
}
function RemoveHtmlComments(string $Content): string
{
$Result = '';
while (strpos($Content, '') + 3);
}
return $Result;
//return preg_replace('//', '', $Content);
}
function is_alpha(string $Char): bool
{
return (($Char >= 'a') and ($Char <= 'z')) or (($Char >= 'A') and ($Char <= 'Z'));
}
function is_white_space(string $Char): bool
{
return ($Char == ' ') or ($Char == "\t");
}
function GetDefaultMeetFilter(string $Table = ''): string
{
global $Config;
if ($Table != '') $Table = $Table.'.';
return '('.$Table.'Hidden=0) AND ('.$Table.'Time > "'.TimeToMysqlDateTime(time() - (int)$Config['MeetInterval']).'")';
}
function GetNumberBeforeText(string $Text, string $Needle): string
{
$Result = '';
for (;;)
{
$Pos = strpos($Text, $Needle);
if ($Pos !== false)
{
if ((($Pos + strlen($Needle)) < strlen($Text)) and (is_alpha($Text[$Pos + strlen($Needle)])))
{
$Text = substr($Text, $Pos + 1);
continue;
}
$Result = substr($Text, 0, $Pos);
$Text = substr($Text, $Pos + 1);
$Start = $Pos - 1;
while (($Start >= 0) and (is_numeric($Result[$Start]) or is_white_space($Result[$Start])))
$Start--;
$Start++;
$Result = trim(substr($Result, $Start, $Pos - $Start));
if (is_numeric($Result)) break;
} else break;
}
return $Result;
}
function GetNumberAfterText(string $Text, string $Needle): string
{
$Result = '';
for (;;)
{
$Pos = strpos($Text, $Needle);
if ($Pos !== false)
{
if ((($Pos - 1) >= 0) and (is_alpha($Text[$Pos - 1])))
{
$Text = substr($Text, $Pos + 1);
continue;
}
$Result = substr($Text, $Pos + strlen($Needle));
$Text = substr($Text, $Pos + 1);
$End = 0;
while (($End < strlen($Result)) and (is_numeric($Result[$End]) or is_white_space($Result[$End])))
$End++;
$End--;
$Result = trim(substr($Result, 0, $End + 1));
if (is_numeric($Result)) break;
} else break;
}
return $Result;
}
function GetAgeFromText(string $Text): string
{
$Text = strtolower($Text);
$Result = GetNumberAfterText($Text, 'je mi');
if ($Result == '') $Result = GetNumberAfterText($Text, 'je mi přes');
if ($Result == '') $Result = GetNumberBeforeText($Text, 'let');
if ($Result == '') $Result = GetNumberBeforeText($Text, 'rokov');
if ($Result == '') $Result = GetNumberBeforeText($Text, 'roků');
if ($Result == '') $Result = GetNumberBeforeText($Text, 'letou');
if ($Result == '') $Result = GetNumberAfterText($Text, 'čerstvých');
if ($Result == '') {
$Result = GetNumberAfterText($Text, 'jsem');
if ($Result > 100) $Result = ''; // Age over 100 is probably not age but height
}
if ($Result == '') $Result = GetAgeHeightWeightFromText($Text)[0];
if ($Result == '') {
$Year = GetNumberAfterText($Text, 'ročník');
if ($Year != '') $Result = date('Y', time()) - $Year;
}
if ($Result == '') {
$Year = GetNumberAfterText($Text, 'ročník:');
if ($Year != '') $Result = date('Y', time()) - $Year;
}
if ($Result == '') {
$Year = GetNumberAfterText($Text, 'narozen roku');
if ($Year != '') $Result = date('Y', time()) - $Year;
}
if ($Result == '') {
$Year = GetNumberAfterText($Text, 'narozena roku');
if ($Year != '') $Result = date('Y', time()) - $Year;
}
if ($Result == '') {
$Result = GetNumberAfterText($Text, 'věk');
}
return $Result;
}
function GetHeightFromText(string $Text): string
{
$Text = strtolower($Text);
$Result = GetNumberAfterText($Text, 'měřím');
if ($Result == '') $Result = GetNumberAfterText($Text, 'merim');
if ($Result == '') $Result = GetNumberAfterText($Text, 'výška');
if ($Result == '') $Result = GetNumberBeforeText($Text, 'cm');
if ($Result == '') $Result = GetNumberBeforeText($Text, 'bez podpatků');
if ($Result == '') {
$Result = GetNumberAfterText($Text, 'jsem');
if ($Result < 150) $Result = ''; // Height below 150 is probably not height but age
}
if ($Result == '') $Result = GetAgeHeightWeightFromText($Text)[1];
return $Result;
}
function GetWeightFromText(string $Text): string
{
$Text = strtolower($Text);
$Result = GetNumberBeforeText($Text, 'kg');
if ($Result == '') $Result = GetNumberAfterText($Text, 'vážím');
if ($Result == '') $Result = GetNumberAfterText($Text, 'váha');
if ($Result == '') $Result = GetAgeHeightWeightFromText($Text)[2];
return $Result;
}
function GetAgeHeightWeightFromText(string $Text): array
{
$Result = array('', '', '');
$Pattern = '/[0-9]+\/[0-9]+\/[0-9]+/i';
if (preg_match_all($Pattern, $Text, $Matches))
{
$Result = explode('/', $Matches[0][0]);
// Avoid dates in a form day/month/year
if ($Result[2] > 150) $Result = array('', '', '');
} else
{
$Pattern = '/[0-9]+\/[0-9]+/i';
if (preg_match_all($Pattern, $Text, $Matches))
{
$Result = explode('/', $Matches[0][0]);
// If first number is over 100 then its probably height/weight
if ($Result[0] > 100) $Result = array('', $Result[0], $Result[1]);
$Result[] = '';
}
}
return $Result;
}
function GetNameFromText(string $Text): string
{
return '';
}
function GetEmailFromText(string $Text): string
{
$Result = '';
if (strpos($Text, '@') !== false)
{
$Pattern = '/[a-z0-9_\-\+\.]+@[a-z0-9\-]+\.([a-z]{2,4})(?:\.[a-z]{2})?/i';
preg_match_all($Pattern, $Text, $Matches);
if ((count($Matches) > 0) and (count($Matches[0]) > 0) and ($Matches[0][0] != ''))
{
$Result = $Matches[0][0];
}
}
return $Result;
}
$Locations = array(
'praha' => 'Praha',
'prahy' => 'Praha',
'praze' => 'Praha',
'brno' => 'Brno',
'brně' => 'Brno',
'ostrava' => 'Ostrava',
'ostravě' => 'Ostrava',
'ostravy' => 'Ostrava',
'olomouc' => 'Olomouc',
'liberec' => 'Liberec',
'opava' => 'Opava',
'opave' => 'Opava',
'plzeň' => 'Plzeň',
'plzni' => 'Plzeň',
'vyškov' => 'Vyškov',
'mladá boleslav' => 'Mladá Boleslav',
'mladé boleslavi' => 'Mladá Boleslav',
'litoměřice' => 'Litoměřice',
'sokolov' => 'Sokolov',
'mikulov' => 'Mikulov',
'havířov' => 'Havířov',
'kolín' => 'Kolín',
'kroměříž' => 'Kroměříž',
'hradec králové' => 'Hradec Králové',
);
function GetLocationFromText(string $Text): string
{
global $Locations;
$Text = strtolower($Text);
foreach ($Locations as $Index => $Location)
{
if (strpos($Text, $Index) !== false) return $Location;
}
return '';
}
function GetGenderFromName(string $Text): string
{
$Gender = Gender::Male;
$Ending = substr($Text, -2);
if (($Ending == 'na') or ($Ending == 'ta') or ($Ending == 'va') or
($Ending == 'ka') or ($Ending == 'ga') or ($Ending == 'ie') or
($Ending == 'la') or ($Ending == 'za') or ($Ending == 'še') or
($Ending == 'ra') or ($Ending == 'da') or ($Ending == 'sa') or
($Ending == 'ce') or ($Ending == 'id') or ($Ending == 'ša') or
($Ending == 'ma') or ($Ending == 'ja') or ($Ending == 'ia') or
($Ending == 'ha') or ($Ending == 'is'))
return $Gender = Gender::Female;
return $Gender;
}
class MeetSources
{
public Database $Database;
function Parse(?int $Id = null): string
{
$Output = '';
$Where = '1';
if (($Id != null) and is_numeric($Id)) $Where .= ' AND (Id='.$Id.')';
$DbResult = $this->Database->select('MeetSource', '*', $Where);
while ($DbRow = $DbResult->fetch_assoc())
{
if ($DbRow['Enabled'] == 1)
{
$Method = $DbRow['Method'];
if ($Method == 'hes') $Source = new MeetSourceTanecniSkola();
else if ($Method == 'vavruska') $Source = new MeetSourceVavruska();
else if ($Method == 'salsadance') $Source = new MeetSourceSalsaDance();
else if ($Method == 'astra') $Source = new MeetSourceAstraPraha();
else if ($Method == 'seznamka') $Source = new MeetSourceSeznamka();
else if ($Method == 'amblar') $Source = new MeetSourceAmblar();
else if ($Method == 'majkluvsvet') $Source = new MeetSourceMajkluvSvet();
else if ($Method == 'csts') $Source = new MeetSourceCsts();
else if ($Method == 'facebook') $Source = new MeetSourceFacebook();
else if ($Method == 'eso') $Source = new MeetSourceEso();
else if ($Method == 'ella') $Source = new MeetSourceElla();
else if ($Method == 'mgdance') $Source = new MeetSourceMgDance();
else if ($Method == 'latropical') $Source = new MeetSourceLaTropical();
else {
$Output .= 'Unsupported parse method: '.$Method.'
';
continue;
}
$Source->Database = $this->Database;
$Source->Id = $DbRow['Id'];
$Source->URL = $DbRow['URL'];
$Source->Method = $Method;
$Source->Name = $DbRow['Name'];
$Output .= $Source->DoImport();
} else $Output .= 'Parser '.$DbRow['Name'].' (#'.$DbRow['Id'].') disabled.
'."\n";
}
return $Output;
}
}
class MeetSource
{
public string $Name;
public string $URL;
public string $Method;
public string $Id;
public Database $Database;
public array $MeetItems;
public bool $AddCompareTime;
public bool $AddCompareRemoteId;
public int $AddTimeInterval;
public int $AddedCount;
function __construct()
{
$this->MeetItems = array();
$this->AddedCount = 0;
$this->AddCompareTime = true;
$this->AddCompareRemoteId = false;
$this->AddTimeInterval = 0;
}
function Import(): string
{
return '';
}
function DoImport(): string
{
$this->MeetItems = array();
$this->AddedCount = 0;
$Output = 'Parsing '.$this->Name.' (#'.$this->Id.')...';
$Output .= $this->Import();
$Output .= ' parsed: '.count($this->MeetItems);
foreach ($this->MeetItems as $MeetItem)
{
if ($MeetItem->IsSpam()) continue;
$this->AddedCount += $MeetItem->AddIfNotExist($this->AddTimeInterval, $this->AddCompareTime, $this->AddCompareRemoteId);
}
$Output .= ', new added: '.$this->AddedCount;
$Output .= ''."\n";
return $Output;
}
}
class MeetItem
{
public Database $Database;
public string $Name = '';
public string $Message = '';
public ?int $Time = 0;
public int $Gender = Gender::Undefined;
public string $Phone = '';
public string $Email = '';
public string $Age = '';
public string $Height = '';
public int $Source = 0;
public string $Weight = '';
public string $Location = '';
public string $Image = '';
public string $Link = '';
public string $Title = '';
public string $Level = '';
public string $RemoteId = '';
function AddIfNotExist(int $TimeInterval = 0, bool $CompareTime = true, bool $CompareRemoteId = false): int
{
$Where = '(`Message` = "'.$this->Database->real_escape_string($this->Message).'") AND '.
'(`Email` = "'.$this->Database->real_escape_string($this->Email).'") AND '.
'(`Source` = '.$this->Source.')';
if ($CompareTime)
$Where .= ' AND (`Time` >= "'.$this->Database->real_escape_string(TimeToMysqlDateTime($this->Time - $TimeInterval)).'") AND '.
'(`Time` <= "'.$this->Database->real_escape_string(TimeToMysqlDateTime($this->Time + $TimeInterval)).'")';
if ($CompareRemoteId)
$Where .= ' AND (`RemoteId` = "'.$this->Database->real_escape_string($this->RemoteId).'")';
$DbResult = $this->Database->select('MeetItem', '*', $Where);
if ($DbResult->num_rows == 0)
{
if ($this->Age == '') $Age = null;
else $Age = $this->Age;
if ($this->Height == '') $Height = null;
else $Height = $this->Height;
if ($this->Weight == '') $Weight = null;
else $Weight = $this->Weight;
$this->Database->insert('MeetItem', array(
'Source' => $this->Source,
'Link' => $this->Link,
'Email' => $this->Email,
'Message' => $this->Message,
'Time' => TimeToMysqlDateTime($this->Time),
'Gender' => $this->Gender,
'Age' => $Age,
'Phone' => $this->Phone,
'Name' => $this->Name,
'Height' => $Height,
'Weight' => $Weight,
'Location' => $this->Location,
'RemoteId' => $this->RemoteId,
'TimeImport' => 'NOW()',
));
$Result = 1;
} else $Result = 0;
return $Result;
}
function IsSpam(): bool
{
$Keywords = array('půjčk', 'úvěr');
foreach ($Keywords as $Keyword)
{
if (strpos($this->Message, $Keyword) !== false)
{
return true;
}
}
return false;
}
}