Files
api.stellaamor.com/filter_class.php
2024-12-25 20:02:52 +01:00

414 lines
17 KiB
PHP

<?php
class StellaFilter{
public $gender;
public $minAge;
public $maxAge;
public $sexuality;
public $lookingFor;
public $country;
public $city;
public $minHeight;
public $maxHeight;
public $minWeight;
public $maxWeight;
public $hair;
public $facialHair;
public $pubicHair;
public $bodyHair;
public $hairColor;
public $tattoo;
public $piercing;
public $eyeColor;
public $breastSize;
public $minPenisSize;
public $maxPenisSize;
public $abs;
public $bottomSizes;
public $bodyTypes;
public $ethnicities;
public $fitnessLevels;
public $dietaryPreferences;
public $healthHabits;
public $exerciseFrequency;
public $sleepingHabits;
public $foodAllergies;
public $alcoholConsumptions;
public $smoking;
public $jobs;
public $minNetWorth;
public $maxNetWorth;
public $minYearlySalary;
public $maxYearlySalary;
public $mainLiving;
public $financialGoals;
public $spendingHabits;
public $financialIndependence;
public $inDebt;
public $hasKids;
public $wantKids;
public $fetishes;
public $personalities;
public $hobbiesAndActivities;
public $movieGenres;
public $bookGenres;
public $highestGraduation;
public $education;
public $travelPreferences;
public $religion;
public $languages;
public $currentSituation;
public $pets;
public $sexualActivity;
public $activeFilters = array();
public $generalFilter = array('gender', 'minAge', 'maxAge', 'sexualities', 'sexualActivity', 'lookingFor', 'country', 'city');
public $bodyFeaturesFilter = array('minHeight','maxHeight','minWeight','maxWeight','hair','facialHair','pubicHair','bodyHair','hairColor','tattoo','piercing','eyeColor','breastSize','minPenisSize','maxPenisSize','abs','bottomSizes','bodyTypes','ethnicities');
public $bodyLifeStyleFilter = array('fitnessLevels','dietaryPreferences','healthHabits','exerciseFrequency','sleepingHabits','foodAllergies','alcoholConsumptions','smoking');
public $financialFilter = array('jobs','minNetWorth','maxNetWorth','minYearlySalary','maxYearlySalary','mainLiving','financialGoals','spendingHabits','financialIndependence','inDebt');
public $personalFilter = array('hasKids','wantKids','fetishes','personalities','hobbiesAndActivities','movieGenres','bookGenres','highestGraduation','education','travelPreferences','religion','languages','currentSituation','pets');
public $comparisionFilter = array('minAge', 'maxAge', 'minHeight', 'maxHeight', 'minWeight', 'maxWeight', 'minPenisSize', 'maxPenisSize', 'minNetWorth', 'maxNetWorth', 'minYearlySalary', 'maxYearlySalary');
public $comparisionInfo = array(
'minAge' => array(
'comp' => '>',
'pref' => 'dob'
),
'maxAge' => array(
'comp' => '<',
'pref' => 'dob'
),
'minHeight' => array(
'comp' => '>',
'pref' => 'height'
),
'maxHeight' => array(
'comp' => '<',
'pref' => 'height'
),
'minWeight' => array(
'comp' => '>',
'pref' => 'weight'
),
'maxWeight' => array(
'comp' => '<',
'pref' => 'weight'
),
'minPenisSize' => array(
'comp' => '>',
'pref' => 'penisSize'
),
'maxPenisSize' => array(
'comp' => '<',
'pref' => 'penisSize'
),
'minNetWorth' => array(
'comp' => '>',
'pref' => 'netWorth'
),
'maxNetWorth' => array(
'comp' => '<',
'pref' => 'netWorth'
),
'minYearlySalary' => array(
'comp' => '>',
'pref' => 'yearlySalary'
),
'maxYearlySalary' => array(
'comp' => '<',
'pref' => 'yearlySalary'
)
);
public $comparisionStatus = array(
'dob' => false,
'height' => false,
'weight' => false,
'penisSize' => false,
'netWorth' => false,
'yearlySalary' => false
);
public function returnCountries(){
$countries = file_get_contents('includes/countries.json');
return $countries;
}
public function setFilter($termName, $term){
if(property_exists($this, $termName)){
$this->$termName = $term;
$this->activeFilters[] = $termName;
}
}
public function search($terms){
global $db_con;
$sql = 'SELECT u.id, u.uname, u.avatar, u.bio, u.dob, ';
$aliasCount = 1;
$params = array();
try {
foreach($this->activeFilters as $filter){
if(in_array($filter, $this->comparisionFilter)){
$sql_info = $this->comparisionInfo[$filter];
$pref_name = $sql_info['pref'];
if(!$this->comparisionStatus[$pref_name]){
$alias = 'ud' . $aliasCount;
$sql .= $alias . '.data_value AS ' . $pref_name . ",\n";
$aliasCount++;
$this->comparisionStatus[$pref_name] = true;
}
}else{
$alias = 'ud' . $aliasCount;
$sql .= $alias . '.data_value AS ' . $filter . ",\n";
$aliasCount++;
}
}
$sql = rtrim($sql, ",\n");
$sql .= " \n" . 'FROM users AS u';
$aliasCount = 1;
$this->comparisionStatus = array(
'dob' => false,
'height' => false,
'weight' => false,
'penisSize' => false,
'netWorth' => false,
'yearlySalary' => false
);
foreach($this->activeFilters as $filter){
$value = $this->$filter;
if ($value !== null) {
if (is_array($value)) {
$value = implode(', ', $value);
}
$alias = 'ud' . $aliasCount;
if (in_array($filter, $this->comparisionFilter)) {
$sql_info = $this->comparisionInfo[$filter];
$pref_name = $sql_info['pref'];
if (!$this->comparisionStatus[$pref_name]) {
$sql .= "\n" . ' LEFT JOIN ' . 'user_data' . ' AS ' . $alias . ' ON u.id = ' . $alias . '.user_id AND ' . $alias . '.data_name = ? ';
$params[] = $pref_name;
$this->comparisionStatus[$pref_name] = true;
$aliasCount++;
}
} else {
$sql .= "\n" . ' LEFT JOIN ' . 'user_data' . ' AS ' . $alias . ' ON u.id = ' . $alias . '.user_id AND ' . $alias . '.data_name = ?';
$params[] = $filter;
$aliasCount++;
}
}
}
$aliasCount = 1;
$this->comparisionStatus = array(
'dob' => false,
'height' => false,
'weight' => false,
'penisSize' => false,
'netWorth' => false,
'yearlySalary' => false
);
if(count($this->activeFilters) > 0){
$sql .= "\n" . " WHERE ";
$conditions = array();
foreach ($this->activeFilters as $filter) {
if (isset($terms->$filter) && $terms->$filter && !empty($terms->$filter)) {
$filter_value = $terms->$filter;
} else {
throw new Exception('Malicious user input');
}
if(in_array($filter, $this->comparisionFilter)){
$sql_info = $this->comparisionInfo[$filter];
$pref_name = $sql_info['pref'];
if (!$this->comparisionStatus[$pref_name]) {
$alias = 'ud' . $aliasCount;
$prePref = str_replace('min', '', $filter);
$prePref = str_replace('max', '', $prePref);
$minPref = 'min' . ucfirst($prePref);
$maxPref = 'max' . ucfirst($prePref);
$minVal = $terms->$minPref;
$maxVal = $terms->$maxPref;
if ($prePref == 'Age') {
$isDate = true;
$isMax = intval($terms->maxAge) >= 99;
// Calculate age
$minVal = $this->calcYear($minVal);
$maxVal = $this->calcYear($maxVal);
} else {
$isDate = false;
// Check for max conditions
switch ($prePref) {
case 'Height':
$isMax = intval($terms->maxHeight) >= 240;
break;
case 'NetWorth':
$isMax = intval($terms->maxNetWorth) == 10000000;
break;
case 'PenisSize':
$isMax = intval($terms->maxPenisSize) == 40;
break;
case 'Weight':
$isMax = intval($terms->maxWeight) == 200;
break;
case 'YearlySalary':
$isMax = intval($terms->maxYearlySalary) == 1000000;
break;
default:
$isMax = false;
}
}
if ($isDate) {
if ($isMax) {
$conditions[] = "\n" . "STR_TO_DATE(" . $alias . ".data_value, '%Y-%m-%d') >= ?";
$params[] = "'" . date('Y-m-d', strtotime($minVal)) . "'";
} else {
$conditions[] = "\n" . "STR_TO_DATE(" . $alias . ".data_value, '%Y-%m-%d') >= ? AND STR_TO_DATE(" . $alias . ".data_value, '%Y-%m-%d') <= ?";
$params[] = "'" . date('Y-m-d', strtotime($minVal)) . "'";
$params[] = "'" . date('Y-m-d', strtotime($maxVal)) . "'";
}
} else {
if ($isMax) {
$conditions[] = "\n" . "CAST(" . $alias . ".data_value AS SIGNED) >= ?";
$params[] = intval($minVal);
} else {
$conditions[] = "\n" . "CAST(" . $alias . ".data_value AS SIGNED) >= ? AND CAST(" . $alias . ".data_value AS SIGNED) <= ?";
$params[] = intval($minVal);
$params[] = intval($maxVal);
}
}
$aliasCount++;
$this->comparisionStatus[$pref_name] = true;
}
}else {
$alias = 'ud' . $aliasCount;
if (is_array($filter_value)) {
$conditions[] = "\n" . '(' . rtrim(str_repeat($alias . '.data_value LIKE ? OR ', count($filter_value)), 'OR ') . ')';
foreach ($filter_value as $value) {
$params[] = "%" . $value . "%";
}
} else if($filter_value == 'male' || 'female'){
$conditions[] = "\n" . $alias . '.data_value = ?';
$params[] = $filter_value;
} else {
$conditions[] = "\n" . $alias . '.data_value LIKE ?';
$params[] = "%" . $filter_value . "%";
}
$aliasCount++;
}
}
$sql .= implode(" AND ", $conditions);
$sql .= "ORDER BY RAND() LIMIT 1000";
$stmt = $db_con->prepare($sql);
// echo $sql;
$stmt->execute($params);
}else{
$stmt = $db_con->prepare($sql);
$stmt->execute();
}
$executedQuery = $stmt->queryString;
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$users = array();
foreach($rows as $row){
$user = new stdClass();
if(isset($row['dob']) && !empty($row['dob'])){
$dob = $row['dob'];
$calcDob = new DateTime($dob);
$calcDob = $calcDob->format('Y-m-d');
if($dob < $this->minAge && $dob > $this->maxAge){
// Get country
$stm = $db_con->prepare('SELECT data_value FROM user_data WHERE data_name = "country" AND user_id = :id');
$stm->bindValue(':id', $row['id']);
$stm->execute();
$_country = $stm->fetch(PDO::FETCH_ASSOC);
// Get gender
$stm = $db_con->prepare('SELECT data_value FROM user_data WHERE data_name = "gender" AND user_id = :id');
$stm->bindValue(':id', $row['id']);
$stm->execute();
$_gender = $stm->fetch(PDO::FETCH_ASSOC);
// Get orientation
$stm = $db_con->prepare('SELECT data_value FROM user_data WHERE data_name = "sexuality" AND user_id = :id');
$stm->bindValue(':id', $row['id']);
$stm->execute();
$_sexuality = $stm->fetch(PDO::FETCH_ASSOC);
// Get sexuality, gender and country
$user->id = $row['id'];
$user->username = $row['uname'];
$user->avatar = $row['avatar'];
$user->bio = isset($row['bio']) && !empty($row['bio']) ? $row['bio'] : '';
$user->age = $this->calcAge($dob);
$user->country = isset($_country['data_value']) && !empty($_country['data_value']) ? $_country['data_value'] : 'Unknown location';
$user->gender = isset($_gender['data_value']) && !empty($_gender['data_value']) ? $_gender['data_value'] : '';
$user->sexuality = isset($_sexuality['data_value']) && !empty($_sexuality['data_value']) ? $_sexuality['data_value'] : '';
$users[] = $user;
}
}
}
$filtered_users = json_encode($users);
return $filtered_users;
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
}
public function allowed_search_value($val){
require('includes/allowedFilter.php');
$countries = file_get_contents('includes/countries.json');
$countries = json_decode($countries);
$isAllowed = false;
if(in_array($val, $filterAllowed)){
$isAllowed = true;
}
foreach($countries as $country => $cities) {
if($country === $val || in_array($val, $cities)) {
$isAllowed = true;
break;
}
}
return $isAllowed;
}
public function calcYear($age) {
$currentDate = new DateTime();
$currentDate->sub(new DateInterval('P' . $age . 'Y'));
$dateOfBirth = $currentDate->format('Y-m-d');
return $dateOfBirth;
}
private function calcAge($dob) {
$dobDate = new DateTime($dob);
$currentDate = new DateTime();
$age = $currentDate->diff($dobDate);
return $age->y;
}
}