chequite/chat

离心式聊天包

1.0.0 2024-01-22 14:07 UTC

This package is not auto-updated.

Last update: 2024-09-30 17:30:39 UTC


README

目录

  1. 简介
  2. 依赖关系
  3. 安装
  4. 配置
  5. 重要事项
  6. API 方法
  7. Websockets
  8. 事件和监听器用于定制和改进服务器部分

1. 简介

用于在 Laravel 项目中快速安装聊天的包。

2. 依赖关系

laravel/framework: ^10.0
laravel/passport: ^11.0.0
lcobucci/jwt: ^5.0.0

3. 安装

composer require chequite/chat

4. 配置

首先需要部署 centrifugo。通过 Docker 部署非常方便。

  1. 拉取 centrifugo 镜像: docker pull centrifugo/centrifugo

  2. 创建配置文件的目录 mkdir /var/centrifugo

  3. 创建配置文件 nano /var/centrifugo/config.json

  4. 在文件中记录设置。默认情况下,配置将如下所示: {
    "allow_subscribe_for_client": true,
    "api_key": "5af3d597bd452745a937c0ffda270fab060419e27s93f61d4f48e3409015df9ece",
    "token_hmac_secret_key": "8b1482f10d8d47ac838549c8eac07edf3077a00ac6f6886fd5434f896c401cfb8e",
    "admin": true,
    "admin_password": "MoskowCityB@c9",
    "admin_secret": "3fb95b5b93dad7269b7275c525726e86f47e123f1df1158770bfdc27a2fbab1e",
    "allowed_origins": ["https://"]
    }
    allow_subscribe_for_client - 允许客户端订阅频道
    api_key - 用于 API 请求的密钥,请生成一个随机字符串并插入此处
    token_hmac_secret_key - 用于应用程序的秘密密钥,也生成一个随机字符串
    admin - 启用管理面板以进行调试和跟踪离心式的工作
    admin_password - 管理面板的密码
    admin_secret - 以管理员身份请求的密钥
    allowed_origins - 允许的域名。必须指定将发送请求的所有域名。如果没有指定,则将收到 403 错误。

  5. 启动容器 docker run -v /var/centrifugo/config.json:/centrifugo/config.json -p 8000:8000 centrifugo/centrifugo centrifugo -c config.json

  6. 安装包和启动离心式后,需要在 .env 文件中添加密钥
    CENTRIFUGO_URL - 您的 centrifugo 服务器的 URL (示例 http://3.22.83.190:8000,可能是一个命名的域名)
    CENTRIFUGO_API_KEY - 在 centrifugo 服务器配置中指定的 api key (示例 5af3d5s97bd452745a937c0fda270fab060419e2793af61d4f48e3409015df)
    CENTRIFUGO_SECRET= 您在 centrifugo 服务器配置中指定的秘密密钥 (示例 8b1a482f10d8d47ac83s8549c8e07edf3077a00ac6f6886fd5434f896c401cf)

  7. 安装包后运行包的迁移: php artisan migrate

  8. 为 storage 目录创建符号链接: php artisan storage:link

官方文档: https://centrifugal.dev/

5. 重要事项

1. 在注册和登录时,需要在服务器上生成令牌并将其返回给客户端。

JwtService::generateJwt($user->id) - 生成所需的令牌

2. 消息默认设置为已读

  • 当用户打开聊天时
  • 当用户发送消息时

在打开对话时如何读取消息需要在客户端思考,下面有端点

3. 离心式令牌存活一小时。必须在此间隔内更新它。我在每次页面重新加载时更新它,因为我不太擅长客户端部分

6. API 方法

1. 获取当前用户信息

  • 端点: /api/get-user-info
  • 方法: GET

示例响应

{
  "id": 1,
  "avatar": "https://your-domain.ru/path/to/file",
  "name": "Петр Петров"
}

响应字段说明

2. 获取聊天列表

  • 端点: /api/chats
  • 方法: GET

描述

获取当前用户的聊天列表

示例响应

{
  "id": 137,
  "companion_name": "Михаил Михайлов",
  "avatar": "https://your-domain.ru/path/to/file",
  "last_message": {
    "text": "Текст сообщения",
    "timestamp": "15:33",
    "sender_id": 9,
    "sender_name": "Сергей Сергеев",
    "was_read": true
  }
}

响应字段说明

3. 创建聊天

  • 端点: /api/chats
  • 方法: POST

描述

为当前用户与选定的用户创建聊天

必填参数

示例响应

{
  "chatId": 138
}

响应字段说明

3. 获取聊天消息

  • 端点: /api/chats/{chatId}/messages
  • 方法: GET

URL参数

示例响应

{
  "chatId": 138,
  "messages": {
     {
        "text": "Привет",
        "was_read": true,
        "timestamp": "16:53",
        "user": {
          "id": 3,
          "email": "user@gmail.com",
          "avatar": "https://your-domain.ru/path/to/file",
          "is_online": false,
          "name": "Алексей Алексеев",
          "last_seen_at": "24.01.2024 15:30"
        },
     }
  },
  "companion": {
      "id": 3,
      "email": "user@gmail.com",
      "avatar": "https://your-domain.ru/path/to/file",
      "is_online": false,
      "name": "Алексей Алексеев",
      "last_seen_at": "24.01.2024 15:30",
  }
}

响应字段说明

4. 发送消息

  • 端点: /api/chats/{chatId}/messages
  • 方法: POST

URL参数

示例响应

{
   "text": "Hello world!",
   "user": {
      "id": 5,
      "email": "email@gmail.com",
      "avatar": "https://your-domain.ru/path/to/file",
      "is_online": false,
      "name": "Александр Александров",
      "last_seen_at": "25.01.2024 10:15"
   },
   "was_read": true,
   "timestamp": "11:30"
}

响应字段说明

5. 通知用户正在输入

  • 端点: /api/typing
  • 方法: POST

必填参数

示例响应

{
}

响应参数

空对象

6. 搜索用户

  • 端点: /api/search-users
  • 方法: GET

必填GET参数

示例响应

{
   {
      "id": 3,
      "email": "email@gmail.com",
      "avatar": "https://your-domain.ru/path/to/file",
      "is_online": false,
      "name": "Филип Филипов",
      "last_seen_at": "24.01.2024 19:17"
   },
   {
      "id": 157,
      "email": "email2@gmail.com",
      "avatar": "https://your-domain.ru/path/to/file",
      "is_online": true,
      "name": "Филип Сергеев",
      "last_seen_at": null
   }
}

响应字段说明

7. 更新Centrifugo令牌

  • 端点: /api/update-centrifugo-token
  • 方法: GET

示例响应

{
   "centrifugo_token": "ass2jajdwk2kasdkaskgkbkbggb5ib5o412kf2occe3"
}

8. 通知用户已阅读消息

  • 端点: /api/chats/{chatId}/messages/{messageId}
  • 方法: POST

描述

该请求用于当用户在聊天中收到消息时,向服务器报告已阅读

URL参数

示例响应

{
}

响应参数

空对象

7. WebSockets

我在客户端使用Centrifuge包处理WebSockets: https://github.com/centrifugal/centrifuge-js。根据文档很容易理解。唯一需要注意的是,在订阅频道时需要传递Centrifuge令牌。

1. 监听聊天列表更新

  • 频道名称: user-{userId}-chats

传入频道的数据

2. 监听聊天消息更新

  • 频道名称: user-{chatId}-messages

传入频道的数据

3. 监听对方在线/离线状态更新

  • 频道名称: user-{userId}-status

传入频道的数据

4. 监听消息输入事件

  • 频道名称: chat.{chatId}

传入频道的数据

5. 客户端如何订阅聊天消息更新示例

const sub = this.centrifuge.newSubscription(`user-${chatId}-messages`);

sub.on('publication', (response) => {
    this.currentChat.messages.push(JSON.parse(response.data))
    this.scrollToBottom();
});

sub.subscribe()

8. 事件和监听器用于自定义和改进服务器部分

  • 聊天更新事件 Dd1\Chat\Events\ChatsUpdated

  • 发送消息/更新当前聊天事件 Dd1\Chat\Events\MessageSent

  • 输入事件 Dd1\Chat\Events\TypingEvent

  • 在线/离线状态更新事件 Dd1\Chat\Events\UserStatusUpdatedEvent

如果需要为新的监听事件创建新频道,只需创建Event并绑定ServiceProvider中的监听器Dd1\Chat\Listeners\CentrifugoPushToChannel。监听器构造函数始终期望有2个字段