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

681 lines
24 KiB
PHP

<?php
class Users{
public $username;
public $email;
public $pass;
public $gender;
public $password;
public $country;
public $city;
public $dob;
public $allowedSettings = array('gender', 'dob', 'sexuality', 'sexualActivity', 'lookingFor', 'country', 'city', 'height', 'weight', 'hair', 'facialHair', 'pubicHair', 'bodyHair', 'hairColor', 'tattoo', 'piercing', 'eyeColor', 'breastSize', 'penisSize', 'abs', 'bottomSizes', 'bodyTypes', 'ethnicities', 'fitnessLevels', 'dietaryPreferences', 'healthHabits', 'exerciseFrequency', 'sleepingHabits', 'foodAllergies', 'alcoholConsumptions', 'smoking', 'jobs', 'netWorth', 'yearlySalary', 'mainLiving', 'financialGoals', 'spendingHabits', 'financialIndependence', 'inDebt', 'hasKids', 'wantKids', 'fetishes', 'personalities', 'hobbiesAndActivities', 'movieGenres', 'bookGenres', 'highestGraduation', 'education', 'travelPreferences', 'religion', 'languages', 'currentSituation', 'pets');
public $personalSettings = array(
'gender' => array(
'function' => 'update_general_preference',
'name' => 'gender',
),
'dob' => array(
'function' => 'update_general_preference',
'name' => 'dob',
),
'sexuality' => array(
'function' => 'update_general_preference',
'name' => 'sexuality'
),
'lookingFor' => array(
'function' => 'update_general_preference',
'name' => 'lookingFor',
),
'country' => array(
'function' => 'update_general_preference',
'name' => 'country',
),
'city' => array(
'function' => 'update_general_preference',
'name' => 'city',
),
);
// public function __construct(){
// }
public function email_exists(){
global $db_con;
$pre_sql = $db_con->prepare('SELECT u_email FROM users WHERE u_email = :email');
$pre_sql->bindValue(':email', $this->email);
$pre_sql->execute();
$_res = $pre_sql->rowCount();
if($_res > 0){
return true;
}else{
return false;
}
}
public function username_exists(){
global $db_con;
$pre_sql = $db_con->prepare('SELECT uname FROM users WHERE uname = :uname');
$pre_sql->bindValue(':uname', $this->username);
$pre_sql->execute();
$_res = $pre_sql->rowCount();
if($_res > 0){
return true;
}else{
return false;
}
}
public function setLogin($id){
global $db_con;
$hex = bin2hex(random_bytes(36 / 2));
$sql_con = $db_con->prepare("UPDATE users SET login_session_id = :hex WHERE id = :id");
$sql_con->bindValue(':hex', $hex);
$sql_con->bindValue(':id', $id);
$sql_con->execute();
return $hex;
}
public function logout(){
global $db_con;
$sql = $db_con->prepare("UPDATE users SET login_session_id = '' WHERE id = :id");
$sql->bindValue(':id', $_COOKIE['authId']);
$sql->execute();
setcookie('authCookie','', time() - 7200);
setcookie('authId', '', time() - 7200);
session_destroy();
}
public function isAuth(){
global $db_con;
if(isset($_COOKIE['authCookie'])){
$token = $_COOKIE['authCookie'];
$uId = $_COOKIE['authId'];
$sql_con = $db_con->prepare('SELECT * FROM users WHERE login_session_id = :session_key AND id = :id');
$sql_con->bindValue(':session_key', $token);
$sql_con->bindValue(':id', $uId);
$sql_con->execute();
$rowCount = $sql_con->rowCount();
if($rowCount !== 0){
return true;
}else{
return false;
}
}else{
return false;
}
}
public function register(){
global $db_con;
$sql_con = $db_con->prepare('INSERT INTO users SET uname = :username, u_email = :email, psw = :psw, dob = :dob');
$sql_con->bindValue(':username', $this->username);
$sql_con->bindValue(':email', $this->email);
$sql_con->bindValue(':psw', $this->password);
$sql_con->bindValue(':dob', $this->dob);
$sql_con->execute();
$sql_con = $db_con->prepare('SELECT id FROM users WHERE u_email = :u_email');
$sql_con->bindValue(':u_email', $this->email);
$sql_con->execute();
$temp_user_data = $sql_con->fetch(PDO::FETCH_ASSOC);
$user_id = $temp_user_data['id'];
if(!empty($user_id)){
$this->update_user_data('gender', $this->gender, $user_id);
$this->update_user_data('country', $this->country, $user_id);
$this->update_user_data('dob', '', $user_id);
}
$cu_name = md5(time());
$date = new DateTime();
$date->modify('+30 days');
$cu_exp = $date->getTimestamp();
$sql = $db_con->prepare('INSERT INTO stripe_user_data (cu_name, exp_date) VALUES (:cu_name, :exp)');
$sql->bindValue(':cu_name', $cu_name);
$sql->bindValue(':exp', $cu_exp);
$sql->execute();
$sql_con = $db_con->prepare('UPDATE users SET stripe_cu = :stripe_cu WHERE id = :user_id');
$sql_con->bindValue(':stripe_cu', $cu_name);
$sql_con->bindValue(':user_id', $user_id);
$sql_con->execute();
}
public function login(){
global $db_con;
$sql_con = $db_con->prepare('SELECT * FROM users WHERE uname = :uname');
$sql_con->bindValue(':uname', $this->username);
$sql_con->execute();
$user = $sql_con->fetch(PDO::FETCH_ASSOC);
return $user;
}
public function update_user_data($name, $value, $user){
global $db_con;
if(is_array($value)){
$value = implode(",", $value);
}
$sql_con = $db_con->prepare('SELECT * FROM user_data WHERE data_name = :data_name AND user_id = :user_id');
$sql_con->bindValue(':data_name', $name);
$sql_con->bindValue(':user_id', $user);
$sql_con->execute();
$num_rows = $sql_con->rowCount();
if($num_rows > 0){
$sql_con = $db_con->prepare('UPDATE user_data SET data_value = :data_value WHERE user_id = :user_id AND data_name = :data_name');
$sql_con->bindValue(':data_name', $name);
$sql_con->bindValue(':data_value', $value);
$sql_con->bindValue(':user_id', $user);
$sql_con->execute();
}else{
$sql_con = $db_con->prepare('INSERT INTO user_data (data_name, data_value, user_id) VALUES (:data_name, :data_value, :user_id)');
$sql_con->bindValue(':data_name', $name);
$sql_con->bindValue(':data_value', $value);
$sql_con->bindValue(':user_id', $user);
$sql_con->execute();
}
// echo 'Executed ' . $name . ' with value ' . $value . '<br>';
}
public function allowedSetting($setting){
if(in_array($setting, $this->allowedSettings)){
return true;
}else{
return false;
}
}
public function locateAtts($setting){
if(key_exists($setting, $this->personalSettings)){
return $this->personalSettings;
}
}
public function initUserSettings(){
global $db_con;
if($this->isAuth()){
$sql_con = $db_con->prepare("SELECT u.uname, u.u_email, ud.data_name, ud.data_value
FROM users u
JOIN user_data ud ON u.id = ud.user_id
WHERE ud.user_id = :user_id");
$sql_con->bindValue(':user_id', $_COOKIE['authId']);
$sql_con->execute();
$sql_rows = $sql_con->fetchaLL(PDO::FETCH_ASSOC);
$userSettings = new stdClass();
foreach($sql_rows as $row){
$userSettings->{$row['data_name']} = $row['data_value'];
}
$userSettings = json_encode($userSettings);
return $userSettings;
}else{
return null;
}
}
public function updateAvatar($avatar, $ext){
global $db_con;
$uid = $_COOKIE['authId'];
$allowedPhotos = array('jpg', 'jpeg', 'png', 'gif');
$name = $this->generateRandomName();
$name = $name . '.' . $ext;
$path = $_SERVER['DOCUMENT_ROOT'] . '/uploads/';
if (in_array($ext, $allowedPhotos)) {
move_uploaded_file($avatar, $path . $name);
}
$stmt = $db_con->prepare('UPDATE users SET avatar = :avatar WHERE id = :id');
$stmt->bindValue(':avatar', $name);
$stmt->bindValue(':id', $uid);
$stmt->execute();
}
public function updateBanner($banner, $ext){
global $db_con;
$uid = $_COOKIE['authId'];
$allowedPhotos = array('jpg', 'jpeg', 'png', 'gif');
$name = $this->generateRandomName();
$name = $name . '.' . $ext;
$path = $_SERVER['DOCUMENT_ROOT'] . '/uploads/';
if (in_array($ext, $allowedPhotos)) {
move_uploaded_file($banner, $path . $name);
}
$stmt = $db_con->prepare('UPDATE users SET banner = :banner WHERE id = :id');
$stmt->bindValue(':banner', $name);
$stmt->bindValue(':id', $uid);
$stmt->execute();
}
public function updateBio($bio){
global $db_con;
$uid = $_COOKIE['authId'];
$stmt = $db_con->prepare('UPDATE users SET bio = :bio WHERE id = :id');
$stmt->bindValue(':bio', $bio);
$stmt->bindValue(':id', $uid);
$stmt->execute();
}
public function generateRandomName($length = 32) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomName = '';
$maxIndex = strlen($characters) - 1;
for ($i = 0; $i < $length; $i++) {
$randomName .= $characters[rand(0, $maxIndex)];
}
return $randomName;
}
public function initUser(){
global $db_con;
$id = $_COOKIE['authId'];
$stmt = $db_con->prepare('SELECT * FROM users WHERE id = :id');
$stmt->bindValue(':id', $id);
$stmt->execute();
$defaultUser = $stmt->fetch(PDO::FETCH_ASSOC);
$user = new stdClass();
$user->username = $defaultUser['uname'];
$user->avatar = isset($defaultUser['avatar']) && !empty($defaultUser['avatar']) ? $defaultUser['avatar'] : 'default.png';
$user->banner = isset($defaultUser['banner']) && !empty($defaultUser['banner']) ? $defaultUser['banner'] : 'defaultBG.png';
$user->bio = isset($defaultUser['bio']) && !empty($defaultUser['bio']) ? $defaultUser['bio'] : '';
$user->country = $this->get_data_value('country', $id);
$user->city = $this->get_data_value('city', $id);
$user->gender = $this->get_data_value('gender', $id);
$user->sexuality = $this->get_data_value('sexuality', $id);
$dob = isset($defaultUser['dob']) && !empty($defaultUser['dob']) ? $defaultUser['dob'] : '';
if(isset($dob) && !empty($dob)){
$user->age = $this->calcAge($dob);
}else{
$user->age = '';
}
if(isset($user->username)){
$user->status = "Success";
}
// Get userData:
$sql_con = $db_con->prepare("SELECT u.uname, u.u_email, ud.data_name, ud.data_value
FROM users u
JOIN user_data ud ON u.id = ud.user_id
WHERE ud.user_id = :user_id");
$sql_con->bindValue(':user_id', $_COOKIE['authId']);
$sql_con->execute();
$sql_rows = $sql_con->fetchaLL(PDO::FETCH_ASSOC);
$userData = new stdClass();
foreach($sql_rows as $row){
$userData->{$row['data_name']} = $row['data_value'];
}
$user->userData = $userData;
// Get user images:
$sql_con = $db_con->prepare("SELECT image_name FROM user_gallery WHERE user_id = :user_id");
$sql_con->bindValue(':user_id', $_COOKIE['authId']);
$sql_con->execute();
$sql_rows = $sql_con->fetchaLL(PDO::FETCH_ASSOC);
$userGallery = array();
foreach($sql_rows as $row){
$userGallery[] = $row['image_name'];
}
$user->userGallery = $userGallery;
$user = json_encode($user);
return $user;
}
public function getUser($id){
global $db_con;
$stmt = $db_con->prepare('SELECT * FROM users WHERE id = :id');
$stmt->bindValue(':id', $id);
$stmt->execute();
$defaultUser = $stmt->fetch(PDO::FETCH_ASSOC);
$user = new stdClass();
$user->id = $defaultUser['id'];
$user->username = $defaultUser['uname'];
$user->avatar = isset($defaultUser['avatar']) && !empty($defaultUser['avatar']) ? $defaultUser['avatar'] : 'default.png';
$user->banner = isset($defaultUser['banner']) && !empty($defaultUser['banner']) ? $defaultUser['banner'] : 'defaultBG.png';
$user->bio = isset($defaultUser['bio']) && !empty($defaultUser['bio']) ? $defaultUser['bio'] : '';
$user->country = $this->get_data_value('country', $id);
$user->city = $this->get_data_value('city', $id);
$user->gender = $this->get_data_value('gender', $id);
$user->sexuality = $this->get_data_value('sexuality', $id);
$dob = isset($defaultUser['dob']) && !empty($defaultUser['dob']) ? $defaultUser['dob'] : '0';
if(isset($dob) && !empty($dob)){
$user->age = $this->calcAge($dob);
}else{
$user->age = '';
}
if(isset($user->username)){
$user->status = "Success";
}
// Get userData:
$sql_con = $db_con->prepare("SELECT u.uname, u.u_email, ud.data_name, ud.data_value
FROM users u
JOIN user_data ud ON u.id = ud.user_id
WHERE ud.user_id = :user_id");
$sql_con->bindValue(':user_id', $id);
$sql_con->execute();
$sql_rows = $sql_con->fetchaLL(PDO::FETCH_ASSOC);
$userData = new stdClass();
foreach($sql_rows as $row){
$userData->{$row['data_name']} = $row['data_value'];
}
$user->userData = $userData;
// Get user images:
$sql_con = $db_con->prepare("SELECT image_name FROM user_gallery WHERE user_id = :user_id");
$sql_con->bindValue(':user_id', $id);
$sql_con->execute();
$sql_rows = $sql_con->fetchaLL(PDO::FETCH_ASSOC);
$userGallery = array();
foreach($sql_rows as $row){
$userGallery[] = $row['image_name'];
}
$user->userGallery = $userGallery;
$user = json_encode($user);
return $user;
}
private function get_data_value($name, $id){
global $db_con;
$stmt = $db_con->prepare("SELECT data_value FROM user_data WHERE data_name = :data_name AND user_id = :user_id");
$stmt->bindValue(':data_name', $name);
$stmt->bindValue(':user_id', $id);
$stmt->execute();
$holder = $stmt->fetch(PDO::FETCH_ASSOC);
if(isset($holder['data_value']) && !empty($holder['data_value'])){
$value = $holder['data_value'];
}else{
$value = '';
}
return $value;
}
private function calcAge($dob) {
$dobDate = new DateTime($dob);
$currentDate = new DateTime();
$age = $currentDate->diff($dobDate);
return $age->y;
}
public function uploadGalleryImage($image, $ext){
global $db_con;
$uid = $_COOKIE['authId'];
$allowedPhotos = array('jpg', 'jpeg', 'png', 'gif');
$name = $this->generateRandomName();
$name = $name . '.' . $ext;
$path = $_SERVER['DOCUMENT_ROOT'] . '/uploads/';
if (in_array($ext, $allowedPhotos)) {
move_uploaded_file($image, $path . $name);
}
$stmt = $db_con->prepare('INSERT INTO user_gallery (user_id, image_name) VALUES (:id, :image_name)');
$stmt->bindValue(':image_name', $name);
$stmt->bindValue(':id', $uid);
$stmt->execute();
}
public function deleteImage($image){
global $db_con;
$path = $_SERVER['DOCUMENT_ROOT'] . '/uploads/';
$sql = $db_con->prepare("SELECT * FROM user_gallery WHERE user_id = :user_id AND image_name = :image_name");
$sql->bindValue(':image_name', $image);
$sql->bindValue(':user_id', $_COOKIE['authId']);
$sql->execute();
$nums = $sql->rowCount();
if($nums > 0){
if(file_exists($path . $image)){
unlink($path . $image);
$sql = $db_con->prepare('DELETE FROM user_gallery WHERE user_id = :user_id AND image_name = :image_name');
$sql->bindValue(':image_name', $image);
$sql->bindValue(':user_id', $_COOKIE['authId']);
$sql->execute();
}
}
}
public function receive_messages($user_id){
global $db_con;
$current_user = intval($_COOKIE['authId']);
$message_user = intval($user_id);
// Receive user data
$sql = $db_con->prepare("SELECT uname, avatar FROM users WHERE id = :id");
$sql->bindValue(':id', $current_user);
$sql->execute();
$current_user_data = $sql->fetch(PDO::FETCH_ASSOC);
// Receive messager data
$sql = $db_con->prepare("SELECT uname, avatar FROM users WHERE id = :id");
$sql->bindValue(':id', $message_user);
$sql->execute();
$message_user_data = $sql->fetch(PDO::FETCH_ASSOC);
// Set username and avatar
$cua = $current_user_data['avatar'];
$cuu = $current_user_data['uname'];
$mua = $message_user_data['avatar'];
$muu = $message_user_data['uname'];
// Receive messages
$sql = $db_con->prepare('SELECT *
FROM user_chats
WHERE (sender_id = :current_user AND receiver_id = :message_user)
OR (sender_id = :message_user AND receiver_id = :current_user)
ORDER BY id ASC');
$sql->bindValue(':message_user', $message_user);
$sql->bindValue(':current_user', $current_user);
$sql->execute();
$sql_messages = $sql->fetchAll(PDO::FETCH_ASSOC);
$messages = array();
foreach($sql_messages as $message){
$msg = new stdClass();
if($message['sender_id'] == $current_user){
$msg->uid = $current_user;
$msg->sender = 'me';
$msg->avatar = $cua;
$msg->username = $cuu;
}else{
$msg->uid = $message_user;
$msg->sender = 'other';
$msg->avatar = $mua;
$msg->username = $muu;
}
$msg->content = $message['user_message'];
$messages[] = $msg;
}
$stm = $db_con->prepare("UPDATE user_chats SET readStatus = 0 WHERE receiver_id = :user_id AND sender_id = :sender_id");
$stm->bindValue(':user_id', $current_user);
$stm->bindValue(':sender_id', $message_user);
$stm->execute();
$messages = json_encode($messages);
return $messages;
}
public function sendMessage($user_id, $message){
global $db_con;
$user_id = intval($user_id);
$current_user = $_COOKIE['authId'];
$message = htmlspecialchars($message);
$sql = $db_con->prepare('INSERT INTO user_chats (sender_id, receiver_id, user_message, message_type) VALUES (:sender_id, :receiver_id, :user_message, :message_type)');
$sql->bindValue(':sender_id', $current_user);
$sql->bindValue(':receiver_id', $user_id);
$sql->bindValue(':user_message', $message);
$sql->bindValue(':message_type', 'text');
$sql->execute();
}
public function get_conversations(){
global $db_con;
$user_id = $_COOKIE['authId'];
$sql = $db_con->prepare("SELECT DISTINCT IF(sender_id = :user_id, receiver_id, sender_id) AS chat_partner_id
FROM user_chats
WHERE sender_id = :user_id OR receiver_id = :user_id");
$sql->bindParam(':user_id', $user_id);
$sql->execute();
$chat_partners = $sql->fetchAll(PDO::FETCH_COLUMN);
// $chat_partners = array_diff($chat_partners, [$user_id]);
$conversations = array();
foreach($chat_partners as $chat){
$conversation = new stdClass();
$msg_id = intval($chat);
// Get last message
$sql = $db_con->prepare("SELECT user_message, time_received
FROM user_chats
WHERE (sender_id = :user_id AND receiver_id = :msg_id)
OR (sender_id = :msg_id AND receiver_id = :user_id)
ORDER BY id DESC
LIMIT 1");
$sql->bindValue(':msg_id', $msg_id);
$sql->bindValue(':user_id', $user_id);
$sql->execute();
$_msg = $sql->fetch(PDO::FETCH_ASSOC);
$msg = $_msg['user_message'];
$time_rec = $_msg['time_received'];
$stmt = $db_con->prepare('SELECT uname, avatar FROM users WHERE id = :id');
$stmt->bindValue(':id', $msg_id);
$stmt->execute();
$msg_info = $stmt->fetch(PDO::FETCH_ASSOC);
$conversation->avatar = $msg_info['avatar'];
$conversation->username = $msg_info['uname'];
$conversation->message = $msg;
$conversation->time = $time_rec;
$conversation->user_id = $msg_id;
$conversations[] = $conversation;
}
usort($conversations, function($a, $b) {
return strtotime($b->time) - strtotime($a->time);
});
return json_encode($conversations);
}
public function checkUnread(){
global $db_con;
$id = $_COOKIE['authId'];
$sql = $db_con->prepare('SELECT * FROM user_chats WHERE receiver_id = :user_id AND readStatus = 1');
$sql->bindValue(':user_id', $id);
$sql->execute();
$numRows = $sql->rowCount();
if($numRows > 0){
$status = true;
}else{
$status = false;
}
$response = new stdClass();
$response->status = $status;
$response = json_encode($response);
return $response;
}
public function updatePassword($current_password, $new_password, $confirm_password){
global $db_con;
$id = $_COOKIE['authId'];
$sql = $db_con->prepare("SELECT psw FROM users WHERE id = :id");
$sql->bindValue(':id', $id);
$sql->execute();
$_psw = $sql->fetch(PDO::FETCH_ASSOC);
$psw = $_psw['psw'];
$response = new stdClass();
if(password_verify($current_password, $psw)){
if($new_password == $confirm_password){
$new_psw = password_hash($new_password, PASSWORD_BCRYPT, ["cost" => 12]);
$stmt = $db_con->prepare("UPDATE users SET psw = :psw WHERE id = :id");
$stmt->bindValue(':psw', $new_psw);
$stmt->bindValue(':id', $id);
$stmt->execute();
$response->status = 'success';
}else{
$response->status = 'error';
$response->message = 'Passwords does not match';
}
}else{
$response->status = 'error';
$response->message = 'Incorrect password';
}
$response = json_encode($response);
return $response;
}
public function isPaid(){
global $db_con;
$id = intval($_COOKIE['authId']);
$sql = $db_con->prepare('SELECT u.stripe_cu, st.exp_date FROM users u LEFT JOIN stripe_user_data st ON st.cu_name = u.stripe_cu WHERE u.id = :id');
$sql->bindValue(':id', $id);
$sql->execute();
if($sql->rowCount() > 0){
$date_query = $sql->fetch(PDO::FETCH_ASSOC);
$sub_date = intval($date_query['exp_date']);
$current_date = intval(time());
if($current_date > $sub_date){
return false;
}else{
return true;
}
}else{
return false;
}
}
public function hasPaid(){
global $db_con;
$id = intval($_COOKIE['authId']);
$sql = $db_con->prepare('SELECT u.stripe_cu, st.exp_date FROM users u LEFT JOIN stripe_user_data st ON st.cu_name = u.stripe_cu WHERE u.id = :id');
$sql->bindValue(':id', $id);
$sql->execute();
if($sql->rowCount() > 0){
$date_query = $sql->fetch(PDO::FETCH_ASSOC);
$sub_date = intval($date_query['exp_date']);
$current_date = intval(time());
if($current_date > $sub_date){
return false;
}else{
return true;
}
}else{
return false;
}
}
}
?>