* LCIMConversation.cs:

* LCIMConversationQuery.cs:
* LCIMConversationController.cs:

* Conversation.cs: chore: 完善构造对话实例
oneRain 2020-03-30 16:51:14 +08:00
parent 60cd97c725
commit 66f3a479b4
4 changed files with 38 additions and 33 deletions

View File

@ -5,11 +5,16 @@ using System.Linq;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using LeanCloud.Realtime.Protocol; using LeanCloud.Realtime.Protocol;
using LeanCloud.Storage; using LeanCloud.Storage;
using LeanCloud.Storage.Internal.Codec;
namespace LeanCloud.Realtime { namespace LeanCloud.Realtime {
public class LCIMConversation { public class LCIMConversation {
public string Id { public string Id {
get; set; get; internal set;
}
public bool Unique {
get; internal set;
} }
public string UniqueId { public string UniqueId {
@ -19,7 +24,8 @@ namespace LeanCloud.Realtime {
public string Name { public string Name {
get { get {
return this["name"] as string; return this["name"] as string;
} set { }
internal set {
this["name"] = value; this["name"] = value;
} }
} }
@ -28,7 +34,7 @@ namespace LeanCloud.Realtime {
get; set; get; set;
} }
public ReadOnlyCollection<string> MemberIdList { public ReadOnlyCollection<string> MemberIds {
get { get {
return new ReadOnlyCollection<string>(ids.ToList()); return new ReadOnlyCollection<string>(ids.ToList());
} }
@ -349,28 +355,13 @@ namespace LeanCloud.Realtime {
return convId.StartsWith("_tmp:"); return convId.StartsWith("_tmp:");
} }
internal void MergeFrom(ConvCommand conv) {
if (conv.HasCid) {
Id = conv.Cid;
}
if (conv.HasInitBy) {
CreatorId = conv.InitBy;
}
if (conv.HasCdate) {
CreatedAt = DateTime.Parse(conv.Cdate);
}
if (conv.HasUdate) {
UpdatedAt = DateTime.Parse(conv.Udate);
}
if (conv.M.Count > 0) {
ids = new HashSet<string>(conv.M.ToList());
}
}
internal void MergeFrom(Dictionary<string, object> conv) { internal void MergeFrom(Dictionary<string, object> conv) {
if (conv.TryGetValue("objectId", out object idObj)) { if (conv.TryGetValue("objectId", out object idObj)) {
Id = idObj as string; Id = idObj as string;
} }
if (conv.TryGetValue("unique", out object uniqueObj)) {
Unique = (bool)uniqueObj;
}
if (conv.TryGetValue("uniqueId", out object uniqueIdObj)) { if (conv.TryGetValue("uniqueId", out object uniqueIdObj)) {
UniqueId = uniqueIdObj as string; UniqueId = uniqueIdObj as string;
} }
@ -384,10 +375,15 @@ namespace LeanCloud.Realtime {
CreatorId = co as string; CreatorId = co as string;
} }
if (conv.TryGetValue("m", out object mo)) { if (conv.TryGetValue("m", out object mo)) {
ids = new HashSet<string>((mo as IList<object>).Cast<string>()); IEnumerable<string> ids = (mo as IList<object>).Cast<string>();
this.ids = new HashSet<string>(ids);
} }
if (conv.TryGetValue("mu", out object muo)) { if (conv.TryGetValue("mu", out object muo)) {
mutedIds = new HashSet<string>((muo as IList<object>).Cast<string>()); IEnumerable<string> ids = (muo as IList<object>).Cast<string>();
mutedIds = new HashSet<string>(ids);
}
if (conv.TryGetValue("lm", out object lmo)) {
LastMessageAt = (DateTime)LCDecoder.Decode(lmo);
} }
} }

View File

@ -1,6 +1,5 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using LeanCloud.Storage.Internal.Query; using LeanCloud.Storage.Internal.Query;

View File

@ -78,10 +78,15 @@ namespace LeanCloud.Realtime.Internal.Controller {
Client.ConversationDict[convId] = conversation; Client.ConversationDict[convId] = conversation;
} }
// 合并请求数据 // 合并请求数据
conversation.Id = convId;
conversation.Unique = unique;
conversation.UniqueId = response.ConvMessage.UniqueId;
conversation.Name = name; conversation.Name = name;
conversation.ids = members != null ? new HashSet<string>(members) : null; conversation.CreatorId = Client.Id;
// 合并服务端推送的数据 conversation.ids = members != null ?
conversation.MergeFrom(response.ConvMessage); new HashSet<string>(members) : new HashSet<string>();
conversation.CreatedAt = DateTime.Parse(response.ConvMessage.Cdate);
conversation.UpdatedAt = conversation.CreatedAt;
return conversation; return conversation;
} }
@ -457,12 +462,18 @@ namespace LeanCloud.Realtime.Internal.Controller {
Dictionary<string, object> conv = item as Dictionary<string, object>; Dictionary<string, object> conv = item as Dictionary<string, object>;
string convId = conv["objectId"] as string; string convId = conv["objectId"] as string;
if (!Client.ConversationDict.TryGetValue(convId, out LCIMConversation conversation)) { if (!Client.ConversationDict.TryGetValue(convId, out LCIMConversation conversation)) {
// TODO 解析是哪种类型的对话 // 解析是哪种类型的对话
if (conv.TryGetValue("tr", out object transient) && (bool)transient == true) {
conversation = new LCIMConversation(Client); conversation = new LCIMChatRoom(Client);
} else if (conv.ContainsKey("tempConv") && conv.ContainsKey("tempConvTTL")) {
conversation = new LCIMTemporaryConversation(Client);
} else if (conv.TryGetValue("sys", out object sys) && (bool)sys == true) {
conversation = new LCIMServiceConversation(Client);
} else {
conversation = new LCIMConversation(Client);
}
Client.ConversationDict[convId] = conversation; Client.ConversationDict[convId] = conversation;
} }
conversation.MergeFrom(conv); conversation.MergeFrom(conv);
return conversation; return conversation;
}).ToList().AsReadOnly(); }).ToList().AsReadOnly();
@ -556,7 +567,6 @@ namespace LeanCloud.Realtime.Internal.Controller {
/// <returns></returns> /// <returns></returns>
private async Task OnJoined(ConvCommand convMessage) { private async Task OnJoined(ConvCommand convMessage) {
LCIMConversation conversation = await Client.GetOrQueryConversation(convMessage.Cid); LCIMConversation conversation = await Client.GetOrQueryConversation(convMessage.Cid);
conversation.MergeFrom(convMessage);
Client.OnInvited?.Invoke(conversation, convMessage.InitBy); Client.OnInvited?.Invoke(conversation, convMessage.InitBy);
} }

View File

@ -35,7 +35,7 @@ namespace Realtime.Test {
client.OnMembersJoined = (conv, memberList, initBy) => { client.OnMembersJoined = (conv, memberList, initBy) => {
TestContext.WriteLine($"on members joined: {initBy}"); TestContext.WriteLine($"on members joined: {initBy}");
foreach (string memberId in conv.MemberIdList) { foreach (string memberId in conv.MemberIds) {
TestContext.WriteLine(memberId); TestContext.WriteLine(memberId);
} }
tcs.SetResult(null); tcs.SetResult(null);