PHP webscoket личные сообщения
Есть товары на сайте, у каждого своё айди, свой продавец. Как сделать ЛС ,чтобы пользователь мог нажать на кнопку "написать продавцу" - создать новый чат и писать там продавцу сообщения, а продавец отвечать.
Ну те простой ДИАЛОГ.
1. Сообщения должны отправляться только между продавец<--->покупатель и никому больше.
2. Одному продавцу может написать несколько разных покупателей
3. У одного продавца может быть несколько товаров на продажу
4. Сделать уведомления
Я устанавливал библиотеку RATCHET в принципе очень простая библиотека для создания простого ЧАТА. Именно чата, не ЛС. Тупо нигде в сети я не нашёл как сделать ЛС, диалоги и тп. на этой библиотеке и вообще на php. Везде либо ЛС php-mySql, либо чат ratchet-php.
Как отправлять сообщения только конкретным пользователям
Система как сделать такой чат в принципе понятна. Нужно сделать таблицу с диалогами и таблицу с сообщениями.
- В таблице с диалогами будет айди диалога, айди продовца, айди покупателя, айди товара
- В таблице с сообщениями будет айди сообщения, айди диалога, к которому относится сообщение, роль отправителя и сообщение
Потом нужно при нажатии на кнопку "написать продавцу" Нужно создать новое соединение с вебсокетом и в onopen нужно создать соотношение пользователь-айди диалога, а потом отправлять сообщения только тем, у кого совпадает айди диалога с айди диалога отправителя, тому отправлять сообщение, а остальным нет. Но как это реализовать, я не знаю.
Сейчас у меня код с документации Ratchet
<?php namespace ColorCore;
// file ChatRoom.php //
require 'W:\domains\colorShop\vendor\autoload.php';
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class SocketChat implements MessageComponentInterface {
protected $clients;
protected $rooms;
public function __construct() {
$this->clients = new \SplObjectStorage;
$this->rooms = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
// Store the new connection to send messages to later
$this->clients->attach($conn);
$chat = $conn->query("SELECT * FROM chats WHERE seller = '$seller' AND
buyer = '$buyer' AND
good = '$goodId'");
$chat = $chat->fetch_assoc();
$this->rooms->attach($conn);
echo "New connection! ({$conn->resourceId})\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
$msg = json_encode($msg);
$numRecv = count($this->clients) - 1;
echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
, $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');
foreach ($this->clients as $client) {
// if ($from !== $client) {
// The sender is not the receiver, send to each client connected
$client->send($msg);
// $client->send($msg);
// }
}
}
public function onClose(ConnectionInterface $conn) {
// The connection is closed, remove it, as we can no longer send it messages
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
window.conn = new WebSocket(websocketPath);
// send only if connected
let wsSend = function(data) {
if (!conn.readyState) {
setTimeout(function() {
wsSend(data);
}, 100);
} else {
conn.send(data);
}
};
// if connection is established
conn.onopen = function(e) {
console.log("Connection established!");
};
conn.onclose = function(e) {
console.log("Connection is closed");
};
conn.onerror = function(e) {
console.log("ERROR:" + e.message);
};
// if a message arrived
conn.onmessage = function(e) {
let data = JSON.parse(e.data);
console.log(data);
};
<?php
//file WSchat.php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use ColorCore\SocketChat;
require 'vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new SocketChat()
)
),
8777
);
$server->run();
Могу перейти на другую библиотеку. Лишь бы сделать этот чат. Мучаюсь очень долго. Задавал уже подобный вопрос, но его забраковали (-3). Править его уже нет смысла)
Ответы (1 шт):
Наконец, я нашёл как сделать этот чат!
НЕБОЛЬШОЙ ПРИМЕР
Оказывается у объекта $conn есть своё айди - resourceId.
В примере есть команда register:
По ней из js отправляем userId, а на сервере выполняется такая команда
$this->userresources[$data->userId][] = $conn->resourceId;
Например, мы отправили command: "register", userId: 21 -- в массив users под индексом 21(От айди, которое мы отправили) записалось текущее подключение юзера.
Теперь можно через команду message ( command: "message", to: "21", message: "from me only to you ) отправить сообщение только тому, у кого userId = 21
На сервере берётся подключение из массива users и с индексом 21 и отправляется сообщение
$this->users[$resourceId]->send($msg);
P.s
Искренне надеюсь, что я помог всееем, кто пытается сделать такой чат! Итак, я долго и упорно искал инфу в интернете, но везде рассказывалось про групповой чат - отправляешь сообщение, и оно разлетается всем.
В примере использовался ratchet