From: LeonardoBizzoni Date: Mon, 23 May 2022 07:04:37 +0000 (+0200) Subject: Finished live, started list X-Git-Url: http://git.leonardobizzoni.com/?a=commitdiff_plain;h=a55b13d2e5a764c9fafcfafdcf609471a3656955;p=highschool-graduation-project Finished live, started list --- diff --git a/README.org b/README.org index fa8cec1..90a0ba3 100644 --- a/README.org +++ b/README.org @@ -2,64 +2,33 @@ * Tabella dei contenuti :TOC: - [[#descrizione-del-progetto][Descrizione del progetto]] - - [[#idea-home-page][IDEA Home page]] - - [[#idea-popolazione-del-database][IDEA Popolazione del database]] - - [[#live-page][Live page]] + - [[#home-page][Home page]] + - [[#list-page][List page]] - [[#setup][Setup]] - [[#configurazione-ed-installazione-server][Configurazione ed installazione server]] * Descrizione del progetto -Attraverso la web app è possibile registrare un account con cui è possibile tenere traccia di: -- Anime visti -- Manga/light novel lette -- Visual novel giocate - -Inoltre attravero la pagina "live" è possibile visualizzare quali vtuber sono attualmente live e partecipare ad una di esse senza doversi recare sul sito di streaming da loro adottato. +Attraverso la web app è possibile visualizzare quali vtuber sono attualmente live e partecipare ad una di esse senza doversi recare sul sito di streaming da loro adottato. Gli utenti registrati possono anche aggiungere una vtuber alla loro lista personale di vtuber preferite e ricevere una notifica via email quando una di esse va in onda. Un utente può anche richiedere l'aggiunta di una vtuber al catalogo della web app, qualora essa non ne faccia già parte, semplicemente inviando, tramite l'apposito form, l'URL al canale della vtuber, sia esso su [[twitch.tv/][twitch]] o [[youtube.com/][youtube]]. -** IDEA Home page -Nella home page è possibile visualizzare una lista delle ultime uscite, divise per categoria [anime, manga, LN, VN] e per genere [azione, horror, sportivo, sci-fi, ...]. - -** IDEA Popolazione del database -*** Anime -- Titolo -- Tipo di anime [film, serie TV, speciale] -- Stato pubblicazione - + Numero episodi se lo stato è *concluso* -- Data di inizio/fine pubblicazione -- Trama -- Generi -- Immagine di copertina - -*** Manga e Light novels -- Titolo -- Stato pubblicazione - + Numero di capitoli e volumi se lo stato è *concluso* -- Data di inizio/fine pubblicazione -- Trama -- Generi -- Immagine di copertina - -*** Visual novels -- Titolo -- Link del seller -- Trama -- Generi -- Immagine di copertina - -** TODO Live page -Attraverso la pagina "live" è possibile partecipare alla stream di una vtuber direttamente senza recarsi sul sito di streaming da loro utilizzato. -Nonappena si visita quasta pagina vengono visualizzate 3 liste: -- *Preferite*: lista dedicata alle vtuber preferite dell'utente attualmente in live +** DONE Home page +Attraverso la pagina "home" è possibile partecipare alla stream di una vtuber direttamente senza recarsi sul sito di streaming da loro utilizzato. +Appena si visita quasta pagina vengono visualizzate 2 liste: - *In live*: lista di tutte le vtuber presenti nel catalogo attualmente in onda - *Offline*: lista delle vtuber presenti nel catalogo attualmente non in onda +Se l'utente è registrato allora viene visualizzata un'ulteriore lista che mostra le live attualmente in onda dell vtuber preferite dall'utente. + L'aggiunta di una vtuber viene effettuata tramite l'apposito form visibile agli utenti registrati tramite il tasto "Add vtuber". Una volta cliccato verrà chiesto all'utente l'inserimento dell'URL del canale della vtuber che desidera venga aggiunta al catalogo. -/In qualche modo dovrei tipo controllare che non venga mandata merda, pensavo tipo mi manda una mail quando un utente vuole aggiungere roba ed aspetta una mia risposta prima di aggiungere, però boh troppo sbatti da parte mia./ -/Un'altra roba epica da fare è tipo spostare il controllo se una vtuber è live ad uno script epico in esecuzione sul server separato dal webserver così da rendere la visualizzazione della pagina più rapida visto che ora per renderla un minimo più rapida utilizzo la cache della pagina. Si la pagina è lenta in culo ora./ + +** TODO List page +Attraverso la pagina "list", visibile solo agli utenti registrati, un utente può gestire le sue vtuber preferite. +L'utente può quindi: +- decidere di rimuovere una vtuber dai suoi preferiti +- disabilitare l'invio delle notifiche via email. * DONE Setup ** Configurazione ed installazione server @@ -74,18 +43,26 @@ Un vantaggio che offre questa architettura è la netta divisione delle 3 parti, Il presentation layer è il layer che si occupa dell'interazione con l'utente. Il suo compito principale è quello di mostrare e ricevere informazioni dal client. -Ho deciso di utilizzare Nginx come web server per le performance nettamente migliori e leggerezza in confronto ad altri web server. +Ho deciso di utilizzare Nginx come web server per le migliori performance e leggerezza in confronto ad altri web server. Inoltre la configura di Nginx è molto più semplice di web server come Apache. [[./media/nginxApacheGraph.png]] -/Soluzioni microsoft come il web server IIS non sono state considerate per via delle license sotto cui sono pubblicate ed a causa del mio odio verso i loro prodotti./ - *** Application Layer - PHP L'application layer rappresenta il cuore dell'applicazione. In questo layer le informazioni ricevute dal presentation layer vengono elaborate anche in base a dati presenti nel data layer. L'application layer può inoltre aggiungere, cancellare e modificare i dati nel data layer. -Un docker container si occupa dell'esecuzione di php-fpm e rimane in ascolto sulla porta 9000. +Un docker container si occupa dell'esecuzione di php-fpm e rimane in ascolto sulla porta 9000, questo permette al presentation layer (nginx) di operare similarmente ad un *reverse proxy*: quando riceve una richiesta per una risorsa *.php la inoltra al server php-fpm. +[[./media/proxy.svg]] + +**** Reverse e Forward proxy +Un *forward proxy*, a differenza di un reverse, è logicamente situato /prima/ di un gruppo di macchine *client* e svolge il compito di *middleman* ricevendo le richieste dai client ed inviandole lui stesso a destinazione. +Utilizzando un forward proxy i server destinatari riceveranno richieste dall'indirizzo IP del proxy server e non del client originale, questo permette di nascondere il proprio indirizzo IP aumentando il proprio livello di sicurezza online. + +Al contratio un *reverse proxy* è logicamente situato /prima/ di un gruppo di macchine *server* e svolge il compito di ricevere le richieste, analizzarle ed inviarle al server che ritiene più adatto all'elaborazione. *** Data Layer - MariaDB +Il data layer si occupa della gestione ed immagazinamento dei dati generati dall'application layer. +/Il presentation layer non genera dati visto che opera come un reverse proxy./ + L'installazione del database server mariadb viene anch'essa eseguita tramite un docker container e la container image disponibile su [[https://hub.docker.com/_/mariadb][hub.docker]] per cui non ha bisogno di alcuna configurazione. diff --git a/dockerfiles/bll/Dockerfile b/dockerfiles/bll/Dockerfile index be1e719..f32ad28 100644 --- a/dockerfiles/bll/Dockerfile +++ b/dockerfiles/bll/Dockerfile @@ -3,5 +3,3 @@ WORKDIR /var/www/html RUN docker-php-ext-install pdo pdo_mysql mysqli RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer - -RUN php /var/www/html/vtuberIsLive.php diff --git a/dockerfiles/web/nginx.conf b/dockerfiles/web/nginx.conf index 9a37f12..2a0cf79 100644 --- a/dockerfiles/web/nginx.conf +++ b/dockerfiles/web/nginx.conf @@ -7,10 +7,8 @@ events { worker_connections 1024; } - http { -# fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MY_CACHE:100m inactive=60m; -# fastcgi_cache_key "$scheme$request_method$host$request_uri"; + include mime.types; server { listen 80 default_server; @@ -25,12 +23,6 @@ http { } location ~ \.php$ { - -# fastcgi_ignore_headers Expires Cache-Control; -# fastcgi_cache MY_CACHE; -# fastcgi_cache_valid 200 60m; -# add_header X-Cache $upstream_cache_status; - fastcgi_read_timeout 300; fastcgi_pass app:9000; fastcgi_index index.php; diff --git a/media/proxy.svg b/media/proxy.svg new file mode 100644 index 0000000..fa71405 --- /dev/null +++ b/media/proxy.svg @@ -0,0 +1 @@ +update \ No newline at end of file diff --git a/www/controllers/AuthController.php b/www/controllers/AuthController.php index 6456621..d29c3c4 100644 --- a/www/controllers/AuthController.php +++ b/www/controllers/AuthController.php @@ -4,11 +4,13 @@ namespace app\controllers; use app\core\Application; use app\core\BaseController; use app\core\Request; +use app\core\Response; use app\models\LoginForm; use app\models\User; class AuthController extends BaseController{ public function login(Request $req) { + Application::$app->router->title = "WeebSite - Login"; $loginForm = new LoginForm; if ($req->getMethod() == "post"){ @@ -24,6 +26,7 @@ class AuthController extends BaseController{ } public function register(Request $req) { + Application::$app->router->title = "WeebSite - Sign up"; $registerModel = new User; if ($req->getMethod() == "post") { @@ -35,4 +38,9 @@ class AuthController extends BaseController{ } return $this->render("register", [ "model" => $registerModel ]); } + + public function logout(Request $req, Response $res) { + Application::$app->logout(); + $res->redirect("/"); + } } diff --git a/www/controllers/SiteController.php b/www/controllers/SiteController.php index cbf3fe1..d08b973 100644 --- a/www/controllers/SiteController.php +++ b/www/controllers/SiteController.php @@ -9,21 +9,22 @@ use app\models\Vtubers; class SiteController extends BaseController { - public function home() + public function list() { - $params = [ - "name" => "Leonardo" - ]; - - return $this->render("home", $params); + Application::$app->router->title = "WeebSite - Your top vtubers"; + $this->setLayout("list"); + return $this->render("list"); } public function live(Request $req) { $params = []; - $statement = Application::$app->db->pdo->prepare("SELECT * FROM vtubers;"); + $singleVtuber = false; $vtuberModel = new Vtubers; + Application::$app->router->title = "WeebSite - Live"; + $statement = Application::$app->db->pdo->prepare("SELECT * FROM vtubers;"); + if ($req->getMethod() == "post") { $vtuberModel->loadData($req->getBody()); $vtuberModel->getVtuberInfo(); @@ -33,6 +34,7 @@ class SiteController extends BaseController } } else if ($req->getMethod() == "get") { if (isset($_GET["id"])) { + $singleVtuber = true; $this->setLayout("live"); $statement = Application::$app->db->pdo->prepare("SELECT * from vtubers where id={$_GET['id']}"); } @@ -40,6 +42,9 @@ class SiteController extends BaseController foreach ($statement->fetchAll() as $vtuber) { $params[] = [ $vtuber, $vtuberModel->isLive($vtuber["login"], $vtuber["link"]) ]; + if ($singleVtuber) { + Application::$app->router->title = "WeebSite - ".$vtuber["username"]; + } } } diff --git a/www/core/Application.php b/www/core/Application.php index 7922f6d..8929f72 100644 --- a/www/core/Application.php +++ b/www/core/Application.php @@ -2,8 +2,9 @@ namespace app\core; class Application { - private BaseController $controller; + private ?BaseController $controller = null; + public string $layout = "main"; public $userClass; public array $config; public Router $router; @@ -11,7 +12,7 @@ class Application { public Response $res; public Database $db; public Session $session; - public ?DbModel $user = null; + public ?DbModel $user; public static Application $app; public static string $ROOT_DIR; @@ -33,6 +34,8 @@ class Application { if ($primaryValue) { $primaryKey = $this->userClass::primaryKey(); $this->user = $this->userClass::findOne([$primaryKey => $primaryValue]); + } else { + $this->user = null; } } @@ -62,5 +65,9 @@ class Application { $this->user = null; $this->session->remove("user"); } + + public static function isGuest() { + return !self::$app->user; + } } ?> diff --git a/www/core/Router.php b/www/core/Router.php index d493236..89ef169 100644 --- a/www/core/Router.php +++ b/www/core/Router.php @@ -6,6 +6,7 @@ class Router { private array $routes = []; + public string $title; public Request $req; public Response $res; @@ -40,7 +41,7 @@ class Router Application::$app->setController(new $callback[0]); $callback[0] = Application::$app->getController(); - return call_user_func($callback, $this->req); + return call_user_func($callback, $this->req, $this->res); } else { $this->res->setStatusCode(404); return $this->renderView("404"); @@ -57,7 +58,10 @@ class Router private function loadLayoutContent() { - $layout = Application::$app->getController()->layout; + $layout = Application::$app->layout; + if (Application::$app->getController()) { + $layout = Application::$app->getController()->layout; + } ob_start(); include_once Application::$ROOT_DIR . "/views/layouts/$layout.php"; return ob_get_clean(); diff --git a/www/models/Vtubers.php b/www/models/Vtubers.php index ccaa464..8beb6d3 100644 --- a/www/models/Vtubers.php +++ b/www/models/Vtubers.php @@ -4,7 +4,6 @@ namespace app\models; use app\core\Application; use app\core\DbModel; -use DOMDocument; use Google_Client; use Google_Service_YouTube; diff --git a/www/pub/css/index.css b/www/pub/css/live.css similarity index 100% rename from www/pub/css/index.css rename to www/pub/css/live.css diff --git a/www/pub/css/main.css b/www/pub/css/main.css new file mode 100644 index 0000000..e69de29 diff --git a/www/pub/img/XtPIXR8.png b/www/pub/img/XtPIXR8.png new file mode 100644 index 0000000..141958a Binary files /dev/null and b/www/pub/img/XtPIXR8.png differ diff --git a/www/pub/index.php b/www/pub/index.php index ca1a395..91568a2 100644 --- a/www/pub/index.php +++ b/www/pub/index.php @@ -25,10 +25,11 @@ $config = [ $app = new Application(dirname(__DIR__), $config); -$app->router->get("/", [SiteController::class, "home"]); +$app->router->get("/", [SiteController::class, "live"]); +$app->router->post("/", [SiteController::class, "live"]); -$app->router->get("/live", [SiteController::class, "live"]); -$app->router->post("/live", [SiteController::class, "live"]); +$app->router->get("/list", [SiteController::class, "list"]); +$app->router->post("/list", [SiteController::class, "list"]); # User authentication $app->router->get("/login", [AuthController::class, "login"]); @@ -37,4 +38,6 @@ $app->router->post("/login", [AuthController::class, "login"]); $app->router->get("/register", [AuthController::class, "register"]); $app->router->post("/register", [AuthController::class, "register"]); +$app->router->get("/logout", [AuthController::class, "logout"]); + $app->run(); diff --git a/www/updateVtuberPfp.php b/www/updateVtuberPfp.php new file mode 100644 index 0000000..b988ba2 --- /dev/null +++ b/www/updateVtuberPfp.php @@ -0,0 +1,70 @@ +load(); + +use Google_Client; +use Google_Service_YouTube; + +$config = [ + "db" => [ + "dsn" => $_ENV["DB_DSN"], + "user" => $_ENV["DB_USER"], + "password" => $_ENV["DB_PASSWORD"] + ], + "twitch" => [ + "clientid" => $_ENV["TWITCH_CLIENTID"], + "token" => $_ENV["TWITCH_TOKEN"] + ], + "yt" => [ + "key" => $_ENV["GOOGLE_API_KEY"] + ], + "userClass" => null +]; + +$app = new Application(__DIR__, $config); + +$stmt = $app->db->pdo->prepare("select id, link, login from vtubers"); +$stmt->execute(); +$data = $stmt->fetchAll(); + +foreach ($data as $vtuber) { + $link = $vtuber["link"]; + $login = $vtuber["login"]; + + if (str_contains($link, "twitch.tv")) { + $clientID = Application::$app->config["twitch"]["clientid"] ?? ""; + $token = Application::$app->config["twitch"]["token"] ?? ""; + + $url = "https://api.twitch.tv/helix/users?login=" . $vtuber["login"]; + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_HTTPHEADER, array("Client-ID: $clientID", "Authorization: Bearer $token")); + + $result = get_object_vars(json_decode(curl_exec($ch))); + curl_close($ch); + + $result = get_object_vars($result["data"][0]); + + $img = rtrim($result["profile_image_url"], "/ "); + } + + if (str_contains($link, "youtube.com")) { + $client = new Google_Client(); + $client->setDeveloperKey(Application::$app->config["yt"]["key"]); + $service = new Google_Service_YouTube($client); + + $response = get_object_vars($service->channels->listChannels('snippet', ["id" => $vtuber["login"]])); + $img = $response["items"][0]["snippet"]["thumbnails"]["default"]["url"]; + } + + if (!is_null($img)) { + $stmt = $app->db->pdo->prepare("update vtubers set img='" . $img . "' where id=" . $vtuber["id"]); + $stmt->execute(); + } +} diff --git a/www/views/layouts/list.php b/www/views/layouts/list.php new file mode 100644 index 0000000..26b9e6b --- /dev/null +++ b/www/views/layouts/list.php @@ -0,0 +1,63 @@ + + + + + + + + + + + Document + + + + + + +
+ + + + + + + + + + + {{content}} + +
IconUsername
+
+ + + + + + diff --git a/www/views/layouts/live.php b/www/views/layouts/live.php index 402b17e..725a079 100644 --- a/www/views/layouts/live.php +++ b/www/views/layouts/live.php @@ -3,8 +3,8 @@ - - WeebSite - Live! + + <?= $this->title ?> diff --git a/www/views/layouts/main.php b/www/views/layouts/main.php index 00a44c8..a4a71f8 100644 --- a/www/views/layouts/main.php +++ b/www/views/layouts/main.php @@ -1,10 +1,6 @@ "; -var_dump(Application::$app->user); -echo ""; ?> @@ -12,33 +8,50 @@ echo ""; - + + - Document + <?= $this->title ?> @@ -47,7 +60,8 @@ echo ""; {{content}} - + + diff --git a/www/views/list.php b/www/views/list.php new file mode 100644 index 0000000..30b09ce --- /dev/null +++ b/www/views/list.php @@ -0,0 +1,13 @@ + + + +res->redirect("/"); + +endif; ?> diff --git a/www/views/live.php b/www/views/live.php index 5dc4ebf..ca90ac3 100644 --- a/www/views/live.php +++ b/www/views/live.php @@ -1,16 +1,19 @@ addToFav(); exit; } -if (!isset($_GET["id"])) { +if (count($model->errors) > 0) { + echo "
";
+    var_dump($model->errors);
+    echo "
"; +} else if (!isset($_GET["id"])) { echo "

Live page

"; - ?> - - -