<?php

// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------


namespace app\webscoket;


use think\facade\Cache;

/**
 * Class Ping
 * @package app\webscoket
 * @author xaboy
 * @day 2020-04-29
 */
class Ping
{
    /**
     * @var \Redis
     */
    protected $redis;


    const CACHE_PINK_KEY = 'ws.p.';


    const CACHE_SET_KEY = 'ws.s';


    /**
     * Ping constructor.
     */
    public function __construct()
    {
        $this->redis = Cache::store('redis')->handler();
        $this->destroy();
    }

    /**
     * @param $id
     * @param $time
     * @param int $timeout
     * @author xaboy
     * @day 2020-04-29
     */
    public function createPing($id, $time, $timeout = 0)
    {
        $this->updateTime($id, $time, $timeout);
        $this->redis->sAdd(self::CACHE_SET_KEY, $id);
    }

    /**
     * @param $id
     * @param $time
     * @param int $timeout
     * @author xaboy
     * @day 2020-04-29
     */
    public function updateTime($id, $time, $timeout = 0)
    {
        $this->redis->set(self::CACHE_PINK_KEY . $id, $time, $timeout);
    }

    /**
     * @param $id
     * @author xaboy
     * @day 2020-05-06
     */
    public function removePing($id)
    {
        $this->redis->del(self::CACHE_PINK_KEY . $id);
        $this->redis->del(self::CACHE_SET_KEY, $id);
    }

    /**
     * @param $id
     * @return bool|string
     * @author xaboy
     * @day 2020-04-29
     */
    public function getLastTime($id)
    {
        return $this->redis->get(self::CACHE_PINK_KEY . $id);
    }

    /**
     * @author xaboy
     * @day 2020-04-29
     */
    public function destroy()
    {
        $members = $this->redis->sMembers(self::CACHE_SET_KEY) ?: [];
        foreach ($members as $k => $member) {
            $members[$k] = self::CACHE_PINK_KEY . $member;
        }
        if (count($members))
            $this->redis->del(self::CACHE_SET_KEY, ...$members);
    }
}