Example #1
0
 private void OnMessage(LCIMConversation conv, LCIMMessage msg)
 {
     if (conv.Id == WordConversationId)
     {
         AddMessage(msg);
     }
 }
Example #2
0
 private void OnMessage(LCIMConversation conv, LCIMMessage msg)
 {
     if (conv.Id == conversation.Id &&
         msg is LCIMTextMessage textMsg)
     {
         AddMessage(textMsg);
     }
 }
Example #3
0
    private async void AddMessage(LCIMMessage message)
    {
        LCUser user = await LCManager.Instance.GetUser(message.FromClientId);

        scrollRect.AddItemData(new MessageEntity {
            User    = user,
            Message = message
        });
        StartCoroutine(Resize());
    }
        internal async Task RecallMessage(string convId,
                                          LCIMMessage message)
        {
            PatchCommand patch = new PatchCommand();
            PatchItem    item  = new PatchItem {
                Cid            = convId,
                Mid            = message.Id,
                From           = Client.Id,
                Recall         = true,
                Timestamp      = message.SentTimestamp,
                PatchTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
            };

            patch.Patches.Add(item);
            GenericCommand request = NewCommand(CommandType.Patch, OpType.Modify);

            request.PatchMessage = patch;
            await Connection.SendRequest(request);
        }
        internal async Task Read(string convId,
                                 LCIMMessage msg)
        {
            ReadCommand read  = new ReadCommand();
            ReadTuple   tuple = new ReadTuple {
                Cid = convId
            };

            // 当不传 msg 时,服务端将其收到的最后一条消息标记为已读,可能与客户端不一致
            if (msg != null)
            {
                tuple.Mid       = msg.Id;
                tuple.Timestamp = msg.SentTimestamp;
            }
            read.Convs.Add(tuple);
            GenericCommand command = NewCommand(CommandType.Read);

            command.ReadMessage = read;
            await Connection.SendCommand(command);
        }
Example #6
0
        private async Task OnUnread(GenericCommand notification)
        {
            UnreadCommand unread = notification.UnreadMessage;

            IEnumerable <string> convIds = unread.Convs
                                           .Select(conv => conv.Cid);
            Dictionary <string, LCIMConversation> conversationDict = (await Client.GetConversationList(convIds))
                                                                     .ToDictionary(item => item.Id);
            ReadOnlyCollection <LCIMConversation> conversations = unread.Convs.Select(conv => {
                // 设置对话中的未读数据
                LCIMConversation conversation = conversationDict[conv.Cid];
                conversation.Unread           = conv.Unread;
                if (conv.HasData || conv.HasBinaryMsg)
                {
                    // 如果有消息,则反序列化
                    LCIMMessage message = null;
                    if (conv.HasBinaryMsg)
                    {
                        // 二进制消息
                        byte[] bytes = conv.BinaryMsg.ToByteArray();
                        message      = LCIMBinaryMessage.Deserialize(bytes);
                    }
                    else
                    {
                        // 类型消息
                        message = LCIMTypedMessage.Deserialize(conv.Data);
                    }
                    // 填充消息数据
                    message.ConversationId   = conv.Cid;
                    message.Id               = conv.Mid;
                    message.FromClientId     = conv.From;
                    message.SentTimestamp    = conv.Timestamp;
                    message.Mentioned        = conv.Mentioned;
                    conversation.LastMessage = message;
                }
                return(conversation);
            }).ToList().AsReadOnly();

            Client.OnUnreadMessagesCountUpdated?.Invoke(conversations);
        }
        internal async Task UpdateMessage(string convId,
                                          LCIMMessage oldMessage,
                                          LCIMMessage newMessage)
        {
            PatchCommand patch = new PatchCommand();
            PatchItem    item  = new PatchItem {
                Cid            = convId,
                Mid            = oldMessage.Id,
                From           = Client.Id,
                Recall         = false,
                Timestamp      = oldMessage.SentTimestamp,
                PatchTimestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
            };

            if (newMessage is LCIMTypedMessage typedMessage)
            {
                item.Data = JsonConvert.SerializeObject(typedMessage.Encode());
            }
            else if (newMessage is LCIMBinaryMessage binaryMessage)
            {
                item.BinaryMsg = ByteString.CopyFrom(binaryMessage.Data);
            }
            if (newMessage.MentionIdList != null)
            {
                item.MentionPids.AddRange(newMessage.MentionIdList);
            }
            if (newMessage.MentionAll)
            {
                item.MentionAll = newMessage.MentionAll;
            }
            patch.Patches.Add(item);
            GenericCommand request = NewCommand(CommandType.Patch, OpType.Modify);

            request.PatchMessage = patch;
            GenericCommand response = await Connection.SendRequest(request);
        }
        internal async Task <LCIMMessage> Send(string convId,
                                               LCIMMessage message,
                                               LCIMMessageSendOptions options)
        {
            DirectCommand direct = new DirectCommand {
                FromPeerId = Client.Id,
                Cid        = convId,
            };

            if (message is LCIMTypedMessage typedMessage)
            {
                direct.Msg = JsonConvert.SerializeObject(typedMessage.Encode());
            }
            else if (message is LCIMBinaryMessage binaryMessage)
            {
                direct.BinaryMsg = ByteString.CopyFrom(binaryMessage.Data);
            }
            else
            {
                throw new ArgumentException("Message MUST be LCIMTypedMessage or LCIMBinaryMessage.");
            }
            // 暂态消息
            if (options.Transient)
            {
                direct.Transient = options.Transient;
            }
            // 消息接收回执
            if (options.Receipt)
            {
                direct.R = options.Receipt;
            }
            // 遗愿消息
            if (options.Will)
            {
                direct.Will = options.Will;
            }
            // 推送数据
            if (options.PushData != null)
            {
                direct.PushData = JsonConvert.SerializeObject(options.PushData);
            }
            // 提醒所有人
            if (message.MentionAll)
            {
                direct.MentionAll = message.MentionAll;
            }
            // 提醒用户列表
            if (message.MentionIdList != null &&
                message.MentionIdList.Count > 0)
            {
                direct.MentionPids.AddRange(message.MentionIdList);
            }
            GenericCommand command = NewCommand(CommandType.Direct);

            command.DirectMessage = direct;
            // 优先级
            if (command.Priority > 0)
            {
                command.Priority = (int)options.Priority;
            }
            GenericCommand response = await Connection.SendRequest(command);

            // 消息发送应答
            AckCommand ack = response.AckMessage;

            message.Id            = ack.Uid;
            message.SentTimestamp = ack.T;
            message.FromClientId  = Client.Id;
            return(message);
        }