171 lines
3.7 KiB
PHP
171 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use App\Models\User;
|
|
use App\Models\PoisonedIpAddress;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Laravel\Scout\Searchable;
|
|
|
|
class Ban extends Model
|
|
{
|
|
use Searchable;
|
|
|
|
/**
|
|
* The attributes that are mass assignable.
|
|
*
|
|
* @var array<int, string>
|
|
*/
|
|
protected $fillable = [
|
|
'moderator_id',
|
|
'user_id',
|
|
'internal_reason',
|
|
'moderator_note',
|
|
'offensive_item',
|
|
'expiry_date',
|
|
'is_appealable',
|
|
'is_poison_ban',
|
|
'patient_zero',
|
|
'is_warning',
|
|
'has_been_pardoned',
|
|
'pardon_internal_reason',
|
|
'pardoner_id',
|
|
'is_active',
|
|
];
|
|
|
|
/**
|
|
* The attributes that should be cast.
|
|
*
|
|
* @var array<string, string>
|
|
*/
|
|
protected $casts = [
|
|
'expiry_date' => 'datetime'
|
|
];
|
|
|
|
/**
|
|
* Poisons the ban by banning the IP addresses and users of this account and all accounts associated with it.
|
|
*/
|
|
public function poison()
|
|
{
|
|
if (count($this->poisonedIpAddresses) != 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
$this->update([
|
|
'is_poison_ban' => true,
|
|
'patient_zero' => $this->user_id,
|
|
]);
|
|
|
|
PoisonedIpAddress::create([
|
|
'ip_address' => $this->user->register_ip_address,
|
|
'tied_to' => $this->id,
|
|
]);
|
|
|
|
PoisonedIpAddress::create([
|
|
'ip_address' => $this->user->last_ip_address,
|
|
'tied_to' => $this->id,
|
|
]);
|
|
|
|
foreach ($this->user->getAssociatedAccounts() as $user)
|
|
{
|
|
$user->update(['current_ban_id' => $this->id]);
|
|
|
|
PoisonedIpAddress::create([
|
|
'ip_address' => '127.0.0.1',
|
|
'tied_to' => $this->id,
|
|
]);
|
|
|
|
PoisonedIpAddress::create([
|
|
'ip_address' => $user->register_ip,
|
|
'tied_to' => $this->id,
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Unpoisons the ban.
|
|
*/
|
|
public function cure()
|
|
{
|
|
if (!$this->is_poison_ban)
|
|
{
|
|
return;
|
|
}
|
|
|
|
foreach ($this->poisonedIpAddresses as $ip_address)
|
|
{
|
|
$ip_address->delete();
|
|
}
|
|
|
|
foreach ($this->user->getAssociatedAccounts() as $user)
|
|
{
|
|
$user->update(['current_ban_id' => null]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The IP addresses associated with this ban that are not allowed to create an account.
|
|
*/
|
|
public function poisonedIpAddresses()
|
|
{
|
|
return $this->hasMany(PoisonedIpAddress::class, 'tied_to', 'id');
|
|
}
|
|
|
|
/**
|
|
* Lifts the ban. If this is a poison ban, the ban gets cured.
|
|
*/
|
|
public function lift()
|
|
{
|
|
$this->update([
|
|
'is_active' => false
|
|
]);
|
|
|
|
$this->user->update([
|
|
'current_ban_id' => null
|
|
]);
|
|
|
|
if ($this->is_poison_ban)
|
|
{
|
|
$this->cure();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The user that has been banned.
|
|
*/
|
|
public function user()
|
|
{
|
|
return $this->hasOne(User::class, 'id', 'user_id');
|
|
}
|
|
|
|
/**
|
|
* The moderator that performed this ban.
|
|
*/
|
|
public function moderator()
|
|
{
|
|
return $this->hasOne(User::class, 'id', 'moderator_id');
|
|
}
|
|
|
|
/**
|
|
* The moderator that pardoned this ban (if any.)
|
|
*/
|
|
public function pardoner()
|
|
{
|
|
return $this->hasOne(User::class, 'id', 'pardoner_id');
|
|
}
|
|
|
|
/**
|
|
* The user that was originally poisoned banned associated with this ban.
|
|
*/
|
|
public function patientZero()
|
|
{
|
|
return $this->hasOne(User::class, 'id', 'patient_zero');
|
|
}
|
|
|
|
public function toSearchableArray()
|
|
{
|
|
return [ 'username' => $this->user->username ];
|
|
}
|
|
}
|