id = intval($user_id);
$info = $this->_get_info();
foreach ($info as $key=>$value) {
// Let's not save the password in this object :S
if ($key == 'password') { continue; }
$this->$key = $value;
}
// Make sure the Full name is always filled
if (strlen($this->fullname) < 1) { $this->fullname = $this->username; }
} // Constructor
/**
* _get_info
* This function returns the information for this object
*/
private function _get_info() {
$id = intval($this->id);
if (parent::is_cached('user',$id)) {
return parent::get_from_cache('user',$id);
}
// If the ID is -1 then
if ($id == '-1') {
$data['username'] = 'System';
$data['fullname'] = 'Ampache User';
$data['access'] = '25';
return $data;
}
$sql = "SELECT * FROM `user` WHERE `id`='$id'";
$db_results = Dba::query($sql);
$data = Dba::fetch_assoc($db_results);
parent::add_to_cache('user',$id,$data);
return $data;
} // _get_info
/**
* load_playlist
* This is called once per page load it makes sure that this session
* has a tmp_playlist, creating it if it doesn't, then sets $this->playlist
* as a tmp_playlist object that can be fiddled with later on
*/
public function load_playlist() {
$session_id = session_id();
$this->playlist = tmpPlaylist::get_from_session($session_id);
} // load_playlist
/**
* get_from_username
* This returns a built user from a username. This is a
* static function so it doesn't require an instance
*/
public static function get_from_username($username) {
$username = Dba::escape($username);
$sql = "SELECT `id` FROM `user` WHERE `username`='$username'";
$db_results = Dba::read($sql);
$results = Dba::fetch_assoc($db_results);
$user = new User($results['id']);
return $user;
} // get_from_username
/**
* get_from_email
* This returns a built user from a email. This is a
* static function so it doesn't require an instance
*/
public static function get_from_email($email) {
$email = Dba::escape($email);
$sql = "SELECT `id` FROM `user` WHERE `email`='$email'";
$db_results = Dba::read($sql);
$results = Dba::fetch_assoc($db_results);
$user = new User($results['id']);
return $user;
} // get_from_username
/**
* get_catalogs
* This returns the catalogs as an array of ids that this user is allowed to access
*/
public function get_catalogs() {
if (parent::is_cached('user_catalog',$this->id)) {
return parent::get_from_cache('user_catalog',$this->id);
}
$sql = "SELECT * FROM `user_catalog` WHERE `user`='$user_id'";
$db_results = Dba::read($sql);
while ($row = Dba::fetch_assoc($db_results)) {
$catalogs[] = $row['catalog'];
}
parent::add_to_cache('user_catalog',$this->id,$catalogs);
return $catalogs;
} // get_catalogs
/**
* get_preferences
* This is a little more complicate now that we've got many types of preferences
* This funtions pulls all of them an arranges them into a spiffy little array
* You can specify a type to limit it to a single type of preference
* []['title'] = ucased type name
* []['prefs'] = array(array('name','display','value'));
* []['admin'] = t/f value if this is an admin only section
*/
function get_preferences($user_id=0,$type=0) {
// Fill out the user id
$user_id = $user_id ? Dba::escape($user_id) : Dba::escape($this->id);
if ($user_id != '-1') {
$user_limit = "AND preference.catagory != 'system'";
}
if (!Config::get('use_auth')) { $user_id = '-1'; }
if ($type != '0') {
$user_limit = "AND preference.catagory = '" . Dba::escape($type) . "'";
}
$sql = "SELECT preference.name, preference.description, preference.catagory, preference.level, user_preference.value " .
"FROM preference INNER JOIN user_preference ON user_preference.preference=preference.id " .
"WHERE user_preference.user='$user_id' " . $user_limit;
$db_results = Dba::query($sql);
/* Ok this is crapy, need to clean this up or improve the code FIXME */
while ($r = Dba::fetch_assoc($db_results)) {
$type = $r['catagory'];
$admin = false;
if ($type == 'system') { $admin = true; }
$type_array[$type][$r['name']] = array('name'=>$r['name'],'level'=>$r['level'],'description'=>$r['description'],'value'=>$r['value']);
ksort($type_array[$type]);
$results[$type] = array ('title'=>ucwords($type),'admin'=>$admin,'prefs'=>$type_array[$type]);
} // end while
return $results;
} // get_preferences
/**
* set_preferences
* sets the prefs for this specific user
*/
public function set_preferences() {
$user_id = Dba::escape($this->id);
$sql = "SELECT preference.name,user_preference.value FROM preference,user_preference WHERE user_preference.user='$user_id' " .
"AND user_preference.preference=preference.id AND preference.type != 'system'";
$db_results = Dba::query($sql);
while ($r = Dba::fetch_assoc($db_results)) {
$key = $r['name'];
$this->prefs[$key] = $r['value'];
}
} // set_preferences
/**
* get_favorites
* returns an array of your $type favorites
*/
function get_favorites($type) {
$web_path = Config::get('web_path');
$results = Stats::get_user(Config::get('popular_threshold'),$type,$this->id,1);
$items = array();
foreach ($results as $r) {
/* If its a song */
if ($type == 'song') {
$data = new Song($r['object_id']);
$data->count = $r['count'];
$data->format();
$data->f_name = $data->f_link;
$items[] = $data;
}
/* If its an album */
elseif ($type == 'album') {
$data = new Album($r['object_id']);
$data->count = $r['count'];
$data->format();
$items[] = $data;
}
/* If its an artist */
elseif ($type == 'artist') {
$data = new Artist($r['object_id']);
$data->count = $r['count'];
$data->format();
$data->f_name = $data->f_link;
$items[] = $data;
}
/* If it's a genre */
elseif ($type == 'genre') {
$data = new Genre($r['object_id']);
$data->count = $r['count'];
$data->format();
$data->f_name = $data->f_link;
$items[] = $data;
}
} // end foreach
return $items;
} // get_favorites
/**
* get_recommendations
* This returns recommended objects of $type. The recommendations
* are based on voodoo economics,the phase of the moon and my current BAL.
*/
function get_recommendations($type) {
/* First pull all of your ratings of this type */
$sql = "SELECT object_id,user_rating FROM ratings " .
"WHERE object_type='" . Dba::escape($type) . "' AND user='" . Dba::escape($this->id) . "'";
$db_results = Dba::query($sql);
// Incase they only have one user
$users = array();
while ($r = Dba::fetch_assoc($db_results)) {
/* Store the fact that you rated this */
$key = $r['object_id'];
$ratings[$key] = true;
/* Build a key'd array of users with this same rating */
$sql = "SELECT user FROM ratings WHERE object_type='" . Dba::escape($type) . "' " .
"AND user !='" . Dba::escape($this->id) . "' AND object_id='" . Dba::escape($r['object_id']) . "' " .
"AND user_rating ='" . Dba::escape($r['user_rating']) . "'";
$user_results = Dba::query($sql);
while ($user_info = Dba::fetch_assoc($user_results)) {
$key = $user_info['user'];
$users[$key]++;
}
} // end while
/* now we've got your ratings, and all users and the # of ratings that match your ratings
* sort the users[$key] array by value and then find things they've rated high (4+) that you
* haven't rated
*/
$recommendations = array();
asort($users);
foreach ($users as $user_id=>$score) {
/* Find everything they've rated at 4+ */
$sql = "SELECT object_id,user_rating FROM ratings " .
"WHERE user='" . Dba::escape($user_id) . "' AND user_rating >='4' AND " .
"object_type = '" . Dba::escape($type) . "' ORDER BY user_rating DESC";
$db_results = Dba::query($sql);
while ($r = Dba::fetch_assoc($db_results)) {
$key = $r['object_id'];
if (isset($ratings[$key])) { continue; }
/* Let's only get 5 total for now */
if (count($recommendations) > 5) { return $recommendations; }
$recommendations[$key] = $r['user_rating'];
} // end while
} // end foreach users
return $recommendations;
} // get_recommendations
/**
* is_logged_in
* checks to see if $this user is logged in returns their current IP if they
* are logged in
*/
public function is_logged_in() {
$username = Dba::escape($this->username);
$sql = "SELECT `id`,`ip` FROM `session` WHERE `username`='$username'" .
" AND `expire` > ". time();
$db_results = Dba::query($sql);
if ($row = Dba::fetch_assoc($db_results)) {
$ip = $row['ip'] ? $row['ip'] : NULL;
return $ip;
}
return false;
} // is_logged_in
/**
* has_access
* this function checkes to see if this user has access
* to the passed action (pass a level requirement)
*/
function has_access($needed_level) {
if (!Config::get('use_auth') || Config::get('demo_mode')) { return true; }
if ($this->access >= $needed_level) { return true; }
return false;
} // has_access
/**
* update
* This function is an all encompasing update function that
* calls the mini ones does all the error checking and all that
* good stuff
*/
public function update($data) {
if (empty($data['username'])) {
Error::add('username',_('Error Username Required'));
}
if ($data['password1'] != $data['password2'] AND !empty($data['password1'])) {
Error::add('password',_("Error Passwords don't match"));
}
if (Error::occurred()) {
return false;
}
foreach ($data as $name=>$value) {
switch ($name) {
case 'password1';
$name = 'password';
case 'access':
case 'email':
case 'username':
case 'fullname';
if ($this->$name != $value) {
$function = 'update_' . $name;
$this->$function($value);
}
break;
default:
// Rien a faire
break;
} // end switch on field
} // end foreach
return true;
} // update
/**
* update_username
* updates their username
*/
public function update_username($new_username) {
$new_username = Dba::escape($new_username);
$sql = "UPDATE `user` SET `username`='$new_username' WHERE `id`='$this->id'";
$this->username = $new_username;
$db_results = Dba::query($sql);
} // update_username
/**
* update_validation
* This is used by the registration mumbojumbo
* Use this function to update the validation key
* NOTE: crap this doesn't have update_item the humanity of it all
*/
public function update_validation($new_validation) {
$new_validation = Dba::escape($new_validation);
$sql = "UPDATE `user` SET `validation`='$new_validation', `disabled`='1' WHERE `id`='" . Dba::escape($this->id) . "'";
$db_results = Dba::query($sql);
$this->validation = $new_validation;
return $db_results;
} // update_validation
/**
* update_fullname
* updates their fullname
*/
public function update_fullname($new_fullname) {
$new_fullname = Dba::escape($new_fullname);
$sql = "UPDATE `user` SET `fullname`='$new_fullname' WHERE `id`='$this->id'";
$db_results = Dba::query($sql);
} // update_fullname
/**
* update_email
* updates their email address
*/
public function update_email($new_email) {
$new_email = Dba::escape($new_email);
$sql = "UPDATE `user` SET `email`='$new_email' WHERE `id`='$this->id'";
$db_results = Dba::query($sql);
} // update_email
/**
* disable
* This disables the current user
*/
public function disable() {
// Make sure we aren't disabling the last admin
$sql = "SELECT `id` FROM `user` WHERE `disabled` = '0' AND `id` != '" . $this->id . "' AND `access`='100'";
$db_results = Dba::query($sql);
if (!Dba::num_rows($db_results)) { return false; }
$sql = "UPDATE `user` SET `disabled`='1' WHERE id='" . $this->id . "'";
$db_results = Dba::query($sql);
// Delete any sessions they may have
$sql = "DELETE FROM `session` WHERE `username`='" . Dba::escape($this->username) . "'";
$db_results = Dba::query($sql);
return true;
} // disable
/**
* enable
* this enables the current user
*/
public function enable() {
$sql = "UPDATE `user` SET `disabled`='0' WHERE id='" . $this->id . "'";
$db_results = Dba::query($sql);
return true;
} // enable
/**
* update_access
* updates their access level
*/
public function update_access($new_access) {
/* Prevent Only User accounts */
if ($new_access < '100') {
$sql = "SELECT `id` FROM user WHERE `access`='100' AND `id` != '$this->id'";
$db_results = Dba::query($sql);
if (!Dba::num_rows($db_results)) { return false; }
}
$new_access = Dba::escape($new_access);
$sql = "UPDATE `user` SET `access`='$new_access' WHERE `id`='$this->id'";
$db_results = Dba::query($sql);
} // update_access
/*!
@function update_last_seen
@discussion updates the last seen data for this user
*/
function update_last_seen() {
$sql = "UPDATE user SET last_seen='" . time() . "' WHERE `id`='$this->id'";
$db_results = Dba::query($sql);
} // update_last_seen
/**
* update_user_stats
* updates the playcount mojo for this specific user
*/
public function update_stats($song_id) {
$song_info = new Song($song_id);
$song_info->format();
$user = $this->id;
if (!strlen($song_info->file)) { return false; }
// Make sure we didn't just play this song
$data = Stats::get_last_song($this->id);
$last_song = new Song($data['object_id']);
if ($data['date']+($song_info->time/2) >= time()) {
debug_event('Stats','Not collecting stats less then 50% of song has elapsed','3');
return false;
}
$this->set_preferences();
// Check if lastfm is loaded, if so run the update
if (Plugin::is_installed('Last.FM')) {
$lastfm = new Plugin('Lastfm');
if ($lastfm->_plugin->load($this->prefs,$this->id)) {
$lastfm->_plugin->submit($song_info,$this->id);
}
} // end if is_installed
// Check and see if librefm is loaded and run scrobblizing
if (Plugin::is_installed('Libre.FM')) {
$librefm = new Plugin('Librefm');
if ($librefm->_plugin->load($this->prefs,$this->id)) {
$librefm->_plugin->submit($song_info,$this->id);
}
} // end if is_installed
// Do this last so the 'last played checks are correct'
Stats::insert('song',$song_id,$user);
Stats::insert('album',$song_info->album,$user);
Stats::insert('artist',$song_info->artist,$user);
} // update_stats
/**
* insert_ip_history
* This inserts a row into the IP History recording this user at this
* address at this time in this place, doing this thing.. you get the point
*/
public function insert_ip_history() {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$sip = $_SERVER['HTTP_X_FORWARDED_FOR'];
debug_event('User Ip', 'Login from ip adress: ' . $sip,'3');
}
else {
$sip = $_SERVER['REMOTE_ADDR'];
debug_event('User Ip', 'Login from ip adress: ' . $sip,'3');
}
$ip = Dba::escape(inet_pton($sip));
$date = time();
$user = $this->id;
$agent = Dba::escape($_SERVER['HTTP_USER_AGENT']);
$sql = "INSERT INTO `ip_history` (`ip`,`user`,`date`,`agent`) VALUES ('$ip','$user','$date','$agent')";
$db_results = Dba::query($sql);
/* Clean up old records... sometimes */
if (rand(1,100) > 60) {
$date = time() - (86400*Config::get('user_ip_cardinality'));
$sql = "DELETE FROM `ip_history` WHERE `date` < $date";
$db_results = Dba::query($sql);
}
return true;
} // insert_ip_history
/**
* create
* inserts a new user into ampache
*/
public static function create($username, $fullname, $email, $password, $access) {
/* Lets clean up the fields... */
$username = Dba::escape($username);
$fullname = Dba::escape($fullname);
$email = Dba::escape($email);
$access = Dba::escape($access);
$password_hashed = hash('sha256', $password);
/* Now Insert this new user */
$sql = "INSERT INTO `user` (`username`, `fullname`, `email`, `password`, `access`, `create_date`) VALUES" .
" ('$username','$fullname','$email','$password_hashed','$access','" . time() ."')";
$db_results = Dba::write($sql);
if (!$db_results) { return false; }
// Get the insert_id
$insert_id = Dba::insert_id();
/* Populates any missing preferences, in this case all of them */
self::fix_preferences($insert_id);
return $insert_id;
} // create
/**
* update_password
* updates a users password
*/
public function update_password($new_password) {
$new_password = hash('sha256',$new_password);
$new_password = Dba::escape($new_password);
$sql = "UPDATE `user` SET `password`='$new_password' WHERE `id`='$this->id'";
$db_results = Dba::write($sql);
// Clear this (temp fix)
if ($db_results) { unset($_SESSION['userdata']['password']); }
} // update_password
/**
* format
* This function sets up the extra variables we need when we are displaying a
* user for an admin, these should not be normally called when creating a
* user object
*/
public function format() {
/* If they have a last seen date */
if (!$this->last_seen) { $this->f_last_seen = _('Never'); }
else { $this->f_last_seen = date("m\/d\/Y - H:i",$this->last_seen); }
/* If they have a create date */
if (!$this->create_date) { $this->f_create_date = _('Unknown'); }
else { $this->f_create_date = date("m\/d\/Y - H:i",$this->create_date); }
// Base link
$this->f_link = '' . $this->fullname . '';
/* Calculate their total Bandwidth Useage */
$sql = "SELECT `song`.`size` FROM `song` LEFT JOIN `object_count` ON `song`.`id`=`object_count`.`object_id` " .
"WHERE `object_count`.`user`='$this->id' AND `object_count`.`object_type`='song'";
$db_results = Dba::read($sql);
while ($r = Dba::fetch_assoc($db_results)) {
$total = $total + $r['size'];
}
$divided = 0;
while (strlen(floor($total)) > 3) {
$total = ($total / 1024);
$divided++;
}
switch ($divided) {
default:
case '1': $name = "KB"; break;
case '2': $name = "MB"; break;
case '3': $name = "GB"; break;
case '4': $name = "TB"; break;
case '5': $name = "PB"; break;
} // end switch
$this->f_useage = round($total,2) . $name;
/* Get Users Last ip */
$data = $this->get_ip_history(1);
$this->ip_history = inet_ntop($data['0']['ip']);
} // format_user
/**
* format_favorites
* takes an array of objects and formats them corrrectly
* and returns a simply array with just count);
// Go through the favs
foreach ($items as $data) {
// Make all number lengths equal
$len = strlen($data->count);
while ($len < $maxlen) {
$data->count = "0" . $data->count;
$len++;
}
$item = "[$data->count] - $data->f_name";
$results[]->f_name_link = $item;
} // end foreach items
return $results;
} // format_favorites
/**
* format_recommendations
* This takes an array of [object_id] = ratings
* and displays them in a semi-pretty format
*/
function format_recommendations($items,$type) {
foreach ($items as $object_id=>$rating) {
switch ($type) {
case 'artist':
$object = new Artist($object_id);
$object->format_artist();
$name = $object->link;
break;
case 'album':
$object = new Album($object_id);
$object->format_album();
$name = $object->f_link;
break;
case 'song':
$object = new Song($object_id);
$object->format_song();
$name = $object->f_link;
break;
} // end switch on type
$results[] = "$name -- " . get_rating_name($rating) . "
\n";
} // end foreach items
return $results;
} // format_recommendations
/**
* access_name_to_level
* This takes the access name for the user and returns the level
*/
public static function access_name_to_level($level) {
switch ($level) {
case 'admin':
return '100';
break;
case 'user':
return '25';
break;
case 'manager':
return '75';
break;
case 'guest':
return '5';
break;
default:
return '0';
break;
}
return false;
} // access_name_to_level
/**
* fix_preferences
* This is the new fix_preferences function, it does the following
* Remove Duplicates from user, add in missing
* If -1 is passed it also removes duplicates from the `preferences`
* table.
*/
public static function fix_preferences($user_id) {
$user_id = Dba::escape($user_id);
/* Get All Preferences for the current user */
$sql = "SELECT * FROM `user_preference` WHERE `user`='$user_id'";
$db_results = Dba::query($sql);
$results = array();
while ($r = Dba::fetch_assoc($db_results)) {
$pref_id = $r['preference'];
/* Check for duplicates */
if (isset($results[$pref_id])) {
$r['value'] = Dba::escape($r['value']);
$sql = "DELETE FROM `user_preference` WHERE `user`='$user_id' AND `preference`='" . $r['preference'] . "' AND" .
" `value`='" . Dba::escape($r['value']) . "'";
$delete_results = Dba::query($sql);
} // if its set
else {
$results[$pref_id] = 1;
}
} // end while
/* If we aren't the -1 user before we continue grab the -1 users values */
if ($user_id != '-1') {
$sql = "SELECT `user_preference`.`preference`,`user_preference`.`value` FROM `user_preference`,`preference` " .
"WHERE `user_preference`.`preference` = `preference`.`id` AND `user_preference`.`user`='-1' AND `preference`.`catagory` !='system'";
$db_results = Dba::query($sql);
/* While through our base stuff */
while ($r = Dba::fetch_assoc($db_results)) {
$key = $r['preference'];
$zero_results[$key] = $r['value'];
}
} // if not user -1
// get me _EVERYTHING_
$sql = "SELECT * FROM `preference`";
// If not system, exclude system... *gasp*
if ($user_id != '-1') {
$sql .= " WHERE catagory !='system'";
}
$db_results = Dba::query($sql);
while ($r = Dba::fetch_assoc($db_results)) {
$key = $r['id'];
/* Check if this preference is set */
if (!isset($results[$key])) {
if (isset($zero_results[$key])) {
$r['value'] = $zero_results[$key];
}
$value = Dba::escape($r['value']);
$sql = "INSERT INTO user_preference (`user`,`preference`,`value`) VALUES ('$user_id','$key','$value')";
$insert_db = Dba::query($sql);
}
} // while preferences
/* Let's also clean out any preferences garbage left over */
$sql = "SELECT DISTINCT(user_preference.user) FROM user_preference " .
"LEFT JOIN user ON user_preference.user = user.id " .
"WHERE user_preference.user!='-1' AND user.id IS NULL";
$db_results = Dba::query($sql);
$results = array();
while ($r = Dba::fetch_assoc($db_results)) {
$results[] = $r['user'];
}
foreach ($results as $data) {
$sql = "DELETE FROM user_preference WHERE user='$data'";
$db_results = Dba::query($sql);
}
} // fix_preferences
/**
* delete
* deletes this user and everything assoicated with it. This will affect
* ratings and tottal stats
*/
public function delete() {
/*
Before we do anything make sure that they aren't the last
admin
*/
if ($this->has_access(100)) {
$sql = "SELECT `id` FROM `user` WHERE `access`='100' AND id !='" . Dba::escape($this->id) . "'";
$db_results = mysql_query($sql);
if (!Dba::num_rows($db_results)) {
return false;
}
} // if this is an admin check for others
// Delete their playlists
$sql = "DELETE FROM `playlist` WHERE `user`='$this->id'";
$db_results = Dba::query($sql);
// Clean up the playlist data table
$sql = "DELETE FROM `playlist_data` USING `playlist_data` " .
"LEFT JOIN `playlist` ON `playlist`.`id`=`playlist_data`.`playlist` " .
"WHERE `playlist`.`id` IS NULL";
$db_results = Dba::query($sql);
// Delete any stats they have
$sql = "DELETE FROM `object_count` WHERE `user`='$this->id'";
$db_results = Dba::query($sql);
// Clear the IP history for this user
$sql = "DELETE FROM `ip_history` WHERE `user`='$this->id'";
$db_results = Dba::query($sql);
// Nuke any access lists that are specific to this user
$sql = "DELETE FROM `access_list` WHERE `user`='$this->id'";
$db_results = Dba::query($sql);
// Delete their ratings
$sql = "DELETE FROM `rating` WHERE `user`='$this->id'";
$db_results = Dba::query($sql);
// Delete their tags
$sql = "DELETE FROM `tag_map` WHERE `user`='$this->id'";
$db_results = Dba::query($sql);
// Clean out the tags
$sql = "DELETE FROM `tags` USING `tag_map` LEFT JOIN `tag_map` ON tag_map.id=tags.map_id AND tag_map.id IS NULL";
$db_results = Dba::query($sql);
// Delete their preferences
$sql = "DELETE FROM `user_preference` WHERE `user`='$this->id'";
$db_results = Dba::query($sql);
// Delete their voted stuff in democratic play
$sql = "DELETE FROM `user_vote` WHERE `user`='$this->id'";
$db_results = Dba::query($sql);
// Delete their shoutbox posts
$sql = "DELETE FROM `user_shout` WHERE `user='$this->id'";
$db_results = Dba::query($sql);
// Delete the user itself
$sql = "DELETE FROM `user` WHERE `id`='$this->id'";
$db_results = Dba::query($sql);
$sql = "DELETE FROM `session` WHERE `username`='" . Dba::escape($this->username) . "'";
$db_results = Dba::query($sql);
return true;
} // delete
/**
* is_online
* delay how long since last_seen in seconds default of 20 min
* calcs difference between now and last_seen
* if less than delay, we consider them still online
*/
public function is_online( $delay = 1200 ) {
return time() - $this->last_seen <= $delay;
} // is_online
/**
* get_user_validation
*if user exists before activation can be done.
*/
public static function get_validation($username) {
$usename = Dba::escape($username);
$sql = "SELECT `validation` FROM `user` WHERE `username`='$username'";
$db_results = Dba::query($sql);
$row = Dba::fetch_assoc($db_results);
return $row['validation'];
} // get_validation
/**
* get_recently_played
* This gets the recently played items for this user respecting
* the limit passed
*/
public function get_recently_played($limit,$type='') {
if (!$type) { $type = 'song'; }
$sql = "SELECT * FROM `object_count` WHERE `object_type`='$type' AND `user`='$this->id' " .
"ORDER BY `date` DESC LIMIT $limit";
$db_results = Dba::query($sql);
while ($row = Dba::fetch_assoc($db_results)) {
$results[] = $row['object_id'];
}
return $results;
} // get_recently_played
/**
* get_ip_history
* This returns the ip_history from the
* last Config::get('user_ip_cardinality') days
*/
public function get_ip_history($count='',$distinct='') {
$username = Dba::escape($this->id);
$count = $count ? intval($count) : intval(Config::get('user_ip_cardinality'));
// Make sure it's something
if ($count < 1) { $count = '1'; }
$limit_sql = "LIMIT " . intval($count);
if ($distinct) { $group_sql = "GROUP BY `ip`"; }
/* Select ip history */
$sql = "SELECT `ip`,`date` FROM `ip_history`" .
" WHERE `user`='$username'" .
" $group_sql ORDER BY `date` DESC $limit_sql";
$db_results = Dba::read($sql);
$results = array();
while ($row = Dba::fetch_assoc($db_results)) {
$results[] = $row;
}
return $results;
} // get_ip_history
/*!
@function activate_user
@activates the user from public_registration
*/
public function activate_user($username) {
$username = Dba::escape($username);
$sql = "UPDATE user SET disabled='0' WHERE username='$username'";
$db_results = Dba::query($sql);
} // activate_user
/*!
@function is_xmlrpc
@discussion checks to see if this is a valid
xmlrpc user
*/
function is_xmlrpc() {
/* If we aren't using XML-RPC return true */
if (!Config::get('xml_rpc')) {
return false;
}
//FIXME: Ok really what we will do is check the MD5 of the HTTP_REFERER
//FIXME: combined with the song title to make sure that the REFERER
//FIXME: is in the access list with full rights
return true;
} // is_xmlrpc
/**
* check_username
* This checks to make sure the username passed doesn't already
* exist in this instance of ampache
*/
public static function check_username($username) {
$username = Dba::escape($username);
$sql = "SELECT `id` FROM `user` WHERE `username`='$username'";
$db_results = Dba::query($sql);
if (Dba::num_rows($db_results)) {
return false;
}
return true;
} // check_username
/**
* rebuild_all_preferences
* This rebuilds the user preferences for all installed users, called by the plugin functions
*/
public static function rebuild_all_preferences() {
$sql = "SELECT * FROM `user`";
$db_results = Dba::query($sql);
User::fix_preferences('-1');
while ($row = Dba::fetch_assoc($db_results)) {
User::fix_preferences($row['id']);
}
return true;
} // rebuild_all_preferences
} //end user class
?>