示例#1
0
        internal async Task <LCIMPartiallySuccessResult> UnblockMembers(string convId,
                                                                        IEnumerable <string> clientIds)
        {
            BlacklistCommand blacklist = new BlacklistCommand {
                SrcCid = convId,
            };

            blacklist.ToPids.AddRange(clientIds);
            if (Client.SignatureFactory != null)
            {
                LCIMSignature signature = await Client.SignatureFactory.CreateBlacklistSignature(convId,
                                                                                                 Client.Id,
                                                                                                 clientIds,
                                                                                                 LCIMSignatureAction.ConversationUnblockClients);

                blacklist.S = signature.Signature;
                blacklist.T = signature.Timestamp;
                blacklist.N = signature.Nonce;
            }
            GenericCommand request = NewCommand(CommandType.Blacklist, OpType.Unblock);

            request.BlacklistMessage = blacklist;
            GenericCommand response = await Connection.SendRequest(request);

            return(NewPartiallySuccessResult(response.BlacklistMessage.AllowedPids, response.BlacklistMessage.FailedPids));
        }
示例#2
0
        internal async Task <LCIMPartiallySuccessResult> RemoveMembers(string convId,
                                                                       IEnumerable <string> removeIds)
        {
            ConvCommand conv = new ConvCommand {
                Cid = convId,
            };

            conv.M.AddRange(removeIds);
            // 签名参数
            if (Client.SignatureFactory != null)
            {
                LCIMSignature signature = await Client.SignatureFactory.CreateConversationSignature(convId,
                                                                                                    Client.Id,
                                                                                                    removeIds,
                                                                                                    LCIMSignatureAction.Kick);

                conv.S = signature.Signature;
                conv.T = signature.Timestamp;
                conv.N = signature.Nonce;
            }
            GenericCommand request = NewCommand(CommandType.Conv, OpType.Remove);

            request.ConvMessage = conv;
            GenericCommand response = await Connection.SendRequest(request);

            List <string>       allowedIds = response.ConvMessage.AllowedPids.ToList();
            List <ErrorCommand> errors     = response.ConvMessage.FailedPids.ToList();

            return(NewPartiallySuccessResult(allowedIds, errors));
        }
        private async Task <SessionCommand> NewSessionCommand()
        {
            SessionCommand session = new SessionCommand();

            if (Client.Tag != null)
            {
                session.Tag = Client.Tag;
            }
            if (Client.DeviceId != null)
            {
                session.DeviceId = Client.DeviceId;
            }
            LCIMSignature signature = null;

            if (Client.SignatureFactory != null)
            {
                signature = await Client.SignatureFactory.CreateConnectSignature(Client.Id);
            }
            if (signature == null && !string.IsNullOrEmpty(Client.SessionToken))
            {
                Dictionary <string, object> ret = await LCCore.HttpClient.Post <Dictionary <string, object> >("rtm/sign", data : new Dictionary <string, object> {
                    { "session_token", Client.SessionToken }
                });

                signature = new LCIMSignature {
                    Signature = ret["signature"] as string,
                    Timestamp = (long)ret["timestamp"],
                    Nonce     = ret["nonce"] as string
                };
            }
            if (signature != null)
            {
                session.S = signature.Signature;
                session.T = signature.Timestamp;
                session.N = signature.Nonce;
            }
            return(session);
        }
示例#4
0
        internal async Task <LCIMConversation> CreateConv(
            IEnumerable <string> members = null,
            string name      = null,
            bool transient   = false,
            bool unique      = true,
            bool temporary   = false,
            int temporaryTtl = 86400,
            Dictionary <string, object> properties = null)
        {
            GenericCommand request = NewCommand(CommandType.Conv, OpType.Start);
            ConvCommand    conv    = new ConvCommand {
                Transient = transient,
                Unique    = unique,
            };

            if (members != null)
            {
                conv.M.AddRange(members);
            }
            if (temporary)
            {
                conv.TempConv    = temporary;
                conv.TempConvTTL = temporaryTtl;
            }
            Dictionary <string, object> attrs = new Dictionary <string, object>();

            if (!string.IsNullOrEmpty(name))
            {
                attrs["name"] = name;
            }
            if (properties != null)
            {
                attrs = properties.Union(attrs.Where(kv => !properties.ContainsKey(kv.Key)))
                        .ToDictionary(k => k.Key, v => v.Value);
            }
            conv.Attr = new JsonObjectMessage {
                Data = JsonConvert.SerializeObject(LCEncoder.Encode(attrs))
            };
            if (Client.SignatureFactory != null)
            {
                LCIMSignature signature = await Client.SignatureFactory.CreateStartConversationSignature(Client.Id, members);

                conv.S = signature.Signature;
                conv.T = signature.Timestamp;
                conv.N = signature.Nonce;
            }
            request.ConvMessage = conv;
            GenericCommand response = await Connection.SendRequest(request);

            string convId = response.ConvMessage.Cid;

            if (!Client.ConversationDict.TryGetValue(convId, out LCIMConversation conversation))
            {
                if (transient)
                {
                    conversation = new LCIMChatRoom(Client);
                }
                else if (temporary)
                {
                    conversation = new LCIMTemporaryConversation(Client);
                }
                else if (properties != null && properties.ContainsKey("system"))
                {
                    conversation = new LCIMServiceConversation(Client);
                }
                else
                {
                    conversation = new LCIMConversation(Client);
                }
                Client.ConversationDict[convId] = conversation;
            }
            // 合并请求数据
            conversation.Id        = convId;
            conversation.Unique    = unique;
            conversation.UniqueId  = response.ConvMessage.UniqueId;
            conversation.Name      = name;
            conversation.CreatorId = Client.Id;
            conversation.ids       = members != null ?
                                     new HashSet <string>(members) : new HashSet <string>();
            // 将自己加入
            conversation.ids.Add(Client.Id);
            conversation.CreatedAt = DateTime.Parse(response.ConvMessage.Cdate);
            conversation.UpdatedAt = conversation.CreatedAt;
            return(conversation);
        }