1
0
Fork 0
mirror of https://codeberg.org/demostf/api.git synced 2026-06-04 02:14:06 +02:00

upload framework

This commit is contained in:
Robin Appelman 2017-03-20 21:51:03 +01:00
commit a1a9504f11
30 changed files with 1578 additions and 155 deletions

View file

@ -0,0 +1,77 @@
<?php namespace Demostf\API\Controllers;
use Ehesp\SteamLogin\SteamLogin;
use Demostf\API\Providers\AuthProvider;
use Demostf\API\Providers\UserProvider;
class AuthController extends BaseController {
/**
* @var UserProvider
*/
private $userProvider;
/**
* @var AuthProvider
*/
private $authProvider;
/** @var string */
private $host;
/**
* AuthController constructor.
*
* @param UserProvider $userProvider
* @param AuthProvider $authProvider
* @param string $host
*/
public function __construct(UserProvider $userProvider, AuthProvider $authProvider, string $host) {
$this->userProvider = $userProvider;
$this->authProvider = $authProvider;
$this->host = $host;
}
public function token() {
echo $this->authProvider->generateToken();
}
public function get($token) {
$userData = $this->authProvider->getUser($token);
\Flight::json([
'token' => $token,
'steamid' => $userData['steamid'],
'name' => $userData['name'],
'key' => $userData['key']
]);
}
public function login($token) {
$_SESSION['return'] = $this->query('return', 'https://' . $this->host);
$steam = new SteamLogin();
$url = $steam->url($_ENV['APP_ROOT'] . '/auth/handle/' . urlencode($token));
\Flight::redirect(str_replace('&amp;', '&', $url)); // headers make no sense
}
public function logout($token) {
$this->authProvider->logout($token);
\Flight::json([
'token' => $token,
'steamid' => null,
'name' => null,
'key' => null
]);
}
public function handle($token) {
$return = isset($_SESSION['return']) ? $_SESSION['return'] : 'http://demos.tf';
unset($_SESSION['return']);
$steam = new SteamLogin();
$steamId = $steam->validate();
if ($steamId) {
$steamIdObject = new \SteamId($steamId);
$key = $this->userProvider->store($steamIdObject);
$this->authProvider->setUser($token, $steamIdObject, $key);
}
\Flight::redirect($return);
}
}

View file

@ -0,0 +1,18 @@
<?php namespace Demostf\API\Controllers;
class BaseController {
protected function query($name, $default) {
$request = \Flight::request();
return isset($request->query[$name]) ? $request->query[$name] : $default;
}
protected function file($name) {
$request = \Flight::request();
return $request->files[$name];
}
protected function post($name, $default = null) {
$request = \Flight::request();
return isset($request->data[$name]) ? $request->data[$name] : $default;
}
}

View file

@ -0,0 +1,81 @@
<?php namespace Demostf\API\Controllers;
use Demostf\API\Providers\DemoProvider;
use Demostf\API\Providers\MatchProvider;
class DemoController extends BaseController {
/**
* @var \Providers\DemoProvider
*/
private $demoProvider;
public function __construct(DemoProvider $demoProvider) {
$this->demoProvider = $demoProvider;
}
/**
* @param string $id
*/
public function get($id) {
\Flight::json($this->demoProvider->get($id));
}
protected function getFilter() {
$map = $this->query('map', '');
$players = $this->query('players', '');
$type = $this->query('type', '');
$filter = [];
if ($map) {
$filter['map'] = $map;
}
if ($players) {
if (!is_array($players)) {
$players = explode(',', $players);
}
$players = array_filter($players);
$filter['players'] = $players;
}
switch ($type) {
case 'hl':
$filter['playerCount'] = [17, 18, 19];
break;
case '6v6':
$filter['playerCount'] = [11, 12, 13];
break;
case '4v4':
$filter['playerCount'] = [7, 8, 9];
break;
}
return $filter;
}
public function listDemos() {
$page = $this->query('page', 1);
\Flight::json($this->demoProvider->listDemos($page, $this->getFilter()));
}
public function listProfile($steamid) {
$page = $this->query('page', 1);
$where = $this->getFilter();
$where['players'][] = $steamid;
\Flight::json($this->demoProvider->listProfile($page, $where));
}
public function listUploads($steamid) {
$page = $this->query('page', 1);
\Flight::json($this->demoProvider->listUploads($steamid, $page, $this->getFilter()));
}
public function chat($demoId) {
\Flight::json($this->demoProvider->getChat($demoId));
}
public function listMaps() {
\Flight::json($this->demoProvider->listMaps());
}
public function stats() {
\Flight::json($this->demoProvider->getStats());
}
}

View file

@ -0,0 +1,89 @@
<?php namespace Demostf\API\Controllers;
use Demostf\API\Demo\DemoStore;
use Demostf\API\Demo\Parser;
use Demostf\API\Providers\DemoProvider;
use Demostf\API\Providers\UserProvider;
class UploadController extends BaseController {
/**
* @var \Providers\DemoProvider
*/
private $demoProvider;
/**
* @var UserProvider
*/
private $userProvider;
/**
* @var Parser
*/
private $parser;
/** @var DemoStore */
private $store;
public function __construct(DemoProvider $demoProvider, UserProvider $userProvider, Parser $parser, DemoStore $store) {
$this->demoProvider = $demoProvider;
$this->userProvider = $userProvider;
$this->parser = $parser;
$this->store = $store;
}
public function upload() {
$key = $this->post('key');
$red = $this->post('red', 'RED');
$blu = $this->post('blu', 'BLU');
$name = $this->post('name', 'Unnamed');
$demo = $this->file('demo');
$user = $this->userProvider->byKey($key);
if (!$user) {
return 'Invalid key';
}
if (!$red) {
$red = 'RED';
}
if (!$blu) {
$blu = 'BLU';
}
$size = $demo['size'];
if ($size < 1024) {
return 'Demos needs to be at least 1KB is size';
}
if ($size > 100 * 1024 * 1024) {
return 'Demos cant be more than 100MB in size';
}
$tmpPath = $demo['tmp_name'];
try {
$info = $this->parser->parseHeader($tmpPath);
} catch (\Exception $e) {
return 'Not a valid demo';
}
if ($info->getDuration() < (5 * 60)) {
return 'Demos need to be at least 5m long';
}
if ($info->getDuration() > (60 * 60)) {
return 'Demos cant be longer than one hour';
}
$hash = hash_file('md5', $tmpPath);
$existingDemo = $this->demoProvider->demoIdByHash($hash);
if ($existingDemo) {
if ($key) {
return 'STV available at: https://demos.tf/' . $existingDemo;
} else {
\Flight::redirect('https://demos.tf/' . $existingDemo);
return '';
}
}
$url = $this->store->store($tmpPath, $hash . '_' . $name);
}
}

View file

@ -0,0 +1,30 @@
<?php namespace Demostf\API\Controllers;
use Ehesp\SteamLogin\SteamLogin;
use Demostf\API\Providers\AuthProvider;
use Demostf\API\Providers\UserProvider;
class UserController extends BaseController {
/**
* @var UserProvider
*/
private $userProvider;
/**
* UserController constructor.
*
* @param UserProvider $userProvider
*/
public function __construct(UserProvider $userProvider) {
$this->userProvider = $userProvider;
}
public function get($steamid) {
\Flight::json($this->userProvider->get($steamid));
}
public function search() {
$query = $this->query('query', '');
\Flight::json($this->userProvider->search($query));
}
}