Compare commits

...

45 Commits

Author SHA1 Message Date
067715f857 Merge branch 'danielbrendel:main' into main 2024-04-09 04:56:04 -07:00
0cb555d5f5 Same here 2024-04-05 22:50:53 +02:00
003513e728 More line spacing 2024-04-05 22:39:30 +02:00
792331d5f4 Add to env 2024-04-05 22:38:32 +02:00
89928a88c3 Cache config server 2024-04-05 22:35:53 +02:00
fc0d1591ac Cache config for group 2024-04-05 22:35:23 +02:00
33f4b1175c Cache config for workshop 2024-04-05 22:34:53 +02:00
b58fa084b9 Cache config for steam user 2024-04-05 22:34:25 +02:00
f13e7fff35 Cache config 2024-04-05 22:33:43 +02:00
3ffc0d46f1 Exception message 2024-04-05 22:30:02 +02:00
183bc25253 Add phpdoc annotations 2024-04-05 22:29:03 +02:00
29ae462e11 DB Caching for SteamServer 2024-04-05 22:26:37 +02:00
63af530e3c DB Caching for SteamWorkshop 2024-04-05 22:23:02 +02:00
99d6e8b2d0 DB Caching for SteamUser 2024-04-05 22:20:15 +02:00
7ef44f9d3e DB Caching for SteamGroup 2024-04-05 22:16:59 +02:00
fd904f4c31 DB Caching for SteamApp 2024-04-05 22:12:50 +02:00
98e3e3fc64 Db Cache components 2024-04-05 22:02:12 +02:00
f4a6c09fc9 Add keywords 2024-04-05 15:05:52 +02:00
919832d5f3 Update npm dependencies 2024-04-05 15:03:54 +02:00
9e182fccd3 Update composer dependencies 2024-04-05 15:02:53 +02:00
3a0a025166 Center header content 2024-04-05 15:02:02 +02:00
7f44d5161b Merge branch 'main' of https://github.com/SophiaAtkinson/steamwidgets-web 2024-04-04 16:07:49 -07:00
d9d9029238 use Redis in modules is not needed 2024-04-04 16:06:40 -07:00
6b473bf12e added predis/predis to composer.json 2024-04-04 16:06:18 -07:00
28900e2788 Merge branch 'main' into main 2024-04-03 16:32:03 -07:00
ae7a4f2a36 fix for PR 2024-04-03 16:27:46 -07:00
8c184046b4 Donation dependent style 2024-04-03 15:30:32 +02:00
3ce1b5c1c0 Add to env 2024-04-03 15:25:51 +02:00
a7c3a4cd0f Resolves #22 2024-04-03 15:25:02 +02:00
7bd96a7c4d Resolves #21 2024-04-03 15:09:03 +02:00
0cd71b7ee1 #21 Upgrade env 2024-04-03 15:05:02 +02:00
6c3f82b2ab Resolves #9 2024-04-03 15:02:05 +02:00
cb5fc6c826 Resolves #23 2024-04-03 14:35:50 +02:00
d85bb1073b Resolves #10 2024-04-03 10:52:02 +02:00
07d4ad4425 #19 Table border color 2024-04-03 02:25:41 +02:00
3b2f71ae26 #19 hr color 2024-04-03 02:22:50 +02:00
329e430cc1 #10 Upgrade package-lock.json version 2024-04-03 02:20:30 +02:00
f9e2639be7 #14 Order 2024-04-03 02:12:50 +02:00
56eec4c113 #14 Check before rendering 2024-04-03 02:12:03 +02:00
bcc773aa67 #14 Proper wording 2024-04-03 02:09:03 +02:00
af851fab96 Same here 2024-04-03 02:05:05 +02:00
00cc24e0a6 Year 2024-04-03 02:04:50 +02:00
f178a68304 Resolves #17 2024-04-03 02:04:25 +02:00
d8c6d7adab Add comment 2024-04-03 02:03:14 +02:00
2716862285 Resolves #18 2024-04-03 02:02:50 +02:00
23 changed files with 912 additions and 240 deletions

View File

@ -14,10 +14,10 @@ APP_AUTHOR="Daniel Brendel"
APP_CONTACT="dbrendel1988@gmail.com" APP_CONTACT="dbrendel1988@gmail.com"
APP_TITLE="${APP_NAME} - Integrate Steam Widgets into your website" APP_TITLE="${APP_NAME} - Integrate Steam Widgets into your website"
APP_DESCRIPTION="Integrate Steam Widgets of your game/app into your website" APP_DESCRIPTION="Integrate Steam Widgets of your game/app into your website"
APP_KEYWORDS="steam, widgets, steam widgets, steam game widget, steam app widget, steam server widget, steam player widget" APP_KEYWORDS="steam, widgets, steam widgets, steam game widget, steam app widget, steam server widget, steam player widget, steam group widget, steam workshop widget"
APP_DEBUG=true APP_DEBUG=true
APP_BASEDIR="" APP_BASEDIR=""
APP_SESSION=true APP_TIMEZONE=null
APP_LINK_GITHUB="https://github.com/danielbrendel" APP_LINK_GITHUB="https://github.com/danielbrendel"
APP_LINK_STEAM="https://store.steampowered.com/developer/danielbrendel/" APP_LINK_STEAM="https://store.steampowered.com/developer/danielbrendel/"
APP_REPOSITORY="danielbrendel/steamwidgets-web" APP_REPOSITORY="danielbrendel/steamwidgets-web"
@ -31,9 +31,15 @@ APP_EXAMPLE_WORKSHOP=""
APP_EXAMPLE_GROUP="" APP_EXAMPLE_GROUP=""
APP_FOOTER_NOTICE="${APP_NAME} is not affiliated with Valve or Steam" APP_FOOTER_NOTICE="${APP_NAME} is not affiliated with Valve or Steam"
APP_STATSPASSWORD="test" APP_STATSPASSWORD="test"
APP_ENABLEDONATION=true
STEAM_API_KEY="" STEAM_API_KEY=""
# Session
SESSION_ENABLE=true
SESSION_DURATION=0
SESSION_NAME=null
# Redis settings # Redis settings
REDIS_HOST=localhost REDIS_HOST=localhost
REDIS_PORT=6379 REDIS_PORT=6379
@ -49,6 +55,11 @@ DB_PASSWORD=""
DB_PORT=3306 DB_PORT=3306
DB_DATABASE=asatru DB_DATABASE=asatru
DB_DRIVER=mysql DB_DRIVER=mysql
DB_CHARSET="utf8"
# Caching
CACHE_DRIVER=null
CACHE_DURATION=512
# SMTP settings # SMTP settings
SMTP_FROMNAME="Test" SMTP_FROMNAME="Test"
@ -58,3 +69,6 @@ SMTP_PORT=587
SMTP_USERNAME="" SMTP_USERNAME=""
SMTP_PASSWORD="" SMTP_PASSWORD=""
SMTP_ENCRYPTION=tls SMTP_ENCRYPTION=tls
# Logging
LOG_ENABLE=true

6
app/config/cache.php Normal file
View File

@ -0,0 +1,6 @@
<?php
return [
'driver' => env('CACHE_DRIVER', null),
'duration' => env('CACHE_DURATION', 123)
];

View File

@ -26,7 +26,7 @@ class ApiController extends BaseController {
$appid = $request->params()->query('appid', null); $appid = $request->params()->query('appid', null);
$language = $request->params()->query('lang', 'english'); $language = $request->params()->query('lang', 'english');
$data = SteamApp::querySteamData($appid, $language); $data = SteamCache::cachedSteamApp($appid, $language);
HitsModel::addHit(HitsModel::HITTYPE_MODULE_APP); HitsModel::addHit(HitsModel::HITTYPE_MODULE_APP);
@ -47,7 +47,7 @@ class ApiController extends BaseController {
try { try {
$addr = $request->params()->query('addr', null); $addr = $request->params()->query('addr', null);
$data = SteamServer::querySteamData(env('STEAM_API_KEY'), $addr); $data = SteamCache::cachedSteamServer(env('STEAM_API_KEY'), $addr);
HitsModel::addHit(HitsModel::HITTYPE_MODULE_SERVER); HitsModel::addHit(HitsModel::HITTYPE_MODULE_SERVER);
@ -68,7 +68,7 @@ class ApiController extends BaseController {
try { try {
$steamid = $request->params()->query('steamid', null); $steamid = $request->params()->query('steamid', null);
$data = SteamUser::querySteamData(env('STEAM_API_KEY'), $steamid); $data = SteamCache::cachedSteamUser(env('STEAM_API_KEY'), $steamid);
HitsModel::addHit(HitsModel::HITTYPE_MODULE_USER); HitsModel::addHit(HitsModel::HITTYPE_MODULE_USER);
@ -89,7 +89,7 @@ class ApiController extends BaseController {
try { try {
$itemid = $request->params()->query('itemid', null); $itemid = $request->params()->query('itemid', null);
$data = SteamWorkshop::querySteamData($itemid); $data = SteamCache::cachedSteamWorkshop($itemid);
HitsModel::addHit(HitsModel::HITTYPE_MODULE_WORKSHOP); HitsModel::addHit(HitsModel::HITTYPE_MODULE_WORKSHOP);
@ -110,7 +110,7 @@ class ApiController extends BaseController {
try { try {
$group = $request->params()->query('group', null); $group = $request->params()->query('group', null);
$data = SteamGroup::querySteamData($group); $data = SteamCache::cachedSteamGroup($group);
HitsModel::addHit(HitsModel::HITTYPE_MODULE_GROUP); HitsModel::addHit(HitsModel::HITTYPE_MODULE_GROUP);

View File

@ -0,0 +1,49 @@
<?php
/*
Asatru PHP - Migration vor Caching
*/
class CacheModel_Migration {
private $database = null;
private $connection = null;
/**
* Construct class and store PDO connection handle
*
* @param \PDO $pdo
* @return void
*/
public function __construct($pdo)
{
$this->connection = $pdo;
}
/**
* Called when the table shall be created or modified
*
* @return void
*/
public function up()
{
$this->database = new Asatru\Database\Migration('CacheModel', $this->connection);
$this->database->drop();
$this->database->add('id INT NOT NULL AUTO_INCREMENT PRIMARY KEY');
$this->database->add('ident VARCHAR(260) NOT NULL');
$this->database->add('value BLOB NULL');
$this->database->add('updated_at TIMESTAMP');
$this->database->add('created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP');
$this->database->create();
}
/**
* Called when the table shall be dropped
*
* @return void
*/
public function down()
{
$this->database = new Asatru\Database\Migration('Cache', $this->connection);
$this->database->drop();
}
}

View File

@ -1 +1,4 @@
47f3d3306fbd25715600db55b33b1542293ab5eb593205d6f5884bcaafa5d9a4627c76af04b684962c99a9518ef6b3d10e983203f6b5a8576912445d8f285fb7 47f3d3306fbd25715600db55b33b1542293ab5eb593205d6f5884bcaafa5d9a4627c76af04b684962c99a9518ef6b3d10e983203f6b5a8576912445d8f285fb7
cd19e5ec4a12d40d8d3ecdf267ef890e80fdd94ab28f81fddeb0c12b6f6b88773157e469c2d693abd4583e18b9b5a126c3fcecd6c07f4374c6c6e2837166b2ec

206
app/models/CacheModel.php Normal file
View File

@ -0,0 +1,206 @@
<?php
/*
Asatru PHP - Model for Caching
*/
class CacheModel extends \Asatru\Database\Model {
/**
* Obtain value either from cache or from closure
*
* @param string $ident The cache item identifier
* @param int $timeInSeconds Amount of seconds the item shall be cached
* @param $closure Function to be called for the actual value
* @return mixed
*/
public static function remember($ident, $timeInSeconds, $closure)
{
$item = CacheModel::find($ident, 'ident');
if ($item->count() == 0) {
$value = $closure();
$data = array(
'ident' => $ident,
'value' => $value,
'updated_at' => date('Y-m-d H:i:s')
);
foreach ($data as $key => $val) {
CacheModel::insert($key, $val);
}
CacheModel::go();
return $value;
} else {
$data = $item->get(0);
$dtLast = new DateTime(date('Y-m-d H:i:s', strtotime($data->get('updated_at'))));
$dtLast->add(new DateInterval('PT' . $timeInSeconds . 'S'));
$dtNow = new DateTime('now');
if ($dtNow < $dtLast) {
return $data->get('value');
} else {
$value = $closure();
$updData = array(
'value' => $value,
'updated_at' => date('Y-m-d H:i:s')
);
foreach ($updData as $key => $val) {
CacheModel::update($key, $val);
}
CacheModel::where('id', '=', $data->get('id'));
CacheModel::go();
return $value;
}
}
return null;
}
/**
* Query an entire item
*
* @param $ident
* @param $default
* @return mixed
*/
public static function query($ident, $default = null)
{
$what = null;
if (strpos($ident, '.') !== false) {
$what = explode('.', $ident);
}
$result = CacheModel::where('ident', '=', (((is_array($what)) && (count($what) > 0)) ? $what[0] : $ident))->first();
if (!$result) {
return $default;
}
if ((is_array($what)) && (count($what) > 1)) {
return $result->get($what[1]);
}
return $result->get('value');
}
/**
* Check for item existence
*
* @param $ident
* @return bool
*/
public static function has($ident)
{
$item = CacheModel::find($ident, 'ident');
if ($item->count() > 0) {
return true;
}
return false;
}
/**
* Check if item cache time is elapsed
*
* @param $ident
* @param $timeInSeconds
* @return bool
*/
public static function elapsed($ident, $timeInSeconds)
{
if (!CacheModel::has($ident)) {
return false;
}
$data = CacheModel::where('ident', '=', $ident)->first();
$dtLast = new DateTime(date('Y-m-d H:i:s', strtotime($data->get('updated_at'))));
$dtLast->add(new DateInterval('PT' . $timeInSeconds . 'S'));
$dtNow = new DateTime('now');
return ($dtNow >= $dtLast);
}
/**
* Get item and then delete it
*
* @param $ident
* @return mixed
*/
public static function pull($ident)
{
$item = CacheModel::find($ident, 'ident');
if ($item->count() > 0) {
$data = $item->get(0);
CacheModel::where('id', '=', $item->get(0)->get('id'))->delete();
return $data->get('value');
}
return null;
}
/**
* Write item to table
*
* @param $ident
* @param $value
* @return bool
*/
public static function put($ident, $value)
{
if (CacheModel::has($ident)) {
return false;
}
$data = array(
'ident' => $ident,
'value' => $value,
'updated_at' => date('Y-m-d H:i:s')
);
foreach ($data as $key => $val) {
CacheModel::insert($key, $val);
}
CacheModel::go();
return true;
}
/**
* Forget cache item
*
* @param string $ident The item identifier
* @return bool
*/
public static function forget($ident)
{
$item = CacheModel::find($ident, 'ident');
if ($item->count() > 0) {
CacheModel::where('id', '=', $item->get(0)->get('id'))->delete();
return true;
}
return false;
}
/**
* Return the associated table name of the migration
*
* @return string
*/
public static function tableName()
{
return 'CacheModel';
}
}

View File

@ -1,5 +1,4 @@
<?php <?php
/** /**
* Class SteamApp * Class SteamApp
* *

106
app/modules/SteamCache.php Normal file
View File

@ -0,0 +1,106 @@
<?php
/**
* Class SteamCache
*
* Cached gateway to Steam Web API queries
*/
class SteamCache {
/**
* @param $appid
* @param $lang
* @return mixed
*/
public static function cachedSteamApp($appid, $lang)
{
$cache = config('cache');
if ($cache->driver === 'db') {
return json_decode(CacheModel::remember('steam_app_' . $appid . '_' . $lang, $cache->duration, function() use ($appid, $lang) {
return json_encode(SteamApp::querySteamData($appid, $lang));
}));
} else if ($cache->driver === 'redis') {
throw new \Exception('Not implemented yet.');
} else {
return SteamApp::querySteamData($appid, $lang);
}
}
/**
* @param $key
* @param $steamid
* @return mixed
*/
public static function cachedSteamUser($key, $steamid)
{
$cache = config('cache');
if ($cache->driver === 'db') {
return json_decode(CacheModel::remember('steam_user_' . $steamid, $cache->duration, function() use ($key, $steamid) {
return json_encode(SteamUser::querySteamData($key, $steamid));
}));
} else if ($cache->driver === 'redis') {
throw new \Exception('Not implemented yet.');
} else {
return SteamUser::querySteamData($key, $steamid);
}
}
/**
* @param $itemid
* @return mixed
*/
public static function cachedSteamWorkshop($itemid)
{
$cache = config('cache');
if ($cache->driver === 'db') {
return json_decode(CacheModel::remember('steam_workshop_' . $itemid, $cache->duration, function() use ($itemid) {
return json_encode(SteamWorkshop::querySteamData($itemid));
}));
} else if ($cache->driver === 'redis') {
throw new \Exception('Not implemented yet.');
} else {
return SteamWorkshop::querySteamData($itemid);
}
}
/**
* @param $group
* @return mixed
*/
public static function cachedSteamGroup($group)
{
$cache = config('cache');
if ($cache->driver === 'db') {
return json_decode(CacheModel::remember('steam_group_' . $group, $cache->duration, function() use ($group) {
return json_encode(SteamGroup::querySteamData($group));
}));
} else if ($cache->driver === 'redis') {
throw new \Exception('Not implemented yet.');
} else {
return SteamGroup::querySteamData($group);
}
}
/**
* @param $key
* @param $addr
* @return mixed
*/
public static function cachedSteamServer($key, $addr)
{
$cache = config('cache');
if ($cache->driver === 'db') {
return json_decode(CacheModel::remember('steam_server_' . $addr, $cache->duration, function() use ($key, $addr) {
return json_encode(SteamServer::querySteamData($key, $addr));
}));
} else if ($cache->driver === 'redis') {
throw new \Exception('Not implemented yet.');
} else {
return SteamServer::querySteamData($key, $addr);
}
}
}

View File

@ -1,5 +1,4 @@
<?php <?php
/** /**
* Class SteamGroup * Class SteamGroup
* *

View File

@ -1,7 +1,4 @@
<?php <?php
use Redis;
/** /**
* Class SteamServer * Class SteamServer
* *

View File

@ -1,7 +1,4 @@
<?php <?php
use Redis;
/** /**
* Class SteamUser * Class SteamUser
* *

View File

@ -1,7 +1,4 @@
<?php <?php
use Redis;
/** /**
* Class SteamWorkshop * Class SteamWorkshop
* *

View File

@ -97,6 +97,12 @@ a.navbar-burger:hover {
height: 100%; height: 100%;
} }
.header-centered {
@media screen and (min-width: 1089px) {
transform: translateX(9.5%);
}
}
.header-content { .header-content {
position: relative; position: relative;
top: 50%; top: 50%;
@ -279,6 +285,11 @@ tbody strong {
text-decoration: underline; text-decoration: underline;
} }
.sponsoring {
position: relative;
margin-top: 35px;
}
.stats-input { .stats-input {
padding: 8px; padding: 8px;
color: rgb(50, 50, 50); color: rgb(50, 50, 50);
@ -450,6 +461,14 @@ tbody strong {
padding-top: 45px; padding-top: 45px;
} }
.background-get-started {
background-color: rgb(35, 55, 79);
@media screen and (min-width: 768px) {
border-radius: 10px;
}
margin-bottom: 30px;
}
.button-get-started { .button-get-started {
margin-top: 50px; margin-top: 50px;
margin-bottom: 50px; margin-bottom: 50px;

View File

@ -653,7 +653,7 @@ document.addEventListener('DOMContentLoaded', function() {
</pre> </pre>
<br/><br/> <br/><br/>
This renders the following widget:<br/> This renders the following widget:<br/><br/>
<steam-workshop itemid="{{ env('APP_EXAMPLE_WORKSHOP') }}"></steam-workshop> <steam-workshop itemid="{{ env('APP_EXAMPLE_WORKSHOP') }}"></steam-workshop>
</p> </p>
@ -842,7 +842,7 @@ document.addEventListener('DOMContentLoaded', function() {
</pre> </pre>
<br/><br/> <br/><br/>
This renders the following widget:<br/> This renders the following widget:<br/><br/>
<steam-group group="{{ env('APP_EXAMPLE_GROUP') }}"></steam-group> <steam-group group="{{ env('APP_EXAMPLE_GROUP') }}"></steam-group>
</p> </p>

View File

@ -2,6 +2,7 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Asatru PHP - Exception</title> <title>Asatru PHP - Exception</title>
@ -25,6 +26,12 @@
height: 100%; height: 100%;
} }
@media screen and (max-width: 1087px) {
.ex_image {
display: none;
}
}
.ex_box { .ex_box {
position: absolute; position: absolute;
display: inline-block; display: inline-block;
@ -33,6 +40,12 @@
overflow-y: auto; overflow-y: auto;
} }
@media screen and (max-width: 1087px) {
.ex_box {
width: 100%;
}
}
.ex_header_num { .ex_header_num {
position: relative; position: relative;
margin-top: 5px; margin-top: 5px;
@ -76,24 +89,25 @@
position: relative; position: relative;
margin-left: 10px; margin-left: 10px;
margin-right: 10px; margin-right: 10px;
margin-top: 20px; margin-top: 30px;
padding-top: 10px;
padding-bottom: 10px;
padding-left: 50px;
padding-right: 50px;
width: 51px;
border: 1px solid rgb(51, 63, 104);
border-radius: 5px;
background-color: rgb(45, 95, 245);
} }
.ex_refresh a { .ex_refresh a {
width: 51px;
padding-top: 10px;
padding-bottom: 10px;
padding-left: 50px;
padding-right: 50px;
color: rgb(235, 235, 235); color: rgb(235, 235, 235);
background-color: rgb(45, 95, 245);
border: 1px solid rgb(51, 63, 104);
border-radius: 5px;
text-decoration: none; text-decoration: none;
} }
.ex_refresh a:hover { .ex_refresh a:hover {
color: rgb(255, 255, 255); color: rgb(255, 255, 255);
background-color: rgb(67, 111, 245);
text-decoration: none; text-decoration: none;
} }
@ -167,8 +181,8 @@
<?php foreach ($stacktrace as $item) { ?> <?php foreach ($stacktrace as $item) { ?>
<div class="ex_trace_content_col_<?= (($tableswitch) ? '1' : '2') ?>"> <div class="ex_trace_content_col_<?= (($tableswitch) ? '1' : '2') ?>">
#<?= $stackcounter ?> <?= ((isset($item['file'])) ? $item['file'] : 'internal function') ?><?= (isset($item['line']) ? '(' . $item['line'] . ')' : '') ?>: <?= $item['function'] ?> #<?= $stackcounter ?> <?= ((isset($item['file'])) ? $item['file'] : 'internal function') ?><?= (isset($item['line']) ? '(' . $item['line'] . ')' : '') ?>: <?= isset($item['class']) ? $item['class'] . '::' : '' ?><?= $item['function'] ?>
<?php if (count($item['args']) > 0) { ?> <?php if ((isset($item['args'])) && (count($item['args']) > 0)) { ?>
( (
<?php $argcnt = 0; ?> <?php $argcnt = 0; ?>
<?php foreach ($item['args'] as $key => $arg) { ?> <?php foreach ($item['args'] as $key => $arg) { ?>

View File

@ -2,6 +2,7 @@
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Asatru PHP - Error 500</title> <title>Asatru PHP - Error 500</title>

View File

@ -2,7 +2,7 @@
<div class="header"> <div class="header">
<div class="header-overlay"> <div class="header-overlay">
<div class="container"> <div class="container">
<div class="columns"> <div class="columns header-centered">
<div class="column is-half"> <div class="column is-half">
<div class="header-content"> <div class="header-content">
<h1 class="header-gradient">{{ env('APP_NAME') }}</h1> <h1 class="header-gradient">{{ env('APP_NAME') }}</h1>

View File

@ -140,10 +140,28 @@ let widget = new SteamApp('#app-widget', {
</div> </div>
@endif @endif
<div><hr/></div> @if (!env('APP_ENABLEDONATION'))
<div><hr/></div>
@endif
<div class="content-section is-centered"> <div class="content-section is-centered {{ (env('APP_ENABLEDONATION')) ? 'background-get-started' : '' }}">
<div class="is-sidepadding button-get-started fade fade-out"> <div class="is-sidepadding button-get-started fade fade-out">
<a href="{{ url('/documentation') }}">Get Started!</a> <a href="{{ url('/documentation') }}">Get Started!</a>
</div> </div>
</div> </div>
@if (env('APP_ENABLEDONATION'))
<div class="content-section is-centered">
<div class="is-sidepadding fade fade-out">
<h3>Your support is greatly appreciated</h3>
<p>
Your support helps to continue working on the project and providing the required infrastructure.
</p>
<p class="sponsoring">
<a href='https://ko-fi.com/C0C7V2ESD' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi2.png?v=3' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
</p>
</div>
</div>
@endif

View File

@ -21,7 +21,8 @@
"php": "^8.0", "php": "^8.0",
"danielbrendel/asatru-php-framework": "dev-main", "danielbrendel/asatru-php-framework": "dev-main",
"phpmailer/phpmailer": "^6.1", "phpmailer/phpmailer": "^6.1",
"nesbot/carbon": "^2.0" "nesbot/carbon": "^2.0",
"predis/predis": "^2.2"
}, },
"scripts": { "scripts": {
"post-root-package-install": [ "post-root-package-install": [

602
composer.lock generated

File diff suppressed because it is too large Load Diff

Binary file not shown.

48
package-lock.json generated
View File

@ -112,9 +112,9 @@
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.12.3", "version": "20.12.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.3.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz",
"integrity": "sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==", "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
} }
@ -435,9 +435,9 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001605", "version": "1.0.30001606",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz",
"integrity": "sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==", "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -589,9 +589,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.4.724", "version": "1.4.728",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.724.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.728.tgz",
"integrity": "sha512-RTRvkmRkGhNBPPpdrgtDKvmOEYTrPlXDfc0J/Nfq5s29tEahAwhiX4mmhNzj6febWMleulxVYPh7QwCSL/EldA==" "integrity": "sha512-Ud1v7hJJYIqehlUJGqR6PF1Ek8l80zWwxA6nGxigBsGJ9f9M2fciHyrIiNMerSHSH3p+0/Ia7jIlnDkt41h5cw=="
}, },
"node_modules/emojis-list": { "node_modules/emojis-list": {
"version": "3.0.0", "version": "3.0.0",
@ -1246,9 +1246,9 @@
} }
}, },
"node_modules/postcss-modules-extract-imports": { "node_modules/postcss-modules-extract-imports": {
"version": "3.0.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
"integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^10 || ^12 || >= 14" "node": "^10 || ^12 || >= 14"
@ -1258,9 +1258,9 @@
} }
}, },
"node_modules/postcss-modules-local-by-default": { "node_modules/postcss-modules-local-by-default": {
"version": "4.0.4", "version": "4.0.5",
"resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz",
"integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"icss-utils": "^5.0.0", "icss-utils": "^5.0.0",
@ -1275,9 +1275,9 @@
} }
}, },
"node_modules/postcss-modules-scope": { "node_modules/postcss-modules-scope": {
"version": "3.1.1", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz",
"integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"postcss-selector-parser": "^6.0.4" "postcss-selector-parser": "^6.0.4"
@ -1426,9 +1426,9 @@
] ]
}, },
"node_modules/sass": { "node_modules/sass": {
"version": "1.72.0", "version": "1.74.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", "resolved": "https://registry.npmjs.org/sass/-/sass-1.74.1.tgz",
"integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", "integrity": "sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"chokidar": ">=3.0.0 <4.0.0", "chokidar": ">=3.0.0 <4.0.0",
@ -1649,9 +1649,9 @@
} }
}, },
"node_modules/terser": { "node_modules/terser": {
"version": "5.30.2", "version": "5.30.3",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.30.2.tgz", "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz",
"integrity": "sha512-vTDjRKYKip4dOFL5VizdoxHTYDfEXPdz5t+FbxCC5Rp2s+KbEO8w5wqMDPgj7CtFKZuzq7PXv28fZoXfqqBVuw==", "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==",
"dependencies": { "dependencies": {
"@jridgewell/source-map": "^0.3.3", "@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2", "acorn": "^8.8.2",

2
public/js/app.js vendored

File diff suppressed because one or more lines are too long