master
Seph 2024-08-07 22:34:54 +02:00
parent 7d0771be23
commit 2a7f744634
16 changed files with 451 additions and 40 deletions

View File

@ -4,7 +4,7 @@ Theme URI: https://nebelkrieger.de
Author: Yorndar
Author URI: https://nebelkrieger.de
Description: The next gen NK-Theme
Version: 0.4.0
Version: 0.4.2
Tested up to: 6.2
Requires PHP: 8.0
License: GNU General Public License v2 or later

View File

@ -2,6 +2,8 @@
use WoWPress\Database\CreateCacheTable;
use WoWPress\Database\CreateCharacterTable;
use WoWPress\Database\CreateCharListItemTable;
use WoWPress\Database\CreateCharListsTable;
use WoWPress\Database\CreateComplaintTable;
use WoWPress\Database\CreateLogTable;
use WoWPress\Database\CreateNotificationTable;
@ -163,6 +165,8 @@ if (!function_exists('wowpress_database')) :
CreateLogTable::sql(),
CreateComplaintTable::sql(),
CreateNotificationTable::sql(),
CreateCharListsTable::sql(),
CreateCharListItemTable::sql(),
]);
}

View File

@ -84,6 +84,10 @@ function isAllowed($capability)
endif;
}
function checkNonce($nonce){
return isset($_POST[$nonce.'_nonce']) && wp_verify_nonce($_POST[$nonce.'_nonce'], $nonce);
}
function setGlobalUser(){
global $user;

View File

@ -1,5 +1,7 @@
<?php
use WoWPress\Models\Character;
use WoWPress\Models\CharacterList;
use WoWPress\Models\Log;
use WoWPress\Models\Raid;
use WoWPress\Models\SKS;
@ -18,6 +20,8 @@ add_filter('generate_rewrite_rules', function ($wp_rewrite) {
['db/?$' => 'index.php?wowpress_page=db'],
['kummerkasten/?$' => 'index.php?wowpress_page=complaints'],
['kummerkasten/(\d+)/?$' => 'index.php?wowpress_page=complaints&complaint_id=$matches[1]'],
['lists/?$' => 'index.php?wowpress_page=lists'],
['list/(\d+)/?$' => 'index.php?wowpress_page=lists&list_id=$matches[1]'],
$wp_rewrite->rules
);
@ -29,6 +33,7 @@ add_filter('query_vars', function ($query_vars) {
$query_vars[] = 'month';
$query_vars[] = 'raid_id';
$query_vars[] = 'list_name';
$query_vars[] = 'list_id';
$query_vars[] = 'complaint_id';
@ -48,6 +53,18 @@ add_action('template_redirect', function () {
header('Location: /');
die;
break;
case 'lists':
$list = get_query_var('list_id');
$list = CharacterList::find($list);
if ($list) {
$GLOBALS['wowpress']['page_title'] = $list->list_name;
include plugin_dir_path(__FILE__) . '../pages/single_charlist.php';
} else {
$GLOBALS['wowpress']['page_title'] = "Charakterlisten";
include plugin_dir_path(__FILE__) . '../pages/charlists.php';
}
die;
break;
case 'complaints':
isAllowed('wowpress_view_complaints');
$GLOBALS['wowpress']['page_title'] = "Kummerkasten";
@ -68,20 +85,43 @@ add_action('template_redirect', function () {
die;
break;
case 'logs':
# $cl = new CharacterList();
# $cl->list_name = "Strike-Liste TWW Season 1";
# $cl->border_color = "red";
# $cl->max_count = 6;
# $cl->notify = true;
# $cl->save();
$cl = CharacterList::find(14);
$char = Character::first();
#$char = Character::find(8);
$cl->addItem($char,'Richtig Dumm','2024-09-26');
dd($cl->characters);
exit;
isAllowed('wowpress_edit_raids');
$GLOBALS['wowpress']['page_title'] = "Logs";
echo "<div style='display:flex;flex-direction:column;gap:2em;'>";
echo '<hr style="width:100%">';
foreach(Log::all() as $log){
?>
foreach (Log::all() as $log) {
?>
<div style="display:flex;flex-direction:column;gap:1em;">
<div>Message: <?=$log->message?></div>
<div>Action: <?=$log->action?></div>
<div>Logged: <?=format_date($log->created_at,"dd.MM.YY HH:mm")?></div>
<div>Message: <?= $log->message ?></div>
<div>Action: <?= $log->action ?></div>
<div>Logged: <?= format_date($log->created_at, "dd.MM.YY HH:mm") ?></div>
</div>
<hr style="width:100%">
<?php
<?php
}
echo "<div>";
die;

View File

@ -0,0 +1,57 @@
<?php
use WoWPress\Api\BattleNet;
use WoWPress\Database\Cache;
use WoWPress\Frontend\Icon;
use WoWPress\Models\Character;
use WoWPress\Models\CharacterList;
global $widget_area;
set_sidebar_status('top', false);
$characters = Character::orderBy('rank')->get();
get_header();
?>
<div class="top-title flex flex-row gap-2" style="margin-top:calc(-1 * var(--wowp-gap))">
<div class="text-3xl font-bold bg-glass shadow p-3 text-center w-full">
<?= $GLOBALS['wowpress']['page_title'] ?>
</div>
</div>
<section id="primary" x-data="{char:null}">
<main id="main" class="flex flex-row gap-2 flex-wrap">
<?php foreach (CharacterList::all() as $list) : ?>
<a class="bg-glass shadow p-auto text-center" href="/list/<?=$list->ID?>">
<div class="text-2xl"><?= $list->list_name ?></div>
<div class="text-small text-slate-700">(<?= $list->characters()->groupBy('ID')->get()->count() ?> Charaktere)</div>
</a>
<?php endforeach; ?>
</main><!-- #main -->
<?php
if (current_user_can('wowpress_edit_raids')) : ?>
<template x-teleport="#sidebar_right">
<div class="bg-glass shadow p-auto order-1">
<h4 class="text-xl font-bold text-center mb-2">Liste hinzufügen</h4>
<form action="/request" method="POST">
<div class="flex flex-col gap-2">
<?php wp_nonce_field('addList', 'addList_nonce'); ?>
<input type="hidden" name="action" value="addList">
<input type="text" class="bg-white bg-opacity-0 border-alliance" placeholder="Listenname" name="list_name">
<input type="text" class="bg-white bg-opacity-0 border-alliance" placeholder="CSS-Farbe der Einträge" name="border_color">
<label for="notify" class="flex flex-row gap-1 items-center justify-between">Spieler bei Eintrag benachrichtigen? <input class="accent-orange-500" type="checkbox" name="notify" id="notify"></label>
<button type="submit" class="btn btn-outline btn-orange"><?= Icon::get('o-plus') ?> Hinzufügen</a>
</div>
</form>
</div>
</template>
<?php
endif;
?>
</section><!-- #primary -->
<?php
get_footer();

View File

@ -65,7 +65,7 @@ get_header();
foreach ($has_raid as $raid) {
?>
<a href="<?= $raid->link ?>" class="group" style="grid-area: 2 / 1 / 3 / 3;">
<div class="group-hover:text-<?= $raid->color ?> bg-<?= $raid->color ?>-200"><?= $raid->title ?></div>
<div class="group-hover:text-<?= $raid->color ?> bg-<?= $raid->color ?> bg-opacity-50"><?= $raid->title ?></div>
<?php if ($raid->difficulty) : ?><div class="text-sm text-slate-500">(<?= $raid->difficulty ?>)</div><?php endif; ?>
</a>
<?php

View File

@ -0,0 +1,118 @@
<?php
use WoWPress\Api\BattleNet;
use WoWPress\Database\Cache;
use WoWPress\Frontend\Icon;
use WoWPress\Models\Character;
use WoWPress\Models\CharacterList;
global $widget_area;
set_sidebar_status('top', false);
$characters = Character::orderBy('rank')->get();
get_header();
?>
<div class="top-title flex flex-row gap-2" style="margin-top:calc(-1 * var(--wowp-gap))">
<div class="text-3xl font-bold bg-glass shadow p-3 text-center w-full">
<?= $GLOBALS['wowpress']['page_title'] ?>
</div>
</div>
<section id="primary" x-data="{char:null}">
<main id="main">
<div class="flex flex-col gap-10">
<?php foreach ($list->characters()->get()->groupBy('ID') as $character) : ?>
<div class="flex flex-row gap-2 flex-wrap">
<div class="bg-glass shadow p-auto text-center xl:w-1/4">
<div class="text-2xl"><?php $character->first()->classButton ?></div>
</div>
<div class="bg-glass shadow p-auto flex-grow xl:flex-grow-0 text-2xl flex flex-col items-center justify-center">
<?= $character->count() ?>x
</div>
<div class="hidden flex-grow xl:grid gap-2" style=" grid-template-columns: repeat(auto-fill, 24%);">
<?php foreach ($character as $listItem) : ?>
<?php if (current_user_can('wowpress_edit_raids')) : ?>
<div class="bg-glass shadow p-auto flex-grow text-center border border-<?= $list->border_color ? $list->border_color . "-500" : 'white' ?>" x-data="{open:false}" @click="open=!open">
<div><?= format_date($listItem->pivot->date) ?></div>
<div><?= $listItem->pivot->comment ?></div>
<template x-teleport="body">
<div x-show="open" class="fixed inset-0 px-2 z-10 overflow-hidden flex items-center justify-center">
<div x-show="open" x-on:click="open = false" x-transition:enter="transition-opacity ease-out duration-300" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="transition-opacity ease-in duration-300" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" class="absolute inset-0 bg-deepblue bg-opacity-75 transition-opacity"></div>
<!-- Modal Content -->
<div x-show="open" x-transition:enter="transition-transform ease-out duration-300" x-transition:enter-start="transform scale-75" x-transition:enter-end="transform scale-100" x-transition:leave="transition-transform ease-in duration-300" x-transition:leave-start="transform scale-100" x-transition:leave-end="transform scale-75" class="bg-glass border shadow overflow-hidden max-w-md w-full sm:w-96 md:w-1/2 lg:w-2/3 xl:w-1/3 z-50">
<!-- Modal Body -->
<div class="p-auto flex flex-col gap-2 items-center justify-center">
<form id="removeListItem<?= $listItem->pivot->ID ?>" action="/request" method="POST" class="hidden">
<?php wp_nonce_field('removeListItem', 'removeListItem_nonce'); ?>
<input type="hidden" name="action" value="removeListItem">
<input type="hidden" name="item_id" value="<?= $listItem->pivot->ID ?>">
<!-- Modal Footer -->
</form>
<?php $listItem->classButton?>
<div class="text-center w-full p-auto border border-white">Eintrag vom <?=format_date($listItem->pivot->date)?></div>
<button type="submit" form="removeListItem<?= $listItem->pivot->ID ?>" class="btn btn-red w-full">Löschen</button>
</div>
</div>
</div>
</template>
</div>
<?php else : ?>
<div class="bg-glass shadow p-auto flex-grow text-center border border-<?= $list->border_color ? $list->border_color . "-500" : 'white' ?>">
<div><?= format_date($listItem->pivot->date) ?></div>
<div><?= $listItem->pivot->comment ?></div>
</div>
<?php endif; ?>
<?php endforeach ?>
<?php
if (current_user_can('wowpress_edit_raids')) :
?>
<button @click="char=<?= $listItem->ID ?>" class="btn btn-<?= $list->border_color ?>"><?= Icon::get('o-plus') ?></button>
<?php
endif;
?>
</div>
</div>
<?php endforeach; ?>
</div>
</main><!-- #main -->
<?php
if (current_user_can('wowpress_edit_raids')) : ?>
<template x-teleport="#sidebar_right">
<div class="bg-glass shadow p-auto order-1">
<h4 class="text-xl font-bold text-center mb-2">Charakter hinzufügen</h4>
<form action="/request" method="POST">
<div class="flex flex-col gap-2">
<?php wp_nonce_field('addCharToList', 'addCharToList_nonce'); ?>
<input type="hidden" name="action" value="addCharToList">
<input type="hidden" name="list_id" value="<?= $list->ID ?>">
<select name="character_ID" id="" x-model="char" class="bg-white bg-opacity-0 border-alliance">
<option value="null" selected disabled>Charakter auswählen</option>
<?php
foreach (Character::all() as $char) :
?>
<option value="<?= $char->ID ?>"><?= $char->name ?> - <?= $char->realm ?></option>
<?php
endforeach;
?>
</select>
<input type="text" class="bg-white bg-opacity-0 border-alliance" placeholder="Kommentar" name="comment">
<input type="date" name="date" id="" class="bg-white bg-opacity-0 border-alliance">
<button type="submit" class="btn btn-outline btn-<?= $list->border_color ?>"><?= Icon::get('o-plus') ?> Hinzufügen</a>
</div>
</form>
</div>
</template>
<?php
endif;
?>
</section><!-- #primary -->
<?php
get_footer();

View File

@ -2,7 +2,12 @@
require_once('vendor/autoload.php');
use Illuminate\Support\Facades\Redirect;
use Wenprise\Eloquent\Database;
use Wenprise\Eloquent\Facades\DB;
use Wenprise\Eloquent\Model;
use WoWPress\Models\Character;
use WoWPress\Models\CharacterList;
use WoWPress\Models\CharacterListItem;
use WoWPress\Models\Complaint;
use WoWPress\Models\Log;
use WoWPress\Models\Notification;
@ -245,6 +250,7 @@ switch ($_POST['action']) {
$c->complaint = $_POST['complaint'];
$c->anonymous = !empty($_POST['hide']);
$c->save();
Notification::addCapabilityNotification("wowpress_edit_complaints", "Neuer Eintrag im Kummerkasten!");
}
}
break;
@ -334,24 +340,79 @@ switch ($_POST['action']) {
case 'updatePageBG':
isAllowed('wowpress_edit_site');
if (isset($_POST['updatePageBG_nonce']) && wp_verify_nonce($_POST['updatePageBG_nonce'], 'updatePageBG')) {
if (isset($_FILES['bg']) && $_FILES['bg']['type'] == "image/jpeg" ) {
$bg_path = ABSPATH."/wp-content/bg.jpg";
rename($_FILES['bg']['tmp_name'],$bg_path);
chmod(ABSPATH."/wp-content/bg.jpg",0644);
if (isset($_FILES['bg']) && $_FILES['bg']['type'] == "image/jpeg") {
$bg_path = ABSPATH . "/wp-content/bg.jpg";
rename($_FILES['bg']['tmp_name'], $bg_path);
chmod(ABSPATH . "/wp-content/bg.jpg", 0644);
}
}
break;
case 'updateRaidTitle':
isAllowed('wowpress_edit_raids');
if (isset($_POST['updateRaidTitle_nonce']) && wp_verify_nonce($_POST['updateRaidTitle_nonce'], 'updateRaidTitle')) {
if(isset($_POST['raid_id']) && isset($_POST['name'])){
if (isset($_POST['raid_id']) && isset($_POST['name'])) {
$raid = Raid::find($_POST['raid_id']);
if($raid){
if ($raid) {
$raid->setTitle($_POST['name']);
}
}
}
case 'addList':
isAllowed('wowpress_edit_raids');
if(checkNonce('addList')){
if(isset($_POST['list_name'],$_POST['border_color'])){
$list = new CharacterList();
$list->list_name = $_POST['list_name'];
$list->border_color = $_POST['border_color'];
$list->notify = !empty($_POST['notify']);
$list->max_count = 18;
$list->save();
}
}
case 'addCharToList':
isAllowed('wowpress_edit_raids');
if (isset($_POST['addCharToList_nonce']) && wp_verify_nonce($_POST['addCharToList_nonce'], 'addCharToList')) {
if(isset($_POST['character_ID']) && isset($_POST['list_id'])){
$list = CharacterList::find($_POST['list_id']);
$char = Character::find($_POST['character_ID']);
if($char && $list){
$comment = "";
$date = date('Y-m-d');
if(!empty($_POST['comment'])){
$comment = $_POST['comment'];
}
if(!empty($_POST['date'])){
$date = $_POST['date'];
}
$list->addItem($char,$comment,$date);
}
}
}
break;
case 'removeListItem':
isAllowed('wowpress_edit_raids');
if(checkNonce('removeListItem')){
if(isset($_POST['item_id'])){
$item_id = intval($_POST['item_id']);
$item = CharacterListItem::find($item_id);
if($item){
$item->delete();
#CharacterListItem::deleteOrphans();
}
}
}
break;
case 'cron':
if(isset($_POST['cron'])){
switch($_POST['cron']){
case 'update_applications':
break;
}
}
break;
}
header('Location: ' . $_SERVER['HTTP_REFERER']);

View File

@ -136,14 +136,14 @@ if (is_user_logged_in()) {
<div x-show="notification">
<div class="p-2 flex flex-col mt-1 absolute gap-2 shadow" style="background-color:var(--color-deepblue)">
<?php foreach ($notifications as $notification) : ?>
<div class="p-2 border flex flex-row gap-1 justify-between">
<div class="p-2 border border-alliance flex flex-row gap-1 justify-between">
<form class="hidden" action="/request" method="POST" id="deleteNotification<?= $notification->ID ?>">
<input type="hidden" name="action" value="notificationSeen">
<input type="hidden" name="notification_id" value="<?= $notification->ID ?>">
<?php wp_nonce_field('notificationSeen', 'notificationSeen_nonce'); ?>
</form>
<div><?= $notification->note ?></div>
<button type="submit" class="cursor-pointer" form="deleteNotification<?= $notification->ID ?>"><?= Icon::get('o-x-circle') ?> </button>
<div class="my-2 mx-3"><?= $notification->note ?></div>
<button type="submit" class="cursor-pointer text-red-500" form="deleteNotification<?= $notification->ID ?>"><?= Icon::get('o-x-circle') ?> </button>
</div>
<?php endforeach; ?>
</div>

View File

@ -0,0 +1,17 @@
<?php
namespace WoWPress\Database;
class CreateCharListItemTable extends CreateTable
{
public static $table_name = "charlists_item";
public static $fields = [
'character_id' => 'mediumint NOT NULL',
'list_id' => 'mediumint NOT NULL',
'date' => 'date NOT NULL',
'count_multiplier' => 'tinyint NOT NULL',
'comment' => 'text',
];
}

View File

@ -0,0 +1,16 @@
<?php
namespace WoWPress\Database;
class CreateCharListsTable extends CreateTable
{
public static $table_name = "charlists";
public static $fields = [
'list_name' => 'text NOT NULL',
'border_color' => 'text NOT NULL',
'max_count' => 'mediumint NOT NULL',
'notify' => 'boolean'
];
}

View File

@ -29,6 +29,10 @@ class Character extends Model
$this->api = new BattleNet($id,$key);
}
public function lists(){
return $this->belongsToMany(CharacterList::class,'wowpress_charlists_item','list_id','character_id')->withPivot('comment','date','id');
}
public function user(){
return $this->belongsTo(User::class);
}
@ -53,15 +57,25 @@ class Character extends Model
public function getRankAttribute($rank){
switch($rank){
case 0: return "Gildenmeister";
break;
case 1: return "Offizier";
break;
case 2: return "Offi-Twink";
break;
case 3: return "Raidlead";
break;
case 4: return "Ehrenmitglied";
break;
case 5: return "Raider";
break;
case 6: return "Raider-Twink";
break;
case 7: return "F&F";
break;
case 8: return "Novize";
break;
case 9: return "Sleeper";
break;
default: return "Gast";
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace WoWPress\Models;
use Wenprise\Eloquent\Model;
class CharacterList extends Model{
protected $table = "wowpress_charlists";
public $timestamps = false;
protected $primaryKey = 'ID';
protected $guarded = ['ID'];
public function characters(){
return $this->belongsToMany(Character::class,'wowpress_charlists_item','character_id','list_id')->orderBy('character_id')->orderByPivot('date')->withPivot('comment','date','ID');
}
public function addItem(Character $char, $comment = null, $date = null, $multiplier = 1){
$this->characters()->attach($char->ID,[
'comment' => $comment,
'date' => $date?:date('Y-m-d'),
'count_multiplier' => $multiplier
]);
if($this->notify){
if($char->user){
Notification::addNotification($char->user->ID,'Neuer Eintrag in Liste: '.$this->list_name);
}
}
}
public function removeItem($id){
$this->characters()->wherePivot('id',$id)->first()->detach();
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace WoWPress\Models;
use LogicException;
use Wenprise\Eloquent\Model;
class CharacterListItem extends Model{
protected $table = "wowpress_charlists_item";
public $timestamps = false;
protected $primaryKey = 'ID';
protected $guarded = ['ID'];
public function list(){
$this->belongsTo(CharacterList::class,'list_id');
}
public function character(){
$this->belongsTo(Character::class,'character_id');
}
public static function deleteOrphans(){
$items = static::all();
foreach($items as $item){
try{
$item->list;
}catch(LogicException $e){
$item->delete();
}
}
}
}

View File

@ -19,6 +19,15 @@ class Notification extends Model{
$note->save();
}
public static function addCapabilityNotification($capability,$note_text){
$users = get_users(array(
'capability' => $capability,
));
foreach($users as $user){
Notification::addNotification($user->ID, $note_text);
}
}
public static function getAll(){
return Notification::where('user_id',get_current_user_id())->get();
}

View File

@ -81,9 +81,9 @@ class Raid extends Model
if (!empty($this->id_wowaudit)) {
$raid = (object)$this->api->getRaid($this->id_wowaudit, $force);
if (!empty($raid->id)) {
if($this->title && $raid->instance == "Custom"){
if ($this->title && $raid->instance == "Custom") {
//Titel nur sezten wenn kein Custom Raid
}else{
} else {
$this->title = $raid->instance;
}
$this->start = $raid->date . " " . $raid->start_time;
@ -103,7 +103,7 @@ class Raid extends Model
}
$encounters[$key]['selections'] = collect($encounter['selections']);
}
$this->partial = $partial;
foreach ($raid->signups as $signup) {
@ -147,10 +147,10 @@ class Raid extends Model
$s->role = $signup['status'] == "Unknown" ? "Unknown" : $signup['role'];
$signups[] = $s;
}
$this->signups = collect($signups);
foreach ($encounters as &$encounter) {
foreach ($encounter['selections'] as $key => &$selection) {
$character = Character::where('id_wowaudit', $selection['character_id'])->first();
@ -166,9 +166,9 @@ class Raid extends Model
$encounter['selections'][$key] = $s;
}
}
array_unshift($encounters, [
'name' => "Alle Bosse",
@ -183,16 +183,17 @@ class Raid extends Model
}
$this->encounters = collect($encounters);
}else{
} else {
return false;
}
}
return $this;
}
public function setTitle($title){
public function setTitle($title)
{
$this->title = $title;
$this->save();
}
@ -222,27 +223,28 @@ class Raid extends Model
public function getPreviousAttribute()
{
$previous = Raid::where('start','<',$this->start)->orderBy('start','DESC')->first();
$previous = Raid::where('start', '<', $this->start)->orderBy('start', 'DESC')->first();
return $previous;
}
public function getThumbnailAttribute(){
public function getThumbnailAttribute()
{
$clean_name = str_replace([" ","'"],"-",$this->title);
$clean_name = str_replace([" ", "'"], "-", $this->title);
$clean_name = preg_replace('/[^a-zA-Z0-9_-]/', '', $clean_name);
$clean_name = strtolower($clean_name);
$url = "https://data.wowaudit.com/img/$clean_name-small.jpeg";
if(file_exists($url)){
return $url;
list($status) = get_headers($url);
if (strpos($status, '404') !== FALSE) {
return "https://data.wowaudit.com/img/custom-small.jpeg";
}
return "https://data.wowaudit.com/img/custom-small.jpeg";
return $url;
}
public function getNextAttribute()
{
$next = Raid::where('start','>',$this->start)->orderBy('start','ASC')->first();
$next = Raid::where('start', '>', $this->start)->orderBy('start', 'ASC')->first();
return $next;
}
@ -254,7 +256,7 @@ class Raid extends Model
} else {
$chars = [$character];
}
if(!empty($this->id_wowaudit)) $this->sync();
if (!empty($this->id_wowaudit)) $this->sync();
if (!empty($character->ID) && !empty($this->signups)) {
foreach ($this->signups as $signup) {
foreach ($chars as $character) {
@ -268,7 +270,6 @@ class Raid extends Model
$s = new Signup();
$s->raid_id = $this->ID;
$s->character_id = $character->ID;
return $s->showForm($showRole,$showStatus,$vertical);
return $s->showForm($showRole, $showStatus, $vertical);
}
}