abpvnext chat module.
docker build -t iczpnet/chat-auth-server:v0 -f ./host/IczpNet.Chat.AuthServer/Dockerfile .
docker build -t iczpnet/chat-api-host:v0 -f ./host/IczpNet.Chat.HttpApi.Host/Dockerfile .abp new IczpNet.Chat -t module --no-ui
Update-Database
| SenderId | ReceiverId | SessionId |
|---|---|---|
| C1 | S1.1 | S1-C1 |
| s2 | C2 | S-C2 |
dasfasdfwftc
- ddaf
- 服务器异常关闭时与重启时,在线用户边界处理
- 多设备、踢出设备,
- 同步多设备上线/下线通知
- ListSet 分布式索引(快速定位用户是否在线,以及在线设备[pc,phone,tablet,pad,web])
- 好友事件通知(上线/下线通知)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace IczpNet.Chat.ConnectionPools;
/// <summary>
/// 连接池管理器
/// </summary>
public interface IConnectionPoolManager
{
/// <summary>
/// 添加连接
/// </summary>
/// <param name="connectionPool"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<bool> ConnectedAsync(ConnectionPoolCacheItem connectionPool, CancellationToken token = default);
/// <summary>
/// 设置活跃时间
/// </summary>
/// <param name="connectionId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<ConnectionPoolCacheItem> UpdateActiveTimeAsync(string connectionId, CancellationToken token = default);
/// <summary>
/// 移除连接
/// </summary>
/// <param name="connectionId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<bool> DisconnectedAsync(string connectionId, CancellationToken token = default);
///// <summary>
///// 移除连接
///// </summary>
///// <param name="connectionId"></param>
//void Remove(string connectionId);
/// <summary>
/// 获取连接数量
/// </summary>
/// <param name="host"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<int> GetTotalCountAsync(string host = null, CancellationToken token = default);
/// <summary>
/// 清空所有连接
/// </summary>
/// <param name="host"></param>
/// <param name="reason"></param>
/// <param name="token"></param>
/// <returns></returns>
Task ClearAllAsync(string host, string reason, CancellationToken token = default);
/// <summary>
/// 创建查询
/// </summary>
/// <returns></returns>
Task<IQueryable<ConnectionPoolCacheItem>> CreateQueryableAsync(CancellationToken token = default);
/// <summary>
/// 获取连接
/// </summary>
/// <param name="connectionId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<ConnectionPoolCacheItem> GetAsync(string connectionId, CancellationToken token = default);
/// <summary>
/// 更新连接数量
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
Task<int> UpdateAllConnectionIdsAsync(CancellationToken token = default);
/// <summary>
/// 获取用户连接
/// </summary>
/// <param name="userId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<List<string>> GetConnectionIdsByUserAsync(Guid userId, CancellationToken token = default);
/// <summary>
/// 更新连接数量
/// </summary>
/// <param name="userId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<int> UpdateIndexByUserAsync(Guid userId, CancellationToken token = default);
/// <summary>
/// 更新连接数量
/// </summary>
/// <param name="chatObjectId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<int> UpdateIndexByChatObjectAsync(long chatObjectId, CancellationToken token = default);
/// <summary>
/// 获取聊天对象连接
/// </summary>
/// <param name="chatObjectId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<IEnumerable<ConnectionPoolCacheItem>> GetListByChatObjectAsync(long chatObjectId, CancellationToken token = default);
/// <summary>
/// 获取聊天对象连接
/// </summary>
/// <param name="chatObjectIdList"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<IEnumerable<ConnectionPoolCacheItem>> GetListByChatObjectAsync(IEnumerable<long> chatObjectIdList, CancellationToken token = default);
/// <summary>
/// 获取 用户 连接
/// </summary>
/// <param name="userId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<IEnumerable<ConnectionPoolCacheItem>> GetListByUserAsync(Guid userId, CancellationToken token = default);
/// <summary>
/// 获取 用户 连接
/// </summary>
/// <param name="userIdList"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<IEnumerable<ConnectionPoolCacheItem>> GetListByUserAsync(IEnumerable<Guid> userIdList, CancellationToken token = default);
/// <summary>
/// 是否在线(用户)
/// </summary>
/// <param name="userId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<bool> IsOnlineAsync(Guid userId, CancellationToken token = default);
/// <summary>
/// 是否在线(聊天对象)
/// </summary>
/// <param name="chatObjectId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<bool> IsOnlineAsync(long chatObjectId, CancellationToken token = default);
/// <summary>
/// 获取设备类型 聊天对象
/// </summary>
/// <param name="chatObjectId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<List<string>> GetDeviceTypesAsync(long chatObjectId, CancellationToken token = default);
/// <summary>
/// 获取设备类型 用户
/// </summary>
/// <param name="userId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<List<string>> GetDeviceTypesAsync(Guid userId, CancellationToken token = default);
/// <summary>
/// 获取连接数量(用户)
/// </summary>
/// <param name="userId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<int> GetCountByUserAsync(Guid userId, CancellationToken token = default);
/// <summary>
/// 获取连接数量(聊天对象)
/// </summary>
/// <param name="chatObjectId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<int> GetCountByChatObjectAsync(long chatObjectId, CancellationToken token = default);
}- 群/公众号 解析为 null
- 人/Anonymous/ShopWaiter/Customer 解析为 [Online | Offline]
- Shopper(自己或是子账号任何一下在线就解析为 [Online ]),都不在线都解析为【Offline】
| Person人(用户、员工) | Customer 人(客户) | Room(Group) 群 | Official 公众号 | Subscription订阅号 | Square 聊天广场 | Shopkeeper 电商掌柜(主账号) | ShopWaiter 店小二(子账号) | |
|---|---|---|---|---|---|---|---|---|
| 说明 | 单聊 | 单聊 | 群聊 | 单聊(服务通知) | 群聊(新闻) | 群聊(论坛) | 群聊(日春旗舰店) | 群聊(售后\客服) |
| Person人(用户、员工) | 单聊 | |||||||
| Customer 人(客户) | 单聊 | |||||||
| Room(Group) 群 | 群聊 | |||||||
| Official 公众号 | X | |||||||
| Subscription订阅号 | 订阅 | |||||||
| Square 聊天广场 | ||||||||
| Shopkeeper 电商掌柜(主账号) | ||||||||
| ShopWaiter 店小二(子账号) |
{
"name": "9999999999999999999999999",
"code": "string",
"ownerId": null,
"type": 0,
"description": "string",
"chatObjectIdList": [
"31F8B124-BEA6-85C4-B4E3-3A07BB313745","329A7C43-9B01-5966-322A-3A07D4A342EA","5B6A6100-CA52-8040-09F2-3A07D4A367ED","972157FA-2449-FEC6-49A1-3A07DE609F58",
]
}- 单用户绑定多个聊天对象
- 机器人
- 官方号(Official)
- 订阅号(Subscription)
- 掌柜(ShopKeeper)
- 店小二(ShopWaiter)
- 聊天广场(Square)
- 匿名(Anonymous)
- 动态信息添加(添加手机,QQ,职位等)
- 个性签名(Motto)
- 朋友圈
- 单聊
- 群聊
- 官方通知/功能号(Official)
- 聊天广场
- 订阅号/服务号
- 客服系统(CallCenter)
- 好友验证、处理好友验证消息
- 加群验证,群主/管理员处理验证
- 设置验证方式(不需要验证、验证、自动拒绝验证)
- 自动验证
- 我的会话消息
- 会话成员(群内成员,广场成员)
- 共同的好友、共同所在的群/广场
- 群/广场内名称
- 备注好友/群
- 会话置顶
- 会话免打扰功能
- 标记为已读
- 删除会话消息
- 清除会话消息
- 会话角标
- 删除会话(不退群)
- 退出会话(退群)
- 会话开启与停用(官方号、功能号)
- 订阅与取消订阅(订阅号、服务号)
- 设置聊天背景
- 只读会话(通知群、官方功能、公告等)
- 【新消息】角标统计
- 【私有消息】角标统计
- 【特别关注】角标统计
- 【@我】角标统计
- 动态属性备注(添加手机,QQ,职位等)
- 会话生成器(SessionGenerator)
- 会话盒子(SessionBox)
- 创建聊天广场
- 二维码扫码加入群聊
- 二维码扫码加入聊天广场
- 角色管理、角色权限分配
- 组织架构
- 角色管理、角色权限分配
- 会话内权限(组织、角色、加人,踢人等)
- 权限分组
- 权限启用与禁用
- 会话标签(SessionTag)--
- 会话菜单功能
- “拍一拍”
- 消息提醒(@我、@所有人、@XXX)
- 禁言(管理员、群主)
- 是否允许设置“免打扰”
- 特别关注
- 一键关注()
- 收藏
- 消息已读
- 消息已打开
- 创建群聊
- 邀请成员入群
- 邀请成员加群
- 群主权限(拥有所有权限)
- 群角色功能(可配置多角色)
- 群成员权限(可单一配置成员权限)
- [权限]更新群名称并通知群成员
- [权限]更新头头像并通知群成员
- 转让群主
- 共同所在的群
- 加群验证(验证消息由【机器人/群助手】发送到【群主或管理员】)
- 管理员/群主处理验证
- 添加/取消【特别关注】(关注群成员,有新消息时标注为【特别关注】)
- 入群方式设置
- 二维码扫码加入群聊
- 面对面加群
- 邀请码加群
- 群内组织架构
- 群内公告
- 群机器人提醒功能
- 设置是否可以转发群里消息
- 设置新成员“默认角色”
- 设置新成员“历史消息查看范围”
- 创建聊天广场
- 广场成员(分组)
- 特别关注(关注群成员,有新消息时标注为【特别关注】)
- 设置广场进入方式(公有、私有)
- 广场公告
- 机器人提醒功能
- 设置“能过账号找到我”
- 设置“通过手机号找到我”
- 设置“好友验证方式”
- 设置是否群内加好友
- 启用与停用功能
- 设置是否可以停用
- 设置是否为只读(通知功能 ,成员不能发消息,只能接收消息)
- 订阅与取消订阅(同时发会话内私有通知)
- 设置是否可以停用
- 设置是否为只读(通知功能 ,成员不能发消息,只能接收消息)
- 创建子账号
- 子账号管理(开启、禁用、删除)
- 消息同步
- 消息转接
- 账号状态设置(挂起、忙录)
- 系统消息(Command)
- 文本消息
- 图片消息
- 语音消息
- 视频消息
- 文件消息
- 文章消息
- HTML消息
- 链接消息
- 名片消息
- HTML消息[H5、markdown]
- 位置消息(Location)
- 历史聊天记录
- 公告消息(群公告、广场公告)
- 红包消息(未实现支付功能,只能积分形式收发红包)
- 转发消息
- 群发消息
- 引用消息
- 消息提醒器
- 消息收藏夹
- 消息已读记录器(ReadedRecorder)
- 消息打开记录器(OpenedRecorder)
- 敏感词过滤\审核
- Elasticsearch(elastic.co)
- 子账号管理
- 设置服务状态(挂起、接收、忙录等)
- 会话转接功能
- 消息分流功能
- 客户发起会话(自动加入会话)
- 机器人账号
- 机器人主动发通知
- ChatGPT
- Google Gemini
- 开发者设置(Token、EncodingAesKey、PostUrl)
- 开启与关闭功能
- 验证及验签(signature)
- Http请求开发者服务日志
- 后台作业调用开发者及重试功能
- 验证开发者主机(HOST)
- 开发者Demo
- 开发者SDK
- 权限验证(APIKey)
- ApiKey管理功能
- Api日志
- 实现共享位置
- 扫码登录
- 文件服务器(文件预览)