Browse Source

更新敏感词

LiuQilin 7 years ago
parent
commit
e9d1b4d34d

+ 1 - 3
Assets/Resource/XML/lan/ChineseSimplified.xml

@@ -252,14 +252,12 @@
     <AH_Current desc=""><![CDATA[刚刚]]></AH_Current>
   </UI>
   <FriendItem>
-    <MinutesAgo desc=""><![CDATA[[&value&]分钟前]]></MinutesAgo>
-    <HoursAgo desc=""><![CDATA[[&value&]小时前]]></HoursAgo>
-    <DaysAgo desc=""><![CDATA[[&value&]天前]]></DaysAgo>
     <SendMessageButtonText desc=""><![CDATA[私信]]></SendMessageButtonText>
     <DeleteButtonText desc=""><![CDATA[删除]]></DeleteButtonText>
     <DeleteWarning desc=""><![CDATA[删除后无法恢复!确认要继续吗?]]></DeleteWarning>
   </FriendItem>
   <ApplicantItem>
+    <SecondsAgo desc=""><![CDATA[[&value&]秒前]]></SecondsAgo>
     <MinutesAgo desc=""><![CDATA[[&value&]分钟前]]></MinutesAgo>
     <HoursAgo desc=""><![CDATA[[&value&]小时前]]></HoursAgo>
     <DaysAgo desc=""><![CDATA[[&value&]天前]]></DaysAgo>

+ 1 - 3
Assets/Resource/XML/lan/ChineseTraditional.xml

@@ -252,14 +252,12 @@
     <AH_Current desc=""><![CDATA[]]></AH_Current>
   </UI>
   <FriendItem>
-    <MinutesAgo desc=""><![CDATA[]]></MinutesAgo>
-    <HoursAgo desc=""><![CDATA[]]></HoursAgo>
-    <DaysAgo desc=""><![CDATA[]]></DaysAgo>
     <SendMessageButtonText desc=""><![CDATA[]]></SendMessageButtonText>
     <DeleteButtonText desc=""><![CDATA[]]></DeleteButtonText>
     <DeleteWarning desc=""><![CDATA[]]></DeleteWarning>
   </FriendItem>
   <ApplicantItem>
+    <SecondsAgo desc=""><![CDATA[]]></SecondsAgo>
     <MinutesAgo desc=""><![CDATA[]]></MinutesAgo>
     <HoursAgo desc=""><![CDATA[]]></HoursAgo>
     <DaysAgo desc=""><![CDATA[]]></DaysAgo>

+ 1 - 3
Assets/Resource/XML/lan/English.xml

@@ -252,14 +252,12 @@ Program 水怪
     <AH_Current desc=""><![CDATA[]]></AH_Current>
   </UI>
   <FriendItem>
-    <MinutesAgo desc=""><![CDATA[]]></MinutesAgo>
-    <HoursAgo desc=""><![CDATA[]]></HoursAgo>
-    <DaysAgo desc=""><![CDATA[]]></DaysAgo>
     <SendMessageButtonText desc=""><![CDATA[]]></SendMessageButtonText>
     <DeleteButtonText desc=""><![CDATA[]]></DeleteButtonText>
     <DeleteWarning desc=""><![CDATA[]]></DeleteWarning>
   </FriendItem>
   <ApplicantItem>
+    <SecondsAgo desc=""><![CDATA[]]></SecondsAgo>
     <MinutesAgo desc=""><![CDATA[]]></MinutesAgo>
     <HoursAgo desc=""><![CDATA[]]></HoursAgo>
     <DaysAgo desc=""><![CDATA[]]></DaysAgo>

BIN
Assets/Resource/Xlsx/language_config.xlsx


+ 1 - 3
Assets/Script/Label/LanguageLabel.cs

@@ -250,14 +250,12 @@ public class LanguageLabel
 	public static string UI__AH_Current = "UI__AH_Current";
 	
 	public static string FriendItem = "FriendItem";
-	public static string FriendItem__MinutesAgo = "FriendItem__MinutesAgo";
-	public static string FriendItem__HoursAgo = "FriendItem__HoursAgo";
-	public static string FriendItem__DaysAgo = "FriendItem__DaysAgo";
 	public static string FriendItem__SendMessageButtonText = "FriendItem__SendMessageButtonText";
 	public static string FriendItem__DeleteButtonText = "FriendItem__DeleteButtonText";
 	public static string FriendItem__DeleteWarning = "FriendItem__DeleteWarning";
 	
 	public static string ApplicantItem = "ApplicantItem";
+	public static string ApplicantItem__SecondsAgo = "ApplicantItem__SecondsAgo";
 	public static string ApplicantItem__MinutesAgo = "ApplicantItem__MinutesAgo";
 	public static string ApplicantItem__HoursAgo = "ApplicantItem__HoursAgo";
 	public static string ApplicantItem__DaysAgo = "ApplicantItem__DaysAgo";

+ 1 - 0
Assets/Script/Label/PlayerConfigLabel.cs

@@ -8,6 +8,7 @@ public class PlayerConfigLabel
     public static string DefaultID = "Default";
     public static string DefaultSerialNumber = "Default";
 
+    public static string AttributeName = "value";
     public static string LastApplicantSerialNumber = "LastApplicantSerialNumber";
     public static string LastPrivateMessageDate = "LastPrivateMessageDate";
     public static string CurrentMinigameType = "CurrentMinigameType";

+ 19 - 5
Assets/Script/Manage/HttpManager.cs

@@ -188,9 +188,16 @@ public class HttpManager : Regist
         //GetPrivateMessage("1709110839194378775", "1", data => {}, () => {}, "1709207727231988804");
 
         //URLRequestData requestData = new URLRequestData();
-        //requestData.Add("b", 1710065808151506837);
-        //requestData.Add("u", 1709110837794360346);
+        //requestData.Add("b", 1709207727231988804);
+        //requestData.Add("u", 1709110837472481803);
         //URLRequest.CreateStrURLRequest(true, ApplyBuddyURL, requestData, data => Debug.Log("申请好友返回结果 " + data), URLRequest.Method.POST);
+
+        //requestData = new URLRequestData();
+        //requestData.Add("b", 1709207727231988804);
+        //requestData.Add("u", 1709110835209952822);
+        //URLRequest.CreateStrURLRequest(true, ApplyBuddyURL, requestData, data => Debug.Log("申请好友返回结果 " + data), URLRequest.Method.POST);
+
+        //AddComment("1709110839194378775", "1709207727231988804", "你好", CommentType.Garden);
     }
 
     public void Update()
@@ -1255,6 +1262,7 @@ public class HttpManager : Regist
                     string serialNumber = Random.Range(0f, 1f) < 0.5f ? "1709110839194378775" : SerialNumber;
                     string nickname = "篮球";
                     string content = "篮球的留言" + int.Parse(page)*20 + i;
+                    //accountDatas.Add(new PrivateMessageData(serialNumber, nickname, content, DateTime.Parse("4/23/2017 09:30:00 AM")));
                     accountDatas.Add(new PrivateMessageData(serialNumber, nickname, content, CurrentDateTime));
                 }
                 succeedCallback.Invoke("1709110839194378775", page, accountDatas);
@@ -1486,7 +1494,13 @@ public class HttpManager : Regist
     public static string GetTimespanAndTransfer(DateTime dateTime)
     {
         TimeSpan timeSpan = CurrentDateTime.Subtract(dateTime);
-        if (timeSpan.TotalMinutes < 60)
+        if (timeSpan.TotalSeconds < 60)
+        {
+            string content = Language.GetStr(LanguageLabel.ApplicantItem__SecondsAgo);
+            content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
+            return content;
+        }
+        else if (timeSpan.TotalMinutes < 60)
         {
             string content = Language.GetStr(LanguageLabel.ApplicantItem__MinutesAgo);
             content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
@@ -1495,13 +1509,13 @@ public class HttpManager : Regist
         else if (timeSpan.TotalHours < 24)
         {
             string content = Language.GetStr(LanguageLabel.ApplicantItem__HoursAgo);
-            content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
+            content = content.Replace(TransferLabel.Value, timeSpan.TotalHours.ToString("0"));
             return content;
         }
         else
         {
             string content = Language.GetStr(LanguageLabel.ApplicantItem__DaysAgo);
-            content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
+            content = content.Replace(TransferLabel.Value, timeSpan.TotalDays.ToString("0"));
             return content;
         }
     }

+ 24 - 0
Assets/Script/Object/CommentItem.cs

@@ -117,6 +117,8 @@ public class CommentItem : Regist
         };
 
         FriendPanel.OnFriendListRefresh += RefreshRelationship;
+        MessagePanel.OnHaveNewMessage += OnHaveNewMessage;
+        MessagePanel.OnDontHaveNewMessage += OnDontHaveNewMessage;
 
         return false;
     }
@@ -135,6 +137,11 @@ public class CommentItem : Regist
 
         RefreshRelationship(FriendPanel.FriendAccountDatas);
 
+        if (FriendPanel.HaveNewMessage(accountData.SerialNumber))
+        {
+            OnHaveNewMessage(accountData.SerialNumber);
+        }
+
         if (accountData.SerialNumber == HttpManager.SerialNumber)
         {
             VisitButton.SetActive(false);
@@ -208,4 +215,21 @@ public class CommentItem : Regist
         AudioManager.PlayClip(ResourceLabel.BtnClip);
         MessagePanel.OpenPanel(AccountData);
     }
+
+
+    public void OnHaveNewMessage(string serialNumber)
+    {
+        if (serialNumber == AccountData.SerialNumber)
+        {
+            NewMessageFlagImage.SetActive(true);
+        }
+    }
+
+    public void OnDontHaveNewMessage(string serialNumber)
+    {
+        if (serialNumber == AccountData.SerialNumber)
+        {
+            NewMessageFlagImage.SetActive(false);
+        }
+    }
 }

+ 24 - 19
Assets/Script/Social/FriendItem.cs

@@ -75,6 +75,9 @@ public class FriendItem : VirtualScrollRectItem
             VisitButtonTitle.text = ResourceManager.Get<Text>(ObjectLabel.C_CostLab).text;
         };
 
+        MessagePanel.OnHaveNewMessage += OnHaveNewMessage;
+        MessagePanel.OnDontHaveNewMessage += OnDontHaveNewMessage;
+
         return false;
     }
 
@@ -83,25 +86,7 @@ public class FriendItem : VirtualScrollRectItem
     {
         AccountData = accountData;
         NicknameTitle.text = accountData.Nickname;
-        TimeSpan timeSpan = HttpManager.CurrentDateTime.Subtract(accountData.LastLoginDate);
-        if (timeSpan.TotalMinutes < 60)
-        {
-            string content = Language.GetStr(LanguageLabel.ApplicantItem__MinutesAgo);
-            content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
-            ContentTitle.text = content;
-        }
-        else if (timeSpan.TotalHours < 24)
-        {
-            string content = Language.GetStr(LanguageLabel.ApplicantItem__HoursAgo);
-            content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
-            ContentTitle.text = content;
-        }
-        else
-        {
-            string content = Language.GetStr(LanguageLabel.ApplicantItem__DaysAgo);
-            content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
-            ContentTitle.text = content;
-        }
+        ContentTitle.text = HttpManager.GetTimespanAndTransfer(accountData.LastLoginDate);
     }
 
 
@@ -154,6 +139,7 @@ public class FriendItem : VirtualScrollRectItem
     {
         DeleteButton.interactable = true;
         FriendPanel.SaveFriendItem(this);
+        FriendPanel.DeleteLastPrivateMessageDate(AccountData.SerialNumber);
     }
 
     public void OnSendMessageButtonClick()
@@ -163,4 +149,23 @@ public class FriendItem : VirtualScrollRectItem
         CounterAction counterAction = new CounterAction(FriendPanel.OpenFriendPanel);
         counterAction.Bind(ref MessagePanel.OnPanelClosed);
     }
+
+
+    public void OnHaveNewMessage(string serialNumber)
+    {
+        if (serialNumber == AccountData.SerialNumber)
+        {
+            NewMessageFlagImage.SetActive(true);
+        }
+        FriendPanel.UpdateFriendButtonOutlineStatus();
+    }
+
+    public void OnDontHaveNewMessage(string serialNumber)
+    {
+        if (serialNumber == AccountData.SerialNumber)
+        {
+            NewMessageFlagImage.SetActive(false);
+        }
+        FriendPanel.UpdateFriendButtonOutlineStatus();
+    }
 }

+ 136 - 17
Assets/Script/Social/FriendPanel.cs

@@ -1,7 +1,8 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
-
+using System.Xml;
+using Sfs2X.Util;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -57,14 +58,18 @@ public class FriendPanel : Regist
     public static bool HaveNewApplicant;
     public static bool HaveNewPrivateMessage
     {
-        get { return haveNewPrivateMessage; }
-        set
+        get
         {
-            haveNewPrivateMessage = value;
-            UpdateFriendButtonOutlineStatus();
+            foreach (var friendItem in FriendItems)
+            {
+                if (HaveNewMessage(friendItem.AccountData.SerialNumber))
+                {
+                    return true;
+                }
+            }
+            return false;
         }
     }
-    public static bool haveNewPrivateMessage;
     public static TweenOutline OpenPanelButtonOutlineTween;
 
     public static int ActivateLevel = TutorialManager.VisitTutorialLevel;
@@ -102,13 +107,13 @@ public class FriendPanel : Regist
         FriendScrollRect = ResourceManager.Get<VirtualScrollRectPlus>(ObjectLabel.AF_FriendScrollRect);
         ApplicantScrollRect = ResourceManager.Get<VirtualScrollRectPlus>(ObjectLabel.AF_ApplicantScrollRect);
 
-        LanguageManager.Add(NicknameTitle, Language.GetStr(LanguageLabel.UI__AF_NicknameTitle));
-        LanguageManager.Add(ContentTitle, Language.GetStr(LanguageLabel.UI__AF_ContentTitle));
-        LanguageManager.Add(CloseButtonTitle, Language.GetStr(LanguageLabel.UI__AF_CloseButtonTitle));
-        LanguageManager.Add(ApplicantTitle, Language.GetStr(LanguageLabel.UI__AF_ApplicantTitle));
-        LanguageManager.Add(PanelTitle, Language.GetStr(LanguageLabel.UI__AF_PanelTitle));
-        LanguageManager.Add(AcceptAllButtonTitle, Language.GetStr(LanguageLabel.UI__AF_AcceptAllButtonTitle));
-        LanguageManager.Add(AddFriendTitle, Language.GetStr(LanguageLabel.UI__AF_AddFriendTitle));
+        LanguageManager.Add(NicknameTitle, new MulLanStr(LanguageLabel.UI__AF_NicknameTitle));
+        LanguageManager.Add(ContentTitle, new MulLanStr(LanguageLabel.UI__AF_ContentTitle));
+        LanguageManager.Add(CloseButtonTitle, new MulLanStr(LanguageLabel.UI__AF_CloseButtonTitle));
+        LanguageManager.Add(ApplicantTitle, new MulLanStr(LanguageLabel.UI__AF_ApplicantTitle));
+        LanguageManager.Add(PanelTitle, new MulLanStr(LanguageLabel.UI__AF_PanelTitle));
+        LanguageManager.Add(AcceptAllButtonTitle, new MulLanStr(LanguageLabel.UI__AF_AcceptAllButtonTitle));
+        LanguageManager.Add(AddFriendTitle, new MulLanStr(LanguageLabel.UI__AF_AddFriendTitle));
 
         OpenPanelButton.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);
         FriendPanelParentMask.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);
@@ -127,6 +132,8 @@ public class FriendPanel : Regist
         {
             if (level >= ActivateLevel) OpenPanelButton.TweenForCG();
         };
+
+        MessagePanel.OnHaveNewMessage += SortFriendItems;
     }
 
 
@@ -230,9 +237,47 @@ public class FriendPanel : Regist
         {
             OnFriendListRefresh.Invoke(accountDatas);
         }
+        SortFriendItems(null);
         RefreshPrivateMessage();
     }
 
+    public static void SortFriendItems(string targetSerialNumber)
+    {
+        FriendItem friendItem = null;
+        List<FriendItem> haveNewPrivateMessageItems = new List<FriendItem>();
+        List<FriendItem> dontHaveNewPrivateMessageItems = new List<FriendItem>();
+        foreach (var item in FriendItems)
+        {
+            if (item.AccountData.SerialNumber == targetSerialNumber)
+            {
+                friendItem = item;
+            }
+            else if (HaveNewMessage(item.AccountData.SerialNumber))
+            {
+                haveNewPrivateMessageItems.Add(item);
+            }
+            else
+            {
+                dontHaveNewPrivateMessageItems.Add(item);
+            }
+        }
+
+        haveNewPrivateMessageItems.MySort((item0, item1) => item0.AccountData.LastLoginDate.Ticks < item1.AccountData.LastLoginDate.Ticks);
+        dontHaveNewPrivateMessageItems.MySort((item0, item1) => item0.AccountData.LastLoginDate.Ticks < item1.AccountData.LastLoginDate.Ticks);
+
+        List<FriendItem> friendItems = new List<FriendItem>();
+        friendItems.AddRange(haveNewPrivateMessageItems);
+        friendItems.AddRange(dontHaveNewPrivateMessageItems);
+        for (int i = 0; i < friendItems.Count; i++)
+        {
+            friendItems[i].transform.SetSiblingIndex(i);
+        }
+        if (friendItem != null)
+        {
+            friendItem.transform.SetAsFirstSibling();
+        }
+    }
+
 
     public static void AddApplicantItem(AccountData accountData)
     {
@@ -324,10 +369,6 @@ public class FriendPanel : Regist
     {
         foreach (var friendAccountData in FriendAccountDatas)
         {
-            if (!MessagePanel.PrivateMessageDataDictionary.ContainsKey(friendAccountData.SerialNumber))
-            {
-                MessagePanel.PrivateMessageDataDictionary.Add(friendAccountData.SerialNumber, new PrivateMessageDataStash());
-            }
             HttpManager.GetPrivateMessage(friendAccountData.SerialNumber, "0", MessagePanel.RefreshPrivateMessageSucceedCallback, MessagePanel.RefreshPrivateMessageFailedCallback);
         }
     }
@@ -411,4 +452,82 @@ public class FriendPanel : Regist
             return false;
         }
     }
+
+
+    public static bool IsPrivateMessageNew(string targetSerialNumber, DateTime dateTime)
+    {
+        XmlNodeList nodes = ConfigManager.ConfigRootNode.SelectSingleNode(PlayerConfigLabel.LastPrivateMessageDate).SelectNodes(PlayerConfigLabel.LastPrivateMessageDate);
+        for (int i = 0; i < nodes.Count; i++)
+        {
+            string[] strings = nodes[i].Attributes[0].Value.Split('|');
+            string serialNumber = strings[0];
+            DateTime lastDateTime = DateTime.Parse(strings[1]);
+            //Debug.Log(dateTime + "    " + lastDateTime);
+            //Debug.Log(targetSerialNumber == serialNumber && dateTime == lastDateTime);
+            if (targetSerialNumber == serialNumber && dateTime == lastDateTime)
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public static bool HaveNewMessage(string targetSerialNumber)
+    {
+        if (MessagePanel.PrivateMessageDataDictionary.ContainsKey(targetSerialNumber))
+        {
+            PrivateMessageDataStash dataStash = MessagePanel.PrivateMessageDataDictionary[targetSerialNumber];
+            if (dataStash.PrivateMessageDatas.Count > 0)
+            {
+                return IsPrivateMessageNew(targetSerialNumber, dataStash.PrivateMessageDatas[0].Date);
+            }
+            else
+            {
+                return false;
+            }
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    public static void SaveLastPrivateMessageDate(string targetSerialNumber, DateTime dateTime)
+    {
+        XmlNode parentNode = ConfigManager.ConfigRootNode.SelectSingleNode(PlayerConfigLabel.LastPrivateMessageDate);
+        XmlNodeList nodes = parentNode.SelectNodes(PlayerConfigLabel.LastPrivateMessageDate);
+        for (int i = 0; i < nodes.Count; i++)
+        {
+            string[] strings = nodes[i].Attributes[0].Value.Split('|');
+            string serialNumber = strings[0];
+            if (targetSerialNumber == serialNumber)
+            {
+                nodes[i].Attributes[0].Value = $"{targetSerialNumber}|{dateTime}";
+                //ConfigManager.SaveConfigDocument();
+                return;
+            }
+        }
+        
+        XmlNode node = ConfigManager.ConfigDocument.CreateNode(XmlNodeType.Element, PlayerConfigLabel.LastPrivateMessageDate, null);
+        XmlAttribute attribute = node.Attributes.Append(ConfigManager.ConfigDocument.CreateAttribute(PlayerConfigLabel.AttributeName));
+        attribute.Value = $"{targetSerialNumber}|{dateTime}";
+        parentNode.AppendChild(node);
+        //ConfigManager.SaveConfigDocument();
+    }
+
+    public static void DeleteLastPrivateMessageDate(string targetSerialNumber)
+    {
+        XmlNode parentNode = ConfigManager.ConfigRootNode.SelectSingleNode(PlayerConfigLabel.LastPrivateMessageDate);
+        XmlNodeList nodes = parentNode.SelectNodes(PlayerConfigLabel.LastPrivateMessageDate);
+        for (int i = 0; i < nodes.Count; i++)
+        {
+            string[] strings = nodes[i].Attributes[0].Value.Split('|');
+            string serialNumber = strings[0];
+            if (targetSerialNumber == serialNumber)
+            {
+                parentNode.RemoveChild(nodes[i]);
+                return;
+            }
+        }
+    }
 }

+ 41 - 5
Assets/Script/Social/MessagePanel.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
-
+using System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -71,6 +71,9 @@ public class MessagePanel : Regist
     public static List<PrivateMessageItem> PrivateMessageItems = new List<PrivateMessageItem>();
     public static Dictionary<string, PrivateMessageDataStash> PrivateMessageDataDictionary = new Dictionary<string, PrivateMessageDataStash>();
 
+    public static Action<string> OnHaveNewMessage;
+    public static Action<string> OnDontHaveNewMessage;
+
     #endregion
 
     public override void RegistReference()
@@ -116,6 +119,14 @@ public class MessagePanel : Regist
         AccountData = accountData;
         MessagePanelMask.TweenForCG();
         RefreshScrollRect();
+
+        PrivateMessageDataStash dataStash = PrivateMessageDataDictionary[AccountData.SerialNumber];
+        if (dataStash.PrivateMessageDatas.Count > 0)
+        {
+            FriendPanel.SaveLastPrivateMessageDate(AccountData.SerialNumber, dataStash.PrivateMessageDatas[0].Date);
+            OnDontHaveNewMessage.Invoke(AccountData.SerialNumber);
+            FriendPanel.SortFriendItems(null);
+        }
     }
 
     public static void ClosePanel()
@@ -134,6 +145,7 @@ public class MessagePanel : Regist
 
     private VirtualScrollRectItem GetNextItem(int dataIndex)
     {
+        TryCreateNewPrivateMessageDataStash(AccountData.SerialNumber);
         PrivateMessageDataStash dataStash = PrivateMessageDataDictionary[AccountData.SerialNumber];
         if (dataStash.PrivateMessageDatas.Count > dataIndex)
         {
@@ -185,12 +197,24 @@ public class MessagePanel : Regist
 
     public static void RefreshPrivateMessageSucceedCallback(string targetSerialNumber, string page, List<PrivateMessageData> datas)
     {
+        if (datas.Count == 0)
+        {
+            return;
+        }
+
+        TryCreateNewPrivateMessageDataStash(targetSerialNumber);
         PrivateMessageDataStash dataStash = PrivateMessageDataDictionary[targetSerialNumber];
         dataStash.Add(int.Parse(page), datas);
 
-        if (IsPanelOpen && targetSerialNumber == AccountData.SerialNumber)
+        if (IsPanelOpen && targetSerialNumber == AccountData.SerialNumber && FriendPanel.IsPrivateMessageNew(targetSerialNumber, datas[0].Date))
         {
             RefreshScrollRect();
+            FriendPanel.SaveLastPrivateMessageDate(targetSerialNumber, datas[0].Date);
+            OnHaveNewMessage.Invoke(targetSerialNumber);
+        }
+        else if (FriendPanel.IsPrivateMessageNew(targetSerialNumber, datas[0].Date))
+        {
+            OnHaveNewMessage.Invoke(targetSerialNumber);
         }
     }
 
@@ -214,11 +238,22 @@ public class MessagePanel : Regist
         DownloadingPrivateMessageFlag = false;
         LoadingTitle.text = Language.GetStr(LanguageLabel.UI__AH_LoadSucceed);
         DelayCall.Call(1f, () => LoadingTitle.TweenBacCG());
+
+        TryCreateNewPrivateMessageDataStash(targetSerialNumber);
         PrivateMessageDataStash dataStash = PrivateMessageDataDictionary[targetSerialNumber];
         dataStash.Add(int.Parse(page), datas);
     }
 
 
+    public static void TryCreateNewPrivateMessageDataStash(string targetSerialNumber)
+    {
+        if (!PrivateMessageDataDictionary.ContainsKey(targetSerialNumber))
+        {
+            PrivateMessageDataDictionary.Add(targetSerialNumber, new PrivateMessageDataStash());
+        }
+    }
+
+
     private static void SendMessage()
     {
         if (string.IsNullOrEmpty(InputField.text))
@@ -228,8 +263,8 @@ public class MessagePanel : Regist
         }
 
         AudioManager.PlayClip(ResourceLabel.BtnClip);
-        InputField.text = "";
         HttpManager.SendPrivateMessage(AccountData.SerialNumber, InputField.text, SendMessageSucceedCallback, SendMessageFailedCallback);
+        InputField.text = "";
         SendMessageButton.interactable = false;
     }
 
@@ -244,9 +279,10 @@ public class MessagePanel : Regist
         SendMessageButton.interactable = true;
         if (IsPanelOpen && targetSerialNumber == AccountData.SerialNumber)
         {
-            foreach (var key in ScrollRect.ChildrenDataIndexDictionary.Keys)
+            List<VirtualScrollRectItem> keys = ScrollRect.ChildrenDataIndexDictionary.Keys.ToList();
+            for (int i = 0; i < keys.Count; i++)
             {
-                ScrollRect.ChildrenDataIndexDictionary[key] = ScrollRect.ChildrenDataIndexDictionary[key] + 1;
+                ScrollRect.ChildrenDataIndexDictionary[keys[i]] = ScrollRect.ChildrenDataIndexDictionary[keys[i]] + 1;
             }
             PrivateMessageData data = new PrivateMessageData(HttpManager.SerialNumber, NickNameManager.NickName, content, HttpManager.CurrentDateTime);
             PrivateMessageItem item = GetItem(data);

+ 24 - 0
Assets/Script/Social/PlazaroomMemberItem.cs

@@ -88,6 +88,8 @@ public class PlazaroomMemberItem : MonoBehaviour
         SendMessageButton.onClick.AddListener(OnSendMessageButtonClick);
 
         FriendPanel.OnFriendListRefresh += RefreshRelationship;
+        MessagePanel.OnHaveNewMessage += OnHaveNewMessage;
+        MessagePanel.OnDontHaveNewMessage += OnDontHaveNewMessage;
     }
 
     public void Reset(AccountData accountData, DateTime joinedTime)
@@ -105,6 +107,11 @@ public class PlazaroomMemberItem : MonoBehaviour
         SendMessageButton.SetActive(false);
 
         RefreshRelationship(FriendPanel.FriendAccountDatas);
+
+        if (FriendPanel.HaveNewMessage(accountData.SerialNumber))
+        {
+            OnHaveNewMessage(accountData.SerialNumber);
+        }
     }
 
     private string GetContent()
@@ -181,4 +188,21 @@ public class PlazaroomMemberItem : MonoBehaviour
         AudioManager.PlayClip(ResourceLabel.BtnClip);
         MessagePanel.OpenPanel(AccountData);
     }
+
+
+    public void OnHaveNewMessage(string serialNumber)
+    {
+        if (serialNumber == AccountData.SerialNumber)
+        {
+            NewMessageFlagImage.SetActive(true);
+        }
+    }
+
+    public void OnDontHaveNewMessage(string serialNumber)
+    {
+        if (serialNumber == AccountData.SerialNumber)
+        {
+            NewMessageFlagImage.SetActive(false);
+        }
+    }
 }

+ 5 - 5
Assets/Script/Social/PlazaroomMemberPanel.cs

@@ -42,11 +42,11 @@ public class PlazaroomMemberPanel : Regist
         Grid = ResourceManager.Get(ObjectLabel.AE_Grid);
         PanelMask = ResourceManager.Get(ObjectLabel.AE_PlazaroomMemberPanelMask);
 
-        LanguageManager.Add(PanelTitle, Language.GetStr(LanguageLabel.UI__AE_Title));
-        LanguageManager.Add(ContentTitle, Language.GetStr(LanguageLabel.UI__AE_JoinedTimeTitle));
-        LanguageManager.Add(FriendFilterTitle, Language.GetStr(LanguageLabel.UI__AE_FilterTitle));
-        LanguageManager.Add(NicknameTitle, Language.GetStr(LanguageLabel.UI__AE_Nickname));
-        LanguageManager.Add(CloseButtonTitle, Language.GetStr(LanguageLabel.UI__AE_CloseTitle));
+        LanguageManager.Add(PanelTitle, new MulLanStr(LanguageLabel.UI__AE_Title));
+        LanguageManager.Add(ContentTitle, new MulLanStr(LanguageLabel.UI__AE_JoinedTimeTitle));
+        LanguageManager.Add(FriendFilterTitle, new MulLanStr(LanguageLabel.UI__AE_FilterTitle));
+        LanguageManager.Add(NicknameTitle, new MulLanStr(LanguageLabel.UI__AE_Nickname));
+        LanguageManager.Add(CloseButtonTitle, new MulLanStr(LanguageLabel.UI__AE_CloseTitle));
 
         PanelMask.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);
         MemberButton.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);

+ 3 - 2
Assets/Script/Tool/Auxiliary.cs

@@ -145,8 +145,9 @@ public class Auxiliary : Regist
 
         if (Input.GetKeyDown(KeyCode.Space))
         {
-            DebugManager.ResetGardenLevel(7);
-            DebugManager.ResetVisitTutorial();
+            Debug.Log(ConfigManager.ConfigRootNode.OuterXml);
+            //DebugManager.ResetGardenLevel(7);
+            //DebugManager.ResetVisitTutorial();
             //HttpManager.GetThanksGiftInfo(RechargeGiftManager.Init, () => Bubble.Show(null, Language.GetStr(LanguageLabel.UI__GetThanksGiftInfoFailed)));
         }