2015-08-19 01:29:45 +02:00
< ? php
/*
* Everything you ' d ever need from a specific user
*/
namespace Sakura ;
class User {
// User data
2015-08-19 04:37:45 +02:00
public $data = [];
public $ranks = [];
public $mainRank = [];
2015-08-19 01:29:45 +02:00
2015-08-19 04:37:45 +02:00
// Initialise the user object
function __construct ( $id ) {
2015-08-19 01:29:45 +02:00
// Get the user database row
2015-08-22 00:07:45 +02:00
$this -> data = Database :: fetch ( 'users' , false , [ 'id' => [ $id , '=' , true ], 'username_clean' => [ Main :: cleanString ( $id , true ), '=' , true ]]);
// Check if anything like the username exists
if ( empty ( $this -> data )) {
$this -> data = Database :: fetch ( 'users' , false , [ 'username_clean' => [ '%' . Main :: cleanString ( $id , true ) . '%' , 'LIKE' ]]);
}
2015-08-19 04:37:45 +02:00
// Check if the user actually exists
if ( empty ( $this -> data )) {
// If not assign as the fallback user
$this -> data = Users :: $emptyUser ;
}
// Decode the json in the userData column
$this -> data [ 'userData' ] = json_decode ( ! empty ( $this -> data [ 'userData' ]) ? $this -> data [ 'userData' ] : '[]' , true );
2015-08-19 01:29:45 +02:00
// Decode the ranks json array
2015-08-19 04:37:45 +02:00
$ranks = json_decode ( $this -> data [ 'ranks' ], true );
2015-08-19 01:29:45 +02:00
// Get the rows for all the ranks
2015-08-19 04:37:45 +02:00
foreach ( $ranks as $rank ) {
// Store the database row in the array
$this -> ranks [ $rank ] = Database :: fetch ( 'ranks' , false , [ 'id' => [ $rank , '=' ]]);
}
// Check if ranks were set
if ( empty ( $this -> ranks )) {
// If not assign the fallback rank
$this -> ranks [ 0 ] = Users :: $emptyRank ;
}
// Assign the user's main rank to a special variable since we'll use it a lot
$this -> mainRank = $this -> ranks [ array_key_exists ( $this -> data [ 'rank_main' ], $this -> ranks ) ? $this -> data [ 'rank_main' ] : array_keys ( $this -> ranks )[ 0 ]];
}
2015-08-22 00:07:45 +02:00
// Check if the user has the specified ranks
public function checkIfUserHasRanks ( $ranks ) {
// Check if the main rank is the specified rank
if ( in_array ( $this -> mainRank [ 'id' ], $ranks )) {
return true ;
}
// If not go over all ranks and check if the user has them
foreach ( $ranks as $rank ) {
// We check if $rank is in $this->ranks and if yes return true
if ( array_key_exists ( $rank , $this -> ranks )) {
return true ;
}
}
// If all fails return false
return false ;
}
2015-08-19 04:37:45 +02:00
// Get the user's colour
public function colour () {
return empty ( $this -> data [ 'name_colour' ]) ? $this -> mainRank [ 'colour' ] : $this -> data [ 'name_colour' ];
}
// Get the user's title
public function userTitle () {
return empty ( $this -> data [ 'usertitle' ]) ? $this -> mainRank [ 'title' ] : $this -> data [ 'usertitle' ];
}
// Get the user's long and short country names
public function country () {
return [
'long' => Main :: getCountryName ( $this -> data [ 'country' ]),
'short' => $this -> data [ 'country' ]
];
}
2015-08-19 14:13:38 +02:00
// Check if a user is online
public function checkOnline () {
return $this -> data [ 'lastdate' ] > ( time () - Configuration :: getConfig ( 'max_online_time' ));
}
// Get user's forum statistics
public function forumStats () {
return Forum :: getUserStats ( $this -> data [ 'id' ]);
}
// Check if the user is friends with the currently authenticated
public function checkFriends ( $with ) {
return Users :: checkFriend ( $this -> data [ 'id' ], $with );
}
2015-08-24 00:08:36 +02:00
// Get all the friend of this user
public function getFriends () {
return Users :: getFriends ( $this -> data [ 'id' ]);
}
2015-08-19 14:13:38 +02:00
// Check if the user is banned
public function checkBan () {
return Bans :: checkBan ( $this -> data [ 'id' ]);
}
2015-08-22 00:07:45 +02:00
// Check if the user has the proper permissions
public function checkPermission ( $layer , $action ) {
return Permissions :: check ( $layer , $action , $this -> data [ 'id' ], 1 );
}
2015-08-19 04:37:45 +02:00
// Get the user's profile fields
public function profileFields () {
// Get profile fields
$profileFields = Database :: fetch ( 'profilefields' );
// If there's nothing just return null
if ( ! count ( $profileFields )) {
return ;
}
// Once again if nothing was returned just return null
if ( empty ( $this -> data [ 'userData' ][ 'profileFields' ])) {
return ;
}
// Create output array
$profile = [];
// Check if profile fields aren't fake
foreach ( $profileFields as $field ) {
// Completely strip all special characters from the field name
$fieldName = Main :: cleanString ( $field [ 'name' ], true , true );
// Check if the user has the current field set otherwise continue
if ( ! array_key_exists ( $fieldName , $this -> data [ 'userData' ][ 'profileFields' ])) {
continue ;
}
// Assign field to output with value
$profile [ $fieldName ] = array ();
$profile [ $fieldName ][ 'name' ] = $field [ 'name' ];
$profile [ $fieldName ][ 'value' ] = $this -> data [ 'userData' ][ 'profileFields' ][ $fieldName ];
$profile [ $fieldName ][ 'islink' ] = $field [ 'islink' ];
// If the field is set to be a link add a value for that as well
if ( $field [ 'islink' ]) {
$profile [ $fieldName ][ 'link' ] = str_replace ( '{{ VAL }}' , $this -> data [ 'userData' ][ 'profileFields' ][ $fieldName ], $field [ 'linkformat' ]);
}
// Check if we have additional options as well
if ( $field [ 'additional' ] != null ) {
// Decode the json of the additional stuff
$additional = json_decode ( $field [ 'additional' ], true );
// Go over all additional forms
foreach ( $additional as $subName => $subField ) {
// Check if the user has the current field set otherwise continue
if ( ! array_key_exists ( $subName , $this -> data [ 'userData' ][ 'profileFields' ])) {
continue ;
}
// Assign field to output with value
$profile [ $fieldName ][ $subName ] = $this -> data [ 'userData' ][ 'profileFields' ][ $subName ];
}
}
}
// Return appropiate profile data
return $profile ;
2015-08-19 01:29:45 +02:00
}
2015-08-22 00:07:45 +02:00
// Get the user's option fields
public function optionFields () {
// Get option fields
$optionFields = Database :: fetch ( 'optionfields' );
// If there's nothing just return null
if ( ! count ( $optionFields )) {
return ;
}
// Once again if nothing was returned just return null
if ( empty ( $this -> data [ 'userData' ][ 'userOptions' ])) {
return ;
}
// Create output array
$options = [];
// Check if profile fields aren't fake
foreach ( $optionFields as $field ) {
// Check if the user has the current field set otherwise continue
if ( ! array_key_exists ( $field [ 'id' ], $this -> data [ 'userData' ][ 'userOptions' ])) {
continue ;
}
// Make sure the user has the proper permissions to use this option
if ( ! $this -> checkPermission ( 'SITE' , $field [ 'require_perm' ])) {
continue ;
}
// Assign field to output with value
$options [ $field [ 'id' ]] = $this -> data [ 'userData' ][ 'userOptions' ][ $field [ 'id' ]];
}
// Return appropiate profile data
return $options ;
}
2015-08-19 14:13:38 +02:00
// Check if user has Premium
public function checkPremium () {
// Check if the user has static premium
if ( Permissions :: check ( 'SITE' , 'STATIC_PREMIUM' , $this -> data [ 'id' ], 1 )) {
return [ 2 , 0 , time () + 1 ];
}
// Attempt to retrieve the premium record from the database
$getRecord = Database :: fetch ( 'premium' , false , [
'uid' => [ $this -> data [ 'id' ], '=' ]
]);
// If nothing was returned just return false
if ( empty ( $getRecord )) {
return [ 0 ];
}
// Check if the Tenshi hasn't expired
if ( $getRecord [ 'expiredate' ] < time ()) {
Users :: removeUserPremium ( $this -> data [ 'id' ]);
Users :: updatePremiumMeta ( $this -> data [ 'id' ]);
return [ 0 , $getRecord [ 'startdate' ], $getRecord [ 'expiredate' ]];
}
// Else return the start and expiration date
return [ 1 , $getRecord [ 'startdate' ], $getRecord [ 'expiredate' ]];
}
// Get all warnings issued to the user
public function getWarnings () {
// Do the database query
$warnings = Database :: fetch ( 'warnings' , true , [
'uid' => [ $this -> data [ 'id' ], '=' ]
]);
// Return all the warnings
return $warnings ;
}
2015-08-19 01:29:45 +02:00
}