2024-04-10 17:46:06 +05:45

155 lines
4.3 KiB
PHP

<?php
/**
* Helper class for interacting with the user
*/
namespace Extendify\Library;
use Extendify\Library\App;
/**
* Helper class for interacting with the user
*/
class User
{
/**
* User unique, anonymous identifier
*
* @var string
*/
public $uuid = '';
/**
* A WP user
*
* @var \WP_User
*/
protected $user = null;
/**
* The DB key for scoping. For historical reasons do not change
*
* @var string
*/
protected $key = 'extendifysdk_';
/**
* The class instance.
*
* @var $instance
*/
protected static $instance = null;
/**
* Set up the user
*
* @param WP_User $user - A WP User object.
* @return void
*/
public function __construct($user)
{
$this->user = $user;
}
/**
* Return the user ID
*
* @return void
*/
private function setupUuid()
{
$uuid = \get_user_meta($this->user->ID, $this->key . 'uuid', true);
if (!$uuid) {
$id = \wp_hash(\wp_json_encode($this->user));
\update_user_meta($this->user->ID, $this->key . 'uuid', $id);
}
$this->uuid = $uuid;
}
/**
* Returns data about the user
* Use it like User::data('ID') to get the user id
*
* @param string $arguments - Right now a string of arguments, like ID.
* @return mixed - Data about the user.
*/
private function dataHandler($arguments)
{
// Right now assume a single argument, but could expand to multiple.
if (isset($this->user->$arguments)) {
return $this->user->$arguments;
}
return \get_user_meta($this->user->ID, $this->key . $arguments, true);
}
/**
* Returns the application state for he current user
* Use it like User::data('ID') to get the user id
*
* @return string - JSON representation of the current state
*/
private function stateHandler()
{
$state = \get_user_meta($this->user->ID, $this->key . 'user_data');
// Add some state boilerplate code for the first load.
if (!isset($state[0])) {
$state[0] = '{}';
}
$userData = json_decode($state[0], true);
if (!isset($userData['version'])) {
$userData['version'] = 0;
}
// This will reset the allowed max imports to 0 once a week which will force the library to re-check.
if (!get_transient('extendify_import_max_check_' . $this->user->ID)) {
set_transient('extendify_import_max_check_' . $this->user->ID, time(), strtotime('1 week', 0));
$userData['state']['allowedImports'] = 0;
}
// Similiar to above, this will give the user free imports once a month just for logging in.
if (!get_transient('extendify_free_extra_imports_check_' . $this->user->ID)) {
set_transient('extendify_free_extra_imports_check_' . $this->user->ID, time(), strtotime('first day of next month', 0));
$userData['state']['runningImports'] = 0;
}
if (!isset($userData['state']['sdkPartner']) || !$userData['state']['sdkPartner']) {
$userData['state']['sdkPartner'] = App::$sdkPartner;
}
$userData['state']['uuid'] = self::data('uuid');
$userData['state']['canInstallPlugins'] = \current_user_can('install_plugins');
$userData['state']['canActivatePlugins'] = \current_user_can('activate_plugins');
$userData['state']['isAdmin'] = \current_user_can('create_users');
return \wp_json_encode($userData);
}
/**
* Allows to dynamically setup the user with uuid
* Use it like User::data('ID') to get the user id
*
* @param string $name - The name of the method to call.
* @param array $arguments - The arguments to pass in.
*
* @return mixed
*/
public static function __callStatic($name, array $arguments)
{
$name = "{$name}Handler";
if (is_null(self::$instance)) {
require_once ABSPATH . 'wp-includes/pluggable.php';
self::$instance = new static(\wp_get_current_user());
$r = self::$instance;
$r->setupUuid();
}
$r = self::$instance;
return $r->$name(...$arguments);
}
}