From c576b446f7333915b66ac6b74c7d140252c37220 Mon Sep 17 00:00:00 2001 From: jam Date: Mon, 15 Jul 2024 18:11:34 -0400 Subject: [PATCH 01/15] reward maker --- .../Admin/Data/RewardController.php | 51 ++++++ app/Models/ObjectReward.php | 63 ++++++++ app/Services/RewardManager.php | 88 +++++++++++ ...024_07_15_214139_add_pluggable_rewards.php | 35 ++++ .../views/widgets/_reward_display.blade.php | 20 +++ .../views/widgets/_reward_maker.blade.php | 149 ++++++++++++++++++ routes/lorekeeper/admin.php | 3 + 7 files changed, 409 insertions(+) create mode 100644 app/Http/Controllers/Admin/Data/RewardController.php create mode 100644 app/Models/ObjectReward.php create mode 100644 app/Services/RewardManager.php create mode 100644 database/migrations/2024_07_15_214139_add_pluggable_rewards.php create mode 100644 resources/views/widgets/_reward_display.blade.php create mode 100644 resources/views/widgets/_reward_maker.blade.php diff --git a/app/Http/Controllers/Admin/Data/RewardController.php b/app/Http/Controllers/Admin/Data/RewardController.php new file mode 100644 index 0000000000..89b9eea8eb --- /dev/null +++ b/app/Http/Controllers/Admin/Data/RewardController.php @@ -0,0 +1,51 @@ +only([ + 'reward_id', 'reward_type', 'quantity', + ]); + + if ($id && $service->editRewards($object, $data)) { + flash('Rewards updated successfully.')->success(); + } else { + foreach ($service->errors()->getMessages()['error'] as $error) { + flash($error)->error(); + } + + } + return redirect()->back(); + } + +} \ No newline at end of file diff --git a/app/Models/ObjectReward.php b/app/Models/ObjectReward.php new file mode 100644 index 0000000000..930bf31c93 --- /dev/null +++ b/app/Models/ObjectReward.php @@ -0,0 +1,63 @@ +object_type) { + case 'Prompt': + return $this->belongsTo('App\Models\Prompt\Prompt', 'object_id'); + } + return null; + } + + /** + * Get the reward attached to the prompt reward. + */ + public function reward() + { + switch ($this->reward_type) + { + case 'Item': + return $this->belongsTo('App\Models\Item\Item', 'reward_id'); + break; + case 'Currency': + return $this->belongsTo('App\Models\Currency\Currency', 'reward_id'); + break; + case 'LootTable': + return $this->belongsTo('App\Models\Loot\LootTable', 'reward_id'); + break; + case 'Raffle': + return $this->belongsTo('App\Models\Raffle\Raffle', 'reward_id'); + break; + } + return null; + } +} \ No newline at end of file diff --git a/app/Services/RewardManager.php b/app/Services/RewardManager.php new file mode 100644 index 0000000000..c982535712 --- /dev/null +++ b/app/Services/RewardManager.php @@ -0,0 +1,88 @@ +objectRewards()->delete(); + + if (isset($data['reward_type'])) { + foreach ($data['reward_type'] as $key => $type) { + ObjectReward::create([ + 'object_id' => $object->id, + 'object_type' => class_basename($object), + 'reward_type' => $type, + 'reward_id' => $data['reward_id'][$key], + 'quantity' => $data['quantity'][$key], + ]); + } + } + + return $this->commitReturn(true); + } catch (\Exception $e) { + $this->setError('error', $e->getMessage()); + } + return $this->rollbackReturn(false); + } + + /** + * Grant rewards + * + * @param array $data + * @param \App\Models\User\User $user + * @return mixed + */ + public function grantRewards($object, $user, $recipient, $logtype, $logdata) + { + DB::beginTransaction(); + + try { + if (!$object) { + throw new \Exception("Invalid object."); + } + + if (!$recipient) { + throw new \Exception("Invalid user."); + } + + // Distribute user rewards + if (!$rewards = fillUserAssets($object->objectRewards, $user, $recipient, $logtype, $logdata)) { + throw new \Exception("Failed to distribute rewards to user."); + } + flash('Rewards granted successfully.')->success(); + + return $this->commitReturn(true); + } catch (\Exception $e) { + $this->setError('error', $e->getMessage()); + } + return $this->rollbackReturn(false); + } +} diff --git a/database/migrations/2024_07_15_214139_add_pluggable_rewards.php b/database/migrations/2024_07_15_214139_add_pluggable_rewards.php new file mode 100644 index 0000000000..d43cd38b4a --- /dev/null +++ b/database/migrations/2024_07_15_214139_add_pluggable_rewards.php @@ -0,0 +1,35 @@ +increments('id'); + $table->integer('object_id'); + $table->string('object_type'); + $table->integer('reward_id'); + $table->string('reward_type')->default('Item'); + $table->integer('quantity')->unsigned(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/resources/views/widgets/_reward_display.blade.php b/resources/views/widgets/_reward_display.blade.php new file mode 100644 index 0000000000..922b1eafbc --- /dev/null +++ b/resources/views/widgets/_reward_display.blade.php @@ -0,0 +1,20 @@ +
+

{{ ucfirst($type) }} Rewards

+ + + + + + + + + + @foreach ($object->objectRewards as $reward) + + + + + @endforeach + +
RewardAmount
{!! $reward->reward->displayName !!} ({{ $reward->reward_type }}){{ $reward->quantity }}
+
diff --git a/resources/views/widgets/_reward_maker.blade.php b/resources/views/widgets/_reward_maker.blade.php new file mode 100644 index 0000000000..dd0ebe4e01 --- /dev/null +++ b/resources/views/widgets/_reward_maker.blade.php @@ -0,0 +1,149 @@ +{!! Form::open(['url' => 'admin/data/reward-maker/edit/' . base64_encode(urlencode(get_class($object))) . '/' . $object->id]) !!} + +@php + // This file represents a common source and definition for assets used in loot_select + // While it is not per se as tidy as defining these in the controller(s), + // doing so this way enables better compatibility across disparate extensions + $items = \App\Models\Item\Item::orderBy('name')->pluck('name', 'id'); + $currencies = \App\Models\Currency\Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'); + $tables = \App\Models\Loot\LootTable::orderBy('name')->pluck('name', 'id'); + $raffles = \App\Models\Raffle\Raffle::where('rolled_at', null)->where('is_active', 1)->orderBy('name')->pluck('name', 'id'); +@endphp + +
+ +
+
+ Add Reward + {{ ucfirst($type) }} Rewards +
+
+

You can add rewards to this {{ $type }} here.

+
+ + + + + + + + + + + @if ($rewards) + @foreach ($rewards as $reward) + + + + + + + @endforeach + @endif + +
Reward TypeRewardQuantity
{!! Form::select('reward_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table', 'Raffle' => 'Raffle Ticket'], $reward->reward_type, ['class' => 'form-control reward-type', 'placeholder' => 'Select reward Type']) !!} + @if ($reward->reward_type == 'Item') + {!! Form::select('reward_id[]', $items, $reward->reward_id, ['class' => 'form-control item-select selectize', 'placeholder' => 'Select Item']) !!} + @elseif($reward->reward_type == 'Currency') + {!! Form::select('reward_id[]', $currencies, $reward->reward_id, ['class' => 'form-control currency-select selectize', 'placeholder' => 'Select Currency']) !!} + @elseif($reward->reward_type == 'LootTable') + {!! Form::select('reward_id[]', $tables, $reward->reward_id, ['class' => 'form-control table-select selectize', 'placeholder' => 'Select Loot Table']) !!} + @elseif($reward->reward_type == 'Raffle') + {!! Form::select('reward_id[]', $raffles, $reward->reward_id, ['class' => 'form-control raffle-select selectize', 'placeholder' => 'Select Raffle']) !!} + @endif + + {!! Form::number('quantity[]', $reward->quantity, ['class' => 'form-control', 'placeholder' => 'Set Quantity', 'min' => 1]) !!} + Remove
+
+
+
+ + +
+ {!! Form::submit('Edit', ['class' => 'btn btn-primary']) !!} +
+ +{!! Form::close() !!} + +
+ +
+ + + + + + + + + +
{!! Form::select('reward_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table', 'Raffle' => 'Raffle Ticket'], null, ['class' => 'form-control reward-type', 'placeholder' => 'Select Reward Type']) !!}{!! Form::number('quantity[]', null, ['class' => 'form-control', 'placeholder' => 'Set Quantity', 'min' => 1]) !!} Remove
+ {!! Form::select('reward_id[]', $items, null, ['class' => 'form-control item-select', 'placeholder' => 'Select Item']) !!} + {!! Form::select('reward_id[]', $currencies, null, ['class' => 'form-control currency-select', 'placeholder' => 'Select Currency']) !!} + {!! Form::select('reward_id[]', $tables, null, ['class' => 'form-control table-select', 'placeholder' => 'Select Loot Table']) !!} + {!! Form::select('reward_id[]', $raffles, null, ['class' => 'form-control raffle-select', 'placeholder' => 'Select Raffle']) !!} +
+ + + diff --git a/routes/lorekeeper/admin.php b/routes/lorekeeper/admin.php index d0d89c83eb..ce9b0f4930 100644 --- a/routes/lorekeeper/admin.php +++ b/routes/lorekeeper/admin.php @@ -226,6 +226,9 @@ Route::post('prompts/create', 'PromptController@postCreateEditPrompt'); Route::post('prompts/edit/{id?}', 'PromptController@postCreateEditPrompt'); Route::post('prompts/delete/{id}', 'PromptController@postDeletePrompt'); + + # REWARD MAKER + Route::post('reward-maker/edit/{model}/{id}', 'RewardController@editReward'); }); From ca20b8a713fe3db2cfa1524e2697854f67b425b4 Mon Sep 17 00:00:00 2001 From: jam Date: Thu, 18 Jul 2024 13:44:02 -0400 Subject: [PATCH 02/15] fixes --- .../Admin/Data/RewardController.php | 2 +- app/Models/ObjectReward.php | 13 +++-- app/Services/RewardManager.php | 23 +++++--- ...024_07_15_214139_add_pluggable_rewards.php | 8 +-- .../views/widgets/_reward_display.blade.php | 4 +- .../views/widgets/_reward_maker.blade.php | 55 ++++++++----------- 6 files changed, 52 insertions(+), 53 deletions(-) diff --git a/app/Http/Controllers/Admin/Data/RewardController.php b/app/Http/Controllers/Admin/Data/RewardController.php index 89b9eea8eb..f8d3cb2967 100644 --- a/app/Http/Controllers/Admin/Data/RewardController.php +++ b/app/Http/Controllers/Admin/Data/RewardController.php @@ -34,7 +34,7 @@ public function editReward(Request $request, RewardManager $service, $model, $id } $data = $request->only([ - 'reward_id', 'reward_type', 'quantity', + 'rewardable_type', 'rewardable_id', 'reward_quantity' ]); if ($id && $service->editRewards($object, $data)) { diff --git a/app/Models/ObjectReward.php b/app/Models/ObjectReward.php index 930bf31c93..7d7b9f5bee 100644 --- a/app/Models/ObjectReward.php +++ b/app/Models/ObjectReward.php @@ -12,7 +12,7 @@ class ObjectReward extends Model * @var array */ protected $fillable = [ - 'object_id', 'object_type', 'reward_id', 'reward_type', 'quantity', + 'object_id', 'object_type', 'rewardable_id', 'rewardable_type', 'quantity', ]; /** @@ -34,6 +34,7 @@ public function object() switch ($this->object_type) { case 'Prompt': return $this->belongsTo('App\Models\Prompt\Prompt', 'object_id'); + break; } return null; } @@ -43,19 +44,19 @@ public function object() */ public function reward() { - switch ($this->reward_type) + switch ($this->rewardable_type) { case 'Item': - return $this->belongsTo('App\Models\Item\Item', 'reward_id'); + return $this->belongsTo('App\Models\Item\Item', 'rewardable_id'); break; case 'Currency': - return $this->belongsTo('App\Models\Currency\Currency', 'reward_id'); + return $this->belongsTo('App\Models\Currency\Currency', 'rewardable_id'); break; case 'LootTable': - return $this->belongsTo('App\Models\Loot\LootTable', 'reward_id'); + return $this->belongsTo('App\Models\Loot\LootTable', 'rewardable_id'); break; case 'Raffle': - return $this->belongsTo('App\Models\Raffle\Raffle', 'reward_id'); + return $this->belongsTo('App\Models\Raffle\Raffle', 'rewardable_id'); break; } return null; diff --git a/app/Services/RewardManager.php b/app/Services/RewardManager.php index c982535712..84432b6984 100644 --- a/app/Services/RewardManager.php +++ b/app/Services/RewardManager.php @@ -34,14 +34,14 @@ public function editRewards($object, $data) $object->objectRewards()->delete(); - if (isset($data['reward_type'])) { - foreach ($data['reward_type'] as $key => $type) { + if (isset($data['rewardable_type'])) { + foreach ($data['rewardable_type'] as $key => $type) { ObjectReward::create([ 'object_id' => $object->id, 'object_type' => class_basename($object), - 'reward_type' => $type, - 'reward_id' => $data['reward_id'][$key], - 'quantity' => $data['quantity'][$key], + 'rewardable_type' => $type, + 'rewardable_id' => $data['rewardable_id'][$key] ?? null, + 'quantity' => $data['reward_quantity'][$key], ]); } } @@ -73,9 +73,15 @@ public function grantRewards($object, $user, $recipient, $logtype, $logdata) throw new \Exception("Invalid user."); } + $rewards = createAssetsArray(); + + foreach ($object->objectRewards as $reward) { + addAsset($rewards, $reward->reward, $reward->quantity); + } + // Distribute user rewards - if (!$rewards = fillUserAssets($object->objectRewards, $user, $recipient, $logtype, $logdata)) { - throw new \Exception("Failed to distribute rewards to user."); + if (!($rewards = fillUserAssets($rewards, null, $recipient, $logtype, $logdata))) { + throw new \Exception('Failed to distribute rewards to user.'); } flash('Rewards granted successfully.')->success(); @@ -85,4 +91,5 @@ public function grantRewards($object, $user, $recipient, $logtype, $logdata) } return $this->rollbackReturn(false); } -} + +} \ No newline at end of file diff --git a/database/migrations/2024_07_15_214139_add_pluggable_rewards.php b/database/migrations/2024_07_15_214139_add_pluggable_rewards.php index d43cd38b4a..aab1d02e29 100644 --- a/database/migrations/2024_07_15_214139_add_pluggable_rewards.php +++ b/database/migrations/2024_07_15_214139_add_pluggable_rewards.php @@ -17,8 +17,8 @@ public function up() $table->increments('id'); $table->integer('object_id'); $table->string('object_type'); - $table->integer('reward_id'); - $table->string('reward_type')->default('Item'); + $table->integer('rewardable_id'); + $table->string('rewardable_type')->default('Item'); $table->integer('quantity')->unsigned(); }); } @@ -30,6 +30,6 @@ public function up() */ public function down() { - // + Schema::dropIfExists('object_rewards'); } -} +} \ No newline at end of file diff --git a/resources/views/widgets/_reward_display.blade.php b/resources/views/widgets/_reward_display.blade.php index 922b1eafbc..bd9505233d 100644 --- a/resources/views/widgets/_reward_display.blade.php +++ b/resources/views/widgets/_reward_display.blade.php @@ -11,10 +11,10 @@ @foreach ($object->objectRewards as $reward) - {!! $reward->reward->displayName !!} ({{ $reward->reward_type }}) + {!! $reward->reward->displayName !!} {{ $reward->quantity }} @endforeach -
+
\ No newline at end of file diff --git a/resources/views/widgets/_reward_maker.blade.php b/resources/views/widgets/_reward_maker.blade.php index dd0ebe4e01..6123e93921 100644 --- a/resources/views/widgets/_reward_maker.blade.php +++ b/resources/views/widgets/_reward_maker.blade.php @@ -25,7 +25,7 @@ Reward Type Reward - Quantity + Quantity @@ -33,21 +33,22 @@ @if ($rewards) @foreach ($rewards as $reward) - {!! Form::select('reward_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table', 'Raffle' => 'Raffle Ticket'], $reward->reward_type, ['class' => 'form-control reward-type', 'placeholder' => 'Select reward Type']) !!} + {!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table', 'Raffle' => 'Raffle'], $reward->rewardable_type, [ + 'class' => 'form-control reward-type selectize', + 'placeholder' => 'Select Reward Type', + ]) !!} - @if ($reward->reward_type == 'Item') - {!! Form::select('reward_id[]', $items, $reward->reward_id, ['class' => 'form-control item-select selectize', 'placeholder' => 'Select Item']) !!} - @elseif($reward->reward_type == 'Currency') - {!! Form::select('reward_id[]', $currencies, $reward->reward_id, ['class' => 'form-control currency-select selectize', 'placeholder' => 'Select Currency']) !!} - @elseif($reward->reward_type == 'LootTable') - {!! Form::select('reward_id[]', $tables, $reward->reward_id, ['class' => 'form-control table-select selectize', 'placeholder' => 'Select Loot Table']) !!} - @elseif($reward->reward_type == 'Raffle') - {!! Form::select('reward_id[]', $raffles, $reward->reward_id, ['class' => 'form-control raffle-select selectize', 'placeholder' => 'Select Raffle']) !!} + @if ($reward->rewardable_type == 'Item') + {!! Form::select('rewardable_id[]', $items, $reward->rewardable_id, ['class' => 'form-control item-select selectize', 'placeholder' => 'Select Item']) !!} + @elseif($reward->rewardable_type == 'Currency') + {!! Form::select('rewardable_id[]', $currencies, $reward->rewardable_id, ['class' => 'form-control currency-select selectize', 'placeholder' => 'Select Currency']) !!} + @elseif($reward->rewardable_type == 'LootTable') + {!! Form::select('rewardable_id[]', $tables, $reward->rewardable_id, ['class' => 'form-control table-select selectize', 'placeholder' => 'Select Loot Table']) !!} + @elseif($reward->rewardable_type == 'Raffle') + {!! Form::select('rewardable_id[]', $raffles, $reward->rewardable_id, ['class' => 'form-control raffle-select selectize', 'placeholder' => 'Select Raffle']) !!} @endif - - {!! Form::number('quantity[]', $reward->quantity, ['class' => 'form-control', 'placeholder' => 'Set Quantity', 'min' => 1]) !!} - + {!! Form::text('reward_quantity[]', $reward->quantity, ['class' => 'form-control']) !!} Remove @endforeach @@ -60,7 +61,7 @@
- {!! Form::submit('Edit', ['class' => 'btn btn-primary']) !!} + {!! Form::submit('Edit Rewards', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!} @@ -71,17 +72,17 @@ - + - +
{!! Form::select('reward_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table', 'Raffle' => 'Raffle Ticket'], null, ['class' => 'form-control reward-type', 'placeholder' => 'Select Reward Type']) !!}{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table', 'Raffle' => 'Raffle'], null, ['class' => 'form-control reward-type selectize', 'placeholder' => 'Select Reward Type']) !!} {!! Form::number('quantity[]', null, ['class' => 'form-control', 'placeholder' => 'Set Quantity', 'min' => 1]) !!} {!! Form::text('reward_quantity[]', 1, ['class' => 'form-control']) !!} Remove
- {!! Form::select('reward_id[]', $items, null, ['class' => 'form-control item-select', 'placeholder' => 'Select Item']) !!} - {!! Form::select('reward_id[]', $currencies, null, ['class' => 'form-control currency-select', 'placeholder' => 'Select Currency']) !!} - {!! Form::select('reward_id[]', $tables, null, ['class' => 'form-control table-select', 'placeholder' => 'Select Loot Table']) !!} - {!! Form::select('reward_id[]', $raffles, null, ['class' => 'form-control raffle-select', 'placeholder' => 'Select Raffle']) !!} + {!! Form::select('rewardable_id[]', $items, null, ['class' => 'form-control item-select', 'placeholder' => 'Select Item']) !!} + {!! Form::select('rewardable_id[]', $currencies, null, ['class' => 'form-control currency-select', 'placeholder' => 'Select Currency']) !!} + {!! Form::select('rewardable_id[]', $tables, null, ['class' => 'form-control table-select', 'placeholder' => 'Select Loot Table']) !!} + {!! Form::select('rewardable_id[]', $raffles, null, ['class' => 'form-control raffle-select', 'placeholder' => 'Select Raffle']) !!} @@ -93,57 +94,47 @@ var $currencySelect = $('#rewardRowData').find('.currency-select'); var $tableSelect = $('#rewardRowData').find('.table-select'); var $raffleSelect = $('#rewardRowData').find('.raffle-select'); - - $('#rewardTableBody .selectize').selectize(); attachRewardTypeListener($('#rewardTableBody .reward-type')); attachRemoveListener($('#rewardTableBody .remove-reward-button')); - $('#addReward').on('click', function(e) { e.preventDefault(); var $clone = $rewardRow.clone(); $rewardTable.append($clone); + $clone.find('.selectize').selectize(); attachRewardTypeListener($clone.find('.reward-type')); attachRemoveListener($clone.find('.remove-reward-button')); }); - $('.reward-type').on('change', function(e) { var val = $(this).val(); var $cell = $(this).parent().find('.reward-row-select'); - var $clone = null; if (val == 'Item') $clone = $itemSelect.clone(); else if (val == 'Currency') $clone = $currencySelect.clone(); else if (val == 'LootTable') $clone = $tableSelect.clone(); else if (val == 'Raffle') $clone = $raffleSelect.clone(); - $cell.html(''); $cell.append($clone); }); - function attachRewardTypeListener(node) { node.on('change', function(e) { var val = $(this).val(); var $cell = $(this).parent().parent().find('.reward-row-select'); - var $clone = null; if (val == 'Item') $clone = $itemSelect.clone(); else if (val == 'Currency') $clone = $currencySelect.clone(); else if (val == 'LootTable') $clone = $tableSelect.clone(); else if (val == 'Raffle') $clone = $raffleSelect.clone(); - $cell.html(''); $cell.append($clone); $clone.selectize(); }); } - function attachRemoveListener(node) { node.on('click', function(e) { e.preventDefault(); $(this).parent().parent().remove(); }); } - }); - + \ No newline at end of file From 5a2fd330d1d7bb02dd34bc67fa16d3db2ca55fb2 Mon Sep 17 00:00:00 2001 From: jam Date: Mon, 14 Oct 2024 13:20:20 -0400 Subject: [PATCH 03/15] add character reward granting --- .../Admin/Data/RewardController.php | 4 +- app/Models/ObjectReward.php | 6 +- app/Services/RewardManager.php | 39 ++++++--- ...024_10_13_213812_add_character_rewards.php | 30 +++++++ .../views/widgets/_reward_display.blade.php | 18 +++- .../views/widgets/_reward_maker.blade.php | 83 +++++++++++++------ 6 files changed, 134 insertions(+), 46 deletions(-) create mode 100644 database/migrations/2024_10_13_213812_add_character_rewards.php diff --git a/app/Http/Controllers/Admin/Data/RewardController.php b/app/Http/Controllers/Admin/Data/RewardController.php index f8d3cb2967..71496ad75d 100644 --- a/app/Http/Controllers/Admin/Data/RewardController.php +++ b/app/Http/Controllers/Admin/Data/RewardController.php @@ -34,7 +34,7 @@ public function editReward(Request $request, RewardManager $service, $model, $id } $data = $request->only([ - 'rewardable_type', 'rewardable_id', 'reward_quantity' + 'rewardable_type', 'rewardable_id', 'reward_quantity','earner_type' ]); if ($id && $service->editRewards($object, $data)) { @@ -48,4 +48,4 @@ public function editReward(Request $request, RewardManager $service, $model, $id return redirect()->back(); } -} \ No newline at end of file +} diff --git a/app/Models/ObjectReward.php b/app/Models/ObjectReward.php index 7d7b9f5bee..59b70f8510 100644 --- a/app/Models/ObjectReward.php +++ b/app/Models/ObjectReward.php @@ -12,7 +12,7 @@ class ObjectReward extends Model * @var array */ protected $fillable = [ - 'object_id', 'object_type', 'rewardable_id', 'rewardable_type', 'quantity', + 'object_id', 'object_type', 'rewardable_id', 'rewardable_type', 'quantity','earner_type' ]; /** @@ -42,7 +42,7 @@ public function object() /** * Get the reward attached to the prompt reward. */ - public function reward() + public function reward() { switch ($this->rewardable_type) { @@ -61,4 +61,4 @@ public function reward() } return null; } -} \ No newline at end of file +} diff --git a/app/Services/RewardManager.php b/app/Services/RewardManager.php index 84432b6984..609518bcf8 100644 --- a/app/Services/RewardManager.php +++ b/app/Services/RewardManager.php @@ -31,8 +31,13 @@ public function editRewards($object, $data) try { // We're going to remove all rewards and reattach them with the updated data + $Etype = $data['earner_type']; - $object->objectRewards()->delete(); + if($Etype == 'User'){ + $object->objectRewards()->delete(); + }else{ + $object->objectRewardsCharacter()->delete(); + } if (isset($data['rewardable_type'])) { foreach ($data['rewardable_type'] as $key => $type) { @@ -42,6 +47,7 @@ public function editRewards($object, $data) 'rewardable_type' => $type, 'rewardable_id' => $data['rewardable_id'][$key] ?? null, 'quantity' => $data['reward_quantity'][$key], + 'earner_type' => $Etype, ]); } } @@ -60,7 +66,7 @@ public function editRewards($object, $data) * @param \App\Models\User\User $user * @return mixed */ - public function grantRewards($object, $user, $recipient, $logtype, $logdata) + public function grantRewards($object, $user, $recipient, $logtype, $logdata, $isCharacter = false) { DB::beginTransaction(); @@ -70,19 +76,31 @@ public function grantRewards($object, $user, $recipient, $logtype, $logdata) } if (!$recipient) { - throw new \Exception("Invalid user."); + throw new \Exception("Invalid recipient."); } $rewards = createAssetsArray(); - foreach ($object->objectRewards as $reward) { - addAsset($rewards, $reward->reward, $reward->quantity); - } + if ($isCharacter) { + foreach ($object->objectRewardsCharacter as $reward) { + addAsset($rewards, $reward->reward, $reward->quantity); + } - // Distribute user rewards - if (!($rewards = fillUserAssets($rewards, null, $recipient, $logtype, $logdata))) { - throw new \Exception('Failed to distribute rewards to user.'); + // Distribute character rewards + if (!($rewards = fillCharacterAssets($rewards, null, $recipient, $logtype, $logdata, $user))) { + throw new \Exception('Failed to distribute rewards to character.'); + } + } else { + foreach ($object->objectRewards as $reward) { + addAsset($rewards, $reward->reward, $reward->quantity); + } + + // Distribute user rewards + if (!($rewards = fillUserAssets($rewards, null, $recipient, $logtype, $logdata))) { + throw new \Exception('Failed to distribute rewards to user.'); + } } + flash('Rewards granted successfully.')->success(); return $this->commitReturn(true); @@ -91,5 +109,4 @@ public function grantRewards($object, $user, $recipient, $logtype, $logdata) } return $this->rollbackReturn(false); } - -} \ No newline at end of file +} diff --git a/database/migrations/2024_10_13_213812_add_character_rewards.php b/database/migrations/2024_10_13_213812_add_character_rewards.php new file mode 100644 index 0000000000..e6a9d9d85c --- /dev/null +++ b/database/migrations/2024_10_13_213812_add_character_rewards.php @@ -0,0 +1,30 @@ +string('earner_type')->default('User'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/resources/views/widgets/_reward_display.blade.php b/resources/views/widgets/_reward_display.blade.php index bd9505233d..948b4ad0cf 100644 --- a/resources/views/widgets/_reward_display.blade.php +++ b/resources/views/widgets/_reward_display.blade.php @@ -1,5 +1,17 @@ +@php + if (!$earner) { + $earner = 'User'; + $rewardses = $object->objectRewards; + } elseif ($earner == 'Character') { + $rewardses = $object->objectRewardsCharacter; + } +@endphp
-

{{ ucfirst($type) }} Rewards

+

{{ ucfirst($type) }} Rewards ({!! $earner == 'User' ? 'User ' : 'Character ' !!} )

+ +@if (isset($info)) +
{!! $info !!}
+@endif @@ -9,7 +21,7 @@ - @foreach ($object->objectRewards as $reward) + @foreach ($rewardses as $reward) @@ -17,4 +29,4 @@ @endforeach
{!! $reward->reward->displayName !!} {{ $reward->quantity }}
-
\ No newline at end of file +
diff --git a/resources/views/widgets/_reward_maker.blade.php b/resources/views/widgets/_reward_maker.blade.php index 6123e93921..c370b7005e 100644 --- a/resources/views/widgets/_reward_maker.blade.php +++ b/resources/views/widgets/_reward_maker.blade.php @@ -4,23 +4,39 @@ // This file represents a common source and definition for assets used in loot_select // While it is not per se as tidy as defining these in the controller(s), // doing so this way enables better compatibility across disparate extensions - $items = \App\Models\Item\Item::orderBy('name')->pluck('name', 'id'); - $currencies = \App\Models\Currency\Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'); + + //set earner if not set + if (!$earner) { + $earner = 'User'; + } + + //isUser variable for character specifics + $isUser = $earner == 'User'; + + if ($isUser) { + $items = \App\Models\Item\Item::orderBy('name')->pluck('name', 'id'); + $currencies = \App\Models\Currency\Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'); + $raffles = \App\Models\Raffle\Raffle::where('rolled_at', null)->where('is_active', 1)->orderBy('name')->pluck('name', 'id'); + } else { + $items = \App\Models\Item\Item::whereIn('item_category_id', \App\Models\Item\ItemCategory::where('is_character_owned', 1)->pluck('id')->toArray()) + ->orderBy('name') + ->pluck('name', 'id'); + $currencies = \App\Models\Currency\Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'); + } $tables = \App\Models\Loot\LootTable::orderBy('name')->pluck('name', 'id'); - $raffles = \App\Models\Raffle\Raffle::where('rolled_at', null)->where('is_active', 1)->orderBy('name')->pluck('name', 'id'); @endphp - +{!! Form::hidden('earner_type', $earner) !!}
- Add Reward - {{ ucfirst($type) }} Rewards + Add Reward + {{ ucfirst($type) }} Rewards ({!! $isUser ? 'User ' : 'Character ' !!} )
-

You can add rewards to this {{ $type }} here.

+

You can add {!! $isUser ? 'user' : 'character' !!} rewards to this {{ $type }} here.

- +
@@ -29,11 +45,11 @@ - + @if ($rewards) @foreach ($rewards as $reward) - @@ -44,7 +60,7 @@ {!! Form::select('rewardable_id[]', $currencies, $reward->rewardable_id, ['class' => 'form-control currency-select selectize', 'placeholder' => 'Select Currency']) !!} @elseif($reward->rewardable_type == 'LootTable') {!! Form::select('rewardable_id[]', $tables, $reward->rewardable_id, ['class' => 'form-control table-select selectize', 'placeholder' => 'Select Loot Table']) !!} - @elseif($reward->rewardable_type == 'Raffle') + @elseif($isUser && $reward->rewardable_type == 'Raffle') {!! Form::select('rewardable_id[]', $raffles, $reward->rewardable_id, ['class' => 'form-control raffle-select selectize', 'placeholder' => 'Select Raffle']) !!} @endif @@ -68,11 +84,14 @@
-
+
Reward Type
{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table', 'Raffle' => 'Raffle'], $reward->rewardable_type, [ + {!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), $reward->rewardable_type, [ 'class' => 'form-control reward-type selectize', 'placeholder' => 'Select Reward Type', ]) !!}
- + - + @@ -82,25 +101,29 @@ {!! Form::select('rewardable_id[]', $items, null, ['class' => 'form-control item-select', 'placeholder' => 'Select Item']) !!} {!! Form::select('rewardable_id[]', $currencies, null, ['class' => 'form-control currency-select', 'placeholder' => 'Select Currency']) !!} {!! Form::select('rewardable_id[]', $tables, null, ['class' => 'form-control table-select', 'placeholder' => 'Select Loot Table']) !!} - {!! Form::select('rewardable_id[]', $raffles, null, ['class' => 'form-control raffle-select', 'placeholder' => 'Select Raffle']) !!} + @if ($isUser) + {!! Form::select('rewardable_id[]', $raffles, null, ['class' => 'form-control raffle-select', 'placeholder' => 'Select Raffle']) !!} + @endif \ No newline at end of file + From 7bb59c582e709e381ead4b4d42fbecac5824adf8 Mon Sep 17 00:00:00 2001 From: jam Date: Mon, 14 Oct 2024 14:43:30 -0400 Subject: [PATCH 04/15] e --- .../views/widgets/_reward_display.blade.php | 36 ++- .../views/widgets/_reward_maker.blade.php | 295 +++++++++--------- 2 files changed, 176 insertions(+), 155 deletions(-) diff --git a/resources/views/widgets/_reward_display.blade.php b/resources/views/widgets/_reward_display.blade.php index 948b4ad0cf..45907fb9fa 100644 --- a/resources/views/widgets/_reward_display.blade.php +++ b/resources/views/widgets/_reward_display.blade.php @@ -1,5 +1,5 @@ @php - if (!$earner) { + if (!isset($earner)) { $earner = 'User'; $rewardses = $object->objectRewards; } elseif ($earner == 'Character') { @@ -7,26 +7,30 @@ } @endphp
+

{{ ucfirst($type) }} Rewards ({!! $earner == 'User' ? 'User ' : 'Character ' !!} )

@if (isset($info))
{!! $info !!}
@endif - -
{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table', 'Raffle' => 'Raffle'], null, ['class' => 'form-control reward-type selectize', 'placeholder' => 'Select Reward Type']) !!}{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), null, [ + 'class' => 'form-control reward-type selectize', + 'placeholder' => 'Select Reward Type', + ]) !!} {!! Form::text('reward_quantity[]', 1, ['class' => 'form-control']) !!} Remove
- - - - - - - - @foreach ($rewardses as $reward) +@if ($rewardses->count()) +
RewardAmount
+ - - + + - @endforeach - -
{!! $reward->reward->displayName !!}{{ $reward->quantity }}RewardAmount
+ + + @foreach ($rewardses as $reward) + + {!! $reward->reward->displayName !!} + {{ $reward->quantity }} + + @endforeach + + +@else +

No rewards.

+@endif
diff --git a/resources/views/widgets/_reward_maker.blade.php b/resources/views/widgets/_reward_maker.blade.php index c370b7005e..3526857286 100644 --- a/resources/views/widgets/_reward_maker.blade.php +++ b/resources/views/widgets/_reward_maker.blade.php @@ -1,151 +1,152 @@ -{!! Form::open(['url' => 'admin/data/reward-maker/edit/' . base64_encode(urlencode(get_class($object))) . '/' . $object->id]) !!} - @php - // This file represents a common source and definition for assets used in loot_select - // While it is not per se as tidy as defining these in the controller(s), - // doing so this way enables better compatibility across disparate extensions - //set earner if not set - if (!$earner) { + if (!isset($earner)) { $earner = 'User'; } - - //isUser variable for character specifics - $isUser = $earner == 'User'; - - if ($isUser) { - $items = \App\Models\Item\Item::orderBy('name')->pluck('name', 'id'); - $currencies = \App\Models\Currency\Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'); - $raffles = \App\Models\Raffle\Raffle::where('rolled_at', null)->where('is_active', 1)->orderBy('name')->pluck('name', 'id'); - } else { - $items = \App\Models\Item\Item::whereIn('item_category_id', \App\Models\Item\ItemCategory::where('is_character_owned', 1)->pluck('id')->toArray()) - ->orderBy('name') - ->pluck('name', 'id'); - $currencies = \App\Models\Currency\Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'); - } - $tables = \App\Models\Loot\LootTable::orderBy('name')->pluck('name', 'id'); @endphp -{!! Form::hidden('earner_type', $earner) !!} -
- -
-
- Add Reward - {{ ucfirst($type) }} Rewards ({!! $isUser ? 'User ' : 'Character ' !!} ) -
-
-

You can add {!! $isUser ? 'user' : 'character' !!} rewards to this {{ $type }} here.

-
- - - - - - - - - - - @if ($rewards) - @foreach ($rewards as $reward) - - - - - - - @endforeach - @endif - -
Reward TypeRewardQuantity
{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), $reward->rewardable_type, [ - 'class' => 'form-control reward-type selectize', - 'placeholder' => 'Select Reward Type', - ]) !!} - @if ($reward->rewardable_type == 'Item') - {!! Form::select('rewardable_id[]', $items, $reward->rewardable_id, ['class' => 'form-control item-select selectize', 'placeholder' => 'Select Item']) !!} - @elseif($reward->rewardable_type == 'Currency') - {!! Form::select('rewardable_id[]', $currencies, $reward->rewardable_id, ['class' => 'form-control currency-select selectize', 'placeholder' => 'Select Currency']) !!} - @elseif($reward->rewardable_type == 'LootTable') - {!! Form::select('rewardable_id[]', $tables, $reward->rewardable_id, ['class' => 'form-control table-select selectize', 'placeholder' => 'Select Loot Table']) !!} - @elseif($isUser && $reward->rewardable_type == 'Raffle') - {!! Form::select('rewardable_id[]', $raffles, $reward->rewardable_id, ['class' => 'form-control raffle-select selectize', 'placeholder' => 'Select Raffle']) !!} - @endif - {!! Form::text('reward_quantity[]', $reward->quantity, ['class' => 'form-control']) !!}Remove
+@if (!$object->id) +
+
+
+ {{ ucfirst($type) }} Rewards ({!! $earner == 'User' ? 'User ' : 'Character ' !!} ) +
+
+

You can create {{ $earner }} rewards once the {{ $type }} has been made.

+

-
+@else + {!! Form::open(['url' => 'admin/data/reward-maker/edit/' . base64_encode(urlencode(get_class($object))) . '/' . $object->id]) !!} + + @php + // This file represents a common source and definition for assets used in loot_select + // While it is not per se as tidy as defining these in the controller(s), + // doing so this way enables better compatibility across disparate extensions + //isUser variable for character specifics + $isUser = $earner == 'User'; + + if ($isUser) { + $items = \App\Models\Item\Item::orderBy('name')->pluck('name', 'id'); + $currencies = \App\Models\Currency\Currency::where('is_user_owned', 1)->orderBy('name')->pluck('name', 'id'); + $raffles = \App\Models\Raffle\Raffle::where('rolled_at', null)->where('is_active', 1)->orderBy('name')->pluck('name', 'id'); + } else { + $items = \App\Models\Item\Item::whereIn('item_category_id', \App\Models\Item\ItemCategory::where('is_character_owned', 1)->pluck('id')->toArray()) + ->orderBy('name') + ->pluck('name', 'id'); + $currencies = \App\Models\Currency\Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'); + } + $tables = \App\Models\Loot\LootTable::orderBy('name')->pluck('name', 'id'); + @endphp + {!! Form::hidden('earner_type', $earner) !!} +
-
- {!! Form::submit('Edit Rewards', ['class' => 'btn btn-primary']) !!} -
+
+
+ Add Reward + {{ ucfirst($type) }} Rewards ({!! $isUser ? 'User ' : 'Character ' !!} ) +
+
+

You can add {!! $isUser ? 'user' : 'character' !!} rewards to this {{ $type }} here.

+ @if (isset($info)) +
{!! $info !!}
+ @endif +
+ + + + + + + + + + + @if ($rewards) + @foreach ($rewards as $reward) + + + + + + + @endforeach + @endif + +
Reward TypeRewardQuantity
{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), $reward->rewardable_type, [ + 'class' => 'form-control reward-type selectize', + 'placeholder' => 'Select Reward Type', + ]) !!} + @if ($reward->rewardable_type == 'Item') + {!! Form::select('rewardable_id[]', $items, $reward->rewardable_id, ['class' => 'form-control item-select selectize', 'placeholder' => 'Select Item']) !!} + @elseif($reward->rewardable_type == 'Currency') + {!! Form::select('rewardable_id[]', $currencies, $reward->rewardable_id, ['class' => 'form-control currency-select selectize', 'placeholder' => 'Select Currency']) !!} + @elseif($reward->rewardable_type == 'LootTable') + {!! Form::select('rewardable_id[]', $tables, $reward->rewardable_id, ['class' => 'form-control table-select selectize', 'placeholder' => 'Select Loot Table']) !!} + @elseif($isUser && $reward->rewardable_type == 'Raffle') + {!! Form::select('rewardable_id[]', $raffles, $reward->rewardable_id, ['class' => 'form-control raffle-select selectize', 'placeholder' => 'Select Raffle']) !!} + @endif + {!! Form::text('reward_quantity[]', $reward->quantity, ['class' => 'form-control']) !!}Remove
+
+
+
-{!! Form::close() !!} -
+
+ {!! Form::submit('Edit ' . $earner . ' Rewards', ['class' => 'btn btn-primary']) !!} +
-
- - - - - - - - - -
{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), null, [ - 'class' => 'form-control reward-type selectize', - 'placeholder' => 'Select Reward Type', - ]) !!}{!! Form::text('reward_quantity[]', 1, ['class' => 'form-control']) !!}Remove
- {!! Form::select('rewardable_id[]', $items, null, ['class' => 'form-control item-select', 'placeholder' => 'Select Item']) !!} - {!! Form::select('rewardable_id[]', $currencies, null, ['class' => 'form-control currency-select', 'placeholder' => 'Select Currency']) !!} - {!! Form::select('rewardable_id[]', $tables, null, ['class' => 'form-control table-select', 'placeholder' => 'Select Loot Table']) !!} - @if ($isUser) - {!! Form::select('rewardable_id[]', $raffles, null, ['class' => 'form-control raffle-select', 'placeholder' => 'Select Raffle']) !!} - @endif -
+ {!! Form::close() !!} +
- + function attachRewardTypeListener(node) { + node.on('change', function(e) { + var val = $(this).val(); + var $cell = $(this).parent().parent().find('.reward-row-select'); + var $clone = null; + if (val == 'Item') $clone = $itemSelect.clone(); + else if (val == 'Currency') $clone = $currencySelect.clone(); + else if (val == 'LootTable') $clone = $tableSelect.clone(); + @if ($isUser) + else if (val == 'Raffle') $clone = $raffleSelect.clone(); + @endif + $cell.html(''); + $cell.append($clone); + $clone.selectize(); + }); + } + + function attachRemoveListener(node) { + node.on('click', function(e) { + e.preventDefault(); + $(this).parent().parent().remove(); + }); + } + }); + +@endif From 49d9626026f5cc7ddf50fbae50c3e10467b3d896 Mon Sep 17 00:00:00 2001 From: jam Date: Mon, 14 Oct 2024 14:50:28 -0400 Subject: [PATCH 05/15] i forgor --- app/Services/RewardManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Services/RewardManager.php b/app/Services/RewardManager.php index 609518bcf8..65977ffb81 100644 --- a/app/Services/RewardManager.php +++ b/app/Services/RewardManager.php @@ -101,7 +101,7 @@ public function grantRewards($object, $user, $recipient, $logtype, $logdata, $is } } - flash('Rewards granted successfully.')->success(); + flash( ($isCharacter ? 'Character' : 'User').' rewards granted successfully.')->success(); return $this->commitReturn(true); } catch (\Exception $e) { From 5c520dab952f537417f97053f42d3a77b188b08d Mon Sep 17 00:00:00 2001 From: jam Date: Mon, 21 Oct 2024 00:06:54 -0400 Subject: [PATCH 06/15] aa --- app/Helpers/AssetHelpers.php | 2 +- .../Admin/Data/RewardController.php | 2 +- app/Models/ObjectReward.php | 34 +++---- app/Services/RewardManager.php | 34 ++++--- .../2024_10_18_023955_update_reward_maker.php | 32 +++++++ .../2024_10_21_003129_add_reward_key.php | 32 +++++++ .../views/widgets/_reward_display.blade.php | 18 ++-- .../views/widgets/_reward_maker.blade.php | 88 ++++++++++--------- 8 files changed, 151 insertions(+), 91 deletions(-) create mode 100644 database/migrations/2024_10_18_023955_update_reward_maker.php create mode 100644 database/migrations/2024_10_21_003129_add_reward_key.php diff --git a/app/Helpers/AssetHelpers.php b/app/Helpers/AssetHelpers.php index 78685c204c..e434af7f3a 100644 --- a/app/Helpers/AssetHelpers.php +++ b/app/Helpers/AssetHelpers.php @@ -83,7 +83,7 @@ function getAssetModelString($type, $namespaced = true) { switch($type) { - case 'items': + case 'items': case 'item': if($namespaced) return '\App\Models\Item\Item'; else return 'Item'; break; diff --git a/app/Http/Controllers/Admin/Data/RewardController.php b/app/Http/Controllers/Admin/Data/RewardController.php index 71496ad75d..9e03986297 100644 --- a/app/Http/Controllers/Admin/Data/RewardController.php +++ b/app/Http/Controllers/Admin/Data/RewardController.php @@ -34,7 +34,7 @@ public function editReward(Request $request, RewardManager $service, $model, $id } $data = $request->only([ - 'rewardable_type', 'rewardable_id', 'reward_quantity','earner_type' + 'rewardable_type', 'rewardable_id', 'reward_quantity','recipient_type','reward_key' ]); if ($id && $service->editRewards($object, $data)) { diff --git a/app/Models/ObjectReward.php b/app/Models/ObjectReward.php index 59b70f8510..58fe6cc272 100644 --- a/app/Models/ObjectReward.php +++ b/app/Models/ObjectReward.php @@ -12,7 +12,7 @@ class ObjectReward extends Model * @var array */ protected $fillable = [ - 'object_id', 'object_type', 'rewardable_id', 'rewardable_type', 'quantity','earner_type' + 'object_id', 'object_type', 'rewardable_id', 'rewardable_type', 'quantity','recipient_type','reward_key' ]; /** @@ -31,12 +31,7 @@ class ObjectReward extends Model */ public function object() { - switch ($this->object_type) { - case 'Prompt': - return $this->belongsTo('App\Models\Prompt\Prompt', 'object_id'); - break; - } - return null; + return $this->morphTo(__FUNCTION__, 'object_type', 'object_id'); } /** @@ -44,21 +39,14 @@ public function object() */ public function reward() { - switch ($this->rewardable_type) - { - case 'Item': - return $this->belongsTo('App\Models\Item\Item', 'rewardable_id'); - break; - case 'Currency': - return $this->belongsTo('App\Models\Currency\Currency', 'rewardable_id'); - break; - case 'LootTable': - return $this->belongsTo('App\Models\Loot\LootTable', 'rewardable_id'); - break; - case 'Raffle': - return $this->belongsTo('App\Models\Raffle\Raffle', 'rewardable_id'); - break; - } - return null; + return $this->morphTo(__FUNCTION__, 'rewardable_type', 'rewardable_id'); + } + + /** + * Get the reward type so we don't have to do the no-no of model names in forms + */ + public function rewardType() + { + return class_basename($this->rewardable_type); } } diff --git a/app/Services/RewardManager.php b/app/Services/RewardManager.php index 65977ffb81..b6958c3dda 100644 --- a/app/Services/RewardManager.php +++ b/app/Services/RewardManager.php @@ -29,25 +29,31 @@ public function editRewards($object, $data) DB::beginTransaction(); try { + if (!isset($data['reward_key'])) { + throw new \Exception('You must set a reward key.'); + } + if (!isset($data['recipient_type'])) { + throw new \Exception('You must select a recipient.'); + } // We're going to remove all rewards and reattach them with the updated data - $Etype = $data['earner_type']; - - if($Etype == 'User'){ - $object->objectRewards()->delete(); - }else{ - $object->objectRewardsCharacter()->delete(); - } + //update the key variable because for some reason it doesn't like being called directly????????????? + $rewardkey = $data['reward_key']; + $object->$rewardkey()->delete(); if (isset($data['rewardable_type'])) { foreach ($data['rewardable_type'] as $key => $type) { + + $model = strtolower($type); + ObjectReward::create([ 'object_id' => $object->id, - 'object_type' => class_basename($object), - 'rewardable_type' => $type, + 'object_type' => get_class($object), + 'rewardable_type' => getAssetModelString($model), 'rewardable_id' => $data['rewardable_id'][$key] ?? null, 'quantity' => $data['reward_quantity'][$key], - 'earner_type' => $Etype, + 'recipient_type' => $data['recipient_type'], + 'reward_key' => $data['reward_key'], ]); } } @@ -66,7 +72,7 @@ public function editRewards($object, $data) * @param \App\Models\User\User $user * @return mixed */ - public function grantRewards($object, $user, $recipient, $logtype, $logdata, $isCharacter = false) + public function grantRewards($object, $user, $recipient, $logtype, $logdata, $rewardKey, $isCharacter = false) { DB::beginTransaction(); @@ -82,7 +88,7 @@ public function grantRewards($object, $user, $recipient, $logtype, $logdata, $is $rewards = createAssetsArray(); if ($isCharacter) { - foreach ($object->objectRewardsCharacter as $reward) { + foreach ($object->$rewardKey as $reward) { addAsset($rewards, $reward->reward, $reward->quantity); } @@ -91,7 +97,7 @@ public function grantRewards($object, $user, $recipient, $logtype, $logdata, $is throw new \Exception('Failed to distribute rewards to character.'); } } else { - foreach ($object->objectRewards as $reward) { + foreach ($object->$rewardKey as $reward) { addAsset($rewards, $reward->reward, $reward->quantity); } @@ -101,7 +107,7 @@ public function grantRewards($object, $user, $recipient, $logtype, $logdata, $is } } - flash( ($isCharacter ? 'Character' : 'User').' rewards granted successfully.')->success(); + flash(($isCharacter ? 'Character' : 'User') . ' rewards granted successfully.')->success(); return $this->commitReturn(true); } catch (\Exception $e) { diff --git a/database/migrations/2024_10_18_023955_update_reward_maker.php b/database/migrations/2024_10_18_023955_update_reward_maker.php new file mode 100644 index 0000000000..dc25390d37 --- /dev/null +++ b/database/migrations/2024_10_18_023955_update_reward_maker.php @@ -0,0 +1,32 @@ +renameColumn('earner_type', 'recipient_type'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('object_rewards', function (Blueprint $table) { + $table->renameColumn('recipient_type', 'earner_type'); + }); + } +} diff --git a/database/migrations/2024_10_21_003129_add_reward_key.php b/database/migrations/2024_10_21_003129_add_reward_key.php new file mode 100644 index 0000000000..81db7ba3fa --- /dev/null +++ b/database/migrations/2024_10_21_003129_add_reward_key.php @@ -0,0 +1,32 @@ +string('reward_key')->default('objectRewards'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('object_rewards', function (Blueprint $table) { + $table->dropColumn('reward_key'); + }); + } +} diff --git a/resources/views/widgets/_reward_display.blade.php b/resources/views/widgets/_reward_display.blade.php index 45907fb9fa..2791a5a0a8 100644 --- a/resources/views/widgets/_reward_display.blade.php +++ b/resources/views/widgets/_reward_display.blade.php @@ -1,19 +1,11 @@ -@php - if (!isset($earner)) { - $earner = 'User'; - $rewardses = $object->objectRewards; - } elseif ($earner == 'Character') { - $rewardses = $object->objectRewardsCharacter; - } -@endphp
-

{{ ucfirst($type) }} Rewards ({!! $earner == 'User' ? 'User ' : 'Character ' !!} )

+

{{ ucfirst($type) }} Rewards ({!! $recipient == 'User' ? 'User ' : 'Character ' !!} )

@if (isset($info))
{!! $info !!}
@endif -@if ($rewardses->count()) +@if ($object->$reward_key->count()) @@ -22,7 +14,7 @@ - @foreach ($rewardses as $reward) + @foreach ($object->$reward_key as $reward) @@ -33,4 +25,6 @@ @else

No rewards.

@endif -
+@if (isset($showHr) && $showHr) +
+@endif diff --git a/resources/views/widgets/_reward_maker.blade.php b/resources/views/widgets/_reward_maker.blade.php index 3526857286..6a67d12804 100644 --- a/resources/views/widgets/_reward_maker.blade.php +++ b/resources/views/widgets/_reward_maker.blade.php @@ -1,17 +1,20 @@ @php - //set earner if not set - if (!isset($earner)) { - $earner = 'User'; + //idk what to name this variable, it's in case you want to add an addition to the title ($keytitle user rewards) given that now we have reward keys for multiple attachments to the same model + +//so instead of just periodic rewards you could add some other textual identifier for another purpose so you won't confuse yourself with multiple identical fields. + if (!isset($keytitle)) { + $keytitle = ''; } @endphp + @if (!$object->id)
- {{ ucfirst($type) }} Rewards ({!! $earner == 'User' ? 'User ' : 'Character ' !!} ) + {{ $keytitle }} {{ ucfirst($type) }} Rewards ({!! $recipient == 'User' ? 'User ' : 'Character ' !!} )
-

You can create {{ $earner }} rewards once the {{ $type }} has been made.

+

You can create {{ $keytitle }} {{ $recipient }} rewards once the {{ $type }} has been made.

@@ -24,7 +27,7 @@ // doing so this way enables better compatibility across disparate extensions //isUser variable for character specifics - $isUser = $earner == 'User'; + $isUser = $recipient == 'User'; if ($isUser) { $items = \App\Models\Item\Item::orderBy('name')->pluck('name', 'id'); @@ -38,21 +41,25 @@ } $tables = \App\Models\Loot\LootTable::orderBy('name')->pluck('name', 'id'); @endphp - {!! Form::hidden('earner_type', $earner) !!} + {!! Form::hidden('recipient_type', $recipient) !!} + {!! Form::hidden('reward_key', $reward_key) !!}
-
- Add Reward - {{ ucfirst($type) }} Rewards ({!! $isUser ? 'User ' : 'Character ' !!} ) +
+ Add Reward +
+

{{ $keytitle }} {{ ucfirst($type) }} Rewards ({!! $isUser ? 'User ' : 'Character ' !!} )

+
Display is collapsed to shorten the page, click to expand
+
-
-

You can add {!! $isUser ? 'user' : 'character' !!} rewards to this {{ $type }} here.

+
{!! $reward->reward->displayName !!} {{ $reward->quantity }}
+
@@ -61,22 +68,22 @@ - - @if ($rewards) - @foreach ($rewards as $reward) + + @if ($object->$reward_key) + @foreach ($object->$reward_key as $reward) - @@ -91,18 +98,19 @@ -
- {!! Form::submit('Edit ' . $earner . ' Rewards', ['class' => 'btn btn-primary']) !!} + {!! Form::submit('Edit ' . $keytitle . ' ' . $recipient . ' Rewards', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!} -
+ @if (isset($showHr) && $showHr) +
+ @endif -
+
Reward Type
{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), $reward->rewardable_type, [ + {!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), $reward->rewardType(), [ 'class' => 'form-control reward-type selectize', 'placeholder' => 'Select Reward Type', ]) !!} - @if ($reward->rewardable_type == 'Item') + @if ($reward->rewardType() == 'Item') {!! Form::select('rewardable_id[]', $items, $reward->rewardable_id, ['class' => 'form-control item-select selectize', 'placeholder' => 'Select Item']) !!} - @elseif($reward->rewardable_type == 'Currency') + @elseif($reward->rewardType() == 'Currency') {!! Form::select('rewardable_id[]', $currencies, $reward->rewardable_id, ['class' => 'form-control currency-select selectize', 'placeholder' => 'Select Currency']) !!} - @elseif($reward->rewardable_type == 'LootTable') + @elseif($reward->rewardType() == 'LootTable') {!! Form::select('rewardable_id[]', $tables, $reward->rewardable_id, ['class' => 'form-control table-select selectize', 'placeholder' => 'Select Loot Table']) !!} - @elseif($isUser && $reward->rewardable_type == 'Raffle') + @elseif($isUser && $reward->rewardType() == 'Raffle') {!! Form::select('rewardable_id[]', $raffles, $reward->rewardable_id, ['class' => 'form-control raffle-select selectize', 'placeholder' => 'Select Raffle']) !!} @endif
- +
{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), null, [ 'class' => 'form-control reward-type selectize', @@ -125,23 +133,23 @@ -@endsection \ No newline at end of file + @parent + @include('js._loot_js', ['showLootTables' => true, 'showRaffles' => true]) + +@endsection diff --git a/resources/views/prompts/_prompt_entry.blade.php b/resources/views/prompts/_prompt_entry.blade.php index 011e3f90e1..6122e3af9f 100644 --- a/resources/views/prompts/_prompt_entry.blade.php +++ b/resources/views/prompts/_prompt_entry.blade.php @@ -31,27 +31,19 @@

Submissions to this prompt are hidden.

@endif -

Rewards

- @if(!count($prompt->rewards)) - No rewards. - @else - - - - - - - - - @foreach($prompt->rewards as $reward) - - - - - @endforeach - -
RewardAmount
{!! $reward->reward->displayName !!}{{ $reward->quantity }}
- @endif + @include('widgets._reward_display', [ + 'object' => $prompt, + 'type' => 'prompt', + 'reward_key' => 'objectRewards', + 'recipient' => 'User', + ]) + @include('widgets._reward_display', [ + 'object' => $prompt, + 'type' => 'prompt', + 'reward_key' => 'objectCharacterRewards', + 'recipient' => 'Character', + 'info' => 'Only focus characters will recieve these rewards.', + ])
@if($prompt->end_at && $prompt->end_at->isPast()) diff --git a/resources/views/widgets/_reward_display.blade.php b/resources/views/widgets/_reward_display.blade.php index 2791a5a0a8..a40b4e0f2c 100644 --- a/resources/views/widgets/_reward_display.blade.php +++ b/resources/views/widgets/_reward_display.blade.php @@ -1,3 +1,7 @@ +@php + $rewards = objectRewards($object, $reward_key, $recipient); +@endphp +

{{ ucfirst($type) }} Rewards ({!! $recipient == 'User' ? 'User ' : 'Character ' !!} )

@@ -5,7 +9,7 @@ @if (isset($info))
{!! $info !!}
@endif -@if ($object->$reward_key->count()) +@if ($rewards->count()) @@ -14,7 +18,7 @@ - @foreach ($object->$reward_key as $reward) + @foreach ($rewards as $reward) diff --git a/resources/views/widgets/_reward_maker.blade.php b/resources/views/widgets/_reward_maker.blade.php index 6a67d12804..86550972b3 100644 --- a/resources/views/widgets/_reward_maker.blade.php +++ b/resources/views/widgets/_reward_maker.blade.php @@ -1,7 +1,7 @@ @php //idk what to name this variable, it's in case you want to add an addition to the title ($keytitle user rewards) given that now we have reward keys for multiple attachments to the same model -//so instead of just periodic rewards you could add some other textual identifier for another purpose so you won't confuse yourself with multiple identical fields. +//so you could add some other textual identifier for another purpose so you won't confuse yourself with multiple identical fields. if (!isset($keytitle)) { $keytitle = ''; } @@ -40,6 +40,12 @@ $currencies = \App\Models\Currency\Currency::where('is_character_owned', 1)->orderBy('sort_character', 'DESC')->pluck('name', 'id'); } $tables = \App\Models\Loot\LootTable::orderBy('name')->pluck('name', 'id'); + + //get the rewards + $rewards = objectRewards($object, $reward_key, $recipient); + + //get the types + $reward_types = ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []); @endphp {!! Form::hidden('recipient_type', $recipient) !!} {!! Form::hidden('reward_key', $reward_key) !!} @@ -69,10 +75,10 @@ - @if ($object->$reward_key) - @foreach ($object->$reward_key as $reward) + @if ($rewards->count()) + @foreach ($rewards as $reward) - @@ -112,7 +118,7 @@
{!! $reward->reward->displayName !!} {{ $reward->quantity }}
{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), $reward->rewardType(), [ + {!! Form::select('rewardable_type[]', $reward_types, $reward->rewardType(), [ 'class' => 'form-control reward-type selectize', 'placeholder' => 'Select Reward Type', ]) !!}
- From 8ca39e8cc9bff551d3b8bdc059d3a9c03e0b0626 Mon Sep 17 00:00:00 2001 From: CH3RVB Date: Sun, 12 Jan 2025 19:40:22 -0500 Subject: [PATCH 08/15] no message --- app/Helpers/AssetHelpers.php | 9 +- .../Admin/Data/PromptController.php | 2 +- .../Admin/SubmissionController.php | 2 +- .../Users/SubmissionController.php | 6 +- app/Models/Prompt/Prompt.php | 7 - app/Models/Submission/SubmissionCharacter.php | 2 +- app/Services/PromptService.php | 27 -- app/Services/SubmissionManager.php | 231 +++++++++++------- ...14_165017_add_character_prompt_rewards.php | 34 +++ .../prompts/create_edit_prompt.blade.php | 8 - resources/views/home/_prompt.blade.php | 19 ++ .../views/home/_submission_content.blade.php | 4 +- .../views/home/_submission_form.blade.php | 2 + .../views/home/submissions_closed.blade.php | 2 + .../views/js/_character_select_js.blade.php | 1 + .../views/prompts/_prompt_entry.blade.php | 24 +- .../views/widgets/_character_select.blade.php | 4 + .../widgets/_character_select_entry.blade.php | 6 + 18 files changed, 247 insertions(+), 143 deletions(-) create mode 100644 database/migrations/2024_10_14_165017_add_character_prompt_rewards.php diff --git a/app/Helpers/AssetHelpers.php b/app/Helpers/AssetHelpers.php index c870b91f35..6b29591b5a 100644 --- a/app/Helpers/AssetHelpers.php +++ b/app/Helpers/AssetHelpers.php @@ -171,11 +171,12 @@ function createAssetsArray($isCharacter = false) { * * @param array $first * @param array $second + * @param mixed $isCharacter * * @return array */ -function mergeAssetsArrays($first, $second) { - $keys = getAssetKeys(); +function mergeAssetsArrays($first, $second, $isCharacter = false) { + $keys = getAssetKeys($isCharacter); foreach ($keys as $key) { foreach ($second[$key] as $item) { addAsset($first, $item['asset'], $item['quantity']); @@ -256,8 +257,8 @@ function getDataReadyAssets($array, $isCharacter = false) { * * @return array */ -function parseAssetData($array) { - $assets = createAssetsArray(); +function parseAssetData($array, $isCharacter = false) { + $assets = createAssetsArray($isCharacter); foreach ($array as $key => $contents) { $model = getAssetModelString($key); if ($model) { diff --git a/app/Http/Controllers/Admin/Data/PromptController.php b/app/Http/Controllers/Admin/Data/PromptController.php index ed19ceb6d2..38ef7fde98 100644 --- a/app/Http/Controllers/Admin/Data/PromptController.php +++ b/app/Http/Controllers/Admin/Data/PromptController.php @@ -210,7 +210,7 @@ public function getEditPrompt($id) { public function postCreateEditPrompt(Request $request, PromptService $service, $id = null) { $id ? $request->validate(Prompt::$updateRules) : $request->validate(Prompt::$createRules); $data = $request->only([ - 'name', 'prompt_category_id', 'summary', 'description', 'start_at', 'end_at', 'hide_before_start', 'hide_after_end', 'is_active', 'rewardable_type', 'rewardable_id', 'quantity', 'image', 'remove_image', 'prefix', 'hide_submissions', 'staff_only', + 'name', 'prompt_category_id', 'summary', 'description', 'start_at', 'end_at', 'hide_before_start', 'hide_after_end', 'is_active','image', 'remove_image', 'prefix', 'hide_submissions', 'staff_only' ]); if ($id && $service->updatePrompt(Prompt::find($id), $data, Auth::user())) { flash('Prompt updated successfully.')->success(); diff --git a/app/Http/Controllers/Admin/SubmissionController.php b/app/Http/Controllers/Admin/SubmissionController.php index 85d02b7749..5035d71c5a 100644 --- a/app/Http/Controllers/Admin/SubmissionController.php +++ b/app/Http/Controllers/Admin/SubmissionController.php @@ -152,7 +152,7 @@ public function getClaim($id) { * @return \Illuminate\Http\RedirectResponse */ public function postSubmission(Request $request, SubmissionManager $service, $id, $action) { - $data = $request->only(['slug', 'character_rewardable_quantity', 'character_rewardable_id', 'character_rewardable_type', 'character_currency_id', 'rewardable_type', 'rewardable_id', 'quantity', 'staff_comments']); + $data = $request->only(['slug', 'character_rewardable_quantity', 'character_rewardable_id', 'character_rewardable_type', 'character_currency_id', 'rewardable_type', 'rewardable_id', 'quantity', 'staff_comments','character_is_focus']); if ($action == 'reject' && $service->rejectSubmission($request->only(['staff_comments']) + ['id' => $id], Auth::user())) { flash('Submission rejected successfully.')->success(); } elseif ($action == 'cancel' && $service->cancelSubmission($request->only(['staff_comments']) + ['id' => $id], Auth::user())) { diff --git a/app/Http/Controllers/Users/SubmissionController.php b/app/Http/Controllers/Users/SubmissionController.php index 780e7ba76a..6e014650dd 100644 --- a/app/Http/Controllers/Users/SubmissionController.php +++ b/app/Http/Controllers/Users/SubmissionController.php @@ -212,7 +212,7 @@ public function postNewSubmission(Request $request, SubmissionManager $service, $request->only([ 'url', 'prompt_id', 'comments', 'slug', 'character_rewardable_type', 'character_rewardable_id', 'character_rewardable_quantity', 'rewardable_type', 'rewardable_id', 'quantity', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity', - 'gallery_submission_id', + 'gallery_submission_id','character_is_focus' ]), Auth::user(), false, @@ -257,13 +257,13 @@ public function postEditSubmission(Request $request, SubmissionManager $service, if ($submit && $service->editSubmission($submission, $request->only([ 'url', 'prompt_id', 'comments', 'slug', 'character_rewardable_type', 'character_rewardable_id', 'character_rewardable_quantity', 'rewardable_type', 'rewardable_id', 'quantity', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity', - 'gallery_submission_id', + 'gallery_submission_id','character_is_focus' ]), Auth::user(), false, $submit)) { flash('Draft submitted successfully.')->success(); } elseif ($service->editSubmission($submission, $request->only([ 'url', 'prompt_id', 'comments', 'slug', 'character_rewardable_type', 'character_rewardable_id', 'character_rewardable_quantity', 'rewardable_type', 'rewardable_id', 'quantity', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity', - 'gallery_submission_id', + 'gallery_submission_id','character_is_focus' ]), Auth::user())) { flash('Draft saved successfully.')->success(); diff --git a/app/Models/Prompt/Prompt.php b/app/Models/Prompt/Prompt.php index bd78af27ef..493ec8ad3d 100644 --- a/app/Models/Prompt/Prompt.php +++ b/app/Models/Prompt/Prompt.php @@ -75,13 +75,6 @@ public function category() { return $this->belongsTo(PromptCategory::class, 'prompt_category_id'); } - /** - * Get the rewards attached to this prompt. - */ - public function rewards() { - return $this->hasMany(PromptReward::class, 'prompt_id'); - } - /********************************************************************************************** SCOPES diff --git a/app/Models/Submission/SubmissionCharacter.php b/app/Models/Submission/SubmissionCharacter.php index 006adccdc6..17b629a884 100644 --- a/app/Models/Submission/SubmissionCharacter.php +++ b/app/Models/Submission/SubmissionCharacter.php @@ -12,7 +12,7 @@ class SubmissionCharacter extends Model { * @var array */ protected $fillable = [ - 'submission_id', 'character_id', 'data', + 'submission_id', 'character_id', 'data','is_focus' ]; /** diff --git a/app/Services/PromptService.php b/app/Services/PromptService.php index 44127055c8..4cd0eacd2a 100644 --- a/app/Services/PromptService.php +++ b/app/Services/PromptService.php @@ -208,8 +208,6 @@ public function createPrompt($data, $user) { $this->handleImage($image, $prompt->imagePath, $prompt->imageFileName); } - $this->populateRewards(Arr::only($data, ['rewardable_type', 'rewardable_id', 'quantity']), $prompt); - return $this->commitReturn($prompt); } catch (\Exception $e) { $this->setError('error', $e->getMessage()); @@ -266,8 +264,6 @@ public function updatePrompt($prompt, $data, $user) { $this->handleImage($image, $prompt->imagePath, $prompt->imageFileName); } - $this->populateRewards(Arr::only($data, ['rewardable_type', 'rewardable_id', 'quantity']), $prompt); - return $this->commitReturn($prompt); } catch (\Exception $e) { $this->setError('error', $e->getMessage()); @@ -292,7 +288,6 @@ public function deletePrompt($prompt) { throw new \Exception('A submission under this prompt exists. Deleting the prompt will break the submission page - consider setting the prompt to be not active instead.'); } - $prompt->rewards()->delete(); if ($prompt->has_image) { $this->deleteImage($prompt->imagePath, $prompt->imageFileName); } @@ -368,26 +363,4 @@ private function populateData($data, $prompt = null) { return $data; } - - /** - * Processes user input for creating/updating prompt rewards. - * - * @param array $data - * @param Prompt $prompt - */ - private function populateRewards($data, $prompt) { - // Clear the old rewards... - $prompt->rewards()->delete(); - - if (isset($data['rewardable_type'])) { - foreach ($data['rewardable_type'] as $key => $type) { - PromptReward::create([ - 'prompt_id' => $prompt->id, - 'rewardable_type' => $type, - 'rewardable_id' => $data['rewardable_id'][$key], - 'quantity' => $data['quantity'][$key], - ]); - } - } - } } diff --git a/app/Services/SubmissionManager.php b/app/Services/SubmissionManager.php index 71dbefa053..4b453abda1 100644 --- a/app/Services/SubmissionManager.php +++ b/app/Services/SubmissionManager.php @@ -18,7 +18,8 @@ use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; -class SubmissionManager extends Service { +class SubmissionManager extends Service +{ /* |-------------------------------------------------------------------------- | Submission Manager @@ -26,7 +27,7 @@ class SubmissionManager extends Service { | | Handles creation and modification of submission data. | - */ + */ /** * Creates a new submission. @@ -38,7 +39,8 @@ class SubmissionManager extends Service { * * @return mixed */ - public function createSubmission($data, $user, $isClaim = false, $isDraft = false) { + public function createSubmission($data, $user, $isClaim = false, $isDraft = false) + { DB::beginTransaction(); try { @@ -68,11 +70,11 @@ public function createSubmission($data, $user, $isClaim = false, $isDraft = fals // Create the submission itself. $submission = Submission::create([ - 'user_id' => $user->id, - 'url' => $data['url'] ?? null, - 'status' => $isDraft ? 'Draft' : 'Pending', - 'comments' => $data['comments'], - 'data' => null, + 'user_id' => $user->id, + 'url' => $data['url'] ?? null, + 'status' => $isDraft ? 'Draft' : 'Pending', + 'comments' => $data['comments'], + 'data' => null, ] + ($isClaim ? [] : [ 'prompt_id' => $prompt->id, ])); @@ -84,7 +86,7 @@ public function createSubmission($data, $user, $isClaim = false, $isDraft = fals $submission->update([ 'data' => json_encode([ - 'user' => Arr::only(getDataReadyAssets($userAssets), ['user_items', 'currencies']), + 'user' => Arr::only(getDataReadyAssets($userAssets), ['user_items', 'currencies']), 'rewards' => getDataReadyAssets($promptRewards), ] + (config('lorekeeper.settings.allow_gallery_submissions_on_prompts') ? ['gallery_submission_id' => $data['gallery_submission_id'] ?? null] : [])), ]); @@ -111,7 +113,8 @@ public function createSubmission($data, $user, $isClaim = false, $isDraft = fals * * @return mixed */ - public function editSubmission($submission, $data, $user, $isClaim = false, $isSubmit = false) { + public function editSubmission($submission, $data, $user, $isClaim = false, $isSubmit = false) + { DB::beginTransaction(); try { @@ -152,12 +155,12 @@ public function editSubmission($submission, $data, $user, $isClaim = false, $isS // Modify submission $submission->update([ - 'url' => $data['url'] ?? null, - 'updated_at' => Carbon::now(), - 'comments' => $data['comments'], - 'data' => json_encode([ - 'user' => Arr::only(getDataReadyAssets($userAssets), ['user_items', 'currencies']), - 'rewards' => getDataReadyAssets($promptRewards), + 'url' => $data['url'] ?? null, + 'updated_at' => Carbon::now(), + 'comments' => $data['comments'], + 'data' => json_encode([ + 'user' => Arr::only(getDataReadyAssets($userAssets), ['user_items', 'currencies']), + 'rewards' => getDataReadyAssets($promptRewards), ] + (config('lorekeeper.settings.allow_gallery_submissions_on_prompts') ? ['gallery_submission_id' => $data['gallery_submission_id'] ?? null] : [])), ] + ($isClaim ? [] : ['prompt_id' => $prompt->id])); @@ -175,7 +178,8 @@ public function editSubmission($submission, $data, $user, $isClaim = false, $isS * @param mixed $data the submission data * @param mixed $user the user performing the cancellation */ - public function cancelSubmission($data, $user) { + public function cancelSubmission($data, $user) + { DB::beginTransaction(); try { @@ -203,6 +207,13 @@ public function cancelSubmission($data, $user) { $userAssets = $assets['user']; // Remove prompt-only rewards $promptRewards = $this->removePromptAttachments($submission); + // ...aaand the same for characters + if ($submission->characters()->count()) { + foreach ($submission->characters as $character) { + $characterPromptRewards = $this->removeCharacterPromptAttachments($submission, $character); + $character->update(['data' => json_encode(getDataReadyAssets($characterPromptRewards))]); + } + } if ($user->id != $submission->user_id) { // The only things we need to set are: @@ -210,31 +221,31 @@ public function cancelSubmission($data, $user) { // 2. staff ID // 3. status $submission->update([ - 'staff_comments' => $data['staff_comments'], + 'staff_comments' => $data['staff_comments'], 'parsed_staff_comments' => $data['parsed_staff_comments'], - 'updated_at' => Carbon::now(), - 'staff_id' => $user->id, - 'status' => 'Draft', - 'data' => json_encode([ - 'user' => $userAssets, - 'rewards' => getDataReadyAssets($promptRewards), + 'updated_at' => Carbon::now(), + 'staff_id' => $user->id, + 'status' => 'Draft', + 'data' => json_encode([ + 'user' => $userAssets, + 'rewards' => getDataReadyAssets($promptRewards), 'gallery_submission_id' => $submission->data['gallery_submission_id'] ?? null, ]), // list of rewards and addons ]); Notifications::create($submission->prompt_id ? 'SUBMISSION_CANCELLED' : 'CLAIM_CANCELLED', $submission->user, [ - 'staff_url' => $user->url, - 'staff_name' => $user->name, + 'staff_url' => $user->url, + 'staff_name' => $user->name, 'submission_id' => $submission->id, ]); } else { // This is when a user cancels their own submission back into draft form $submission->update([ - 'status' => 'Draft', + 'status' => 'Draft', 'updated_at' => Carbon::now(), - 'data' => json_encode([ - 'user' => $userAssets, - 'rewards' => getDataReadyAssets($promptRewards), + 'data' => json_encode([ + 'user' => $userAssets, + 'rewards' => getDataReadyAssets($promptRewards), 'gallery_submission_id' => $submission->data['gallery_submission_id'] ?? null, ]), // list of rewards and addons ]); @@ -256,7 +267,8 @@ public function cancelSubmission($data, $user) { * * @return mixed */ - public function rejectSubmission($data, $user) { + public function rejectSubmission($data, $user) + { DB::beginTransaction(); try { @@ -287,19 +299,19 @@ public function rejectSubmission($data, $user) { // 2. staff ID // 3. status $submission->update([ - 'staff_comments' => $data['staff_comments'], + 'staff_comments' => $data['staff_comments'], 'parsed_staff_comments' => $data['parsed_staff_comments'], - 'staff_id' => $user->id, - 'status' => 'Rejected', + 'staff_id' => $user->id, + 'status' => 'Rejected', ]); Notifications::create($submission->prompt_id ? 'SUBMISSION_REJECTED' : 'CLAIM_REJECTED', $submission->user, [ - 'staff_url' => $user->url, - 'staff_name' => $user->name, + 'staff_url' => $user->url, + 'staff_name' => $user->name, 'submission_id' => $submission->id, ]); - if (!$this->logAdminAction($user, 'Submission Rejected', 'Rejected submission #'.$submission->id.'')) { + if (!$this->logAdminAction($user, 'Submission Rejected', 'Rejected submission #' . $submission->id . '')) { throw new \Exception('Failed to log admin action.'); } @@ -319,7 +331,8 @@ public function rejectSubmission($data, $user) { * * @return mixed */ - public function approveSubmission($data, $user) { + public function approveSubmission($data, $user) + { DB::beginTransaction(); try { @@ -338,10 +351,10 @@ public function approveSubmission($data, $user) { foreach ($addonData['user_items'] as $userItemId => $quantity) { $userItemRow = UserItem::find($userItemId); if (!$userItemRow) { - throw new \Exception('Cannot return an invalid item. ('.$userItemId.')'); + throw new \Exception('Cannot return an invalid item. (' . $userItemId . ')'); } if ($userItemRow->submission_count < $quantity) { - throw new \Exception('Cannot return more items than was held. ('.$userItemId.')'); + throw new \Exception('Cannot return more items than was held. (' . $userItemId . ')'); } $userItemRow->submission_count -= $quantity; $userItemRow->save(); @@ -350,10 +363,10 @@ public function approveSubmission($data, $user) { // Workaround for user not being unset after inventory shuffling, preventing proper staff ID assignment $staff = $user; - foreach ($stacks as $stackId=> $quantity) { + foreach ($stacks as $stackId => $quantity) { $stack = UserItem::find($stackId); $user = User::find($submission->user_id); - if (!$inventoryManager->debitStack($user, $submission->prompt_id ? 'Prompt Approved' : 'Claim Approved', ['data' => 'Item used in submission (#'.$submission->id.')'], $stack, $quantity)) { + if (!$inventoryManager->debitStack($user, $submission->prompt_id ? 'Prompt Approved' : 'Claim Approved', ['data' => 'Item used in submission (#' . $submission->id . ')'], $stack, $quantity)) { throw new \Exception('Failed to create log for item stack.'); } } @@ -365,7 +378,7 @@ public function approveSubmission($data, $user) { // Log currency removal, etc. $currencyManager = new CurrencyManager; if (isset($addonData['currencies']) && $addonData['currencies']) { - foreach ($addonData['currencies'] as $currencyId=> $quantity) { + foreach ($addonData['currencies'] as $currencyId => $quantity) { $currency = Currency::find($currencyId); if (!$currencyManager->createLog( $submission->user_id, @@ -373,7 +386,7 @@ public function approveSubmission($data, $user) { null, null, $submission->prompt_id ? 'Prompt Approved' : 'Claim Approved', - 'Used in '.($submission->prompt_id ? 'prompt' : 'claim').' (#'.$submission->id.')', + 'Used in ' . ($submission->prompt_id ? 'prompt' : 'claim') . ' (#' . $submission->id . ')', $currencyId, $quantity )) { @@ -401,7 +414,7 @@ public function approveSubmission($data, $user) { // Logging data $promptLogType = $submission->prompt_id ? 'Prompt Rewards' : 'Claim Rewards'; $promptData = [ - 'data' => 'Received rewards for '.($submission->prompt_id ? 'submission' : 'claim').' (#'.$submission->id.')', + 'data' => 'Received rewards for ' . ($submission->prompt_id ? 'submission' : 'claim') . ' (#' . $submission->id . ')', ]; // Distribute user rewards @@ -422,13 +435,13 @@ public function approveSubmission($data, $user) { } elseif (isset($data['character_rewardable_id'])) { $data['character_rewardable_id'] = array_map([$this, 'innerNull'], $data['character_rewardable_id']); foreach ($data['character_rewardable_id'] as $ckey => $c) { - foreach ($c as $key => $id) { + foreach ($c as $key => $id) { switch ($data['character_rewardable_type'][$ckey][$key]) { - case 'Currency': $currencyIds[] = $id; + case 'Currency':$currencyIds[] = $id; break; - case 'Item': $itemIds[] = $id; + case 'Item':$itemIds[] = $id; break; - case 'LootTable': $tableIds[] = $id; + case 'LootTable':$tableIds[] = $id; break; } } @@ -454,9 +467,9 @@ public function approveSubmission($data, $user) { } SubmissionCharacter::create([ - 'character_id' => $c->id, + 'character_id' => $c->id, 'submission_id' => $submission->id, - 'data' => json_encode(getDataReadyAssets($assets)), + 'data' => json_encode(getDataReadyAssets($assets)), ]); } @@ -478,24 +491,24 @@ public function approveSubmission($data, $user) { // 3. status // 4. final rewards $submission->update([ - 'staff_comments' => $data['staff_comments'], + 'staff_comments' => $data['staff_comments'], 'parsed_staff_comments' => $data['parsed_staff_comments'], - 'staff_id' => $user->id, - 'status' => 'Approved', - 'data' => json_encode([ - 'user' => $addonData, - 'rewards' => getDataReadyAssets($rewards), + 'staff_id' => $user->id, + 'status' => 'Approved', + 'data' => json_encode([ + 'user' => $addonData, + 'rewards' => getDataReadyAssets($rewards), 'gallery_submission_id' => $submission->data['gallery_submission_id'] ?? null, ]), // list of rewards ]); Notifications::create($submission->prompt_id ? 'SUBMISSION_APPROVED' : 'CLAIM_APPROVED', $submission->user, [ - 'staff_url' => $user->url, - 'staff_name' => $user->name, + 'staff_url' => $user->url, + 'staff_name' => $user->name, 'submission_id' => $submission->id, ]); - if (!$this->logAdminAction($user, 'Submission Approved', 'Approved submission #'.$submission->id.'')) { + if (!$this->logAdminAction($user, 'Submission Approved', 'Approved submission #' . $submission->id . '')) { throw new \Exception('Failed to log admin action.'); } @@ -513,7 +526,8 @@ public function approveSubmission($data, $user) { * @param mixed $data the data of the submission to be deleted * @param mixed $user the user performing the deletion */ - public function deleteSubmission($data, $user) { + public function deleteSubmission($data, $user) + { DB::beginTransaction(); try { // 1. check that the submission exists @@ -558,7 +572,8 @@ public function deleteSubmission($data, $user) { * * @return array */ - private function innerNull($value) { + private function innerNull($value) + { return array_values(array_filter($value)); } @@ -572,7 +587,8 @@ private function innerNull($value) { * * @return array */ - private function processRewards($data, $isCharacter, $isStaff = false, $isClaim = false) { + private function processRewards($data, $isCharacter, $isStaff = false, $isClaim = false) + { if ($isCharacter) { $assets = createAssetsArray(true); @@ -587,15 +603,15 @@ private function processRewards($data, $isCharacter, $isStaff = false, $isClaim foreach ($data['character_rewardable_id'][$data['character_id']] as $key => $reward) { switch ($data['character_rewardable_type'][$data['character_id']][$key]) { - case 'Currency': if ($data['character_rewardable_quantity'][$data['character_id']][$key]) { - addAsset($assets, $data['currencies'][$reward], $data['character_rewardable_quantity'][$data['character_id']][$key]); - } break; - case 'Item': if ($data['character_rewardable_quantity'][$data['character_id']][$key]) { - addAsset($assets, $data['items'][$reward], $data['character_rewardable_quantity'][$data['character_id']][$key]); - } break; - case 'LootTable': if ($data['character_rewardable_quantity'][$data['character_id']][$key]) { - addAsset($assets, $data['tables'][$reward], $data['character_rewardable_quantity'][$data['character_id']][$key]); - } break; + case 'Currency':if ($data['character_rewardable_quantity'][$data['character_id']][$key]) { + addAsset($assets, $data['currencies'][$reward], $data['character_rewardable_quantity'][$data['character_id']][$key]); + }break; + case 'Item':if ($data['character_rewardable_quantity'][$data['character_id']][$key]) { + addAsset($assets, $data['items'][$reward], $data['character_rewardable_quantity'][$data['character_id']][$key]); + }break; + case 'LootTable':if ($data['character_rewardable_quantity'][$data['character_id']][$key]) { + addAsset($assets, $data['tables'][$reward], $data['character_rewardable_quantity'][$data['character_id']][$key]); + }break; } } } @@ -654,7 +670,8 @@ private function processRewards($data, $isCharacter, $isStaff = false, $isClaim * @param mixed $data the data for creating the attachments * @param mixed $user the user object */ - private function createUserAttachments($submission, $data, $user) { + private function createUserAttachments($submission, $data, $user) + { $userAssets = createAssetsArray(); // Attach items. Technically, the user doesn't lose ownership of the item - we're just adding an additional holding field. @@ -677,7 +694,7 @@ private function createUserAttachments($submission, $data, $user) { // Attach currencies. if (isset($data['currency_id'])) { - foreach ($data['currency_id'] as $holderKey=>$currencyIds) { + foreach ($data['currency_id'] as $holderKey => $currencyIds) { $holder = explode('-', $holderKey); $holderType = $holder[0]; $holderId = $holder[1]; @@ -685,7 +702,7 @@ private function createUserAttachments($submission, $data, $user) { $holder = User::find($holderId); $currencyManager = new CurrencyManager; - foreach ($currencyIds as $key=>$currencyId) { + foreach ($currencyIds as $key => $currencyId) { $currency = Currency::find($currencyId); if (!$currency) { throw new \Exception('Invalid currency selected.'); @@ -712,7 +729,7 @@ private function createUserAttachments($submission, $data, $user) { $promptRewards = mergeAssetsArrays($promptRewards, $this->processRewards($data, false)); return [ - 'userAssets' => $userAssets, + 'userAssets' => $userAssets, 'promptRewards' => $promptRewards, ]; } @@ -722,7 +739,8 @@ private function createUserAttachments($submission, $data, $user) { * * @param mixed $submission the submission object */ - private function removePromptAttachments($submission) { + private function removePromptAttachments($submission) + { $assets = $submission->data; // Get a list of rewards, then create the submission itself $promptRewards = createAssetsArray(); @@ -736,13 +754,34 @@ private function removePromptAttachments($submission) { return $promptRewards; } + /** + * Removes the attachments associated with a prompt from a submission. + * + * @param mixed $submission the submission object + */ + private function removeCharacterPromptAttachments($submission, $character) + { + $assets = $character->data; + // Get a list of rewards, then create the submission itself + $promptRewards = createAssetsArray(true); + $promptRewards = mergeAssetsArrays($promptRewards, parseAssetData($assets, true), true); + if (isset($submission->prompt_id) && $submission->prompt_id) { + foreach ($submission->prompt->characterRewards as $reward) { + removeAsset($promptRewards, $reward->reward, $reward->quantity); + } + } + + return $promptRewards; + } + /** * Creates character attachments for a submission. * * @param mixed $submission the submission object * @param mixed $data the data for creating character attachments */ - private function createCharacterAttachments($submission, $data) { + private function createCharacterAttachments($submission, $data) + { // The character identification comes in both the slug field and as character IDs // that key the reward ID/quantity arrays. // We'll need to match characters to the rewards for them. @@ -771,11 +810,11 @@ private function createCharacterAttachments($submission, $data) { foreach ($data['character_rewardable_id'] as $ckey => $c) { foreach ($c as $key => $id) { switch ($data['character_rewardable_type'][$ckey][$key]) { - case 'Currency': $currencyIds[] = $id; + case 'Currency':$currencyIds[] = $id; break; - case 'Item': $itemIds[] = $id; + case 'Item':$itemIds[] = $id; break; - case 'LootTable': $tableIds[] = $id; + case 'LootTable':$tableIds[] = $id; break; } } @@ -793,12 +832,25 @@ private function createCharacterAttachments($submission, $data) { // Users might not pass in clean arrays (may contain redundant data) so we need to clean that up $assets = $this->processRewards($data + ['character_id' => $c->id, 'currencies' => $currencies, 'items' => $items, 'tables' => $tables], true); + //add the preset character rewards with any character rewards in data + if ($submission->status == 'Pending' && isset($submission->prompt_id) && $submission->prompt_id && $submission->prompt->characterRewards->count() && isset($data['character_is_focus']) && $data['character_is_focus'][$c->id]) { + // Get a list of rewards + $defaultRewards = createAssetsArray(true); + //add to array + foreach ($submission->prompt->characterRewards as $reward) { + addAsset($defaultRewards, $reward->reward, $reward->quantity); + } + //merge with the cleaned up user-set stuff + $assets = mergeAssetsArrays($defaultRewards, $assets, true); + } + // Now we have a clean set of assets (redundant data is gone, duplicate entries are merged) // so we can attach the character to the submission SubmissionCharacter::create([ - 'character_id' => $c->id, + 'character_id' => $c->id, 'submission_id' => $submission->id, - 'data' => json_encode(getDataReadyAssets($assets)), + 'data' => json_encode(getDataReadyAssets($assets)), + 'is_focus' => isset($data['character_is_focus']) && $data['character_is_focus'][$c->id] ? $data['character_is_focus'][$c->id] : 0, ]); } @@ -810,7 +862,8 @@ private function createCharacterAttachments($submission, $data) { * * @param mixed $submission the submission object */ - private function removeAttachments($submission) { + private function removeAttachments($submission) + { // This occurs when a draft is edited or rejected. // Return all added items @@ -819,10 +872,10 @@ private function removeAttachments($submission) { foreach ($addonData['user_items'] as $userItemId => $quantity) { $userItemRow = UserItem::find($userItemId); if (!$userItemRow) { - throw new \Exception('Cannot return an invalid item. ('.$userItemId.')'); + throw new \Exception('Cannot return an invalid item. (' . $userItemId . ')'); } if ($userItemRow->submission_count < $quantity) { - throw new \Exception('Cannot return more items than was held. ('.$userItemId.')'); + throw new \Exception('Cannot return more items than was held. (' . $userItemId . ')'); } $userItemRow->submission_count -= $quantity; $userItemRow->save(); @@ -832,13 +885,13 @@ private function removeAttachments($submission) { // And currencies $currencyManager = new CurrencyManager; if (isset($addonData['currencies']) && $addonData['currencies']) { - foreach ($addonData['currencies'] as $currencyId=>$quantity) { + foreach ($addonData['currencies'] as $currencyId => $quantity) { $currency = Currency::find($currencyId); if (!$currency) { - throw new \Exception('Cannot return an invalid currency. ('.$currencyId.')'); + throw new \Exception('Cannot return an invalid currency. (' . $currencyId . ')'); } if (!$currencyManager->creditCurrency(null, $submission->user, null, null, $currency, $quantity)) { - throw new \Exception('Could not return currency to user. ('.$currencyId.')'); + throw new \Exception('Could not return currency to user. (' . $currencyId . ')'); } } } diff --git a/database/migrations/2024_10_14_165017_add_character_prompt_rewards.php b/database/migrations/2024_10_14_165017_add_character_prompt_rewards.php new file mode 100644 index 0000000000..cc4302d27a --- /dev/null +++ b/database/migrations/2024_10_14_165017_add_character_prompt_rewards.php @@ -0,0 +1,34 @@ +boolean('is_focus')->default(0); + }); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('submission_characters', function (Blueprint $table) { + $table->dropColumn('is_focus'); + }); + } +}; diff --git a/resources/views/admin/prompts/create_edit_prompt.blade.php b/resources/views/admin/prompts/create_edit_prompt.blade.php index 1db3070006..740e610954 100644 --- a/resources/views/admin/prompts/create_edit_prompt.blade.php +++ b/resources/views/admin/prompts/create_edit_prompt.blade.php @@ -90,19 +90,12 @@ {!! Form::select('hide_submissions', [0 => 'Submissions Visible After Approval', 1 => 'Hide Submissions Until Prompt Ends', 2 => 'Hide Submissions Always'], $prompt->hide_submissions, ['class' => 'form-control']) !!} -

Rewards

-

Rewards are credited on a per-user basis. Mods are able to modify the specific rewards granted at approval time.

-

You can add loot tables containing any kind of currencies (both user- and character-attached), but be sure to keep track of which are being distributed! Character-only currencies cannot be given to users.

- @include('widgets._loot_select', ['loots' => $prompt->rewards, 'showLootTables' => true, 'showRaffles' => true]) -
{!! Form::submit($prompt->id ? 'Edit' : 'Create', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!} - @include('widgets._loot_select_row', ['showLootTables' => true, 'showRaffles' => true]) - @if ($prompt->id)

Preview

@@ -115,7 +108,6 @@ @section('scripts') @parent - @include('js._loot_js', ['showLootTables' => true, 'showRaffles' => true]) @include('widgets._datetimepicker_js')
{!! Form::select('rewardable_type[]', ['Item' => 'Item', 'Currency' => 'Currency', 'LootTable' => 'Loot Table'] + ($isUser ? ['Raffle' => 'Raffle'] : []), null, [ + {!! Form::select('rewardable_type[]', $reward_types, null, [ 'class' => 'form-control reward-type selectize', 'placeholder' => 'Select Reward Type', ]) !!}