get(); $reply["echo"] = $api_id; ZMBuf::$atomics["wait_msg_id"]->add(1); EventHandler::callCQAPISend($reply, $connection); if (is_callable($function)) { ZMBuf::appendKey("sent_api", $api_id, [ "data" => $reply, "time" => microtime(true), "func" => $function, "self_id" => $connection->getQQ() ]); } elseif ($function === true) { ZMBuf::appendKey("sent_api", $api_id, [ "data" => $reply, "time" => microtime(true), "coroutine" => Co::getuid(), "self_id" => $connection->getQQ() ]); } else { ZMBuf::appendKey("sent_api", $api_id, [ "data" => $reply, "time" => microtime(true), "self_id" => $connection->getQQ() ]); } if ($connection->push(json_encode($reply))) { //Console::msg($reply, $connection->getQQ()); ZMBuf::$atomics["out_count"]->add(1); if ($function === true) { Co::suspend(); $data = ZMBuf::get("sent_api")[$api_id]; ZMBuf::unsetByValue("sent_api", $reply["echo"]); return isset($data['result']) ? $data['result'] : null; } return true; } else { Console::warning("CQAPI send failed, websocket push error."); $response = [ "status" => "failed", "retcode" => -1000, "data" => null, "self_id" => $connection->getQQ() ]; $s = ZMBuf::get("sent_api")[$reply["echo"]]; if (($s["func"] ?? null) !== null) call_user_func($s["func"], $response, $reply); ZMBuf::unsetByValue("sent_api", $reply["echo"]); if ($function === true) return $response; return false; } } }