using System; using System.Net; using System.Collections.Generic; using com.fpnn.proto; using com.fpnn.common; namespace com.fpnn.rtm { public partial class RTMClient { public static string GetTranslatedLanguage(TranslateLanguage language) { if (language == TranslateLanguage.None) return ""; if (language == TranslateLanguage.zh_cn) return "zh-CN"; if (language == TranslateLanguage.zh_tw) return "zh-TW"; return language.ToString("G"); } public static HashSet WantLongHashSet(Message message, string key) { HashSet rev = new HashSet(); List originalList = (List)message.Want(key); foreach (object obj in originalList) rev.Add((long)Convert.ChangeType(obj, TypeCode.Int64)); return rev; } private static HashSet GetLongHashSet(Message message, string key) { HashSet rev = new HashSet(); List originalList = (List)message.Get(key); if (originalList != null) foreach (object obj in originalList) rev.Add((long)Convert.ChangeType(obj, TypeCode.Int64)); return rev; } private static List WantLongList(Message message, string key) { List rev = new List(); List originalList = (List)message.Want(key); foreach (object obj in originalList) rev.Add((long)Convert.ChangeType(obj, TypeCode.Int64)); return rev; } private static List GetLongList(Message message, string key) { List rev = new List(); List originalList = (List)message.Get(key); if (originalList == null) return null; foreach (object obj in originalList) rev.Add((long)Convert.ChangeType(obj, TypeCode.Int64)); return rev; } private static List> GetLongListList(Message message, string key) { List> rev = new List>(); List originalList = (List)message.Get(key); if (originalList == null) return null; foreach (object obj in originalList) { if (obj == null) continue; List list = new List(); List listObject = (List)obj; foreach (var val in listObject) list.Add((long)Convert.ChangeType(val, TypeCode.Int64)); rev.Add(list); } return rev; } private static List GetIntList(Message message, string key) { List rev = new List(); List originalList = (List)message.Get(key); if (originalList == null) return null; foreach (object obj in originalList) rev.Add((int)Convert.ChangeType(obj, TypeCode.Int32)); return rev; } private static List GetBoolList(Message message, string key) { List rev = new List(); List originalList = (List)message.Get(key); if (originalList == null) return null; foreach (object obj in originalList) rev.Add((bool)Convert.ChangeType(obj, TypeCode.Boolean)); return rev; } private List GetStringList(Message message, string key) { List rev = new List(); List originalList = (List)message.Get(key); if (originalList == null) return null; foreach (object obj in originalList) rev.Add((string)Convert.ChangeType(obj, TypeCode.String)); return rev; } private Dictionary> GetStringStringDictionary(Message message, string key) { Dictionary> rev = new Dictionary>(); Dictionary> originalDict = (Dictionary>)message.Want(key); foreach (var kvp in originalDict) { Dictionary subDict = new Dictionary(); foreach(var kvp2 in kvp.Value) subDict.Add((string)Convert.ChangeType(kvp2.Key, TypeCode.String), (string)Convert.ChangeType(kvp2.Value, TypeCode.String)); rev.Add((string)Convert.ChangeType(kvp.Key, TypeCode.String), subDict); } return rev; } private Dictionary WantStringDictionary(Message message, string key) { Dictionary rev = new Dictionary(); Dictionary originalDict = (Dictionary)message.Want(key); foreach (KeyValuePair kvp in originalDict) rev.Add((string)Convert.ChangeType(kvp.Key, TypeCode.String), (string)Convert.ChangeType(kvp.Value, TypeCode.String)); return rev; } private Dictionary WantLongStringDictionary(Message message, string key) { Dictionary rev = new Dictionary(); Dictionary originalDict = (Dictionary)message.Want(key); foreach (KeyValuePair kvp in originalDict) rev.Add((long)Convert.ChangeType(kvp.Key, TypeCode.Int64), (string)Convert.ChangeType(kvp.Value, TypeCode.String)); return rev; } private Dictionary WantLongIntDictionary(Message message, string key) { Dictionary rev = new Dictionary(); Dictionary originalDict = (Dictionary)message.Want(key); foreach (KeyValuePair kvp in originalDict) rev.Add((long)Convert.ChangeType(kvp.Key, TypeCode.Int64), (int)Convert.ChangeType(kvp.Value, TypeCode.Int32)); return rev; } private Dictionary WantLongLongDictionary(Message message, string key) { Dictionary rev = new Dictionary(); Dictionary originalDict = (Dictionary)message.Want(key); foreach (KeyValuePair kvp in originalDict) rev.Add((long)Convert.ChangeType(kvp.Key, TypeCode.Int64), (long)Convert.ChangeType(kvp.Value, TypeCode.Int64)); return rev; } private List> GetListStringDictionary(Message message, string key) { List> rev = new List>(); List> originalList = (List>)message.Get(key); foreach (var value in originalList) { Dictionary dict = new Dictionary(); foreach (var kv in value) dict.Add((string)Convert.ChangeType(kv.Key, TypeCode.String), (string)Convert.ChangeType(kv.Value, TypeCode.String)); rev.Add(dict); } return rev; } public static byte[] HexToByteArray(String hex) { int NumberChars = hex.Length; byte[] bytes = new byte[NumberChars / 2]; for (int i = 0; i < NumberChars; i += 2) bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); return bytes; } public static List GetIPFromToken(string token) { if (token.Length < 33) return null; List ips = new List(); string originToken = token.Substring(0, 33); string ipToken = token.Substring(33); byte[] ipBytes = HexToByteArray(ipToken); for (int i = 0; i < ipBytes.Length; ++i) ipBytes[i] ^= Convert.ToByte(originToken[i % 33]); Dictionary unpack = com.fpnn.msgpack.MsgUnpacker.Unpack(ipBytes); foreach (var kv in unpack) { string cluster = (string)Convert.ChangeType(kv.Key, TypeCode.String); List list = (List)(kv.Value); foreach (uint ip in list) { long u = Convert.ToInt64((uint)IPAddress.NetworkToHostOrder((int)ip)); IPAddress address = new IPAddress(u); ips.Add(address.ToString()); } } return ips; } internal static void ParseFileMessage(BaseMessage baseMessage, ErrorRecorder errorRecorder) { try { Dictionary infoDict = Json.ParseObject(baseMessage.stringMessage); if (infoDict != null) { if (infoDict.TryGetValue("url", out object urlText)) baseMessage.fileInfo.url = (string)urlText; if (infoDict.TryGetValue("size", out object sizeInt)) baseMessage.fileInfo.size = (Int32)Convert.ChangeType(sizeInt, TypeCode.Int32); if (baseMessage.messageType == (byte)MessageType.ImageFile) { if (infoDict.TryGetValue("surl", out object surlText)) baseMessage.fileInfo.surl = (string)surlText; } baseMessage.stringMessage = null; } } catch (JsonException e) { if (errorRecorder != null) errorRecorder.RecordError("Parse file msg error. Full msg: " + baseMessage.stringMessage, e); } } internal static void ParseFileAttrs(BaseMessage baseMessage, ErrorRecorder errorRecorder) { try { Dictionary attrsDict = Json.ParseObject(baseMessage.attrs); if (attrsDict != null) { if (attrsDict.TryGetValue("rtm", out object rtmAttrs)) { Dictionary rtmAttrsDict = (Dictionary)rtmAttrs; if (rtmAttrsDict.TryGetValue("type", out object typeText)) { string typeStr = (string)typeText; if (typeStr.Equals("audiomsg")) baseMessage.fileInfo.isRTMAudio = true; } if (baseMessage.fileInfo.isRTMAudio) { if (rtmAttrsDict.TryGetValue("lang", out object languageText)) baseMessage.fileInfo.language = (string)languageText; if (rtmAttrsDict.TryGetValue("duration", out object durationInt)) baseMessage.fileInfo.duration = (Int32)Convert.ChangeType(durationInt, TypeCode.Int32); } } if (attrsDict.TryGetValue("custom", out object attrsInfo)) { try { Dictionary userAttrsDict = (Dictionary)attrsInfo; baseMessage.attrs = Json.ToString(userAttrsDict); return; } catch (Exception) { try { string userAttrs = (string)attrsInfo; baseMessage.attrs = userAttrs; return; } catch (Exception ex) { if (errorRecorder != null) errorRecorder.RecordError("Convert user attrs to string type for file attrs error. Full attrs: " + baseMessage.attrs, ex); } } } } } catch (JsonException e) { if (errorRecorder != null) errorRecorder.RecordError("Parse file attrs error. Full attrs: " + baseMessage.attrs, e); } } internal static void BuildFileInfo(BaseMessage baseMessage, ErrorRecorder errorRecorder) { baseMessage.fileInfo = new FileInfo(); ParseFileMessage(baseMessage, errorRecorder); ParseFileAttrs(baseMessage, errorRecorder); } } }