mirror of
https://github.com/MikuLeaks/MikuSB.git
synced 2026-06-04 10:43:59 +00:00
Keep username changes
This commit is contained in:
@@ -7,6 +7,8 @@ namespace MikuSB.Database.Player;
|
|||||||
[SugarTable("Player")]
|
[SugarTable("Player")]
|
||||||
public class PlayerGameData : BaseDatabaseDataHelper
|
public class PlayerGameData : BaseDatabaseDataHelper
|
||||||
{
|
{
|
||||||
|
public const string DefaultDisplayName = "Miku";
|
||||||
|
|
||||||
public string? Name { get; set; } = "";
|
public string? Name { get; set; } = "";
|
||||||
public string? Signature { get; set; } = "MikuPS";
|
public string? Signature { get; set; } = "MikuPS";
|
||||||
public uint Level { get; set; } = 100;
|
public uint Level { get; set; } = 100;
|
||||||
@@ -25,13 +27,30 @@ public class PlayerGameData : BaseDatabaseDataHelper
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string NormalizeDisplayName(string? name)
|
||||||
|
{
|
||||||
|
var normalized = name?.Trim();
|
||||||
|
return string.IsNullOrWhiteSpace(normalized) ? DefaultDisplayName : normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool EnsureDisplayName()
|
||||||
|
{
|
||||||
|
var normalized = NormalizeDisplayName(Name);
|
||||||
|
if (string.Equals(Name, normalized, StringComparison.Ordinal))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Name = normalized;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public PlayerProfile ToProfileProto()
|
public PlayerProfile ToProfileProto()
|
||||||
{
|
{
|
||||||
|
var displayName = NormalizeDisplayName(Name);
|
||||||
var proto = new PlayerProfile
|
var proto = new PlayerProfile
|
||||||
{
|
{
|
||||||
Pid = (uint)Uid,
|
Pid = (uint)Uid,
|
||||||
Account = Name,
|
Account = displayName,
|
||||||
Name = Name,
|
Name = displayName,
|
||||||
Level = Level,
|
Level = Level,
|
||||||
Sex = Gender,
|
Sex = Gender,
|
||||||
Sign = Signature,
|
Sign = Signature,
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
{
|
{
|
||||||
// new player
|
// new player
|
||||||
IsNewPlayer = true;
|
IsNewPlayer = true;
|
||||||
Data.Name = AccountData.GetAccountByUid(uid)?.Username;
|
Data.Name = PlayerGameData.NormalizeDisplayName(AccountData.GetAccountByUid(uid)?.Username);
|
||||||
|
|
||||||
DatabaseHelper.CreateInstance(Data);
|
DatabaseHelper.CreateInstance(Data);
|
||||||
|
|
||||||
@@ -138,6 +138,7 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
public async ValueTask OnEnterGame()
|
public async ValueTask OnEnterGame()
|
||||||
{
|
{
|
||||||
if (!Initialized) await InitialPlayerManager();
|
if (!Initialized) await InitialPlayerManager();
|
||||||
|
Data.EnsureDisplayName();
|
||||||
await CharacterManager.RepairCharacterWeapons();
|
await CharacterManager.RepairCharacterWeapons();
|
||||||
await EnsureSupplies();
|
await EnsureSupplies();
|
||||||
}
|
}
|
||||||
@@ -229,12 +230,13 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
|
|
||||||
public Proto.Player ToPlayerProto()
|
public Proto.Player ToPlayerProto()
|
||||||
{
|
{
|
||||||
|
var displayName = PlayerGameData.NormalizeDisplayName(Data.Name);
|
||||||
var proto = new Proto.Player
|
var proto = new Proto.Player
|
||||||
{
|
{
|
||||||
Pid = (ulong)Data.Uid,
|
Pid = (ulong)Data.Uid,
|
||||||
Account = Data.Name,
|
Account = displayName,
|
||||||
Provider = Data.Name,
|
Provider = displayName,
|
||||||
Name = Data.Name,
|
Name = displayName,
|
||||||
Level = Data.Level,
|
Level = Data.Level,
|
||||||
Sex = Data.Gender,
|
Sex = Data.Gender,
|
||||||
Vigor = Data.Vigor,
|
Vigor = Data.Vigor,
|
||||||
@@ -263,6 +265,11 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
return proto;
|
return proto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetDisplayName(string? name)
|
||||||
|
{
|
||||||
|
Data.Name = PlayerGameData.NormalizeDisplayName(name);
|
||||||
|
}
|
||||||
|
|
||||||
public void SetShowItem(int index, ulong itemId)
|
public void SetShowItem(int index, ulong itemId)
|
||||||
{
|
{
|
||||||
if (index <= 0)
|
if (index <= 0)
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ public class HandlerReqLogin : Handler
|
|||||||
connection.State = SessionStateEnum.WAITING_FOR_LOGIN;
|
connection.State = SessionStateEnum.WAITING_FOR_LOGIN;
|
||||||
var pd = DatabaseHelper.GetInstance<PlayerGameData>(account.Uid);
|
var pd = DatabaseHelper.GetInstance<PlayerGameData>(account.Uid);
|
||||||
connection.Player = pd == null ? new PlayerInstance(account.Uid) : new PlayerInstance(pd);
|
connection.Player = pd == null ? new PlayerInstance(account.Uid) : new PlayerInstance(pd);
|
||||||
|
if (connection.Player.Data.EnsureDisplayName())
|
||||||
|
DatabaseHelper.UpdateInstance(connection.Player.Data);
|
||||||
|
|
||||||
connection.DebugFile = Path.Combine(ConfigManager.Config.Path.LogPath, "Debug/", $"{account.Uid}/",
|
connection.DebugFile = Path.Combine(ConfigManager.Config.Path.LogPath, "Debug/", $"{account.Uid}/",
|
||||||
$"Debug-{DateTime.Now:yyyy-MM-dd HH-mm-ss}.log");
|
$"Debug-{DateTime.Now:yyyy-MM-dd HH-mm-ss}.log");
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using MikuSB.Proto;
|
using Google.Protobuf;
|
||||||
|
using MikuSB.Database;
|
||||||
|
using MikuSB.Proto;
|
||||||
|
|
||||||
namespace MikuSB.GameServer.Server.Packet.Recv.Login;
|
namespace MikuSB.GameServer.Server.Packet.Recv.Login;
|
||||||
|
|
||||||
@@ -7,6 +9,57 @@ public class HandlerReqRename : Handler
|
|||||||
{
|
{
|
||||||
public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo)
|
public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo)
|
||||||
{
|
{
|
||||||
|
var player = connection.Player;
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
var requestedName = ParseDisplayName(data);
|
||||||
|
player.SetDisplayName(requestedName);
|
||||||
|
DatabaseHelper.UpdateInstance(player.Data);
|
||||||
|
await player.OnHeartBeat();
|
||||||
|
}
|
||||||
|
|
||||||
await connection.SendPacket(CmdIds.RspRename);
|
await connection.SendPacket(CmdIds.RspRename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string? ParseDisplayName(byte[] data)
|
||||||
|
{
|
||||||
|
if (data.Length == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var input = new CodedInputStream(data);
|
||||||
|
while (!input.IsAtEnd)
|
||||||
|
{
|
||||||
|
var tag = input.ReadTag();
|
||||||
|
if (tag == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (WireFormat.GetTagWireType(tag) == WireFormat.WireType.LengthDelimited)
|
||||||
|
{
|
||||||
|
var value = input.ReadString();
|
||||||
|
if (!string.IsNullOrWhiteSpace(value))
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
input.SkipLastField();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Fall back to raw UTF-8 payload handling below.
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var rawText = System.Text.Encoding.UTF8.GetString(data).Trim('\0', ' ', '\r', '\n', '\t');
|
||||||
|
return string.IsNullOrWhiteSpace(rawText) ? null : rawText;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user