Exemplo n.º 1
0
Arquivo: MsgKit.cs Projeto: Daoting/dt
        /// <summary>
        /// 向用户列表中的在线用户推送信息
        /// </summary>
        /// <param name="p_userIDs">用户列表</param>
        /// <param name="p_msg">待推送信息</param>
        /// <returns>在线推送列表</returns>
        public static async Task <List <long> > Push(List <long> p_userIDs, MsgInfo p_msg)
        {
            if (p_userIDs == null || p_userIDs.Count == 0 || p_msg == null)
            {
                throw new Exception("待推送的用户或信息不可为空!");
            }

            var    onlines   = new List <long>();
            var    offlines  = new List <long>();
            string onlineMsg = p_msg.GetOnlineMsg();
            int    cnt       = await Kit.GetSvcReplicaCount();

            if (cnt > 1)
            {
                // Msg服务多副本推送
                await PushMultipleReplicas(p_userIDs, onlineMsg, onlines, offlines, cnt);
            }
            else
            {
                // 本地单副本推送
                PushLocal(p_userIDs, onlineMsg, onlines, offlines);
            }

            // 离线
            if (offlines.Count > 0)
            {
                // 将消息保存到用户的未推送列表
                var lc = new ListCache <string>(MsgQueueKey);
                foreach (long id in offlines)
                {
                    await lc.RightPush(id, onlineMsg);
                }

                // 推送离线提醒
                if (!string.IsNullOrEmpty(p_msg.Title))
                {
                    Offline.Add(offlines, p_msg);
                }
            }
            return(onlines);
        }