generator = $generator; } public function store(\SteamId $steamId) { $sql = 'INSERT INTO users(steamid, name, avatar, token) SELECT ?, ?, ?, ? WHERE NOT EXISTS(SELECT id FROM users WHERE steamid = ?)'; $this->query($sql, [ $steamId->getSteamId64(), $steamId->getNickname(), $steamId->getMediumAvatarUrl(), $this->generator->generateString(64), $steamId->getSteamId64() ]); $user = $this->db->user()->where('steamid', $steamId->getSteamId64()); return $user->fetch()->token; } public function get($steamid) { $user = $this->db->user()->where('steamid', $steamid)->fetch(); if (count($user) < 1) { return null; } return [ 'id' => $user['id'], 'steamid' => $user['steamid'], 'name' => $user['name'], 'avatar' => $user['avatar'] ]; } public function search($query) { $sql = 'SELECT user_id, players.name, count(demo_id) AS count, steamid, 1-(players.name <-> ?) AS sim FROM players INNER JOIN users ON users.id = players.user_id WHERE players.name % ? OR players.name ~* ? GROUP BY players.name, user_id, steamid ORDER BY count DESC LIMIT 100'; $result = $this->query($sql, [$query, $query, $query]); $players = $result->fetchAll(\PDO::FETCH_ASSOC); usort($players, function ($b, $a) { $countWeight = 1; $simWeight = 5; $diff = ($a['sim'] * $simWeight + $a['count'] * $countWeight) - ($b['sim'] * $simWeight + $b['count'] * $countWeight); if ($diff === 0) { return 0; } else { return ($diff < 0) ? -1 : 1; } }); $result = []; foreach ($players as $player) { $id = $player['user_id']; if (!isset($result[$id])) { $result[$id] = [ 'id' => $id, 'name' => $player['name'], 'steamid' => $player['steamid'] ]; } } $players = array_values($result); return $players; } }