<?php
use \Workerman\Worker;
use \Workerman\Lib\Timer;
require_once __DIR__ . '/../../Autoloader.php';
require_once __DIR__ . '/online.php';
$title = 'GSP MESSAGE SYSTEM';
$pid = getmypid();
if (!cli_set_process_title($title)) {
    echo "Unable to set process title for PID $pid...\n";
    exit(1);
} else {
    echo "{$title} for PID $pid has been set for your process!\n";
    sleep(3);
}

function send($idArr,$data,$online){
	foreach($idArr as $id => $v){
		$online->lastSendTime($id);
		//$worker->connections[$id]->send
		$online->list[$id]['connection']->send($data);
		printLine('to', $online, $id);
	}
}

function printLine($action, $online,$id){
	if(isset($online->list[$id])){
		printf("%s: %s [%d]".PHP_EOL, $action, $online->list[$id]['userid'], $id);
	}
}

$online = new online();

$worker = new Worker('websocket://0.0.0.0:3007');

//启动1个进程对外提供服务  
$worker->count = 1; 

$worker->onMessage = function($connection, $data)use($worker,$online,$title)
{
	$data = json_decode($data,true);
	$id = $connection->id;
	$cmd = $data['cmd'];
	$value = $data['value'];
	if($cmd=='SIGN'){ //签名
		$online->set($connection,$value);
		$connection->send(json_encode(["type"=>"welcome","data"=>"HELLO [{$value}] WELCOME TO {$title}"]));
		printLine('SIGN', $online, $connection->id);
	}else if($cmd=='HEARTBEAT'){ //心跳
		$online->updateReadTime($id);
	}else if($cmd=='SEND'){ //发送
		echo 'SEND' . PHP_EOL;;
		$to = $value['to'];
		$senddata = json_encode($value['data']);
		if(is_array($to)){
			foreach($to as $userid){
				$ids = $online->getIdsByUserid($userid);
				send($ids, $senddata,$online);
			}
		}else if($to == 'ALL'){
			send($online->list, $senddata,$online);
		}else{
			echo 'to nothing' . PHP_EOL;
		}
	}
};

$worker->onWorkerStart = function($worker)use($online)
{
	if($worker->id === 0){
		Timer::add(15, function()use($online){
			$online->clear();
		});
	}
};

$worker->onConnect = function($connection)use($online)
{
	//$connection->getRemoteIp(); 远程IP
	$online->clear();
	printLine('Connected', $online, $connection->id);
};

$worker->onClose = function($connection)use($online)
{
	printLine('Closed', $online, $connection->id);
	$online->del($connection->id);
};

Worker::runAll();