Files
2026-05-26 16:15:54 +08:00

523 lines
21 KiB
C#

using System;
using System.Collections.Generic;
using com.fpnn.proto;
namespace com.fpnn.rtm
{
public partial class RTMClient
{
private List<Conversation> BuildP2PConversationList(List<long> conversations, List<int> unreads, List<object> messages)
{
List<Conversation> conversationList = new List<Conversation>();
int i = 0;
foreach (List<object> items in messages)
{
HistoryMessage message = new HistoryMessage();
message.cursorId = (long)Convert.ChangeType(items[0], TypeCode.Int64);
if (message.cursorId != 0)
{
long direction = (long)Convert.ChangeType(items[1], TypeCode.Int64);
if (direction == 1)
{
message.fromUid = Uid;
message.toId = conversations[i];
}
else
{
message.fromUid = conversations[i];
message.toId = Uid;
}
message.messageType = (byte)Convert.ChangeType(items[2], TypeCode.Byte);
message.messageId = (long)Convert.ChangeType(items[3], TypeCode.Int64);
if (!CheckBinaryType(items[5]))
message.stringMessage = (string)Convert.ChangeType(items[5], TypeCode.String);
else
message.binaryMessage = (byte[])items[5];
message.attrs = (string)Convert.ChangeType(items[6], TypeCode.String);
message.modifiedTime = (long)Convert.ChangeType(items[7], TypeCode.Int64);
if (message.messageType >= 40 && message.messageType <= 50)
RTMClient.BuildFileInfo(message, errorRecorder);
}
Conversation conversation = new Conversation();
conversation.id = conversations[i];
conversation.conversationType = ConversationType.P2P;
conversation.unreadCount = unreads[i];
conversation.lastMessage = message;
conversationList.Add(conversation);
i += 1;
}
return conversationList;
}
public bool GetP2PConversationList(Action<List<Conversation>, int> callback, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
TCPClient client = GetCoreClient();
if (client == null)
{
if (RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return false;
}
Quest quest = new Quest("getp2pconversationlist");
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
bool asyncStarted = client.SendQuest(quest, (Answer answer, int errorCode) => {
List<Conversation> conversationList = null;
if (errorCode == fpnn.ErrorCode.FPNN_EC_OK)
{
try
{
List<long> conversations = WantLongList(answer, "conversations");
List<int> unreads = GetIntList(answer, "unreads");
List<object> messages = (List<object>)answer.Want("msgs");
conversationList = BuildP2PConversationList(conversations, unreads, messages);
}
catch (Exception)
{
errorCode = fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
callback(conversationList, errorCode);
}, timeout);
if (!asyncStarted && RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return asyncStarted;
}
public int GetP2PConversationList(out List<Conversation> conversationList, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
conversationList = null;
TCPClient client = GetCoreClient();
if (client == null)
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION;
Quest quest = new Quest("getp2pconversationlist");
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
Answer answer = client.SendQuest(quest, timeout);
if (answer.IsException())
return answer.ErrorCode();
try
{
List<long> conversations = WantLongList(answer, "conversations");
List<int> unreads = GetIntList(answer, "unreads");
List<object> messages = (List<object>)answer.Want("msgs");
conversationList = BuildP2PConversationList(conversations, unreads, messages);
return fpnn.ErrorCode.FPNN_EC_OK;
}
catch (Exception)
{
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
public bool GetP2PUnreadConversationList(Action<List<Conversation>, int> callback, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
TCPClient client = GetCoreClient();
if (client == null)
{
if (RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return false;
}
Quest quest = new Quest("getp2punreadconversationlist");
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
bool asyncStarted = client.SendQuest(quest, (Answer answer, int errorCode) => {
List<Conversation> conversationList = null;
if (errorCode == fpnn.ErrorCode.FPNN_EC_OK)
{
try
{
List<long> conversations = WantLongList(answer, "conversations");
List<int> unreads = GetIntList(answer, "unreads");
List<object> messages = (List<object>)answer.Want("msgs");
conversationList = BuildP2PConversationList(conversations, unreads, messages);
}
catch (Exception)
{
errorCode = fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
callback(conversationList, errorCode);
}, timeout);
if (!asyncStarted && RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return asyncStarted;
}
public int GetP2PUnreadConversationList(out List<Conversation> conversationList, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
conversationList = null;
TCPClient client = GetCoreClient();
if (client == null)
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION;
Quest quest = new Quest("getp2punreadconversationlist");
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
Answer answer = client.SendQuest(quest, timeout);
if (answer.IsException())
return answer.ErrorCode();
try
{
List<long> conversations = WantLongList(answer, "conversations");
List<int> unreads = GetIntList(answer, "unreads");
List<object> messages = (List<object>)answer.Want("msgs");
conversationList = BuildP2PConversationList(conversations, unreads, messages);
return fpnn.ErrorCode.FPNN_EC_OK;
}
catch (Exception)
{
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
private List<Conversation> BuildGroupConversationList(List<long> conversations, List<int> unreads, List<object> messages)
{
List<Conversation> conversationList = new List<Conversation>();
int i = 0;
foreach (List<object> items in messages)
{
HistoryMessage message = new HistoryMessage();
message.cursorId = (long)Convert.ChangeType(items[0], TypeCode.Int64);
if (message.cursorId != 0)
{
message.fromUid = (long)Convert.ChangeType(items[1], TypeCode.Int64);
message.toId = conversations[i];
message.messageType = (byte)Convert.ChangeType(items[2], TypeCode.Byte);
message.messageId = (long)Convert.ChangeType(items[3], TypeCode.Int64);
if (!CheckBinaryType(items[5]))
message.stringMessage = (string)Convert.ChangeType(items[5], TypeCode.String);
else
message.binaryMessage = (byte[])items[5];
message.attrs = (string)Convert.ChangeType(items[6], TypeCode.String);
message.modifiedTime = (long)Convert.ChangeType(items[7], TypeCode.Int64);
if (message.messageType >= 40 && message.messageType <= 50)
RTMClient.BuildFileInfo(message, errorRecorder);
}
Conversation conversation = new Conversation();
conversation.id = conversations[i];
conversation.conversationType = ConversationType.GROUP;
conversation.unreadCount = unreads[i];
conversation.lastMessage = message;
conversationList.Add(conversation);
i += 1;
}
return conversationList;
}
public bool GetGroupConversationList(Action<List<Conversation>, int> callback, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
TCPClient client = GetCoreClient();
if (client == null)
{
if (RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return false;
}
Quest quest = new Quest("getgroupconversationlist");
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
bool asyncStarted = client.SendQuest(quest, (Answer answer, int errorCode) => {
List<Conversation> conversationList = null;
if (errorCode == fpnn.ErrorCode.FPNN_EC_OK)
{
try
{
List<long> conversations = WantLongList(answer, "conversations");
List<int> unreads = GetIntList(answer, "unreads");
List<object> messages = (List<object>)answer.Want("msgs");
conversationList = BuildGroupConversationList(conversations, unreads, messages);
}
catch (Exception)
{
errorCode = fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
callback(conversationList, errorCode);
}, timeout);
if (!asyncStarted && RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return asyncStarted;
}
public int GetGroupConversationList(out List<Conversation> conversationList, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
conversationList = null;
TCPClient client = GetCoreClient();
if (client == null)
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION;
Quest quest = new Quest("getgroupconversationlist");
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
Answer answer = client.SendQuest(quest, timeout);
if (answer.IsException())
return answer.ErrorCode();
try
{
List<long> conversations = WantLongList(answer, "conversations");
List<int> unreads = GetIntList(answer, "unreads");
List<object> messages = (List<object>)answer.Want("msgs");
conversationList = BuildGroupConversationList(conversations, unreads, messages);
return fpnn.ErrorCode.FPNN_EC_OK;
}
catch (Exception)
{
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
public bool GetGroupUnreadConversationList(Action<List<Conversation>, int> callback, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
TCPClient client = GetCoreClient();
if (client == null)
{
if (RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return false;
}
Quest quest = new Quest("getgroupunreadconversationlist");
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
bool asyncStarted = client.SendQuest(quest, (Answer answer, int errorCode) => {
List<Conversation> conversationList = null;
if (errorCode == fpnn.ErrorCode.FPNN_EC_OK)
{
try
{
List<long> conversations = WantLongList(answer, "conversations");
List<int> unreads = GetIntList(answer, "unreads");
List<object> messages = (List<object>)answer.Want("msgs");
conversationList = BuildGroupConversationList(conversations, unreads, messages);
}
catch (Exception)
{
errorCode = fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
callback(conversationList, errorCode);
}, timeout);
if (!asyncStarted && RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return asyncStarted;
}
public int GetGroupUnreadConversationList(out List<Conversation> conversationList, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
conversationList = null;
TCPClient client = GetCoreClient();
if (client == null)
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION;
Quest quest = new Quest("getgroupunreadconversationlist");
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
Answer answer = client.SendQuest(quest, timeout);
if (answer.IsException())
return answer.ErrorCode();
try
{
List<long> conversations = WantLongList(answer, "conversations");
List<int> unreads = GetIntList(answer, "unreads");
List<object> messages = (List<object>)answer.Want("msgs");
conversationList = BuildGroupConversationList(conversations, unreads, messages);
return fpnn.ErrorCode.FPNN_EC_OK;
}
catch (Exception)
{
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
public bool GetUnreadConversationList(Action<List<Conversation>, List<Conversation>, int> callback, bool clear = true, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
TCPClient client = GetCoreClient();
if (client == null)
{
if (RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return false;
}
Quest quest = new Quest("getunreadconversationlist");
quest.Param("clear", clear);
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
bool asyncStarted = client.SendQuest(quest, (Answer answer, int errorCode) => {
List<Conversation> groupConversationList = null;
List<Conversation> p2pConversationList = null;
if (errorCode == fpnn.ErrorCode.FPNN_EC_OK)
{
try
{
List<long> groupConversations = WantLongList(answer, "groupConversations");
List<int> groupUnreads = GetIntList(answer, "groupUnreads");
List<object> groupMsgs = (List<object>)answer.Want("groupMsgs");
List<long> p2pConversations = WantLongList(answer, "p2pConversations");
List<int> p2pUnreads = GetIntList(answer, "p2pUnreads");
List<object> p2pMsgs = (List<object>)answer.Want("p2pMsgs");
groupConversationList = BuildGroupConversationList(groupConversations, groupUnreads, groupMsgs);
p2pConversationList = BuildP2PConversationList(p2pConversations, p2pUnreads, p2pMsgs);
}
catch (Exception)
{
errorCode = fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
callback(groupConversationList, p2pConversationList, errorCode);
}, timeout);
if (!asyncStarted && RTMConfig.triggerCallbackIfAsyncMethodReturnFalse)
ClientEngine.RunTask(() =>
{
callback(null, null, fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION);
});
return asyncStarted;
}
public int GetUnreadConversationList(out List<Conversation> groupConversationList, out List<Conversation> p2pConversationList, bool clear = true, HashSet<byte> mTypes = null, long startTime = 0, int timeout = 0)
{
groupConversationList = null;
p2pConversationList = null;
TCPClient client = GetCoreClient();
if (client == null)
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_CONNECTION;
Quest quest = new Quest("getunreadconversationlist");
quest.Param("clear", clear);
if (mTypes != null)
quest.Param("mtypes", mTypes);
if (startTime != 0)
quest.Param("mtime", startTime);
Answer answer = client.SendQuest(quest, timeout);
if (answer.IsException())
return answer.ErrorCode();
try
{
List<long> groupConversations = WantLongList(answer, "groupConversations");
List<int> groupUnreads = GetIntList(answer, "groupUnreads");
List<object> groupMsgs = (List<object>)answer.Want("groupMsgs");
List<long> p2pConversations = WantLongList(answer, "p2pConversations");
List<int> p2pUnreads = GetIntList(answer, "p2pUnreads");
List<object> p2pMsgs = (List<object>)answer.Want("p2pMsgs");
groupConversationList = BuildGroupConversationList(groupConversations, groupUnreads, groupMsgs);
p2pConversationList = BuildP2PConversationList(p2pConversations, p2pUnreads, p2pMsgs);
return fpnn.ErrorCode.FPNN_EC_OK;
}
catch (Exception)
{
return fpnn.ErrorCode.FPNN_EC_CORE_INVALID_PACKAGE;
}
}
}
}