private void OnMessage(LCIMConversation conv, LCIMMessage msg) { if (conv.Id == WordConversationId) { AddMessage(msg); } }
private void OnMessage(LCIMConversation conv, LCIMMessage msg) { if (conv.Id == conversation.Id && msg is LCIMTextMessage textMsg) { AddMessage(textMsg); } }
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); }
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); }