services = $services; $this->config = $services->getMainConfig(); $this->pointConfig = $this->config->get('IsekaiUserPointConfig'); } /** * @param int $userId * @param string $pointType * @return IsekaiUserPoints|null */ public function newFromUserId(int $userId, string $pointType) { $user = $this->services->getUserFactory()->newFromId($userId); return $this->newFromUser($user, $pointType); } /** * @param User $user * @return IsekaiUserPoints|null */ public function newFromUser(User $user, string $pointType) { if (!isset($this->pointConfig[$pointType])) { return null; } if (!$user->isRegistered()) { return null; } $userId = $user->getId(); $cacheKey = $userId . ':' . $pointType; if (!isset(self::$instances[$cacheKey])) { self::$instances[$cacheKey] = new IsekaiUserPoints($user, $pointType, $this->pointConfig, $this->services); } return self::$instances[$cacheKey]; } /** * @param User $user * @param string $pointType * @param stdClass $data */ public function newFromData(User $user, string $pointType, $data) { $instance = $this->newFromUser($user, $pointType); if ($instance) { $instance->setData($data); } return $instance; } /** * @return array{0: User, 1: string, 2: IsekaiUserPoints} (user, instance) */ public function newFromUsers(array $users, array $pointTypes) { $userids = []; $usermap = []; foreach ($users as $user) { $userId = $user->getId(); $userids[] = $userId; $usermap[$userId] = $user; } $dbr = $this->services->getDBLoadBalancer()->getConnection(DB_REPLICA); $pointDataRows = $dbr->select( 'isekai_user_points', '*', [ 'user_id' => $userids, 'point_type' => $pointTypes ], __METHOD__ ); $result = []; $initedUsers = []; foreach ($pointDataRows as $pointData) { $user = $usermap[$pointData->user_id]; $pointType = $pointData->type; $instance = $this->newFromUser($user, $pointType); if ($instance) { $instance->setData($pointData); } $result[] = [$user, $instance]; $initedUsers[] = $user; } foreach ($userids as $userId) { if (!in_array($userId, $initedUsers)) { $user = $usermap[$userId]; $pointType = $pointData->type; $instance = $this->newFromUser($user, $pointType); $result[] = [$user, $pointType, $instance]; } } return $result; } }