Files
nettsiden/www/tjenester/index.php

398 lines
14 KiB
PHP

<?php
namespace pvv\side;
require_once \dirname(__DIR__, 2) . implode(\DIRECTORY_SEPARATOR, ['', 'inc', 'include.php']);
$colorPalette = [
'#FFB3BA',
'#FFCFAA',
'#FFFFBA',
'#BAFFC9',
'#BAE1FF',
'#E2BAFF',
];
function rgbToHsl(int $r, int $g, int $b): array
{
// Assert valid RGB range
if ($r < 0 || $r > 255 || $g < 0 || $g > 255 || $b < 0 || $b > 255) {
throw new \InvalidArgumentException('RGB values must be between 0 and 255');
}
$r /= 255;
$g /= 255;
$b /= 255;
$max = max($r, $g, $b);
$min = min($r, $g, $b);
$delta = $max - $min;
$l = ($max + $min) / 2;
if ($delta == 0) {
$h = 0;
$s = 0;
} else {
$s = $delta / (1 - abs(2 * $l - 1));
if ($max === $r) {
$h = 60 * (($g - $b) / $delta);
if ($h < 0) {
$h += 360;
}
} elseif ($max === $g) {
$h = 60 * ((($b - $r) / $delta) + 2);
} else {
$h = 60 * ((($r - $g) / $delta) + 4);
}
}
return [
'h' => round($h, 2),
's' => round($s * 100, 2),
'l' => round($l * 100, 2),
];
}
function hslToRgb(float $h, float $s, float $l): array
{
// Assert valid HSL ranges
if ($h < 0 || $h > 360) {
throw new \InvalidArgumentException('Hue must be between 0 and 360');
}
if ($s < 0 || $s > 100 || $l < 0 || $l > 100) {
throw new \InvalidArgumentException('Saturation and Lightness must be between 0 and 100');
}
$s /= 100;
$l /= 100;
$c = (1 - abs(2 * $l - 1)) * $s;
$m = $l - $c / 2;
// Determine hue sector explicitly
if ($h < 60) {
$r1 = $c;
$g1 = ($h / 60) * $c;
$b1 = 0;
} elseif ($h < 120) {
$r1 = (2 - $h / 60) * $c;
$g1 = $c;
$b1 = 0;
} elseif ($h < 180) {
$r1 = 0;
$g1 = $c;
$b1 = (($h - 120) / 60) * $c;
} elseif ($h < 240) {
$r1 = 0;
$g1 = (4 - $h / 60) * $c;
$b1 = $c;
} elseif ($h < 300) {
$r1 = (($h - 240) / 60) * $c;
$g1 = 0;
$b1 = $c;
} else { // h < 360
$r1 = $c;
$g1 = 0;
$b1 = (6 - $h / 60) * $c;
}
return [
'r' => (int) round(($r1 + $m) * 255),
'g' => (int) round(($g1 + $m) * 255),
'b' => (int) round(($b1 + $m) * 255),
];
}
function generateHighlightColor(string $hexColor): string {
$r = hexdec(substr($hexColor, 1, 2));
$g = hexdec(substr($hexColor, 3, 2));
$b = hexdec(substr($hexColor, 5, 2));
$a = hexdec(substr($hexColor, 7, 2));
if (!$a) {
$a = 255;
}
$hsl = rgbToHsl($r, $g, $b);
// Increase lightness by 8%, cap at 100%
$hsl['l'] = min(100, $hsl['l'] + 8);
$rgb = hslToRgb($hsl['h'], $hsl['s'], $hsl['l']);
return sprintf(
"#%02x%02x%02x%02x",
$rgb['r'],
$rgb['g'],
$rgb['b'],
$a,
);
}
$services = [
"vcs" => [
"title" => "Versjonskontroll og utvikling",
"services" => [
[
"name" => "Gitea",
"description" => "Vår interne git-tjener, åpen for alle medlemmer. Kommer med CI/CD, nettside-artifakter, pakke-register og mye mer.",
"link" => "https://git.pvv.ntnu.no",
"link_text" => "Gå til git.pvv.ntnu.no",
"image" => "img/gitea.svg",
],
[
"name" => "GitHub",
"description" => "Speiling av våre mest interessante prosjekter på GitHub",
"link" => "https://github.com/Programvareverkstedet/",
"link_text" => "Gå til GitHub",
"image" => "img/github.svg",
],
[
"name" => "Codeberg",
"description" => "Speiling av våre mest interessante prosjekter på Codeberg",
"link" => "https://codeberg.org/Programvareverkstedet/",
"link_text" => "Gå til Codeberg",
"image" => "img/codeberg.svg",
]
]
],
"webmail" => [
"title" => "Epostklienter",
"services" => [
[
"name" => "Roundcube",
"description" => "En av våre webmail-klienter for epost.",
"link" => "https://webmail.pvv.ntnu.no/",
"link_text" => "Gå til Roundcube",
"image" => "img/roundcube.svg",
],
[
"name" => "Snappymail",
"description" => "En annen av våre webmail-klienter for epost.",
"link" => "https://snappymail.pvv.ntnu.no/",
"link_text" => "Gå til Snappymail",
"image" => "img/snappymail.svg",
],
[
"name" => "Alps",
"description" => "Jaggu enda en webmail-klient for epost.",
"link" => "https://alps.pvv.ntnu.no/",
"link_text" => "Gå til Alps",
"image" => "img/alps.svg",
],
],
],
"communication" => [
"title" => "Kommunikasjon",
"services" => [
[
"name" => "Matrix via Element",
"description" => implode(
" ",
[
"Åpen kommunikasjonsprotokoll som støtter ende-til-ende-kryptering og utallige kule funksjoner.",
"Vårt space er bridget sammen med Discord, så du får alle de samme meldingene.",
"#pvv:pvv.ntnu.no",
],
),
"link" => "https://chat.pvv.ntnu.no",
"link_text" => "Gå til chat.pvv.ntnu.no",
"image" => "img/element.svg",
],
[
"name" => "Discord",
"description" => "Vår hovedkanal, her finner du alt fra ofisielle announcements til memes og driftsdiskusjoner.",
"link" => "https://discord.gg/WpaHGV8K",
"link_text" => "Gå til Discord",
"image" => "img/discord.svg",
],
[
"name" => "Epost",
"description" => "Som PVV-medlem får du din egen @pvv.ntnu.no-adresse, som kan brukes med alle vanlige epostprotokoller.",
"link" => "https://webmail.pvv.ntnu.no/",
"link_text" => "Gå til Rouncubcube webmail",
"image" => "img/email.png",
],
[
"name" => "IRC",
"description" => "Hvis Discord er for proprietært og Matrix er for hypermoderne er kanskje IRC for deg. Vi har en kanal på IRCNet, #pvv.",
"link" => "irc://irc.pvv.ntnu.no/pvv",
"link_text" => "Koble til med IRC",
"image" => "img/irc.png",
],
],
],
"hosting" => [
"title" => "Verting og nettsider",
"services" => [
[
"name" => "Brukernettsider",
"description" => "Alle brukere får automatisk en egen side for html og php. Denne er offentlig på pvv.ntnu.no/~brukernavn.",
"link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Hjemmesider",
"link_text" => "Gå til dokumentasjon på wiki",
"image" => "img/php.png",
],
[
"name" => "Gopherhull",
"description" => "PVV driver en egen gopher-tjener for nostalgikere og retroentusiaster.",
"link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Gopherhull",
"link_text" => "Se dokumentasjon for gophertjening",
"image" => "img/gopher.png",
],
[
"name" => "Wiki",
"description" => "PVVs wiki er åpen for alle medlemmer, og kan brukes til dokumentasjon, notater, prosjektsider og mye mer.",
"link" => "https://wiki.pvv.ntnu.no",
"link_text" => "Gå til wiki.pvv.ntnu.no",
"image" => "img/mediawiki.svg",
],
[
"name" => "PVV-siden",
"description" => "Du befinner deg nå på PVV sin offisielle hjemmeside. Den er skrevet i PHP og kjører på en egen server.",
"link" => "https://git.pvv.ntnu.no/Projects/nettsiden",
"link_text" => "Se koden på gitea",
"image" => "../pvv-logo.png",
],
],
],
"recreational" => [
"title" => "Underholdning og fritid",
"services" => [
[
"name" => "Minecraft",
"description" => "Vi har en egen Minecraft-server for medlemmer, som du kan koble til med IP-adressen minecraft.pvv.ntnu.no. Spør om whitelist på matrix/discord.",
"link" => "https://minecraft.pvv.ntnu.no",
"link_text" => "Gå til verdenskartet vårt",
"image" => "img/minecraft.png",
],
// [
// "name" => "MiniFlux RSS reader",
// "description" => "Trenger du en cross-platform RSS/Atom-leser for å følge med på omverdenen som det er 1990? ",
// "link" => "https://feeds.pvv.ntnu.no",
// "link_text" => "Gå til MiniFlux",
// "image" => "img/rss.svg",
// ],
[
"name" => "Bildegalleri",
"description" => "PVV har et felles bildegalleri, der alle kan legge relevante bilder, som automatisk blir inkludert på nettsiden.",
"link" => "https://www.pvv.ntnu.no/galleri/",
"link_text" => "Se galleriet",
"image" => "img/gallery.png",
],
],
],
"physical" => [
"title" => "Fysiske tjenester",
"services" => [
[
"name" => "Dibbler",
"description" => "PVV har en liten kiosk-datamaskin som lar deg kjøpe godis og pølser, drevet av PVVVV-samlespleisegruppa.",
"link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Dibbler",
"link_text" => "Se dokumentasjon på wiki",
"image" => "img/dibbler.png",
],
// [
// "name" => "Worblehat",
// "description" => "Bibliotekssystemet vårt, som lar deg finne og låne bøker i PVVs bibliotek.",
// "link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Worblehat",
// "link_text" => "Se dokumentasjon på wiki",
// "image" => "img/worblehat.png",
// ],
[
"name" => "Grzegorz",
"description" => "Grzegorz er en musikkspiller, den spiller mye dank. Du kan styre den med vevgrensesnitt og diverse API-er.",
"link" => "https://georg.pvv.ntnu.no",
"link_text" => "Gå til Georg's vevgrensesnitt",
"image" => "img/grzegorz.png",
],
[
"name" => "Dørbjelle",
"description" => "PVVs dørbjelle er koblet til internett, og lar deg ringe på hvis du spør botten pent på Discordh eller Matrix",
"link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/D%C3%B8rbjelle",
"link_text" => "Se dokumentasjon på wiki",
"image" => "img/doorbell.png",
],
[
"name" => "Terminaler",
"description" => "PVV har flere terminaler plassert på terminalrommet; her kan du logge inn med PVV-brukeren din og gjøre øvinger eller lære om Linux.",
"link" => "https://wiki.pvv.ntnu.no/wiki/Tjenester/Terminaler",
"link_text" => "Se dokumentasjon på wiki",
"image" => "img/terminal.png",
],
],
]
];
$servicesArrayKeys = array_keys($services);
for ($i = 0; $i < count($services); $i++) {
$servicesKey = $servicesArrayKeys[$i];
$services[$servicesKey]['bgcolor'] = $colorPalette[$i % count($colorPalette)];
}
?>
<!DOCTYPE html>
<html lang="no">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<link rel="shortcut icon" href="/favicon.ico">
<link rel="stylesheet" href="/css/normalize.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/services.css">
<meta name="theme-color" content="#024" />
<title>Tjenesteverkstedet</title>
<style>
<?php foreach ($services as $categoryId => $category):
$categoryClass = '.category-' . htmlspecialchars($categoryId);
?>
<?php echo $categoryClass; ?> {
background: linear-gradient(135deg, <?php echo generateHighlightColor($category['bgcolor']) ?>, <?php echo $category['bgcolor']; ?>);
}
<?php endforeach; ?>
</style>
</head>
<header>Tjenesteverkstedet</header>
<body>
<nav>
<?php echo navbar(1, 'tjenester'); ?>
<?php echo loginbar($sp, $pdo); ?>
</nav>
<main>
<div class="serviceGrid">
<?php foreach ($services as $categoryId => $category):
$categoryClass = 'category-' . htmlspecialchars($categoryId);
?>
<div class="baseServiceCard categoryTitleCard <?php echo $categoryClass; ?>">
<h3 class="categoryTitle">
<?php echo htmlspecialchars($category['title']); ?>
</h3>
</div>
<?php foreach ($category['services'] as $service): ?>
<div class="baseServiceCard serviceCard <?php echo $categoryClass; ?>">
<div class="serviceContent">
<h3 class="serviceTitle"><?php echo htmlspecialchars($service['name']); ?></h3>
<p class="serviceDescription"><?php echo htmlspecialchars($service['description']); ?></p>
<div class="serviceLink">
<a href="<?php echo htmlspecialchars($service['link']); ?>" target="_blank">
<?php echo htmlspecialchars($service['link_text']); ?>
</a>
</div>
</div>
<img class="serviceImage"
src="<?php echo htmlspecialchars($service['image']); ?>"
alt="<?php echo htmlspecialchars($service['name']); ?> logo">
</div>
<?php endforeach; ?>
<?php endforeach; ?>
</div>
</main>
</body>
</html>