The formattening, part 1

This commit is contained in:
2025-03-12 00:20:04 +01:00
parent ece3c8ab80
commit b6697e5750
31 changed files with 1420 additions and 1356 deletions

18
dist/config.local.php vendored

@ -1,24 +1,24 @@
<?php <?php
$DB_DSN = 'sqlite:'.__DIR__.DIRECTORY_SEPARATOR.'pvv.sqlite'; declare(strict_types=1);
$DB_DSN = 'sqlite:' . __DIR__ . \DIRECTORY_SEPARATOR . 'pvv.sqlite';
$DB_USER = null; $DB_USER = null;
$DB_PASS = null; $DB_PASS = null;
$DOOR_SECRET = "changeme"; $DOOR_SECRET = 'changeme';
$GALLERY_DIR = __DIR__.DIRECTORY_SEPARATOR.'www'.DIRECTORY_SEPARATOR.'galleri'.DIRECTORY_SEPARATOR.'bilder'.DIRECTORY_SEPARATOR.'gallery'; $GALLERY_DIR = __DIR__ . \DIRECTORY_SEPARATOR . 'www' . \DIRECTORY_SEPARATOR . 'galleri' . \DIRECTORY_SEPARATOR . 'bilder' . \DIRECTORY_SEPARATOR . 'gallery';
$GALLERY_SERVER_PATH = '/images/gallery/'; $GALLERY_SERVER_PATH = '/images/gallery/';
$SLIDESHOW_DIR = __DIR__.DIRECTORY_SEPARATOR.'www'.DIRECTORY_SEPARATOR.'galleri'.DIRECTORY_SEPARATOR.'bilder'.DIRECTORY_SEPARATOR.'slideshow'; $SLIDESHOW_DIR = __DIR__ . \DIRECTORY_SEPARATOR . 'www' . \DIRECTORY_SEPARATOR . 'galleri' . \DIRECTORY_SEPARATOR . 'bilder' . \DIRECTORY_SEPARATOR . 'slideshow';
$SLIDESHOW_SERVER_PATH = '/images/slideshow/'; $SLIDESHOW_SERVER_PATH = '/images/slideshow/';
$SAML_COOKIE_SALT = 'changeme'; $SAML_COOKIE_SALT = 'changeme';
$SAML_COOKIE_SECURE = false; $SAML_COOKIE_SECURE = false;
$SAML_TRUSTED_DOMAINS = array("localhost:1080"); $SAML_TRUSTED_DOMAINS = ['localhost:1080'];
$SAML_ADMIN_PASSWORD = "changeme"; $SAML_ADMIN_PASSWORD = 'changeme';
$SAML_ADMIN_NAME = 'PVV Drift'; $SAML_ADMIN_NAME = 'PVV Drift';
$SAML_ADMIN_EMAIL = 'drift@pvv.ntnu.no'; $SAML_ADMIN_EMAIL = 'drift@pvv.ntnu.no';
$CACHE_DIRECTORY = __DIR__.DIRECTORY_SEPARATOR.'cache'; $CACHE_DIRECTORY = __DIR__ . \DIRECTORY_SEPARATOR . 'cache';
?>

@ -1,6 +1,6 @@
<?php <?php
$configFile = getenv('PVV_CONFIG_FILE'); declare(strict_types=1);
require_once($configFile);
?> $configFile = getenv('PVV_CONFIG_FILE');
require_once $configFile;

@ -1,9 +1,11 @@
<?php <?php
$config = array(
declare(strict_types=1);
$config = [
/* This is the name of this authentication source, and will be used to access it later. */ /* This is the name of this authentication source, and will be used to access it later. */
'default-sp' => array( 'default-sp' => [
'saml:SP', 'saml:SP',
'idp' => 'https://idp.pvv.ntnu.no/', 'idp' => 'https://idp.pvv.ntnu.no/',
), ],
); ];

@ -1,18 +1,19 @@
<?php <?php
require_once(dirname(dirname(dirname(dirname(__DIR__)))) . DIRECTORY_SEPARATOR . 'config.php'); declare(strict_types=1);
require_once dirname(__DIR__, 4) . \DIRECTORY_SEPARATOR . 'config.php';
/** /**
* The configuration of SimpleSAMLphp * The configuration of SimpleSAMLphp.
*/ */
$httpUtils = new SimpleSAML\Utils\HTTP();
$httpUtils = new \SimpleSAML\Utils\HTTP();
$config = [ $config = [
/******************************* /*
| BASIC CONFIGURATION OPTIONS | | BASIC CONFIGURATION OPTIONS |
*******************************/ */
/* /*
* Setup the following parameters to match your installation. * Setup the following parameters to match your installation.
@ -179,9 +180,9 @@ $config = [
/********************************** /*
| SECURITY CONFIGURATION OPTIONS | | SECURITY CONFIGURATION OPTIONS |
**********************************/ */
/* /*
* This is a secret salt used by SimpleSAMLphp when it needs to generate a secure hash * This is a secret salt used by SimpleSAMLphp when it needs to generate a secure hash
@ -287,9 +288,9 @@ $config = [
*/ */
/************************ /*
| ERRORS AND DEBUGGING | | ERRORS AND DEBUGGING |
************************/ */
/* /*
* The 'debug' option allows you to control how SimpleSAMLphp behaves in certain * The 'debug' option allows you to control how SimpleSAMLphp behaves in certain
@ -347,9 +348,9 @@ $config = [
*/ */
/************************** /*
| LOGGING AND STATISTICS | | LOGGING AND STATISTICS |
**************************/ */
/* /*
* Define the minimum log level to log. Available levels: * Define the minimum log level to log. Available levels:
@ -409,7 +410,7 @@ $config = [
* *
* The default is to use LOG_LOCAL5 if available, and fall back to LOG_USER if not. * The default is to use LOG_LOCAL5 if available, and fall back to LOG_USER if not.
*/ */
'logging.facility' => defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : LOG_USER, 'logging.facility' => defined('LOG_LOCAL5') ? constant('LOG_LOCAL5') : \LOG_USER,
/* /*
* The process name that should be used when logging to syslog. * The process name that should be used when logging to syslog.
@ -445,9 +446,9 @@ $config = [
/*********************** /*
| PROXY CONFIGURATION | | PROXY CONFIGURATION |
***********************/ */
/* /*
* Proxy to use for retrieving URLs. * Proxy to use for retrieving URLs.
@ -466,9 +467,9 @@ $config = [
/************************** /*
| DATABASE CONFIGURATION | | DATABASE CONFIGURATION |
**************************/ */
/* /*
* This database configuration is optional. If you are not using * This database configuration is optional. If you are not using
@ -528,9 +529,9 @@ $config = [
/************* /*
| PROTOCOLS | | PROTOCOLS |
*************/ */
/* /*
* Which functionality in SimpleSAMLphp do you want to enable. Normally you would enable only * Which functionality in SimpleSAMLphp do you want to enable. Normally you would enable only
@ -542,9 +543,9 @@ $config = [
/*********** /*
| MODULES | | MODULES |
***********/ */
/* /*
* Configuration for enabling/disabling modules. By default the 'core', 'admin' and 'saml' modules are enabled. * Configuration for enabling/disabling modules. By default the 'core', 'admin' and 'saml' modules are enabled.
@ -562,13 +563,13 @@ $config = [
'exampleauth' => false, 'exampleauth' => false,
'core' => true, 'core' => true,
'admin' => true, 'admin' => true,
'saml' => true 'saml' => true,
], ],
/************************* /*
| SESSION CONFIGURATION | | SESSION CONFIGURATION |
*************************/ */
/* /*
* This value is the duration of the session in seconds. Make sure that the time duration of * This value is the duration of the session in seconds. Make sure that the time duration of
@ -692,9 +693,9 @@ $config = [
/************************** /*
| MEMCACHE CONFIGURATION | | MEMCACHE CONFIGURATION |
**************************/ */
/* /*
* Configuration for the 'memcache' session store. This allows you to store * Configuration for the 'memcache' session store. This allows you to store
@ -814,9 +815,9 @@ $config = [
/************************************* /*
| LANGUAGE AND INTERNATIONALIZATION | | LANGUAGE AND INTERNATIONALIZATION |
*************************************/ */
/* /*
* Languages available, RTL languages, and what language is the default. * Languages available, RTL languages, and what language is the default.
@ -846,7 +847,7 @@ $config = [
'language.cookie.lifetime' => (60 * 60 * 24 * 900), 'language.cookie.lifetime' => (60 * 60 * 24 * 900),
'language.cookie.samesite' => $httpUtils->canSetSameSiteNone() ? 'None' : null, 'language.cookie.samesite' => $httpUtils->canSetSameSiteNone() ? 'None' : null,
/** /*
* Custom getLanguage function called from SimpleSAML\Locale\Language::getLanguage(). * Custom getLanguage function called from SimpleSAML\Locale\Language::getLanguage().
* Function should return language code of one of the available languages or NULL. * Function should return language code of one of the available languages or NULL.
* See SimpleSAML\Locale\Language::getLanguage() source code for more info. * See SimpleSAML\Locale\Language::getLanguage() source code for more info.
@ -858,9 +859,9 @@ $config = [
* 'language.get_language_function' => ['\SimpleSAML\Module\example\Template', 'getLanguage'], * 'language.get_language_function' => ['\SimpleSAML\Module\example\Template', 'getLanguage'],
*/ */
/************** /*
| APPEARANCE | | APPEARANCE |
**************/ */
/* /*
* Which theme directory should be used? * Which theme directory should be used?
@ -873,7 +874,7 @@ $config = [
*/ */
// 'theme.header' => 'SimpleSAMLphp', // 'theme.header' => 'SimpleSAMLphp',
/** /*
* A template controller, if any. * A template controller, if any.
* *
* Used to intercept certain parts of the template handling, while keeping away unwanted/unexpected hooks. Set * Used to intercept certain parts of the template handling, while keeping away unwanted/unexpected hooks. Set
@ -937,16 +938,16 @@ $config = [
], ],
], ],
/** /*
* Set to a full URL if you want to redirect users that land on SimpleSAMLphp's * Set to a full URL if you want to redirect users that land on SimpleSAMLphp's
* front page to somewhere more useful. If left unset, a basic welcome message * front page to somewhere more useful. If left unset, a basic welcome message
* is shown. * is shown.
*/ */
// 'frontpage.redirect' => 'https://example.com/', // 'frontpage.redirect' => 'https://example.com/',
/********************* /*
| DISCOVERY SERVICE | | DISCOVERY SERVICE |
*********************/ */
/* /*
* Whether the discovery service should allow the user to save his choice of IdP. * Whether the discovery service should allow the user to save his choice of IdP.
@ -975,9 +976,9 @@ $config = [
/************************************* /*
| AUTHENTICATION PROCESSING FILTERS | | AUTHENTICATION PROCESSING FILTERS |
*************************************/ */
/* /*
* Authentication processing filters that will be executed for all IdPs * Authentication processing filters that will be executed for all IdPs
@ -1059,9 +1060,9 @@ $config = [
/************************** /*
| METADATA CONFIGURATION | | METADATA CONFIGURATION |
**************************/ */
/* /*
* This option allows you to specify a directory for your metadata outside of the standard metadata directory * This option allows you to specify a directory for your metadata outside of the standard metadata directory
@ -1181,9 +1182,9 @@ $config = [
'metadata.sign.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256', 'metadata.sign.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
/**************************** /*
| DATA STORE CONFIGURATION | | DATA STORE CONFIGURATION |
****************************/ */
/* /*
* Configure the data store for SimpleSAMLphp. * Configure the data store for SimpleSAMLphp.
@ -1287,9 +1288,9 @@ $config = [
*/ */
'store.redis.sentinels' => [], 'store.redis.sentinels' => [],
/********************* /*
| IdP/SP PROXY MODE | | IdP/SP PROXY MODE |
*********************/ */
/* /*
* If the IdP in front of SimpleSAMLphp in IdP/SP proxy mode sends * If the IdP in front of SimpleSAMLphp in IdP/SP proxy mode sends

@ -1,23 +1,21 @@
<?php <?php
$metadata['https://idp.pvv.ntnu.no/'] = array (
declare(strict_types=1);
$metadata['https://idp.pvv.ntnu.no/'] = [
'metadata-set' => 'saml20-idp-remote', 'metadata-set' => 'saml20-idp-remote',
'entityid' => 'https://idp.pvv.ntnu.no/', 'entityid' => 'https://idp.pvv.ntnu.no/',
'SingleSignOnService' => 'SingleSignOnService' => [
array ( 0 => [
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://idp.pvv.ntnu.no/simplesaml/saml2/idp/SSOService.php', 'Location' => 'https://idp.pvv.ntnu.no/simplesaml/saml2/idp/SSOService.php',
), ],
), ],
'SingleLogoutService' => 'SingleLogoutService' => [
array ( 0 => [
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://idp.pvv.ntnu.no/simplesaml/saml2/idp/SingleLogoutService.php', 'Location' => 'https://idp.pvv.ntnu.no/simplesaml/saml2/idp/SingleLogoutService.php',
), ],
), ],
'certData' => 'MIIDpTCCAo2gAwIBAgIJAJIgibrB7NvsMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAk5PMR4wHAYDVQQKDBVQcm9ncmFtdmFyZXZlcmtzdGVkZXQxGDAWBgNVBAMMD2lkcC5wdnYubnRudS5ubzEgMB4GCSqGSIb3DQEJARYRZHJpZnRAcHZ2Lm50bnUubm8wHhcNMTcxMTEzMjI0NTQyWhcNMjcxMTEzMjI0NTQyWjBpMQswCQYDVQQGEwJOTzEeMBwGA1UECgwVUHJvZ3JhbXZhcmV2ZXJrc3RlZGV0MRgwFgYDVQQDDA9pZHAucHZ2Lm50bnUubm8xIDAeBgkqhkiG9w0BCQEWEWRyaWZ0QHB2di5udG51Lm5vMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAveLujCsgVCRA360y5yezy8FcSPhaqodggDqY12UTkYOMQLBFaph6uUL4oCUlXZqxScrAYVRt9yw+7BYpcm0p51VZzVCsfMxRVkn+O1eUvsaXq3f13f87QHKYP2f0uqkGf5PvnKIdSaI/ix8WJhD8XT+h0OkHEcaBvUtSG7zbEhvG21WPHwgw2rvZSneArQ8tOitZC0u8VXSfdhtf6ynRseo0xC95634UwQAZivhQ2v4A6Tp57QG5DCXIJ9/z3PkINx3KB/hOeh0EP6Dpbp+7V0/t9778E3whpm4llrH144kzROhA7EgUgkZOjAVjxGCYlcj3xQPnnItihVOZ5B5qLwIDAQABo1AwTjAdBgNVHQ4EFgQUPLhrB+Qb/Kzz7Car9GJkKmEkz6swHwYDVR0jBBgwFoAUPLhrB+Qb/Kzz7Car9GJkKmEkz6swDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAd+4E6t0j8/p8rbZE8y/gZ9GsiRhxkR4l6JbMRUfEpqHKi415qstChRcP2Lo3Yd5qdmj9tLDWoPsqet1QgyTTmQTgUmPhhMOQDqSh90LuqEJseKWafXGS/SfWLH6MWVmzDV5YofJEw2ThPiU58GiS06OLS2poq1eAesa2LQ22J8yYisXM4sxImIFte+LYQ1+1evfBWcvU1vrGsQ0VLJHdef9WoXp1swUFhq4Zk0c7gjHiB1CFVlExAAlk9L6W3CVXmKIYlf4eUnEBGkC061Ir42+uhAMWO9Y/L1NEuboTyd2KAI/6JdKdzpmfk7zPVxWlNxNCZ7OPNuvOKp6VlpB2EA==', 'certData' => 'MIIDpTCCAo2gAwIBAgIJAJIgibrB7NvsMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAk5PMR4wHAYDVQQKDBVQcm9ncmFtdmFyZXZlcmtzdGVkZXQxGDAWBgNVBAMMD2lkcC5wdnYubnRudS5ubzEgMB4GCSqGSIb3DQEJARYRZHJpZnRAcHZ2Lm50bnUubm8wHhcNMTcxMTEzMjI0NTQyWhcNMjcxMTEzMjI0NTQyWjBpMQswCQYDVQQGEwJOTzEeMBwGA1UECgwVUHJvZ3JhbXZhcmV2ZXJrc3RlZGV0MRgwFgYDVQQDDA9pZHAucHZ2Lm50bnUubm8xIDAeBgkqhkiG9w0BCQEWEWRyaWZ0QHB2di5udG51Lm5vMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAveLujCsgVCRA360y5yezy8FcSPhaqodggDqY12UTkYOMQLBFaph6uUL4oCUlXZqxScrAYVRt9yw+7BYpcm0p51VZzVCsfMxRVkn+O1eUvsaXq3f13f87QHKYP2f0uqkGf5PvnKIdSaI/ix8WJhD8XT+h0OkHEcaBvUtSG7zbEhvG21WPHwgw2rvZSneArQ8tOitZC0u8VXSfdhtf6ynRseo0xC95634UwQAZivhQ2v4A6Tp57QG5DCXIJ9/z3PkINx3KB/hOeh0EP6Dpbp+7V0/t9778E3whpm4llrH144kzROhA7EgUgkZOjAVjxGCYlcj3xQPnnItihVOZ5B5qLwIDAQABo1AwTjAdBgNVHQ4EFgQUPLhrB+Qb/Kzz7Car9GJkKmEkz6swHwYDVR0jBBgwFoAUPLhrB+Qb/Kzz7Car9GJkKmEkz6swDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAd+4E6t0j8/p8rbZE8y/gZ9GsiRhxkR4l6JbMRUfEpqHKi415qstChRcP2Lo3Yd5qdmj9tLDWoPsqet1QgyTTmQTgUmPhhMOQDqSh90LuqEJseKWafXGS/SfWLH6MWVmzDV5YofJEw2ThPiU58GiS06OLS2poq1eAesa2LQ22J8yYisXM4sxImIFte+LYQ1+1evfBWcvU1vrGsQ0VLJHdef9WoXp1swUFhq4Zk0c7gjHiB1CFVlExAAlk9L6W3CVXmKIYlf4eUnEBGkC061Ir42+uhAMWO9Y/L1NEuboTyd2KAI/6JdKdzpmfk7zPVxWlNxNCZ7OPNuvOKp6VlpB2EA==',
'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient', 'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
); ];

@ -1,11 +1,13 @@
<?php <?php
declare(strict_types=1);
require __DIR__ . '/../src/_autoload.php'; require __DIR__ . '/../src/_autoload.php';
require __DIR__ . '/../config.php'; require __DIR__ . '/../config.php';
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS); $pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$agenda = new \pvv\side\Agenda([ $agenda = new pvv\side\Agenda([
new \pvv\side\social\NerdepitsaActivity, new pvv\side\social\NerdepitsaActivity(),
new \pvv\side\social\AnimekveldActivity, new pvv\side\social\AnimekveldActivity(),
new \pvv\side\DBActivity($pdo), new pvv\side\DBActivity($pdo),
]); ]);

@ -1,33 +1,36 @@
<?php <?php
declare(strict_types=1);
// Set up database and user system, // Set up database and user system,
// and include common files such as HTML includes or SimplSAMLphp. // and include common files such as HTML includes or SimplSAMLphp.
require_once __DIR__ . DIRECTORY_SEPARATOR . 'agenda.php'; require_once __DIR__ . \DIRECTORY_SEPARATOR . 'agenda.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'navbar.php'; require_once __DIR__ . \DIRECTORY_SEPARATOR . 'navbar.php';
require_once dirname(__DIR__) . implode(DIRECTORY_SEPARATOR, ['', 'config.php']); require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'config.php']);
require_once dirname(__DIR__) . implode(DIRECTORY_SEPARATOR, ['', 'src', '_autoload.php']); require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'src', '_autoload.php']);
require_once dirname(__DIR__) . implode(DIRECTORY_SEPARATOR, ['', 'vendor', 'simplesamlphp', 'simplesamlphp', 'lib', '_autoload.php']); require_once dirname(__DIR__) . implode(\DIRECTORY_SEPARATOR, ['', 'vendor', 'simplesamlphp', 'simplesamlphp', 'lib', '_autoload.php']);
date_default_timezone_set('Europe/Oslo'); date_default_timezone_set('Europe/Oslo');
setlocale(LC_ALL, 'nb_NO'); setlocale(\LC_ALL, 'nb_NO');
$pdo = new \PDO($DB_DSN, $DB_USER, $DB_PASS); $pdo = new PDO($DB_DSN, $DB_USER, $DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$userManager = new \pvv\admin\UserManager($pdo); $userManager = new pvv\admin\UserManager($pdo);
$sp = 'default-sp'; $sp = 'default-sp';
$as = new \SimpleSAML\Auth\Simple($sp); $as = new SimpleSAML\Auth\Simple($sp);
use \pvv\side\Agenda; use pvv\side\Agenda;
$agenda = new \pvv\side\Agenda([
$agenda = new Agenda([
// new \pvv\side\social\NerdepitsaActivity, // new \pvv\side\social\NerdepitsaActivity,
// new \pvv\side\social\AnimekveldActivity, // new \pvv\side\social\AnimekveldActivity,
new \pvv\side\social\HackekveldActivity, new pvv\side\social\HackekveldActivity(),
new \pvv\side\social\BrettspillActivity, new pvv\side\social\BrettspillActivity(),
new \pvv\side\social\DriftkveldActivity, new pvv\side\social\DriftkveldActivity(),
new \pvv\side\DBActivity($pdo), new pvv\side\DBActivity($pdo),
]); ]);
$months_translations = ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember']; $months_translations = ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'];

@ -1,5 +1,7 @@
<?php <?php
function navbar($depth, $active = NULL) {
declare(strict_types=1);
function navbar($depth, $active = null) {
$result = "\n\t<ul id=\"menu\">\n"; $result = "\n\t<ul id=\"menu\">\n";
$menuItems = [ $menuItems = [
'Hjem' => '', 'Hjem' => '',
@ -16,7 +18,7 @@ function navbar($depth, $active = NULL) {
]; ];
foreach ($menuItems as $caption => $link) { foreach ($menuItems as $caption => $link) {
$isActive = $active === $link; $isActive = $active === $link;
if (substr( $link, 0, 4 ) != "http") { if (substr($link, 0, 4) != 'http') {
$link = rtrim(str_repeat('../', $depth) . $link, '/') . '/'; $link = rtrim(str_repeat('../', $depth) . $link, '/') . '/';
} }
@ -25,17 +27,19 @@ function navbar($depth, $active = NULL) {
$result .= "\t\t<li" . ($isActive ? ' class="active"' : '') . '>' $result .= "\t\t<li" . ($isActive ? ' class="active"' : '') . '>'
. '<a href="' . $link . '">' . '<a href="' . $link . '">'
. $caption . $caption
. "</a></li>\n" . "</a></li>\n";
;
} }
return $result . "\t</ul>\n"; return $result . "\t</ul>\n";
} }
function loginBar($sp = null, $pdo = null) { function loginBar($sp = null, $pdo = null) {
if (is_null($sp)) $sp = 'default-sp'; if (null === $sp) {
$sp = 'default-sp';
}
$result = "\n"; $result = "\n";
require_once(__DIR__ . '/../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php'); require_once __DIR__ . '/../vendor/simplesamlphp/simplesamlphp/lib/_autoload.php';
$as = new \SimpleSAML\Auth\Simple($sp); $as = new SimpleSAML\Auth\Simple($sp);
$svg = '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 64 64"> $svg = '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 64 64">
<circle cx="32" cy="27" r="14" stroke-width="0" /> <circle cx="32" cy="27" r="14" stroke-width="0" />
@ -48,7 +52,7 @@ function loginBar($sp = null, $pdo = null) {
$uname = $attr['uid'][0]; $uname = $attr['uid'][0];
$isAdmin = false; $isAdmin = false;
if (isset($pdo)) { if (isset($pdo)) {
$userManager = new \pvv\admin\UserManager($pdo); $userManager = new pvv\admin\UserManager($pdo);
$isAdmin = $userManager->isAdmin($uname); $isAdmin = $userManager->isAdmin($uname);
} }
$result .= "\t<a id=\"login\" href=\"#usermenu\" aria-hidden=\"true\">{$svg}" . htmlspecialchars($uname) . "</a>\n"; $result .= "\t<a id=\"login\" href=\"#usermenu\" aria-hidden=\"true\">{$svg}" . htmlspecialchars($uname) . "</a>\n";

@ -1,4 +1,6 @@
<?php <?php
declare(strict_types=1);
/* /*
* Copyright (c) 2014-2015, Jørn Åne de Jong <@jornane> * Copyright (c) 2014-2015, Jørn Åne de Jong <@jornane>
* *
@ -14,7 +16,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/** /*
* Register SPL autoloading for classes and interfaces. Put this file in your * Register SPL autoloading for classes and interfaces. Put this file in your
* namespace root and make sure it gets included from your PHP entry-point. * namespace root and make sure it gets included from your PHP entry-point.
* *
@ -36,4 +38,4 @@
*/ */
spl_autoload_extensions('.php'); spl_autoload_extensions('.php');
spl_autoload_register('spl_autoload'); spl_autoload_register('spl_autoload');
set_include_path( realpath( __DIR__ ) . PATH_SEPARATOR . get_include_path() ); set_include_path(realpath(__DIR__) . \PATH_SEPARATOR . get_include_path());

@ -1,7 +1,8 @@
<?php <?php
namespace pvv\admin;
use \PDO; declare(strict_types=1);
namespace pvv\admin;
class UserManager { class UserManager {
private $pdo; private $pdo;
@ -9,29 +10,29 @@ class UserManager{
public $usergroups = [ public $usergroups = [
'admin' => 1, 'admin' => 1,
'prosjekt' => 2, 'prosjekt' => 2,
'aktiviteter' => 4 'aktiviteter' => 4,
]; ];
public function __construct($pdo) { public function __construct($pdo) {
$this->pdo = $pdo; $this->pdo = $pdo;
} }
public function setupUser($uname, $groups=0){ public function setupUser($uname, $groups = 0): void {
$query = 'INSERT INTO users (uname, groups) VALUES (:uname, :groups)'; $query = 'INSERT INTO users (uname, groups) VALUES (:uname, :groups)';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR); $statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->bindParam(':groups', $groups, PDO::PARAM_INT); $statement->bindParam(':groups', $groups, \PDO::PARAM_INT);
$statement->execute(); $statement->execute();
} }
public function updateFlags($uname, $flags){ public function updateFlags($uname, $flags): void {
$query = 'UPDATE users set groups=:groups WHERE uname=:uname'; $query = 'UPDATE users set groups=:groups WHERE uname=:uname';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':groups', $flags, PDO::PARAM_INT); $statement->bindParam(':groups', $flags, \PDO::PARAM_INT);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR); $statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
} }
public function addGroup($uname, $group){ public function addGroup($uname, $group): void {
$userFlags = $this->getUsergroups($uname); $userFlags = $this->getUsergroups($uname);
if ($userFlags) { if ($userFlags) {
@ -40,7 +41,7 @@ class UserManager{
} }
} }
public function removeGroup($uname, $group){ public function removeGroup($uname, $group): void {
$userFlags = $this->getUsergroups($uname); $userFlags = $this->getUsergroups($uname);
if ($userFlags) { if ($userFlags) {
@ -49,18 +50,18 @@ class UserManager{
} }
} }
public function setGroups($uname, $groups){ public function setGroups($uname, $groups): void {
$query = 'SELECT * FROM users WHERE uname=:uname LIMIT 1'; $query = 'SELECT * FROM users WHERE uname=:uname LIMIT 1';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR); $statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
$row = $statement->fetch(); $row = $statement->fetch();
if ($row) { if ($row) {
$query = 'UPDATE users set groups=:groups WHERE uname=:uname'; $query = 'UPDATE users set groups=:groups WHERE uname=:uname';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':groups', $groups, PDO::PARAM_INT); $statement->bindParam(':groups', $groups, \PDO::PARAM_INT);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR); $statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
} else { } else {
$this->setupUser($uname, $groups); $this->setupUser($uname, $groups);
@ -70,7 +71,7 @@ class UserManager{
public function hasGroup($uname, $groupName) { public function hasGroup($uname, $groupName) {
$userFlags = $this->getUsergroups($uname); $userFlags = $this->getUsergroups($uname);
return ($userFlags & $this->usergroups[$groupName]); return $userFlags & $this->usergroups[$groupName];
} }
// for convenience // for convenience
@ -82,7 +83,7 @@ class UserManager{
$resultFlag = 0; $resultFlag = 0;
foreach ($this->usergroups as $name => $flag) { foreach ($this->usergroups as $name => $flag) {
if(in_array($name, $names)){ if (\in_array($name, $names, true)) {
$resultFlag = ($resultFlag | $flag); $resultFlag = ($resultFlag | $flag);
} }
} }
@ -93,11 +94,14 @@ class UserManager{
public function getUsergroups($uname) { public function getUsergroups($uname) {
$query = 'SELECT groups FROM users WHERE uname=:uname LIMIT 1'; $query = 'SELECT groups FROM users WHERE uname=:uname LIMIT 1';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR); $statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
$row = $statement->fetch(); $row = $statement->fetch();
if ($row == false) return 0; if ($row == false) {
return 0;
}
return $row[0]; return $row[0];
} }
@ -125,7 +129,7 @@ class UserManager{
$uname = $userData['uname']; $uname = $userData['uname'];
$users[] = [ $users[] = [
'name' => $uname, 'name' => $uname,
'groups' => $this->getUsergroupNames($uname) 'groups' => $this->getUsergroupNames($uname),
]; ];
} }

@ -1,12 +1,11 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side; namespace pvv\side;
use \DateTimeImmutable;
interface Activity { interface Activity {
public function getNextEventFrom(\DateTimeImmutable $date) /* : Event */;
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */; public function getPreviousEventFrom(\DateTimeImmutable $date) /* : Event */;
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */;
} }

@ -1,35 +1,34 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side; namespace pvv\side;
use \DateTimeImmutable;
use \DateInterval;
class Agenda { class Agenda {
private $activities; private $activities;
const TODAY = 0; public const TODAY = 0;
const TOMORROW = 1; public const TOMORROW = 1;
const THIS_WEEK = 2; public const THIS_WEEK = 2;
const NEXT_WEEK = 3; public const NEXT_WEEK = 3;
const THIS_MONTH = 4; public const THIS_MONTH = 4;
const NEXT_MONTH = 5; public const NEXT_MONTH = 5;
public function __construct($activities) { public function __construct($activities) {
$this->activities = $activities; $this->activities = $activities;
} }
public static function getFormattedDate($date) { public static function getFormattedDate($date) {
return $date->format("l j. M H.i"); return $date->format('l j. M H.i');
} }
public function getEventsBetween(DateTimeImmutable $from, DateTimeImmutable $to) { public function getEventsBetween(\DateTimeImmutable $from, \DateTimeImmutable $to) {
$results = []; $results = [];
for($i = 0; $i < sizeof($this->activities); $i++) { for ($i = 0; $i < \count($this->activities); ++$i) {
$result = []; $result = [];
do { do {
$run = false; $run = false;
if (sizeof($result)) { if (\count($result)) {
$date = end($result)->getStop(); $date = end($result)->getStop();
} else { } else {
$date = $from; $date = $from;
@ -43,66 +42,73 @@ class Agenda {
$results[] = $result; $results[] = $result;
} }
$result = []; $result = [];
foreach($results as $a) foreach($a as $b) $result[] = $b; foreach ($results as $a) {
usort($result, function($a, $b) { foreach ($a as $b) {
return ($a->getStart() < $b->getStart()) ? -1 : 1; $result[] = $b;
}); }
}
usort($result, static fn($a, $b) => ($a->getStart() < $b->getStart()) ? -1 : 1);
return $result; return $result;
} }
public function getNextDays() { public function getNextDays() {
$result = [[], [], [], [], [], []]; $result = [[], [], [], [], [], []];
$events = $this->getEventsBetween( $events = $this->getEventsBetween(
(new DateTimeImmutable)->setTime(0, 0), (new \DateTimeImmutable())->setTime(0, 0),
(new DateTimeImmutable)->setTime(23, 59)->add(new DateInterval('P1M')) (new \DateTimeImmutable())->setTime(23, 59)->add(new \DateInterval('P1M'))
); );
foreach ($events as $event) { foreach ($events as $event) {
$index = self::NEXT_MONTH; $index = self::NEXT_MONTH;
if (self::isToday($event->getStart())) $index = self::TODAY; if (self::isToday($event->getStart())) {
elseif (self::isTomorrow($event->getStart())) $index = self::TOMORROW; $index = self::TODAY;
elseif (self::isThisWeek($event->getStart())) $index = self::THIS_WEEK; } elseif (self::isTomorrow($event->getStart())) {
elseif (self::isNextWeek($event->getStart())) $index = self::NEXT_WEEK; $index = self::TOMORROW;
elseif (self::isThisMonth($event->getStart())) $index = self::THIS_MONTH; } elseif (self::isThisWeek($event->getStart())) {
$index = self::THIS_WEEK;
} elseif (self::isNextWeek($event->getStart())) {
$index = self::NEXT_WEEK;
} elseif (self::isThisMonth($event->getStart())) {
$index = self::THIS_MONTH;
}
$result[$index][] = $event; $result[$index][] = $event;
} }
return $result; return $result;
} }
public function getNextOfEach(DateTimeImmutable $startDate) { public function getNextOfEach(\DateTimeImmutable $startDate) {
$result = array_filter(array_map( $result = array_filter(array_map(
function($a) use ($startDate){ static fn($a) => $a->getNextEventFrom($startDate),
return $a->getNextEventFrom($startDate); $this->activities
}, $this->activities ), static fn($a) => isset($a));
), function($a){ usort(
return isset($a); $result,
}); static fn($a, $b) => ($a->getStart()->getTimeStamp() < $b->getStart()->getTimeStamp())
usort($result, function($a, $b) {
return ($a->getStart()->getTimeStamp() < $b->getStart()->getTimeStamp())
? -1 ? -1
: 1 : 1
; );
});
return $result; return $result;
} }
public static function isToday(DateTimeImmutable $date) { public static function isToday(\DateTimeImmutable $date) {
return $date->format('dmY') == date('dmY'); return $date->format('dmY') == date('dmY');
} }
public static function isTomorrow(DateTimeImmutable $date) { public static function isTomorrow(\DateTimeImmutable $date) {
return $date->sub(new DateInterval('P1D'))->format('dmY') == date('dmY'); return $date->sub(new \DateInterval('P1D'))->format('dmY') == date('dmY');
} }
public static function isThisWeek(DateTimeImmutable $date) { public static function isThisWeek(\DateTimeImmutable $date) {
return $date->format('WY') == date('WY'); return $date->format('WY') == date('WY');
} }
public static function isNextWeek(DateTimeImmutable $date) { public static function isNextWeek(\DateTimeImmutable $date) {
return $date->sub(new DateInterval('P7D'))->format('WY') == date('WY'); return $date->sub(new \DateInterval('P7D'))->format('WY') == date('WY');
} }
public static function isThisMonth(DateTimeImmutable $date) { public static function isThisMonth(\DateTimeImmutable $date) {
return $date->format('mY') == date('mY'); return $date->format('mY') == date('mY');
} }
} }

@ -1,13 +1,13 @@
<?php <?php
namespace pvv\side;
use \DateTimeImmutable; declare(strict_types=1);
use \PDO;
namespace pvv\side;
class DBActivity implements Activity { class DBActivity implements Activity {
private $pdo; private $pdo;
public function __construct(PDO $pdo) { public function __construct(\PDO $pdo) {
$this->pdo = $pdo; $this->pdo = $pdo;
} }
@ -21,8 +21,8 @@ class DBActivity implements Activity {
$event = new SimpleEvent( $event = new SimpleEvent(
$dbEvent['id'], $dbEvent['id'],
$dbEvent['name'], $dbEvent['name'],
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']), \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']),
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']), \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']),
$dbEvent['organiser'], $dbEvent['organiser'],
$dbEvent['location'], $dbEvent['location'],
$dbEvent['description'] $dbEvent['description']
@ -36,50 +36,48 @@ class DBActivity implements Activity {
public function getEventByID($id) { public function getEventByID($id) {
$query = 'SELECT * FROM events WHERE id=:id LIMIT 1'; $query = 'SELECT * FROM events WHERE id=:id LIMIT 1';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_INT); $statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute(); $statement->execute();
$dbEvent = $statement->fetch(); $dbEvent = $statement->fetch();
$event = new SimpleEvent(
return new SimpleEvent(
$dbEvent['id'], $dbEvent['id'],
$dbEvent['name'], $dbEvent['name'],
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']), \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['start']),
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']), \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $dbEvent['stop']),
$dbEvent['organiser'], $dbEvent['organiser'],
$dbEvent['location'], $dbEvent['location'],
$dbEvent['description'] $dbEvent['description']
); );
return $event;
} }
public function getNextEventFrom(\DateTimeImmutable $date) {
public function getNextEventFrom(DateTimeImmutable $date) {
$query = 'SELECT id,name,start,stop,organiser,location,description FROM events WHERE start > :date ORDER BY start ASC LIMIT 1'; $query = 'SELECT id,name,start,stop,organiser,location,description FROM events WHERE start > :date ORDER BY start ASC LIMIT 1';
return $this->retrieve($date, $query); return $this->retrieve($date, $query);
} }
public function getPreviousEventFrom(DateTimeImmutable $date) { public function getPreviousEventFrom(\DateTimeImmutable $date) {
$query = 'SELECT id,name,start,stop,organiser,location,description FROM events WHERE start < :date ORDER BY start DESC LIMIT 1'; $query = 'SELECT id,name,start,stop,organiser,location,description FROM events WHERE start < :date ORDER BY start DESC LIMIT 1';
return $this->retrieve($date, $query); return $this->retrieve($date, $query);
} }
private function retrieve($date, $query) { private function retrieve($date, $query) {
$stmt = $this->pdo->prepare($query); $stmt = $this->pdo->prepare($query);
$stmt->execute(['date' => $date->format('Y-m-d H:i:s')]); $stmt->execute(['date' => $date->format('Y-m-d H:i:s')]);
if ($result = $stmt->fetch(PDO::FETCH_ASSOC)){ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
$ev = new SimpleEvent( return new SimpleEvent(
$result['id'], $result['id'],
$result['name'], $result['name'],
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['start']), \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['start']),
DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['stop']), \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $result['stop']),
$result['organiser'], $result['organiser'],
$result['location'], $result['location'],
$result['description'] $result['description']
); );
return $ev;
}
return null;
} }
} }
}

@ -1,12 +1,13 @@
<?php <?php
namespace pvv\side;
use \PDO; declare(strict_types=1);
namespace pvv\side;
class Door { class Door {
private $pdo; private $pdo;
public function __construct(PDO $pdo){ public function __construct(\PDO $pdo) {
$this->pdo = $pdo; $this->pdo = $pdo;
} }
@ -19,7 +20,7 @@ class Door{
foreach ($statement->fetchAll() as $row) { foreach ($statement->fetchAll() as $row) {
$doorEvents[] = [ $doorEvents[] = [
'time' => (int) $row['time'], 'time' => (int) $row['time'],
'open' => (bool)$row['open'] 'open' => (bool) $row['open'],
]; ];
} }
@ -29,14 +30,14 @@ class Door{
public function getEntriesAfter($startTime) { public function getEntriesAfter($startTime) {
$query = 'SELECT time, open FROM door WHERE time > :startTime ORDER BY time DESC'; $query = 'SELECT time, open FROM door WHERE time > :startTime ORDER BY time DESC';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':startTime', $startTime, PDO::PARAM_STR); $statement->bindParam(':startTime', $startTime, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
$doorEvents = []; $doorEvents = [];
foreach ($statement->fetchAll() as $row) { foreach ($statement->fetchAll() as $row) {
$doorEvents[] = [ $doorEvents[] = [
'time' => (int) $row['time'], 'time' => (int) $row['time'],
'open' => (bool)$row['open'] 'open' => (bool) $row['open'],
]; ];
} }
@ -48,25 +49,26 @@ class Door{
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->execute(); $statement->execute();
$row = $statement->fetch(); $row = $statement->fetch();
return [ return [
'time' => (int) $row['time'], 'time' => (int) $row['time'],
'open' => (bool)$row['open'] 'open' => (bool) $row['open'],
]; ];
} }
private function removeOld() { private function removeOld(): void {
$firstValidTime = time() - 60 * 60 * 24 * 7; // One week before now $firstValidTime = time() - 60 * 60 * 24 * 7; // One week before now
$query = 'DELETE FROM door WHERE time < :firstValid'; $query = 'DELETE FROM door WHERE time < :firstValid';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':firstValid', $firstValidTime, PDO::PARAM_STR); $statement->bindParam(':firstValid', $firstValidTime, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
} }
public function createEvent($time, $open) { public function createEvent($time, $open): void {
$query = 'INSERT INTO door(time, open) VALUES (:time, :open)'; $query = 'INSERT INTO door(time, open) VALUES (:time, :open)';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':time', $time, PDO::PARAM_STR); $statement->bindParam(':time', $time, \PDO::PARAM_STR);
$statement->bindParam(':open', $open, PDO::PARAM_STR); $statement->bindParam(':open', $open, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
$this->removeOld(); $this->removeOld();

@ -1,14 +1,15 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side; namespace pvv\side;
use \DateTimeImmutable; use DateTimeImmutable;
use \DateInterval;
abstract class Event { abstract class Event {
private $start; private $start;
public function __construct(DateTimeImmutable $start) { public function __construct(\DateTimeImmutable $start) {
$this->start = $start; $this->start = $start;
} }
@ -23,8 +24,8 @@ abstract class Event {
if (Agenda::isTomorrow($this->getStart())) { if (Agenda::isTomorrow($this->getStart())) {
return 'i morgen'; return 'i morgen';
} }
if (Agenda::isThisWeek($this->getStart()) || $this->getStart()->sub(new DateInterval('P4D'))->getTimestamp() < time()) { if (Agenda::isThisWeek($this->getStart()) || $this->getStart()->sub(new \DateInterval('P4D'))->getTimestamp() < time()) {
return $this->getStart()->format("l"); return $this->getStart()->format('l');
} }
if (Agenda::isNextWeek($this->getStart())) { if (Agenda::isNextWeek($this->getStart())) {
return 'neste uke'; return 'neste uke';
@ -32,22 +33,23 @@ abstract class Event {
if (Agenda::isThisMonth($this->getStart())) { if (Agenda::isThisMonth($this->getStart())) {
return 'denne måneden'; return 'denne måneden';
} }
return $this->getStart()->format("j. F");
return $this->getStart()->format('j. F');
} }
public abstract function getStop(); /* : DateTimeImmutable */ abstract public function getStop(); /* : DateTimeImmutable */
public abstract function getName(); abstract public function getName();
public abstract function getLocation(); abstract public function getLocation();
public abstract function getOrganiser(); abstract public function getOrganiser();
public abstract function getURL(); /* : string */ abstract public function getURL(); /* : string */
public abstract function getImageURL(); /* : string */ abstract public function getImageURL(); /* : string */
public abstract function getDescription(); /* : string */ abstract public function getDescription(); /* : string */
public abstract function getColor(); /* : string */ abstract public function getColor(); /* : string */
} }

@ -1,7 +1,8 @@
<?php <?php
namespace pvv\side;
use \PDO; declare(strict_types=1);
namespace pvv\side;
class MOTD { class MOTD {
private $pdo; private $pdo;
@ -10,15 +11,15 @@ class MOTD{
$this->pdo = $pdo; $this->pdo = $pdo;
} }
public function setMOTD($title, $content) { public function setMOTD($title, $content): void {
if (is_array($content)) { if (\is_array($content)) {
$content = implode("_", $content); $content = implode('_', $content);
} }
$query = 'INSERT INTO motd(title, content) VALUES (:title, :content);'; $query = 'INSERT INTO motd(title, content) VALUES (:title, :content);';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':title', $title, PDO::PARAM_STR); $statement->bindParam(':title', $title, \PDO::PARAM_STR);
$statement->bindParam(':content', $content, PDO::PARAM_STR); $statement->bindParam(':content', $content, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
} }
@ -29,21 +30,18 @@ class MOTD{
$statement->execute(); $statement->execute();
$data = $statement->fetch(); $data = $statement->fetch();
$motd = array("title" => $data[0], "content" => explode("\n", $data[1]));
return $motd; return ['title' => $data[0], 'content' => explode("\n", $data[1])];
} }
public function getMOTD_history($limit = 5) { public function getMOTD_history($limit = 5) {
$query = 'SELECT motd.title, motd.content FROM motd ORDER BY motd.id DESC LIMIT :limit'; $query = 'SELECT motd.title, motd.content FROM motd ORDER BY motd.id DESC LIMIT :limit';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':limit', $limit, PDO::PARAM_STR); $statement->bindParam(':limit', $limit, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
$data = $statement->fetch(); $data = $statement->fetch();
$motd = array("title" => $data[0], "content" => explode("\n", $data[1]));
return $motd; return ['title' => $data[0], 'content' => explode("\n", $data[1])];
} }
} }

@ -1,8 +1,14 @@
<?php <?php
declare(strict_types=1);
namespace pvv\side; namespace pvv\side;
class Project { class Project {
private $id, $name, $descr, $active; private $id;
private $name;
private $descr;
private $active;
public function __construct($id, $name, $descr, $active) { public function __construct($id, $name, $descr, $active) {
$this->id = $id; $this->id = $id;

@ -1,12 +1,13 @@
<?php <?php
namespace pvv\side;
use \PDO; declare(strict_types=1);
namespace pvv\side;
class ProjectManager { class ProjectManager {
private $pdo; private $pdo;
public function __construct(PDO $pdo){ public function __construct(\PDO $pdo) {
$this->pdo = $pdo; $this->pdo = $pdo;
} }
@ -32,27 +33,26 @@ class ProjectManager{
public function getByID($id) { public function getByID($id) {
$query = 'SELECT * FROM projects WHERE id=:id LIMIT 1'; $query = 'SELECT * FROM projects WHERE id=:id LIMIT 1';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_INT); $statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute(); $statement->execute();
$dbProj = $statement->fetch(); $dbProj = $statement->fetch();
if (!$dbProj) { if (!$dbProj) {
return false; return false;
} }
$project = new Project(
return new Project(
$dbProj['id'], $dbProj['id'],
$dbProj['name'], $dbProj['name'],
$dbProj['description'], $dbProj['description'],
$dbProj['active'] $dbProj['active']
); );
return $project;
} }
public function getByOwner($uname) { public function getByOwner($uname) {
$query = 'SELECT projectid FROM projectmembers WHERE uname=:uname'; $query = 'SELECT projectid FROM projectmembers WHERE uname=:uname';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':uname', $uname, PDO::PARAM_STR); $statement->bindParam(':uname', $uname, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
$projectIDs = $statement->fetchAll(); $projectIDs = $statement->fetchAll();
@ -62,7 +62,7 @@ class ProjectManager{
$query = 'SELECT * FROM projects WHERE id=:id'; $query = 'SELECT * FROM projects WHERE id=:id';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_INT); $statement->bindParam(':id', $id, \PDO::PARAM_INT);
$statement->execute(); $statement->execute();
foreach ($statement->fetchAll() as $dbProj) { foreach ($statement->fetchAll() as $dbProj) {
@ -82,7 +82,7 @@ class ProjectManager{
public function getProjectMembers($id) { public function getProjectMembers($id) {
$query = 'SELECT * FROM projectmembers WHERE projectid=:id'; $query = 'SELECT * FROM projectmembers WHERE projectid=:id';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_STR); $statement->bindParam(':id', $id, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
$members = []; $members = [];
@ -93,7 +93,7 @@ class ProjectManager{
'mail' => $dbUsr['mail'], 'mail' => $dbUsr['mail'],
'role' => $dbUsr['role'], 'role' => $dbUsr['role'],
'lead' => $dbUsr['lead'], 'lead' => $dbUsr['lead'],
'owner' => $dbUsr['owner'] 'owner' => $dbUsr['owner'],
]; ];
} }
@ -103,19 +103,18 @@ class ProjectManager{
public function getProjectOwner($id) { public function getProjectOwner($id) {
$query = 'SELECT * FROM projectmembers WHERE (projectid=:id AND owner=1)'; $query = 'SELECT * FROM projectmembers WHERE (projectid=:id AND owner=1)';
$statement = $this->pdo->prepare($query); $statement = $this->pdo->prepare($query);
$statement->bindParam(':id', $id, PDO::PARAM_STR); $statement->bindParam(':id', $id, \PDO::PARAM_STR);
$statement->execute(); $statement->execute();
$dbOwner = $statement->fetch(); $dbOwner = $statement->fetch();
$owner = [
return [
'name' => $dbOwner['name'], 'name' => $dbOwner['name'],
'uname' => $dbOwner['uname'], 'uname' => $dbOwner['uname'],
'mail' => $dbOwner['mail'], 'mail' => $dbOwner['mail'],
'role' => $dbOwner['role'], 'role' => $dbOwner['role'],
'lead' => $dbOwner['lead'], 'lead' => $dbOwner['lead'],
'owner' => $dbOwner['owner'] 'owner' => $dbOwner['owner'],
]; ];
return $owner;
} }
} }

@ -1,9 +1,17 @@
<?php <?php
declare(strict_types=1);
namespace pvv\side; namespace pvv\side;
class SimpleEvent extends Event { class SimpleEvent extends Event {
private $id;
private $id, $name, $descr, $start, $end, $org, $loc; private $name;
private $descr;
private $start;
private $end;
private $org;
private $loc;
public function __construct($id, $name, \DateTimeImmutable $start, \DateTimeImmutable $end, $org, $loc, $descr, $_isDBEvent = false) { public function __construct($id, $name, \DateTimeImmutable $start, \DateTimeImmutable $end, $org, $loc, $descr, $_isDBEvent = false) {
$this->id = $id; $this->id = $id;
@ -40,19 +48,16 @@ class SimpleEvent extends Event {
} }
public function getURL() { public function getURL() {
return ('/hendelser/info.php?id=' . $this->id); return '/hendelser/info.php?id=' . $this->id;
} }
public function getImageURL() { public function getImageURL(): void {}
return null;
}
public function getDescription() { public function getDescription() {
return $this->descr; return $this->descr;
} }
public function getColor() { public function getColor() {
return "#3b7"; return '#3b7';
} }
} }

@ -1,36 +1,41 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Activity; use pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
class AnimekveldActivity implements Activity { class AnimekveldActivity implements Activity {
public function nextDate(\DateTimeImmutable $date) {
public function nextDate(DateTimeImmutable $date) { if ($date->format('H') > 20 || $date->format('H') == 19 && $date->format('i') > 30) {
if ($date->format('H') > 20 || $date->format('H') == 19 && $date->format('i') > 30) return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(19, 30, 0));
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(19, 30, 0)); }
$date = $date->setTime(19, 30, 0); $date = $date->setTime(19, 30, 0);
if ($date->format('N') != 5) if ($date->format('N') != 5) {
return $this->nextDate($date->add(new DateInterval('P1D'))); return $this->nextDate($date->add(new \DateInterval('P1D')));
}
return $date; return $date;
} }
public function prevDate(DateTimeImmutable $date) { public function prevDate(\DateTimeImmutable $date) {
if ($date->format('H') < 19 || $date->format('H') == 20 && $date->format('i') < 30) if ($date->format('H') < 19 || $date->format('H') == 20 && $date->format('i') < 30) {
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(19, 30, 0)); return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(19, 30, 0));
}
$date = $date->setTime(19, 30, 0); $date = $date->setTime(19, 30, 0);
if ($date->format('N') != 5) if ($date->format('N') != 5) {
return $this->prevDate($date->sub(new DateInterval('P1D'))); return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
return $date; return $date;
} }
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ { public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new AnimekveldEvent($this->nextDate($date)); return new AnimekveldEvent($this->nextDate($date));
} }
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ { public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new AnimekveldEvent($this->prevDate($date)); return new AnimekveldEvent($this->prevDate($date));
} }
} }

@ -1,29 +1,29 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Event; use pvv\side\Event;
use \DateInterval;
class AnimekveldEvent extends Event { class AnimekveldEvent extends Event {
public function getStop() { public function getStop() {
return $this->getStart()->add(new DateInterval('PT4H1800S')); return $this->getStart()->add(new \DateInterval('PT4H1800S'));
} }
public function getName() /* : string */ { public function getName() { /* : string */
return "Animekveld"; return 'Animekveld';
} }
public function getLocation() /* : Location */ { public function getLocation() { /* : Location */
return "Koserommet"; return 'Koserommet';
} }
public function getOrganiser() /* : User */ { public function getOrganiser() { /* : User */
return "Christoffer Viken"; return 'Christoffer Viken';
} }
public function getURL() /* : string */ { public function getURL() { /* : string */
return '/anime/'; return '/anime/';
} }
@ -42,7 +42,6 @@ class AnimekveldEvent extends Event {
} }
public function getColor() { public function getColor() {
return "#35a"; return '#35a';
} }
} }

@ -1,41 +1,47 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Activity; use pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
class BrettspillActivity implements Activity { class BrettspillActivity implements Activity {
public function nextDate(\DateTimeImmutable $date) {
public function nextDate(DateTimeImmutable $date) { if ($date->format('H') > 17 || $date->format('H') == 16 && $date->format('i') > 15) {
if ($date->format('H') > 17 || $date->format('H') == 16 && $date->format('i') > 15) return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(16, 15, 0));
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(16, 15, 0));
$date = $date->setTime(16, 15, 0);
if ($date->format('N') != 7)
return $this->nextDate($date->add(new DateInterval('P1D')));
if ($date->format('W') % 2 - 1)
return $this->nextDate($date->add(new DateInterval('P7D')));
return $date;
} }
public function prevDate(DateTimeImmutable $date) {
if ($date->format('H') < 16 || $date->format('H') == 17 && $date->format('i') < 15)
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(16, 15, 0));
$date = $date->setTime(16, 15, 0); $date = $date->setTime(16, 15, 0);
if ($date->format('N') != 7) if ($date->format('N') != 7) {
return $this->prevDate($date->sub(new DateInterval('P1D'))); return $this->nextDate($date->add(new \DateInterval('P1D')));
if ($date->format('W') % 2 - 1) }
return $this->prevDate($date->sub(new DateInterval('P7D'))); if ($date->format('W') % 2 - 1) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date; return $date;
} }
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ { public function prevDate(\DateTimeImmutable $date) {
if ($date->format('H') < 16 || $date->format('H') == 17 && $date->format('i') < 15) {
return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(16, 15, 0));
}
$date = $date->setTime(16, 15, 0);
if ($date->format('N') != 7) {
return $this->prevDate($date->sub(new \DateInterval('P1D')));
}
if ($date->format('W') % 2 - 1) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date;
}
public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new BrettspillEvent($this->nextDate($date)); return new BrettspillEvent($this->nextDate($date));
} }
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ { public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new BrettspillEvent($this->prevDate($date)); return new BrettspillEvent($this->prevDate($date));
} }
} }

@ -1,29 +1,29 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Event; use pvv\side\Event;
use \DateInterval;
class BrettspillEvent extends Event { class BrettspillEvent extends Event {
public function getStop() { public function getStop() {
return $this->getStart()->add(new DateInterval('PT4H1800S')); return $this->getStart()->add(new \DateInterval('PT4H1800S'));
} }
public function getName() /* : string */ { public function getName() { /* : string */
return "Brettspillkveld"; return 'Brettspillkveld';
} }
public function getLocation() /* : Location */ { public function getLocation() { /* : Location */
return "Programvareverkstedet"; return 'Programvareverkstedet';
} }
public function getOrganiser() /* : User */ { public function getOrganiser() { /* : User */
return "Programvareverkstedet"; return 'Programvareverkstedet';
} }
public function getURL() /* : string */ { public function getURL() { /* : string */
return '/brettspill/'; return '/brettspill/';
} }
@ -59,7 +59,6 @@ class BrettspillEvent extends Event {
} }
public function getColor() { public function getColor() {
return "#000"; return '#000';
} }
} }

@ -1,40 +1,47 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Activity; use pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
class DriftkveldActivity implements Activity { class DriftkveldActivity implements Activity {
public function nextDate(\DateTimeImmutable $date) {
public function nextDate(DateTimeImmutable $date) { if ($date->format('H') > 18 || $date->format('H') == 17 && $date->format('i') > 30) {
if ($date->format('H') > 18 || $date->format('H') == 17 && $date->format('i') > 30) return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(18, 15, 0));
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(18, 15, 0)); }
$date = $date->setTime(18, 15, 0); $date = $date->setTime(18, 15, 0);
if ($date->format('N') != 6) if ($date->format('N') != 6) {
return $this->nextDate($date->add(new DateInterval('P1D'))); return $this->nextDate($date->add(new \DateInterval('P1D')));
if ($date->format('W') % 2 - 1) }
return $this->nextDate($date->add(new DateInterval('P7D'))); if ($date->format('W') % 2 - 1) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date; return $date;
} }
public function prevDate(DateTimeImmutable $date) { public function prevDate(\DateTimeImmutable $date) {
if ($date->format('H') < 17 || $date->format('H') == 18 && $date->format('i') < 30) if ($date->format('H') < 17 || $date->format('H') == 18 && $date->format('i') < 30) {
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(18, 15, 0)); return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(18, 15, 0));
}
$date = $date->setTime(18, 15, 0); $date = $date->setTime(18, 15, 0);
if ($date->format('N') != 6) if ($date->format('N') != 6) {
return $this->prevDate($date->sub(new DateInterval('P1D'))); return $this->prevDate($date->sub(new \DateInterval('P1D')));
if ($date->format('W') % 2 - 1) }
return $this->prevDate($date->sub(new DateInterval('P7D'))); if ($date->format('W') % 2 - 1) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date; return $date;
} }
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ { public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new DriftkveldEvent($this->nextDate($date)); return new DriftkveldEvent($this->nextDate($date));
} }
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ { public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new DriftkveldEvent($this->prevDate($date)); return new DriftkveldEvent($this->prevDate($date));
} }
} }

@ -1,29 +1,29 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Event; use pvv\side\Event;
use \DateInterval;
class DriftkveldEvent extends Event { class DriftkveldEvent extends Event {
public function getStop() { public function getStop() {
return $this->getStart()->add(new DateInterval('PT4H1800S')); return $this->getStart()->add(new \DateInterval('PT4H1800S'));
} }
public function getName() /* : string */ { public function getName() { /* : string */
return "Driftkveld"; return 'Driftkveld';
} }
public function getLocation() /* : Location */ { public function getLocation() { /* : Location */
return "Terminalrommet / Discord / IRC"; return 'Terminalrommet / Discord / IRC';
} }
public function getOrganiser() /* : User */ { public function getOrganiser() { /* : User */
return "Torstein Nordgård-Hansen"; return 'Torstein Nordgård-Hansen';
} }
public function getURL() /* : string */ { public function getURL() { /* : string */
return '/driftkveld/'; return '/driftkveld/';
} }
@ -38,12 +38,11 @@ class DriftkveldEvent extends Event {
'Kom på driftkveld!', 'Kom på driftkveld!',
'', '',
'Vi møtes annenhver uke for å ta unna driftarbeid og drikke kaffe.', 'Vi møtes annenhver uke for å ta unna driftarbeid og drikke kaffe.',
'Alle PVVere er velkommene, enten de er erfarne driftere eller helt utenforstående!' 'Alle PVVere er velkommene, enten de er erfarne driftere eller helt utenforstående!',
]; ];
} }
public function getColor() { public function getColor() {
return "#35a"; return '#35a';
} }
} }

@ -1,40 +1,47 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Activity; use pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
class HackekveldActivity implements Activity { class HackekveldActivity implements Activity {
public function nextDate(\DateTimeImmutable $date) {
public function nextDate(DateTimeImmutable $date) { if ($date->format('H') > 18 || $date->format('H') == 17 && $date->format('i') > 30) {
if ($date->format('H') > 18 || $date->format('H') == 17 && $date->format('i') > 30) return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(18, 15, 0));
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(18, 15, 0)); }
$date = $date->setTime(16, 15, 0); $date = $date->setTime(16, 15, 0);
if ($date->format('N') != 6) if ($date->format('N') != 6) {
return $this->nextDate($date->add(new DateInterval('P1D'))); return $this->nextDate($date->add(new \DateInterval('P1D')));
if ($date->format('W') % 2) }
return $this->nextDate($date->add(new DateInterval('P7D'))); if ($date->format('W') % 2) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date; return $date;
} }
public function prevDate(DateTimeImmutable $date) { public function prevDate(\DateTimeImmutable $date) {
if ($date->format('H') < 17 || $date->format('H') == 18 && $date->format('i') < 30) if ($date->format('H') < 17 || $date->format('H') == 18 && $date->format('i') < 30) {
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(18, 15, 0)); return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(18, 15, 0));
}
$date = $date->setTime(18, 15, 0); $date = $date->setTime(18, 15, 0);
if ($date->format('N') != 6) if ($date->format('N') != 6) {
return $this->prevDate($date->sub(new DateInterval('P1D'))); return $this->prevDate($date->sub(new \DateInterval('P1D')));
if ($date->format('W') % 2) }
return $this->prevDate($date->sub(new DateInterval('P7D'))); if ($date->format('W') % 2) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date; return $date;
} }
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ { public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new HackekveldEvent($this->nextDate($date)); return new HackekveldEvent($this->nextDate($date));
} }
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ { public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new HackekveldEvent($this->prevDate($date)); return new HackekveldEvent($this->prevDate($date));
} }
} }

@ -1,29 +1,29 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Event; use pvv\side\Event;
use \DateInterval;
class HackekveldEvent extends Event { class HackekveldEvent extends Event {
public function getStop() { public function getStop() {
return $this->getStart()->add(new DateInterval('PT4H1800S')); return $this->getStart()->add(new \DateInterval('PT4H1800S'));
} }
public function getName() /* : string */ { public function getName() { /* : string */
return "Hackekveld"; return 'Hackekveld';
} }
public function getLocation() /* : Location */ { public function getLocation() { /* : Location */
return "Terminalrommet / Discord / IRC"; return 'Terminalrommet / Discord / IRC';
} }
public function getOrganiser() /* : User */ { public function getOrganiser() { /* : User */
return "PVV"; return 'PVV';
} }
public function getURL() /* : string */ { public function getURL() { /* : string */
return '#'; return '#';
} }
@ -34,12 +34,11 @@ class HackekveldEvent extends Event {
public function getDescription() { public function getDescription() {
return [ return [
'Mange PVV-medlemmer liker å programmere.', 'Mange PVV-medlemmer liker å programmere.',
'Hvis du også liker å programmere, så bli med! Her kan du jobbe med dine egne prosjekter eller starte noe med andre nerder her på huset. Vi møtes for en hyggelig prat, mye god programmering og delsponset pizza.' 'Hvis du også liker å programmere, så bli med! Her kan du jobbe med dine egne prosjekter eller starte noe med andre nerder her på huset. Vi møtes for en hyggelig prat, mye god programmering og delsponset pizza.',
]; ];
} }
public function getColor() { public function getColor() {
return "#35a"; return '#35a';
} }
} }

@ -1,40 +1,47 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Activity; use pvv\side\Activity;
use \DateTimeImmutable;
use \DateInterval;
class NerdepitsaActivity implements Activity { class NerdepitsaActivity implements Activity {
public function nextDate(\DateTimeImmutable $date) {
public function nextDate(DateTimeImmutable $date) { if ($date->format('H') > 19) {
if ($date->format('H') > 19) return $this->nextDate($date->add(new \DateInterval('P1D'))->setTime(19, 0, 0));
return $this->nextDate($date->add(new DateInterval('P1D'))->setTime(19, 0, 0)); }
$date = $date->setTime(19, 0, 0); $date = $date->setTime(19, 0, 0);
if ($date->format('N') != 5) if ($date->format('N') != 5) {
return $this->nextDate($date->add(new DateInterval('P1D'))); return $this->nextDate($date->add(new \DateInterval('P1D')));
if ($date->format('W') % 2) }
return $this->nextDate($date->add(new DateInterval('P7D'))); if ($date->format('W') % 2) {
return $this->nextDate($date->add(new \DateInterval('P7D')));
}
return $date; return $date;
} }
public function prevDate(DateTimeImmutable $date) { public function prevDate(\DateTimeImmutable $date) {
if ($date->format('H') < 19) if ($date->format('H') < 19) {
return $this->prevDate($date->sub(new DateInterval('P1D'))->setTime(19, 0, 0)); return $this->prevDate($date->sub(new \DateInterval('P1D'))->setTime(19, 0, 0));
}
$date = $date->setTime(19, 0, 0); $date = $date->setTime(19, 0, 0);
if ($date->format('N') != 5) if ($date->format('N') != 5) {
return $this->prevDate($date->sub(new DateInterval('P1D'))); return $this->prevDate($date->sub(new \DateInterval('P1D')));
if ($date->format('W') % 2) }
return $this->prevDate($date->sub(new DateInterval('P7D'))); if ($date->format('W') % 2) {
return $this->prevDate($date->sub(new \DateInterval('P7D')));
}
return $date; return $date;
} }
public function getNextEventFrom(DateTimeImmutable $date) /* : Event */ { public function getNextEventFrom(\DateTimeImmutable $date) { /* : Event */
return new NerdepitsaEvent($this->nextDate($date)); return new NerdepitsaEvent($this->nextDate($date));
} }
public function getPreviousEventFrom(DateTimeImmutable $date) /* : Event */ { public function getPreviousEventFrom(\DateTimeImmutable $date) { /* : Event */
return new NerdepitsaEvent($this->prevDate($date)); return new NerdepitsaEvent($this->prevDate($date));
} }
} }

@ -1,29 +1,29 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
use \pvv\side\Event; use pvv\side\Event;
use \DateInterval;
class NerdepitsaEvent extends Event { class NerdepitsaEvent extends Event {
public function getStop() { public function getStop() {
return $this->getStart()->add(new DateInterval('PT2H1800S')); return $this->getStart()->add(new \DateInterval('PT2H1800S'));
} }
public function getName() { public function getName() {
return "Nerdepitsa"; return 'Nerdepitsa';
} }
public function getLocation() /* : Location */ { public function getLocation() { /* : Location */
return "Peppes Kjøpmansgata"; return 'Peppes Kjøpmansgata';
} }
public function getOrganiser() /* : User */ { public function getOrganiser() { /* : User */
return "Anders Christensen"; return 'Anders Christensen';
} }
public function getURL() /* : string */ { public function getURL() { /* : string */
return '/nerdepitsa/'; return '/nerdepitsa/';
} }
@ -39,12 +39,11 @@ class NerdepitsaEvent extends Event {
'', '',
'Det er ikke noe krav at du er nerd... noen av oss virker faktisk nesten normale! Det er heller ikke noe krav at du kjenner noen fra før. Det er ikke engang et krav at du må like pizza! (selv om det hjelper) Dersom du har lyst til å treffe personer fra datamiljøet ved NTNU så bare still opp! Vi biter ikke, vel, bortsett fra pizzaen da.', 'Det er ikke noe krav at du er nerd... noen av oss virker faktisk nesten normale! Det er heller ikke noe krav at du kjenner noen fra før. Det er ikke engang et krav at du må like pizza! (selv om det hjelper) Dersom du har lyst til å treffe personer fra datamiljøet ved NTNU så bare still opp! Vi biter ikke, vel, bortsett fra pizzaen da.',
'', '',
'Vi bestiller så mye pizza som vi i fellesskap klarer å stappe i oss, og splitter dermed pizza-regningen broderlig, mens hver enkelt betaler for sin egen drikke, dessert mm. Vell møtt!' 'Vi bestiller så mye pizza som vi i fellesskap klarer å stappe i oss, og splitter dermed pizza-regningen broderlig, mens hver enkelt betaler for sin egen drikke, dessert mm. Vell møtt!',
]; ];
} }
public function getColor() { public function getColor() {
return "#c35"; return '#c35';
} }
} }

@ -1,9 +1,12 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
ini_set('date.timezone', 'Europe/Oslo'); ini_set('date.timezone', 'Europe/Oslo');
require implode(DIRECTORY_SEPARATOR, [dirname(dirname(dirname(__DIR__))), '', '_autoload.php']); require implode(\DIRECTORY_SEPARATOR, [\dirname(__DIR__, 3), '', '_autoload.php']);
$c = new AnimekveldActivity; $c = new AnimekveldActivity();
die($c->nextDate(new \DateTimeImmutable)->format(DATE_RFC2822)); exit($c->nextDate(new \DateTimeImmutable())->format(\DATE_RFC2822));

@ -1,9 +1,12 @@
<?php //declare(strict_types=1); <?php
declare(strict_types=1);
namespace pvv\side\social; namespace pvv\side\social;
ini_set('date.timezone', 'Europe/Oslo'); ini_set('date.timezone', 'Europe/Oslo');
require implode(DIRECTORY_SEPARATOR, [dirname(dirname(dirname(__DIR__))), '', '_autoload.php']); require implode(\DIRECTORY_SEPARATOR, [\dirname(__DIR__, 3), '', '_autoload.php']);
$c = new NerdepitsaActivity; $c = new NerdepitsaActivity();
die($c->prevDate(new \DateTimeImmutable)->format(DATE_RFC2822)); exit($c->prevDate(new \DateTimeImmutable())->format(\DATE_RFC2822));