|                                                                                                                                                                                                                          |  | <?php
namespace App;
use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Capsule\Manager as DB;
use Respect\Validation\Validator;use Movim\Picture;
class Contact extends Model{    protected $fillable = ['id', 'nickname', 'mood'];    protected $keyType = 'string';    public $incrementing = false;
    public function user()    {        return $this->belongsTo('App\User', 'id');    }
    public function scopePublic($query, $like = false)    {        return $query->whereIn('id', function ($query) use ($like) {            $query->select('id')                  ->from('users')                  ->where('public', true)                  ->when($like !== false, function ($query) use ($like) {                      $query->where('id', 'like', '%'. $like . '%');                  });        });    }
    public function scopeNotInRoster($query, $sessionId)    {        return $query->whereNotIn('id', function ($query) use ($sessionId) {            $query->select('jid')                  ->from('rosters')                  ->where('session_id', $sessionId);        });    }
    public function scopeOrderByPresence($query)    {        return $query->leftJoin(DB::raw('(            select min(value) as value, jid            from presences            group by jid) as presences            '), 'presences.jid', '=', 'contacts.id')        ->orderBy('presences.value');    }
    public function save(array $options = [])    {        try {            unset($this->photobin);            parent::save($options);        } catch (\Exception $e) {            /*            * Multi processes simultanous save            */        }    }
    public function set($vcard, $jid)    {        $this->id = $jid;
        $validate_date = Validator::date('Y-m-d');        if (isset($vcard->vCard->BDAY)        && $validate_date->validate($vcard->vCard->BDAY)) {            $this->date = (string)$vcard->vCard->BDAY;        }
        if ($vcard->vCard->NICKNAME) {            $this->name = (string)$vcard->vCard->NICKNAME;        }
        if ($vcard->vCard->FN) {            $this->fn = (string)$vcard->vCard->FN;        }
        if ($vcard->vCard->URL) {            $this->url = (string)$vcard->vCard->URL;        }
        if ($vcard->vCard->EMAIL) {            $this->email = (string)$vcard->vCard->EMAIL->USERID;        }
        if ($vcard->vCard->ADR) {            $this->adrlocality = (string)$vcard->vCard->ADR->LOCALITY;            $this->adrpostalcode = (string)$vcard->vCard->ADR->PCODE;            $this->adrcountry = (string)$vcard->vCard->ADR->CTRY;        }
        if (filter_var((string)$vcard->vCard->PHOTO, FILTER_VALIDATE_URL)) {            $this->photobin = base64_encode(                requestUrl((string)$vcard->vCard->PHOTO, 1)            );        } elseif ($vcard->vCard->PHOTO) {            $this->photobin = (string)$vcard->vCard->PHOTO->BINVAL;            $this->avatarhash = sha1(base64_decode($this->photobin));        }
        if ($vcard->vCard->DESC) {            $this->description = (string)$vcard->vCard->DESC;        }    }
    public function createThumbnails()    {        if (!$this->photobin) {            return;        }
        $p = new Picture;        $p->fromBase($this->photobin);        $p->set($this->id);
        unset($this->photobin);    }
    public function getPhoto($size = 'm')    {        return getPhoto($this->id, $size);    }
    public function setLocation($stanza)    {        $this->loclatitude      = (string)$stanza->items->item->geoloc->lat;        $this->loclongitude     = (string)$stanza->items->item->geoloc->lon;        $this->localtitude      = (int)$stanza->items->item->geoloc->alt;        $this->loccountry       = (string)$stanza->items->item->geoloc->country;        $this->loccountrycode   = (string)$stanza->items->item->geoloc->countrycode;        $this->locregion        = (string)$stanza->items->item->geoloc->region;        $this->locpostalcode    = (string)$stanza->items->item->geoloc->postalcode;        $this->loclocality      = (string)$stanza->items->item->geoloc->locality;        $this->locstreet        = (string)$stanza->items->item->geoloc->street;        $this->locbuilding      = (string)$stanza->items->item->geoloc->building;        $this->loctext          = (string)$stanza->items->item->geoloc->text;        $this->locuri           = (string)$stanza->items->item->geoloc->uri;        $this->loctimestamp = date(            'Y-m-d H:i:s',            strtotime((string)$stanza->items->item->geoloc->timestamp)        );    }
    public function setTune($stanza)    {        $this->tuneartist = (string)$stanza->items->item->tune->artist;        $this->tunelenght = (int)$stanza->items->item->tune->lenght;        $this->tunerating = (int)$stanza->items->item->tune->rating;        $this->tunesource = (string)$stanza->items->item->tune->source;        $this->tunetitle = (string)$stanza->items->item->tune->title;        $this->tunetrack = (string)$stanza->items->item->tune->track;    }
    public function setVcard4($vcard)    {        if (isset($vcard->bday->date)        && Validator::date('Y-m-d')->validate($vcard->bday->date)) {            $this->date = (string)$vcard->bday->date;        }
        $this->nickname = !empty($vcard->nickname->text)            ? (string)$vcard->nickname->text            : null;        $this->fn = !empty($vcard->fn->text)            ? (string)$vcard->fn->text            : null;        $this->url = !empty($vcard->url->uri)            ? (string)$vcard->url->uri            : null;
        $this->adrlocality = (string)$vcard->adr->locality;        $this->adrcountry = (string)$vcard->adr->country;        $this->adrpostalcode = (string)$vcard->adr->code;
        $this->email = !empty($vcard->email->text)            ? (string)$vcard->email->text            : null;        $this->description = trim((string)$vcard->note->text);    }
    public function getPlace(): string    {        $place = '';
        if ($this->loctext != '') {            $place .= $this->loctext.' ';        } else {            if ($this->locbuilding != '') {                $place .= $this->locbuilding.' ';            }            if ($this->locstreet != '') {                $place .= $this->locstreet.'<br />';            }            if ($this->locpostalcode != '') {                $place .= $this->locpostalcode.' ';            }            if ($this->loclocality != '') {                $place .= $this->loclocality.'<br />';            }            if ($this->locregion != '') {                $place .= $this->locregion.' - ';            }            if ($this->loccountry != '') {                $place .= $this->loccountry;            }        }
        return $place;    }
    public function getTruenameAttribute(): string    {        if ($this->fn) {            return $this->fn;        }        if ($this->nickname) {            return $this->nickname;        }        if ($this->name) {            return $this->name;        }
        return explodeJid($this->id)['username'] ?? $this->id;    }
    public function getJidAttribute(): ?string    {        return $this->id;    }
    public function getAge()    {        if ($this->isValidDate()) {            $age = intval(substr(date('Ymd') - date('Ymd', strtotime($this->date)), 0, -4));            if ($age != 0) {                return $age;            }        }    }
    public function getDate()    {        if ($this->date == null) {            return null;        }
        $dt = new \DateTime($this->date);        return $dt->format('Y-m-d');    }
    public function getSearchTerms()    {        return cleanupId($this->id).'-'.            cleanupId($this->truename).'-'.            cleanupId($this->groupname);    }
    public function getBlogUrl()    {        return \Movim\Route::urlize(            'blog',            ($this->user && isset($this->user->nickname))                ? $this->user->nickname                : $this->id        );    }
    public function isEmpty(): bool    {        $this->isValidDate();
        return ($this->fn == null            && $this->name == null            && $this->date == null            && $this->url == null            && $this->email == null            && $this->description == null);    }
    public function isValidDate(): bool    {        if (isset($this->date)            && $this->date != '0000-00-00T00:00:00+0000'            && $this->date != '1970-01-01 00:00:00'            && $this->date != '1970-01-01 01:00:00'            && $this->date != '1970-01-01T00:00:00+0000') {            return true;        }        $this->date = null;        return false;    }
    public function isFromMuc(): bool    {        return strpos($this->jid, '/') !== false;    }
    public function isOld(): bool    {        return (strtotime($this->updated) < mktime( // We update the 1 day old vcards
                                    gmdate("H"),            gmdate("i")-10,            gmdate("s"),            gmdate("m"),            gmdate("d"),            gmdate("Y")                                )        );    }
    public function isMe(): bool    {        return ($this->id == \App\User::me()->id);    }}
 |