GIF89a;
| Direktori : /home/serb/www/livechat/php/model/ |
| Current File : /home/serb/www/livechat/php/model/UserModel.php |
<?php
class UserModel extends Model
{
const GUEST_SESSION_TIME = 600; // 10 minutes (in seconds)
const TYPING_STATUS_TIME = 5; // lifetime of the typing status validity
const TYPING_CLEAR_TIME = 600; // 10 minutes (in seconds)
const ONLINE_TIME = 15;
const AVATAR_SIZE = 40;
const DEFAULT_AVATARS_DIR = 'upload/default-avatars';
// Static methods
public static function getDefaultAvatars()
{
$result = array();
// Read all images from the default avatars directory
foreach(glob(ROOT_DIR . '/../' . self::DEFAULT_AVATARS_DIR . '/*') as $path)
{
$result[] = self::DEFAULT_AVATARS_DIR . '/' . basename($path);
}
return $result;
}
// Getters & setters
public function getTableName()
{
return 'mirrormx_customer_chat_user';
}
public function getColumns()
{
return array('name', 'mail', 'password', 'image', 'roles', 'last_activity', 'info');
}
public function getData($raw = false)
{
$data = parent::getData();
if(!$raw)
{
// Hide the password field
unset($data['password']);
}
// Remove all integer indexed entries
for($i= 0; $i < count($data); $i++)
{
unset($data[$i]);
}
return $data;
}
public function toJson()
{
$data = $this->getData();
// Hide the password field
unset($data['password']);
return $data;
}
// Methods
public function hasRole($role)
{
return is_array($this->roles) && array_search($role, $this->roles) !== false;
}
public function stayAlive($id)
{
self::$db->execute(
'UPDATE ' . $this->getTableName() . ' SET last_activity = ? WHERE id = ?',
array(date('Y-m-d H:i:s'), $id)
);
}
public function updateTypingStatus($id, $secondUserId, $isTyping)
{
$memory = self::$services->get('memory');
$time = time();
// Check if it's time to clear the memory
$lastClearTime = $memory->get('lastClearTime');
if($lastClearTime + self::TYPING_CLEAR_TIME < $time)
{
$memory->clear();
$memory->set('lastClearTime', $time);
}
// Update user's status
if($isTyping) $memory->set('t' . $id . '-' . $secondUserId, $time);
else $memory->remove('t' . $id . '-' . $secondUserId);
}
public function getTypingStatus($id, $secondUserId)
{
$memory = self::$services->get('memory');
$time = time();
$status = $memory->get('t' . $secondUserId . '-' . $id);
if(empty($status)) return false;
return $status + self::TYPING_STATUS_TIME >= $time;
}
public function clearOfflineGuests()
{
// Clear users that are not alive anymore
self::$db->execute(
'DELETE FROM ' . $this->getTableName() . ' WHERE roles = ? AND last_activity < ?',
array('GUEST', date('Y-m-d H:i:s', time() - self::GUEST_SESSION_TIME))
);
}
public function generateGuest($name, $mail)
{
return new UserModel(array(
'name' => $name . '-' . time(),
'mail' => $mail,
'password' => 'x',
'roles' => array('GUEST'),
'last_activity' => date('Y-m-d H:i:s')
));
}
public function hasValidSession()
{
$lastActivityTime = strtotime($this->last_activity);
return time() - $lastActivityTime <= self::GUEST_SESSION_TIME;
}
public function isOperatorOnline()
{
$operators = UserModel::repo()->findBy(array('roles' => array('LIKE', '%OPERATOR%')));
if($operators)
{
foreach($operators as $operator)
{
$lastActivityTime = strtotime($operator->last_activity);
if(time() - $lastActivityTime <= self::ONLINE_TIME) // Operator considered on-line
{
return true;
}
}
}
// No operator on-line
return false;
}
public function getAllOnline()
{
$users = UserModel::repo()->findAll();
$result = array();
if($users)
{
foreach($users as $user)
{
$lastActivityTime = strtotime($user->last_activity);
if(time() - $lastActivityTime <= self::ONLINE_TIME) // Operator considered on-line
{
// Hide the password field
$result[] = $user->getData();
}
}
}
return $result;
}
public function getGuestsOnline()
{
$users = UserModel::repo()->findBy(array('roles' => array('LIKE', '%GUEST%')));
$result = array();
if($users)
{
foreach($users as $user)
{
$lastActivityTime = strtotime($user->last_activity);
if(time() - $lastActivityTime <= self::ONLINE_TIME) // Considered on-line
{
// Hide the password field
$result[] = $user->getData();
}
}
}
return $result;
}
public function countGuestsOnline()
{
$users = UserModel::repo()->findBy(array('roles' => array('LIKE', '%GUEST%')));
$count = 0;
if($users)
{
foreach($users as $user)
{
$lastActivityTime = strtotime($user->last_activity);
if(time() - $lastActivityTime <= self::ONLINE_TIME) $count++;
}
}
return $count;
}
public static function repo()
{
return new UserModel;
}
public function preSave()
{
$result = parent::preSave();
if(isset($result['roles'])) $result['roles'] = implode(',', $result['roles']);
if(isset($result['info'])) $result['info'] = json_encode($result['info']);
return $result;
}
public function postRead($data)
{
$data = parent::postRead($data);
if(isset($data['roles'])) $data['roles'] = explode(',', $data['roles']);
if(isset($data['info'])) $data['info'] = json_decode($data['info']);
return $data;
}
}
?>