Beispiel #1
0
 /// <summary>
 /// Retrieves messages.
 /// </summary>
 /// <param name="start">Start message ID.</param>
 /// <param name="end">End message ID.</param>
 /// <param name="direction">Query direction (defaults to NewToOld).</param>
 /// <param name="limit">Limits the number of returned results. Its default value is 100.</param>
 /// <param name="messageType">The message type to query. The default value is 0 (text message).</param>
 /// <returns></returns>
 public async Task <ReadOnlyCollection <LCIMMessage> > QueryMessages(LCIMMessageQueryEndpoint start      = null,
                                                                     LCIMMessageQueryEndpoint end        = null,
                                                                     LCIMMessageQueryDirection direction = LCIMMessageQueryDirection.NewToOld,
                                                                     int limit       = 20,
                                                                     int messageType = 0)
 {
     return(await Client.MessageController.QueryMessages(Id, start, end, direction, limit, messageType));
 }
        internal async Task <ReadOnlyCollection <LCIMMessage> > QueryMessages(string convId,
                                                                              LCIMMessageQueryEndpoint start      = null,
                                                                              LCIMMessageQueryEndpoint end        = null,
                                                                              LCIMMessageQueryDirection direction = LCIMMessageQueryDirection.NewToOld,
                                                                              int limit       = 20,
                                                                              int messageType = 0)
        {
            LogsCommand logs = new LogsCommand {
                Cid = convId
            };

            if (start != null)
            {
                logs.T         = start.SentTimestamp;
                logs.Mid       = start.MessageId;
                logs.TIncluded = start.IsClosed;
            }
            if (end != null)
            {
                logs.Tt         = end.SentTimestamp;
                logs.Tmid       = end.MessageId;
                logs.TtIncluded = end.IsClosed;
            }
            logs.Direction = direction == LCIMMessageQueryDirection.NewToOld ?
                             LogsCommand.Types.QueryDirection.Old : LogsCommand.Types.QueryDirection.New;
            logs.Limit = limit;
            if (messageType != 0)
            {
                logs.Lctype = messageType;
            }
            GenericCommand request = NewCommand(CommandType.Logs, OpType.Open);

            request.LogsMessage = logs;
            GenericCommand response = await Connection.SendRequest(request);

            // 反序列化聊天记录
            return(response.LogsMessage.Logs.Select(item => {
                LCIMMessage message;
                if (item.Bin)
                {
                    // 二进制消息
                    byte[] bytes = Convert.FromBase64String(item.Data);
                    message = LCIMBinaryMessage.Deserialize(bytes);
                }
                else
                {
                    // 类型消息
                    message = LCIMTypedMessage.Deserialize(item.Data);
                }
                message.ConversationId = convId;
                message.Id = item.MsgId;
                message.FromClientId = item.From;
                message.SentTimestamp = item.Timestamp;
                message.DeliveredTimestamp = item.AckAt;
                message.ReadTimestamp = item.ReadAt;
                message.PatchedTimestamp = item.PatchTimestamp;
                message.MentionAll = item.MentionAll;
                message.MentionIdList = item.MentionPids.ToList();
                message.Mentioned = message.MentionAll ||
                                    message.MentionIdList.Contains(Client.Id);
                return message;
            }).ToList().AsReadOnly());
        }