fix: the friend system will cause server crash

This commit is contained in:
Somebody
2025-05-30 20:16:47 +08:00
parent ab9b7eb267
commit c197250801
5 changed files with 48 additions and 20 deletions

View File

@@ -1,4 +1,5 @@
using Newtonsoft.Json;
using EggLink.DanhengServer.Util;
using Newtonsoft.Json;
using SqlSugar;
namespace EggLink.DanhengServer.Database;
@@ -11,7 +12,8 @@ public class CustomSerializeService : ISerializeService
{
_jsonSettings = new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Ignore // ignore default values
DefaultValueHandling = DefaultValueHandling.Ignore, // ignore default values
ObjectCreationHandling = ObjectCreationHandling.Replace
};
}
@@ -22,7 +24,25 @@ public class CustomSerializeService : ISerializeService
public T DeserializeObject<T>(string value)
{
return JsonConvert.DeserializeObject<T>(value)!;
try
{
var clazz = JsonConvert.DeserializeObject<T>(value)!;
return clazz;
}
catch
{
// try to create empty instance
try
{
Logger.GetByClassName().Warn("Error occured when load database, resetting the mistake value");
var inst = Activator.CreateInstance<T>();
return inst;
}
catch
{
return default!;
}
}
}
public string SugarSerializeObject(object value)

View File

@@ -7,7 +7,11 @@ public class FriendData : BaseDatabaseDataHelper
{
[SugarColumn(IsJson = true, ColumnDataType = "TEXT")]
public Dictionary<int, FriendDetailData> FriendList { get; set; } = [];
public Dictionary<int, FriendDetailData> FriendDetailList { get; set; } = [];
[SugarColumn(IsJson = true, ColumnDataType = "TEXT")]
public List<FriendDetailData> FriendList { get; set; } = []; // leave for compatibility
[SugarColumn(IsJson = true)] public List<int> BlackList { get; set; } = [];

View File

@@ -1,4 +1,5 @@
using EggLink.DanhengServer.Data;
using System.ComponentModel;
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Database.Avatar;
using EggLink.DanhengServer.Database.Quests;
using EggLink.DanhengServer.Proto;
@@ -27,7 +28,7 @@ public class LineupInfo
public int LineupType { get; set; }
public int LeaderAvatarId { get; set; }
public List<LineupAvatarInfo>? BaseAvatars { get; set; }
public int Mp { get; set; } = 5;
[DefaultValue(5)] public int Mp { get; set; } = 5;
[JsonIgnore] public LineupData? LineupData { get; set; }

View File

@@ -44,7 +44,10 @@ public static class ConfigManager
using (var reader = new StreamReader(stream))
{
var json = reader.ReadToEnd();
Config = JsonConvert.DeserializeObject<ConfigContainer>(json)!;
Config = JsonConvert.DeserializeObject<ConfigContainer>(json, new JsonSerializerSettings
{
ObjectCreationHandling = ObjectCreationHandling.Replace
})!;
}
SaveData(Config, ConfigFilePath);

View File

@@ -20,7 +20,7 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
public async ValueTask<Retcode> AddFriend(int targetUid)
{
if (targetUid == Player.Uid) return Retcode.RetSucc; // Cannot add self
if (FriendData.FriendList.ContainsKey(targetUid)) return Retcode.RetFriendAlreadyIsFriend;
if (FriendData.FriendDetailList.ContainsKey(targetUid)) return Retcode.RetFriendAlreadyIsFriend;
if (FriendData.BlackList.Contains(targetUid)) return Retcode.RetFriendInBlacklist;
if (FriendData.SendApplyList.Contains(targetUid)) return Retcode.RetSucc; // Already send apply
@@ -43,19 +43,19 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
public async ValueTask<PlayerData?> ConfirmAddFriend(int targetUid)
{
if (targetUid == Player.Uid) return null; // Cannot add self
if (FriendData.FriendList.ContainsKey(targetUid)) return null;
if (FriendData.FriendDetailList.ContainsKey(targetUid)) return null;
if (FriendData.BlackList.Contains(targetUid)) return null;
var target = DatabaseHelper.Instance!.GetInstance<FriendData>(targetUid);
var targetData = PlayerData.GetPlayerByUid(targetUid);
if (target == null || targetData == null) return null;
if (target.FriendList.ContainsKey(Player.Uid)) return null;
if (target.FriendDetailList.ContainsKey(Player.Uid)) return null;
if (target.BlackList.Contains(Player.Uid)) return null;
FriendData.ReceiveApplyList.Remove(targetUid);
FriendData.FriendList.Add(targetUid, new());
FriendData.FriendDetailList.Add(targetUid, new());
target.SendApplyList.Remove(Player.Uid);
target.FriendList.Add(Player.Uid, new());
target.FriendDetailList.Add(Player.Uid, new());
var targetPlayer = Listener.GetActiveConnection(targetUid);
if (targetPlayer != null)
@@ -86,8 +86,8 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
var target = DatabaseHelper.Instance!.GetInstance<FriendData>(targetUid);
if (blackInfo == null || target == null) return null;
FriendData.FriendList.Remove(targetUid);
target.FriendList.Remove(Player.Uid);
FriendData.FriendDetailList.Remove(targetUid);
target.FriendDetailList.Remove(Player.Uid);
if (!FriendData.BlackList.Contains(targetUid))
FriendData.BlackList.Add(targetUid);
@@ -111,8 +111,8 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
var target = DatabaseHelper.Instance!.GetInstance<FriendData>(targetUid);
if (target == null) return null;
FriendData.FriendList.Remove(targetUid);
target.FriendList.Remove(Player.Uid);
FriendData.FriendDetailList.Remove(targetUid);
target.FriendDetailList.Remove(Player.Uid);
var targetPlayer = Listener.GetActiveConnection(targetUid);
if (targetPlayer != null)
@@ -232,7 +232,7 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
if (uid == ConfigManager.Config.ServerOption.ServerProfile.Uid)
return new FriendDetailData { IsMark = true };
if (!FriendData.FriendList.TryGetValue(uid, out var friend)) return null;
if (!FriendData.FriendDetailList.TryGetValue(uid, out var friend)) return null;
return friend;
}
@@ -261,7 +261,7 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
public List<PlayerData> GetFriendPlayerData(List<int>? uids = null)
{
var list = new List<PlayerData>();
uids ??= [.. FriendData.FriendList.Keys];
uids ??= [.. FriendData.FriendDetailList.Keys];
foreach (var friend in uids)
{
@@ -346,13 +346,13 @@ public class FriendManager(PlayerInstance player) : BasePlayerManager(player)
public void RemarkFriendName(int uid, string remarkName)
{
if (!FriendData.FriendList.TryGetValue(uid, out var friend)) return;
if (!FriendData.FriendDetailList.TryGetValue(uid, out var friend)) return;
friend.RemarkName = remarkName;
}
public void MarkFriend(int uid, bool isMark)
{
if (!FriendData.FriendList.TryGetValue(uid, out var friend)) return;
if (!FriendData.FriendDetailList.TryGetValue(uid, out var friend)) return;
friend.IsMark = isMark;
}