* LCIMChatRoom.cs: chore: 增加会话实例化逻辑

* LCIMClient.cs:
* Program.cs:
* LCIMPartiallySuccessResult.cs:
* LCIMConversation.cs:
* LCIMServiceConversation.cs:
oneRain 2020-03-19 15:12:50 +08:00
parent 87d481f41d
commit b0b85274ca
6 changed files with 111 additions and 36 deletions

View File

@ -1,8 +1,27 @@
using System; using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using LeanCloud.Realtime.Protocol;
namespace LeanCloud.Realtime { namespace LeanCloud.Realtime {
public class LCIMChatRoom : LCIMConversation { public class LCIMChatRoom : LCIMConversation {
public LCIMChatRoom(LCIMClient client) : base(client) { public LCIMChatRoom(LCIMClient client) : base(client) {
} }
public async Task<int> GetOnlineMembersCount() {
return await GetMembersCount();
}
public async Task<List<string>> GetOnlineMembers(int limit = 50) {
ConvCommand conv = new ConvCommand {
Cid = Id,
Limit = limit
};
GenericCommand request = client.NewCommand(CommandType.Conv, OpType.Members);
request.ConvMessage = conv;
GenericCommand response = await client.connection.SendRequest(request);
List<string> memberList = response.ConvMessage.M.ToList();
return memberList;
}
} }
} }

View File

@ -6,6 +6,7 @@ using Newtonsoft.Json;
using Google.Protobuf; using Google.Protobuf;
using LeanCloud.Realtime.Protocol; using LeanCloud.Realtime.Protocol;
using LeanCloud.Storage.Internal.Codec; using LeanCloud.Storage.Internal.Codec;
using LeanCloud.Storage;
namespace LeanCloud.Realtime { namespace LeanCloud.Realtime {
public class LCIMConversation { public class LCIMConversation {
@ -26,15 +27,15 @@ namespace LeanCloud.Realtime {
} }
public List<string> MemberIdList { public List<string> MemberIdList {
get; set; get; internal set;
} }
public DateTime CreatedAt { public DateTime CreatedAt {
get; set; get; internal set;
} }
public DateTime UpdatedAt { public DateTime UpdatedAt {
get; set; get; internal set;
} }
public DateTime LastMessageAt { public DateTime LastMessageAt {
@ -54,11 +55,7 @@ namespace LeanCloud.Realtime {
get; private set; get; private set;
} }
public virtual bool IsSystem => false; protected readonly LCIMClient client;
public virtual bool IsTransient => false;
private readonly LCIMClient client;
private Dictionary<string, object> customProperties; private Dictionary<string, object> customProperties;
@ -71,7 +68,7 @@ namespace LeanCloud.Realtime {
/// 获取对话人数,或暂态对话的在线人数 /// 获取对话人数,或暂态对话的在线人数
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task<int> Count() { public async Task<int> GetMembersCount() {
ConvCommand conv = new ConvCommand { ConvCommand conv = new ConvCommand {
Cid = Id, Cid = Id,
}; };
@ -110,7 +107,7 @@ namespace LeanCloud.Realtime {
/// </summary> /// </summary>
/// <param name="clientIds">用户 Id</param> /// <param name="clientIds">用户 Id</param>
/// <returns></returns> /// <returns></returns>
public async Task<LCIMConversation> Add(IEnumerable<string> clientIds) { public async Task<LCIMPartiallySuccessResult> Add(IEnumerable<string> clientIds) {
if (clientIds == null || clientIds.Count() == 0) { if (clientIds == null || clientIds.Count() == 0) {
throw new ArgumentNullException(nameof(clientIds)); throw new ArgumentNullException(nameof(clientIds));
} }
@ -124,10 +121,8 @@ namespace LeanCloud.Realtime {
request.ConvMessage = conv; request.ConvMessage = conv;
GenericCommand response = await client.connection.SendRequest(request); GenericCommand response = await client.connection.SendRequest(request);
List<string> allowedIds = response.ConvMessage.AllowedPids.ToList(); List<string> allowedIds = response.ConvMessage.AllowedPids.ToList();
List<ErrorCommand> failedIds = response.ConvMessage.FailedPids.ToList(); List<ErrorCommand> errors = response.ConvMessage.FailedPids.ToList();
// TODO 转化为返回 return NewPartiallySuccessResult(allowedIds, errors);
return this;
} }
/// <summary> /// <summary>
@ -135,7 +130,7 @@ namespace LeanCloud.Realtime {
/// </summary> /// </summary>
/// <param name="removeIds">用户 Id</param> /// <param name="removeIds">用户 Id</param>
/// <returns></returns> /// <returns></returns>
public async Task<LCIMConversation> Remove(IEnumerable<string> removeIds) { public async Task<LCIMPartiallySuccessResult> Remove(IEnumerable<string> removeIds) {
if (removeIds == null || removeIds.Count() == 0) { if (removeIds == null || removeIds.Count() == 0) {
throw new ArgumentNullException(nameof(removeIds)); throw new ArgumentNullException(nameof(removeIds));
} }
@ -149,10 +144,8 @@ namespace LeanCloud.Realtime {
request.ConvMessage = conv; request.ConvMessage = conv;
GenericCommand response = await client.connection.SendRequest(request); GenericCommand response = await client.connection.SendRequest(request);
List<string> allowedIds = response.ConvMessage.AllowedPids.ToList(); List<string> allowedIds = response.ConvMessage.AllowedPids.ToList();
List<ErrorCommand> failedIds = response.ConvMessage.FailedPids.ToList(); List<ErrorCommand> errors = response.ConvMessage.FailedPids.ToList();
// TODO 转化为返回 return NewPartiallySuccessResult(allowedIds, errors);
return this;
} }
/// <summary> /// <summary>
@ -160,7 +153,12 @@ namespace LeanCloud.Realtime {
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task<LCIMConversation> Join() { public async Task<LCIMConversation> Join() {
return await Add(new string[] { client.ClientId }); LCIMPartiallySuccessResult result = await Add(new string[] { client.ClientId });
if (!result.IsSuccess) {
LCIMOperationFailure error = result.FailureList[0];
throw new LCException(error.Code, error.Reason);
}
return this;
} }
/// <summary> /// <summary>
@ -168,7 +166,12 @@ namespace LeanCloud.Realtime {
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public async Task<LCIMConversation> Quit() { public async Task<LCIMConversation> Quit() {
return await Remove(new string[] { client.ClientId }); LCIMPartiallySuccessResult result = await Remove(new string[] { client.ClientId });
if (!result.IsSuccess) {
LCIMOperationFailure error = result.FailureList[0];
throw new LCException(error.Code, error.Reason);
}
return this;
} }
/// <summary> /// <summary>
@ -208,7 +211,7 @@ namespace LeanCloud.Realtime {
}; };
GenericCommand request = client.NewCommand(CommandType.Conv, OpType.Mute); GenericCommand request = client.NewCommand(CommandType.Conv, OpType.Mute);
request.ConvMessage = conv; request.ConvMessage = conv;
GenericCommand response = await client.connection.SendRequest(request); await client.connection.SendRequest(request);
IsMute = true; IsMute = true;
return this; return this;
} }
@ -223,7 +226,7 @@ namespace LeanCloud.Realtime {
}; };
GenericCommand request = client.NewCommand(CommandType.Conv, OpType.Unmute); GenericCommand request = client.NewCommand(CommandType.Conv, OpType.Unmute);
request.ConvMessage = conv; request.ConvMessage = conv;
GenericCommand response = await client.connection.SendRequest(request); await client.connection.SendRequest(request);
IsMute = false; IsMute = false;
return this; return this;
} }

View File

@ -0,0 +1,8 @@
using System;
namespace LeanCloud.Realtime {
public class LCIMServiceConversation : LCIMConversation {
public LCIMServiceConversation(LCIMClient client) : base(client) {
}
}
}

View File

@ -4,7 +4,7 @@ using System.Threading.Tasks;
using System.Linq; using System.Linq;
using LeanCloud.Realtime.Internal.WebSocket; using LeanCloud.Realtime.Internal.WebSocket;
using LeanCloud.Realtime.Protocol; using LeanCloud.Realtime.Protocol;
using Google.Protobuf; using LeanCloud.Storage.Internal.Codec;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace LeanCloud.Realtime { namespace LeanCloud.Realtime {
@ -143,8 +143,6 @@ namespace LeanCloud.Realtime {
ConvCommand conv = new ConvCommand { ConvCommand conv = new ConvCommand {
Transient = transient, Transient = transient,
Unique = unique, Unique = unique,
TempConv = temporary,
TempConvTTL = temporaryTtl
}; };
if (members != null) { if (members != null) {
conv.M.AddRange(members); conv.M.AddRange(members);
@ -152,16 +150,35 @@ namespace LeanCloud.Realtime {
if (!string.IsNullOrEmpty(name)) { if (!string.IsNullOrEmpty(name)) {
conv.N = name; conv.N = name;
} }
if (temporary) {
conv.TempConv = temporary;
conv.TempConvTTL = temporaryTtl;
}
if (properties != null) { if (properties != null) {
conv.Attr = new JsonObjectMessage { conv.Attr = new JsonObjectMessage {
Data = JsonConvert.SerializeObject(properties) Data = JsonConvert.SerializeObject(LCEncoder.Encode(properties))
}; };
} }
command.ConvMessage = conv; command.ConvMessage = conv;
GenericCommand response = await connection.SendRequest(command); GenericCommand response = await connection.SendRequest(command);
LCIMConversation conversation = GetOrCreateConversation(response.ConvMessage.Cid); string convId = response.ConvMessage.Cid;
if (!conversationDict.TryGetValue(convId, out LCIMConversation conversation)) {
if (transient) {
conversation = new LCIMChatRoom(this);
} else if (temporary) {
conversation = new LCIMTemporaryConversation(this);
} else if (properties != null && properties.ContainsKey("system")) {
conversation = new LCIMServiceConversation(this);
} else {
conversation = new LCIMConversation(this);
}
conversationDict[convId] = conversation;
}
// 合并请求数据
conversation.Name = name;
conversation.MemberIdList = members?.ToList();
// 合并服务端推送的数据
conversation.MergeFrom(response.ConvMessage); conversation.MergeFrom(response.ConvMessage);
conversationDict[conversation.Id] = conversation;
return conversation; return conversation;
} }

View File

@ -14,5 +14,7 @@ namespace LeanCloud.Realtime {
public LCIMPartiallySuccessResult() { public LCIMPartiallySuccessResult() {
} }
public bool IsSuccess => FailureList == null || FailureList.Count == 0;
} }
} }

View File

@ -12,12 +12,6 @@ namespace RealtimeConsole {
public static void Main(string[] args) { public static void Main(string[] args) {
Console.WriteLine("Hello World!"); Console.WriteLine("Hello World!");
_ = Start();
Console.ReadKey(true);
}
static async Task Start() {
LCLogger.LogDelegate += (level, info) => { LCLogger.LogDelegate += (level, info) => {
switch (level) { switch (level) {
case LCLogLevel.Debug: case LCLogLevel.Debug:
@ -36,6 +30,38 @@ namespace RealtimeConsole {
}; };
LCApplication.Initialize("ikGGdRE2YcVOemAaRbgp1xGJ-gzGzoHsz", "NUKmuRbdAhg1vrb2wexYo1jo", "https://ikggdre2.lc-cn-n1-shared.com"); LCApplication.Initialize("ikGGdRE2YcVOemAaRbgp1xGJ-gzGzoHsz", "NUKmuRbdAhg1vrb2wexYo1jo", "https://ikggdre2.lc-cn-n1-shared.com");
//_ = Start();
//_ = ChatRoom();
_ = TemporaryConversation();
Console.ReadKey(true);
}
static async Task ChatRoom() {
LCIMClient hello = new LCIMClient("hello");
await hello.Open();
string name = Guid.NewGuid().ToString();
LCIMChatRoom chatRoom = await hello.CreateChatRoom(name);
Console.WriteLine(chatRoom.Name);
}
static async Task TemporaryConversation() {
string c1Id = Guid.NewGuid().ToString();
LCIMClient c1 = new LCIMClient(c1Id);
await c1.Open();
string c2Id = Guid.NewGuid().ToString();
LCIMClient c2 = new LCIMClient(c2Id);
await c2.Open();
LCIMTemporaryConversation temporaryConversation = await c1.CreateTemporaryConversation(new string[] { c2Id });
Console.WriteLine(temporaryConversation.Id);
}
static async Task Start() {
LCIMClient hello = new LCIMClient("hello"); LCIMClient hello = new LCIMClient("hello");
await hello.Open(); await hello.Open();