mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-02 20:26:03 +08:00
fix: the friend system will cause server crash
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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; } = [];
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user