package ink.wgink.interfaces.manager;

import ink.wgink.exceptions.websocket.SessionException;
import ink.wgink.pojo.session.WebSocketSession;
import io.netty.channel.Channel;

import java.util.List;

/**
 * @ClassName: IRedisWebSocketChannelManager
 * @Description: redis websocket channel 管理器
 * @Author: wanggeng
 * @Date: 2021/11/29 5:57 下午
 * @Version: 1.0
 */
public interface IWebSocketUserSessionManager {

    String CHANNEL_HASH_KEY = "websocket:channels";

    /**
     * 初始化
     *
     * @param userId
     * @param sessionId
     * @param clientName
     */
    void init(String userId, String sessionId, String clientName);

    /**
     * 添加通道
     *
     * @param sessionId
     * @param userId
     * @param channel
     * @return
     * @throws SessionException
     */
    WebSocketSession addChannel(String sessionId, String userId, Channel channel) throws SessionException;

    /**
     * 删除通道
     *
     * @param channel
     */
    void removeChannel(Channel channel);

    /**
     * 在线会话列表
     *
     * @param userId 用户ID
     * @return
     */
    List<WebSocketSession> listOnlineUser(String userId);

    /**
     * 在线会话
     *
     * @param userId     用户ID
     * @param clientName 客户端名称
     * @return
     */
    List<WebSocketSession> listOnlineUser(String userId, String clientName);

    /**
     * 在线会话列表
     *
     * @param userIds 用户ID列表
     * @return
     */
    List<WebSocketSession> listOnlineUser(List<String> userIds);

    /**
     * 在线会话列表
     *
     * @param userIds    用户ID
     * @param clientName 客户端名称
     * @return
     */
    List<WebSocketSession> listOnlineUser(List<String> userIds, String clientName);

    /**
     * 在线用户
     *
     * @param sessionId 会话ID
     * @return
     */
    WebSocketSession getOnlineUserBySessionId(String sessionId);

    /**
     * 通过通道获取用户
     *
     * @param channelId
     * @return
     */
    WebSocketSession getOnlineUserByChannelId(String channelId);

}
