예제 #1
0
        private void _DoNotify(ref Dictionary <long, MessageStoreResult> messages, NotifyMessageRequest request, Push.Data.IDBMessage senderMessage)
        {
            if (request.IsNotNotify)
            {
                return;
            }
            if (messages != null && messages.Count > 0)
            {
                var insterMessage = messages.Where(m => m.Value.IsInsert).ToDictionary(m => m.Key, m => m.Value);
                if (insterMessage.Count > 0)
                {
                    var sessionId = senderMessage.sessionId;
                    if ((!insterMessage.ContainsKey(request.Sender)) && request.MessageType == MessageType.Message)
                    {
                        insterMessage.Add(request.Sender, insterMessage.First().Value);
                    }
                    var uids = insterMessage.Keys.Distinct().ToArray();

                    var nicks = new Dictionary <long, UserName>();
                    if (request.Sender == 0)
                    {
                        nicks = insterMessage.Keys.ToDictionary(k => k, k => new UserName(String.Empty, NameKind.Name));
                    }
                    else if (request.SessionType != ActionType.ADMIN_MESSAGE.Action)
                    {
                        var nameProvider = _UserNameProviderFactory.CreateProvider(request.Sender);
                        uids  = nameProvider.GetNotifyUsers(uids, request.SessionId, request.SessionType);
                        nicks = nameProvider.NickForUsers(uids);
                        if (request.SessionType == ActionType.SINGLE_MESSAGE.Action)
                        {
                            sessionId = request.Sender;
                        }
                    }
                    else
                    {
                        nicks = insterMessage.Keys.ToDictionary(k => k, k => new UserName("足聊小蜜", NameKind.Name));
                    }

                    //处理阿里云推送
                    var senderNames = nicks.GroupBy(n => n.Value.Name).Select(ns => new { nick = ns.Key, receivers = ns.Select(n => n.Key) }).ToDictionary(n => n.nick, n => n.receivers);
                    var unNicks     = uids.Except(nicks.Keys.Distinct()).ToArray();
                    if (unNicks.Length > 0)
                    {
                        if (senderNames.ContainsKey(String.Empty))
                        {
                            senderNames[String.Empty] = senderNames[String.Empty].Concat(unNicks);
                        }
                        else
                        {
                            senderNames.Add(String.Empty, unNicks);
                        }
                    }
                    foreach (var name in senderNames)
                    {
                        var receivers = name.Value.ToArray();
                        var msg       = new Tgnet.FootChat.Push.MessageModel(name.Key, senderMessage);
                        msg.SessionId = sessionId;
                        Push(request, msg, receivers, true);
                    }
                }
            }
        }
예제 #2
0
        public Dictionary <long, Push.Data.IDBMessage> Notify(NotifyMessageRequest request, out Push.Data.IDBMessage senderMessage)
        {
            ExceptionHelper.ThrowIfNull(request, "request");
            var messages = SaveMessage(request, out senderMessage);

            _DoNotify(ref messages, request, senderMessage);
            return(messages.ToDictionary(r => r.Key, r => r.Value.Message));
        }