1
0
Fork 0
mirror of https://codeberg.org/demostf/api.git synced 2026-06-03 18:04:08 +02:00
api/Providers/UserProvider.php
2016-12-04 01:17:46 +01:00

81 lines
2 KiB
PHP

<?php namespace Providers;
use RandomLib\Generator;
class UserProvider extends BaseProvider {
/**
* @var Generator
*/
private $generator;
public function __construct(\PDO $db, Generator $generator) {
parent::__construct($db);
$this->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;
}
}