using System.Collections;
|
using System.Collections.Generic;
|
using System.Text;
|
using UnityEngine;
|
using System;
|
using System.IO;
|
|
namespace vnxbqy.UI
|
{
|
|
public class LocalChatHistory
|
{
|
public static Dictionary<ChatInfoType, List<string>> chatHistory = new Dictionary<ChatInfoType, List<string>>();
|
|
const string fileName = "ChatHistory";
|
|
public static int localSaveCount = 50;
|
public static int localChatKeepHour = 12;
|
|
static StringBuilder sb = new StringBuilder();
|
|
public static void Save()
|
{
|
if (!ExistAnyLocalChatHistory())
|
{
|
return;
|
}
|
var playerId = PlayerDatas.Instance.baseData.PlayerID;
|
var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, fileName, "_", playerId, ".log");
|
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
|
{
|
using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
|
{
|
foreach (var type in chatHistory.Keys)
|
{
|
var list = chatHistory[type];
|
if (list.Count > 0)
|
{
|
sw.WriteLine(StringUtility.Contact("channel:", (int)type));
|
for (int i = 0; i < list.Count; i++)
|
{
|
sw.WriteLine(list[i]);
|
}
|
}
|
}
|
}
|
}
|
}
|
|
static bool ExistAnyLocalChatHistory()
|
{
|
foreach (var list in chatHistory.Values)
|
{
|
if (list.Count > 0)
|
{
|
return true;
|
}
|
}
|
return false;
|
}
|
|
public static void Save<T>(T chat) where T : ChatUeseData
|
{
|
if (null == chat)
|
{
|
return;
|
}
|
switch (chat.type)
|
{
|
//case ChatInfoType.World:
|
case ChatInfoType.CrossServer:
|
case ChatInfoType.Area:
|
case ChatInfoType.Trumpet:
|
//case ChatInfoType.Fairy:
|
case ChatInfoType.Friend:
|
if (chat.IsSound && string.IsNullOrEmpty(chat.content))
|
{
|
return;
|
}
|
var jsonString = ChatToString(chat);
|
if (!string.IsNullOrEmpty(jsonString))
|
{
|
List<string> list;
|
if (!chatHistory.TryGetValue(chat.type, out list))
|
{
|
list = new List<string>();
|
chatHistory.Add(chat.type, list);
|
}
|
if (list.Count >= localSaveCount)
|
{
|
list.RemoveAt(0);
|
}
|
list.Add(jsonString);
|
}
|
break;
|
}
|
Save();
|
}
|
|
static void Save(ChatInfoType type, string line)
|
{
|
if (!string.IsNullOrEmpty(line))
|
{
|
List<string> list;
|
if (!chatHistory.TryGetValue(type, out list))
|
{
|
list = new List<string>();
|
chatHistory.Add(type, list);
|
}
|
if (list.Count >= localSaveCount)
|
{
|
list.RemoveAt(0);
|
}
|
list.Add(line);
|
}
|
}
|
|
public static string ChatToString(ChatUeseData chat)
|
{
|
switch (chat.type)
|
{
|
//case ChatInfoType.World:
|
case ChatInfoType.Area:
|
case ChatInfoType.CrossServer:
|
case ChatInfoType.Team:
|
//case ChatInfoType.Fairy:
|
{
|
LocalChat localChat = new LocalChat();
|
localChat.type = chat.type;
|
localChat.player = chat.player;
|
localChat.name = chat.name;
|
localChat.extra = chat.extra;
|
localChat.content = chat.content;
|
localChat.time = chat.createTime;
|
return LitJson.JsonMapper.ToJson(localChat);
|
}
|
case ChatInfoType.Trumpet:
|
{
|
var chatTrumpet = chat as ChatTrumpetData;
|
LocalTrumpetChat localChat = new LocalTrumpetChat();
|
localChat.player = chat.player;
|
localChat.name = chat.name;
|
localChat.extra = chat.extra;
|
localChat.content = chat.content;
|
localChat.speakType = chatTrumpet.speakType;
|
localChat.accId = chatTrumpet.accId;
|
localChat.time = chat.createTime;
|
return LitJson.JsonMapper.ToJson(localChat);
|
}
|
case ChatInfoType.Friend:
|
{
|
var chatFriend = chat as ChatFriendData;
|
LocalFriendChat localChat = new LocalFriendChat();
|
localChat.player = chat.player;
|
localChat.name = chat.name;
|
localChat.extra = chat.extra;
|
localChat.toName = chatFriend.toName;
|
localChat.toPlayer = chatFriend.toPlayer;
|
localChat.talkType = chatFriend.talkType;
|
localChat.content = chat.content;
|
localChat.time = chat.createTime;
|
return LitJson.JsonMapper.ToJson(localChat);
|
}
|
}
|
return string.Empty;
|
}
|
|
public static void Read()
|
{
|
Clear();
|
var playerId = PlayerDatas.Instance.baseData.PlayerID;
|
var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, fileName, "_", playerId, ".log");
|
if (!File.Exists(path))
|
{
|
return;
|
}
|
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
|
{
|
using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
|
{
|
ChatInfoType type = ChatInfoType.World;
|
while (!sr.EndOfStream)
|
{
|
try
|
{
|
var line = sr.ReadLine();
|
if (line.StartsWith("channel"))
|
{
|
type = (ChatInfoType)int.Parse(line.Split(':')[1]);
|
continue;
|
}
|
if (type == ChatInfoType.Fairy)
|
{
|
if (PlayerDatas.Instance.baseData.FamilyId == 0)
|
{
|
continue;
|
}
|
}
|
ChatData chat = null;
|
switch (type)
|
{
|
//case ChatInfoType.World:
|
case ChatInfoType.Area:
|
case ChatInfoType.CrossServer:
|
case ChatInfoType.Team:
|
//case ChatInfoType.Fairy:
|
{
|
LocalChat localChat = LitJson.JsonMapper.ToObject<LocalChat>(line);
|
var ts = DateTime.Now - localChat.time;
|
if (ts.TotalHours >= localChatKeepHour)
|
{
|
continue;
|
}
|
if (type == ChatInfoType.World)
|
{
|
chat = new ChatWorldData(localChat.content, localChat.player, localChat.name, localChat.extra);
|
}
|
else if (type == ChatInfoType.Area)
|
{
|
chat = new ChatAreaData(localChat.content, localChat.player, localChat.name, localChat.extra);
|
}
|
else if (type == ChatInfoType.Team)
|
{
|
chat = new ChatTeamData(localChat.content, localChat.player, localChat.name, localChat.extra);
|
}
|
else if (type == ChatInfoType.Fairy)
|
{
|
chat = new ChatFamilyData(localChat.content, localChat.player, localChat.name, localChat.extra);
|
}
|
else if (type == ChatInfoType.CrossServer)
|
{
|
chat = new ChatCrossServerData(localChat.content, localChat.player, localChat.name, localChat.extra);
|
}
|
chat.createTime = localChat.time;
|
}
|
break;
|
case ChatInfoType.Trumpet:
|
{
|
LocalTrumpetChat localChat = LitJson.JsonMapper.ToObject<LocalTrumpetChat>(line);
|
var ts = DateTime.Now - localChat.time;
|
if (ts.TotalHours >= localChatKeepHour)
|
{
|
continue;
|
}
|
chat = new ChatTrumpetData(localChat.content, localChat.player, localChat.name,
|
localChat.extra, localChat.speakType, localChat.accId);
|
chat.createTime = localChat.time;
|
}
|
break;
|
case ChatInfoType.Friend:
|
{
|
LocalFriendChat localChat = LitJson.JsonMapper.ToObject<LocalFriendChat>(line);
|
var ts = DateTime.Now - localChat.time;
|
if (ts.TotalHours >= localChatKeepHour)
|
{
|
continue;
|
}
|
chat = new ChatFriendData(localChat.content, localChat.player, localChat.name,
|
localChat.extra, localChat.toName, localChat.talkType, (uint)localChat.toPlayer);
|
chat.createTime = localChat.time;
|
}
|
break;
|
}
|
if (chat != null)
|
{
|
ChatCtrl.Inst.KeepLocalChat(chat);
|
}
|
Save(type, line);
|
}
|
catch (Exception e)
|
{
|
DebugEx.Log(e.Message);
|
continue;
|
}
|
}
|
}
|
}
|
}
|
|
public static void Clear(ChatInfoType type)
|
{
|
if (chatHistory.ContainsKey(type))
|
{
|
chatHistory.Remove(type);
|
Save();
|
}
|
}
|
|
public static void Clear()
|
{
|
chatHistory.Clear();
|
}
|
|
public struct LocalChat
|
{
|
public ChatInfoType type;
|
public DateTime time;
|
public int player;
|
public string name;
|
public string extra;
|
public string content;
|
}
|
|
public struct LocalFriendChat
|
{
|
public DateTime time;
|
public int player;
|
public string name;
|
public string extra;
|
public string content;
|
public string toName;
|
public byte talkType;
|
public int toPlayer;
|
}
|
|
public struct LocalTrumpetChat
|
{
|
public DateTime time;
|
public int player;
|
public string name;
|
public string extra;
|
public string content;
|
public byte speakType;
|
public string accId;
|
}
|
}
|
}
|
|