Приложение Ionic 4 chat и как отправить сообщение конкретному пользователю? - PullRequest
0 голосов
/ 17 апреля 2019

Я создал приложение в Ionic 4, а для бэкэнда я использую Lumen.Приложение должно иметь страницу чата, и для этого я добавляю Redis, Socket.io и nodejs.Я успешно создал публичную комнату, и чат между пользователями в этой комнате работает.Проблема в том, как отправить личное сообщение для пользователя, как инициализировать пользователей для их личной комнаты.

Вот как я создал публичную комнату:

constructor(private socket: Socket) {

        this.getMessages().subscribe(message => {
            this.messages.push(message);
        });

    }

    getMessages() {
        const observable = new Observable(observer => {
            this.socket.on('message', (data) => {
                observer.next(data);
            });
        });
        return observable;
    }

Я отправляю сообщение из приложения Lumen и Redis:

public function sendMessage()
{
    $redis = Redis::Connection();
    $sendMessage = json_encode(['user' => 'John Doe', 'text' => 'Some message, text', 'channel' => 'message']);
    $redis->publish('add-message', $sendMessage);
}

И мой сервер узла:

let express = require('express');
let app = express();
let http = require('http').Server(app);
let redis = require('redis');
let client = redis.createClient("redis://127.0.0.1:6379");

let io = require('socket.io')(http);

app.use('/', express.static('www'));

http.listen(3000, '192.168.10.10', function(){
    console.log('listening on *:3000');
});

client.on('message', function(chan, msg) {
    let data = JSON.parse(msg);
    io.sockets.emit(data.channel, msg);
});

client.subscribe('add-message');

В итоге все, кто подписан на канал 'message', получат сообщение.Проблема в том, что я подписываю пользователя на канал, когда захожу на страницу чата.Я не знаю, как подписать пользователя и когда на канале, где какой-то другой пользователь отправляет ему сообщение. Также как этот отправитель создает новую комнату, я предполагаю использовать id пользователей для имени комнаты (для экземпляра user1_user2).

Кто-нибудь знает, как я могу решить эту проблему?Я не знаю, даже я хорошо описал.

Заранее спасибо

...