public ChatBuffer.MessageData Deserialize(Stream stream) { if (!stream.CanRead) { return(null); // TODO: Exceptions } ChatBuffer.MessageData ret = new ChatBuffer.MessageData(); using (var read = new StreamReader(stream)) { if (read.Read() == '[') { var data = read.ReadLine(); var timestamp = data.Substring(0, data.IndexOf(']')); data = data.Remove(0, data.IndexOf(']') + 2); var type = data.Substring(0, 3); data = data.Remove(0, 5); var sender = data.Substring(0, data.IndexOf(':')); data = data.Remove(0, data.IndexOf(':') + 2); ret.Timestamp = DateTime.ParseExact(timestamp, "u", CultureInfo.InvariantCulture); ret.Type = _TypeDict.FirstOrDefault(k => k.Value == type).Key; ret.Sender = (sender == "System" ? null : Chat.GetOrCreateCharacter(sender)); ret.RawMessage = new Parser { Validity = NodeValidity.FChat }.ParseMessage(data); } } return(ret); }
public ChatBuffer.MessageData Deserialize(Stream stream) { if (!stream.CanRead) return null; // TODO: Exceptions ChatBuffer.MessageData ret = new ChatBuffer.MessageData(); using (var read = new StreamReader(stream)) { if (read.Read() == '[') { var data = read.ReadLine(); var timestamp = data.Substring(0, data.IndexOf(']')); data = data.Remove(0, data.IndexOf(']') + 2); var type = data.Substring(0, 3); data = data.Remove(0, 5); var sender = data.Substring(0, data.IndexOf(':')); data = data.Remove(0, data.IndexOf(':') + 2); ret.Timestamp = DateTime.ParseExact(timestamp, "u", CultureInfo.InvariantCulture); ret.Type = _TypeDict.FirstOrDefault(k => k.Value == type).Key; ret.Sender = (sender == "System" ? null : Chat.GetOrCreateCharacter(sender)); ret.RawMessage = new Parser { Validity = NodeValidity.FChat }.ParseMessage(data); } } return ret; }
public void Serialize(Stream stream, ChatBuffer.MessageData message) { if (message.Type == MessageType.Preview || !stream.CanWrite) { return; // TODO: Exceptions } using (var write = new StreamWriter(stream)) write.WriteLine($"[{message.Timestamp.ToString("u", CultureInfo.InvariantCulture)}] {_TypeDict[message.Type]}, {message.Sender?.Name ?? "System"}: {new libflist.Message.Renderers.BBCode().Render(message.RawMessage)}"); }
// TODO: Pre-render messages into row-lists, split on \n and width. ANSIString RenderMessage(ChatBuffer.MessageData msg) { if (msg.RenderedMessage == null) { var build = new ANSIString(); if (msg.Timestamp.Date == DateTime.Now.Date) { build.Append($"[{msg.Timestamp.ToString("HH:mm")}]".Color(ConsoleColor.Gray)); } else { build.Append($"[{msg.Timestamp.ToString("yyyy-MM-dd")}]".Color(ConsoleColor.Gray)); } ANSIString message = new ANSIRenderer().Render(msg.RawMessage); bool action = message.PlainString.StartsWith("/me", StringComparison.CurrentCultureIgnoreCase); build.Append(action ? "*" : " "); if (msg.Sender?.Name != null) { build.Append(msg.Sender.ToANSIString(Channel, true)); } else { build.Append("System".Color(ConsoleColor.DarkGray)); } if (action) { if (message.PlainString.StartsWith("/me's", StringComparison.CurrentCultureIgnoreCase)) { build.Append(message.Substring(3)); } else { build.Append(new ANSIString(" ") + message.Substring(4)); } } else { build.Append(new ANSIString(": ") + message); } msg.RenderedMessage = build; } return(msg.RenderedMessage); }