🏡 index : ~doyle/zpan.git

<?php

namespace App\Models;

use Eloquent;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\HtmlString;
use Watson\Rememberable\Rememberable;

/**
 * vBulletin table containing all users.
 *
 * @author Jordan Doyle <jordan@doyle.wf>
 * @mixin Eloquent
 */
class User extends Authenticatable
{
    use Rememberable;

    protected $connection = 'forum';
    protected $table = 'user';
    protected $primaryKey = 'userid';
    public $timestamps = false;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'salt'
    ];

    /**
     * Get this user's "remember me" token.
     *
     * @return HasOne
     */
    public function token()
    {
        return $this->hasOne(Token::class);
    }

    /**
     * Get this user's timezone.
     *
     * @return HasOne
     */
    public function timezone()
    {
        return $this->hasOne(Timezone::class);
    }

    /**
     * Get the user's timezone or the app's timezone if that is not set.
     *
     * @return string
     */
    public function getTimezone()
    {
        return $this->timezone ? $this->timezone->timezone : config('app.timezone');
    }

    /**
     * Get this user's custom fields.
     *
     * @return HasOne
     */
    public function fields()
    {
        return $this->hasOne(UserField::class, 'userid');
    }

    /**
     * Get this user's display group.
     *
     * @return Group
     */
    public function getDisplayGroup()
    {
        $display = $this->displaygroupid;

        if (!$display) {
            $display = $this->usergroupid;
        }

        return Group::find($display);
    }

    /**
     * Check if this user is a staff member.
     *
     * @return bool
     */
    public function isStaff()
    {
        $staff = false;

        foreach ($this->usergroups->get() as $group) {
            if ($group->isStaff()) {
                $staff = true;
            }

            if ($group->isBanned()) {
                return false;
            }
        }

        return $staff;
    }

    /**
     * Check if this user is management.
     *
     * @return bool
     */
    public function isManagement()
    {
        foreach ($this->usergroups->get() as $group) {
            if ($group->isManagement()) {
                return true;
            }
        }

        return false;
    }


    /**
     * Check if this user is an administrator.
     *
     * @return bool
     */
    public function isAdmin()
    {
        foreach ($this->usergroups->get() as $group) {
            if ($group->isAdmin()) {
                return true;
            }
        }

        return false;
    }

    /**
     * Check if this user is apart of a group.
     *
     * @param array $groups
     * @return bool
     * @internal param string $group group to check if the user is apart of
     */
    public function is(...$groups)
    {
        foreach ($this->usergroups->get() as $usergroup) {
            foreach ($groups as $group) {
                if ($usergroup->is($group)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Get the usergroups this user belongs to.
     *
     * @return mixed
     */
    public function getUsergroupsAttribute()
    {
        if (!$this->relationLoaded('usergroups')) {
            $usergroups = Group::whereIn('usergroupid', $this->membergroupids);
            $this->setRelation('usergroups', $usergroups);
        }

        return $this->getRelation('usergroups');
    }

    /**
     * Get a query containing all the usergroups this user belongs to.
     *
     * @return Group
     */
    public function usergroups()
    {
        return Group::whereIn('usergroupid', $this->membergroupids);
    }

    /**
     * Mutate the weird relationship vBulletin gives us into an array to make it easier to work with.
     *
     * @param $commaSeparatedIds
     * @return mixed
     */
    public function getMembergroupidsAttribute($commaSeparatedIds)
    {
        $groups = json_decode("[{$commaSeparatedIds}]", true);
        array_unshift($groups, $this->usergroupid);

        return $groups;
    }

    /**
     * Get the display name of this user.
     *
     * @return HtmlString
     */
    public function getDisplayName()
    {
        $group = $this->getDisplayGroup();
        return new HtmlString($group->opentag . e($this->username) . $group->closetag);
    }
}