phpvms/app/Contracts/Award.php

100 lines
2.4 KiB
PHP
Raw Normal View History

2018-03-17 12:59:53 +08:00
<?php
namespace App\Contracts;
2018-03-17 12:59:53 +08:00
use App\Models\Award as AwardModel;
2018-03-17 12:59:53 +08:00
use App\Models\User;
use App\Models\UserAward;
use App\Support\Utils;
use Exception;
use Illuminate\Support\Facades\Log;
2018-03-17 12:59:53 +08:00
/**
* Base class for the Awards, you need to extend this, and implement:
* $name
* $param_description (optional)
* public function check($parameter=null)
*
* See: http://docs.phpvms.net/customizing/awards
2018-03-17 12:59:53 +08:00
*/
abstract class Award
2018-03-17 12:59:53 +08:00
{
public $name = '';
public $param_description = '';
2018-03-17 12:59:53 +08:00
/**
* Each award class just needs to return true or false if it should actually
* be awarded to a user. This is the only method that needs to be implemented
2018-08-27 00:40:04 +08:00
*
* @param null $parameter Optional parameters that are passed in from the UI
2018-08-27 00:40:04 +08:00
*
* @return bool
*/
abstract public function check($parameter = null): bool;
/*
* You don't really need to mess with anything below here
*/
2018-08-27 00:40:04 +08:00
protected $award;
protected $user;
public function __construct(AwardModel $award = null, User $user = null)
2018-03-17 12:59:53 +08:00
{
$this->award = $award;
$this->user = $user;
2018-03-17 12:59:53 +08:00
}
/**
* Run the main handler for this award class to determine if
* it should be awarded or not. Declared as final to prevent a child
* from accidentally overriding and breaking something
*/
final public function handle(): void
{
2018-08-27 00:40:04 +08:00
// Check if the params are a JSON object or array
2018-04-02 03:32:01 +08:00
$param = $this->award->ref_model_params;
if (Utils::isObject($this->award->ref_model_params)) {
$param = json_decode($this->award->ref_model_params);
}
if ($this->check($param)) {
$this->addAward();
}
}
2018-03-17 12:59:53 +08:00
/**
* Add the award to this user, if they don't already have it
2018-08-27 00:40:04 +08:00
*
* @return bool|UserAward
2018-03-17 12:59:53 +08:00
*/
protected function addAward()
2018-03-17 12:59:53 +08:00
{
$w = [
'user_id' => $this->user->id,
'award_id' => $this->award->id,
2018-03-17 12:59:53 +08:00
];
$found = UserAward::where($w)->count('id');
if ($found > 0) {
2018-03-17 12:59:53 +08:00
return true;
}
// Associate this award to the user now
$award = new UserAward($w);
try {
$award->save();
} catch (Exception $e) {
Log::error(
'Error saving award: '.$e->getMessage(),
$e->getTrace()
);
2018-08-27 02:50:08 +08:00
return false;
}
return $award;
2018-03-17 12:59:53 +08:00
}
}