WowPress-Tailwind/theme/wowpress/Models/SKSHistory.php

267 lines
6.9 KiB
PHP
Raw Normal View History

2024-09-20 20:02:10 +02:00
<?php
namespace WoWPress\Models;
use Illuminate\Support\Collection;
use Wenprise\Eloquent\Model;
use WoWPress\Api\BattleNet;
use WoWPress\Api\WoWAudit;
class SKSHistory extends Model
{
protected $table = "wowpress_sks_history";
protected $primaryKey = 'ID';
protected $guarded = ['ID'];
public function getLatest()
{
return self::where('list_name', $this->list_name)->where('active', true)->latest('created_at')->first();
}
public static function getLatestList($list_name)
{
return static::where('list_name', $list_name)->where('active', true)->latest('created_at')->first();
}
private function setList($list_array)
{
$this->list_json = json_encode($list_array);
}
public static function createList(string $list_name, $list_json)
{
$sks = new static();
$sks->list_name = $list_name;
if (is_array($list_json)) {
$list_json = json_encode($list_json);
}
$sks->list_json = $list_json;
$sks->active = true;
$sks->fixOrder();
return $sks;
}
public function fillWithRaiders()
{
$options = get_option('wowpress_api');
if (isset($options['wowaudit'])) {
$key = get_option('wowpress_api')['wowaudit']['key'];
} else {
return false;
}
$api = new WoWAudit(null, $key);
$roster = $api->getRoster();
$list = [];
foreach ($roster as $id => $character) {
if (!empty($character['name'])) {
$list[] = [
'char' => $character['name'] . "-" . $character['realm'],
'rank' => $id + 1,
'active' => true,
];
}
}
$this->list_json = json_encode($list);
}
public function getListArrayAttribute()
{
return json_decode($this->list_json, true);
}
public function shuffle()
{
$ranks = range(1, count($this->list_array));
shuffle($ranks);
$list = $this->list_array;
foreach ($list as $id => &$list_item) {
$list_item['rank'] = array_pop($ranks);
}
$this->saveList($list);
}
private function getChar($char)
{
foreach ($this->list_array as $list_item) {
if ($list_item['char'] == $char) {
return $list_item;
}
}
return false;
}
private function sort($list)
{
usort($list, fn($a, $b) => $a['rank'] - $b['rank']);
return $list;
}
public function fixOrder()
{
$data = $this->list_array;
// Separate active and inactive items
$activeItems = [];
$inactiveItems = [];
foreach ($data as $item) {
if ($item["active"]) {
$activeItems[] = $item;
} else {
$inactiveItems[] = $item;
}
}
// Sort the active items by rank
usort($activeItems, function ($a, $b) {
return $a["rank"] - $b["rank"];
});
// Reassign ranks starting from 1 for active items
$rankCounter = 0;
foreach ($activeItems as $key => $item) {
$rankCounter += 1;
foreach ($inactiveItems as $inactive_item) {
if ($inactive_item['rank'] == $rankCounter) {
$rankCounter += 1;
}
}
$item["rank"] = $rankCounter;
$activeItems[$key] = $item;
}
// Merge active and inactive items back
$data = array_merge($inactiveItems, $activeItems);
$data = $this->sort($data);
$this->setList($data);
}
public function loot($char)
{
if ($looter = $this->getChar($char)) {
if ($looter['active']) {
$list = $this->list_array;
foreach ($list as $id => &$list_item) {
if ($list_item['rank'] == $looter['rank']) {
$list[$id]['rank'] = PHP_INT_MAX; //Ans Ende der Liste mit dem Looter
break;
}
}
return $this->saveList($list);
}
}
return false;
}
public function saveList($list_array)
{
$this->active = false;
$this->save();
$new = self::createList($this->list_name, $list_array);
$new->save();
return $new;
}
public function toggleActive($rank)
{
$list = $this->list_array;
foreach ($list as &$list_item) {
if ($rank == $list_item['rank']) {
$list_item['active'] = !$list_item['active'];
return $this->saveList($list);
}
}
return false;
}
public function getList()
{
return $this->list_array;
}
public function getCharData($char)
{
list($name, $realm) = explode("-", $char);
$character = Character::whereName($name)->whereRealm($realm)->first();
if (empty($character)) {
$character = new Character();
$character->name = $name;
$character->realm = $realm;
$character->class = "priest";
}
return $character;
}
public function getPreviousList()
{
2024-11-02 20:53:15 +01:00
return SKSHistory::where('list_name', $this->list_name)->whereNot('active')->where('created_at', '<', $this->created_at)->orderBy('updated_at','DESC')->first();
2024-09-20 20:02:10 +02:00
}
public function getNextList()
{
2024-11-02 20:53:15 +01:00
return SKSHistory::where('list_name', $this->list_name)->whereNot('active')->where('created_at', '>', $this->created_at)->orderBy('updated_at','DESC')->first();
2024-09-20 20:02:10 +02:00
}
public function undo()
{
$lastItem = $this->getPreviousList();
$lastItem->active = true;
$lastItem->save();
$this->active = false;
$this->save();
}
public function redo()
{
$nextItem = $this->getNextList();
$nextItem->active = true;
$nextItem->save();
$this->active = false;
$this->save();
}
public function removeChar($char, $realm = "")
{
if ($realm) {
$char = $char . "-" . $realm;
}
$list = $this->list_array;
foreach ($list as $id => $list_item) {
if (!$list_item['active'] && $list_item['char'] == $char) {
unset($list[$id]);
}
}
$this->saveList($list);
}
public function addChar($char, $realm = "")
{
if ($realm) {
$char = $char . "-" . $realm;
}
$list = $this->list_array;
foreach ($list as $list_item) {
if ($list_item['char'] == $char) {
return false;
}
}
$list[] = [
'rank' => PHP_INT_MAX,
'active' => true,
'char' => $char
];
$this->saveList($list);
}
}