Skip to content

Commit 2f3e86a

Browse files
author
billsonnn
committed
Add figure update
1 parent b106e1e commit 2f3e86a

24 files changed

Lines changed: 229 additions & 29 deletions

File tree

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,35 @@
11
using System.Threading;
22
using System.Threading.Tasks;
3+
using Orleans;
34
using Turbo.Messages.Registry;
45
using Turbo.Primitives.Messages.Incoming.Register;
6+
using Turbo.Primitives.Orleans;
7+
using Turbo.Primitives.Rooms.Enums;
58

69
namespace Turbo.PacketHandlers.Register;
710

8-
public class UpdateFigureDataMessageHandler : IMessageHandler<UpdateFigureDataMessage>
11+
public class UpdateFigureDataMessageHandler(IGrainFactory grainFactory)
12+
: IMessageHandler<UpdateFigureDataMessage>
913
{
14+
private readonly IGrainFactory _grainFactory = grainFactory;
15+
1016
public async ValueTask HandleAsync(
1117
UpdateFigureDataMessage message,
1218
MessageContext ctx,
1319
CancellationToken ct
1420
)
1521
{
16-
await ValueTask.CompletedTask.ConfigureAwait(false);
22+
if (ctx.PlayerId < 0)
23+
return;
24+
25+
var player = _grainFactory.GetPlayerGrain(ctx.PlayerId);
26+
27+
await player
28+
.SetFigureAsync(
29+
message.Figure,
30+
AvatarGenderTypeExtensions.FromLegacyString(message.Gender),
31+
ct
32+
)
33+
.ConfigureAwait(false);
1734
}
1835
}

Turbo.Players/Grains/PlayerGrain.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using Turbo.Primitives.Orleans.Snapshots.Players;
1414
using Turbo.Primitives.Orleans.States.Players;
1515
using Turbo.Primitives.Players;
16+
using Turbo.Primitives.Rooms.Enums;
1617

1718
namespace Turbo.Players.Grains;
1819

@@ -36,6 +37,21 @@ public override async Task OnDeactivateAsync(DeactivationReason reason, Cancella
3637
await WriteToDatabaseAsync(ct);
3738
}
3839

40+
public async Task SetFigureAsync(string figure, AvatarGenderType gender, CancellationToken ct)
41+
{
42+
state.State.Figure = figure;
43+
state.State.Gender = gender;
44+
state.State.LastUpdated = DateTime.UtcNow;
45+
46+
await state.WriteStateAsync(ct);
47+
48+
var summary = await GetSummaryAsync(ct);
49+
50+
var playerPresence = _grainFactory.GetPlayerPresenceGrain((int)this.GetPrimaryKeyLong());
51+
52+
await playerPresence.OnFigureUpdatedAsync(summary, ct);
53+
}
54+
3955
private async Task HydrateAsync(CancellationToken ct)
4056
{
4157
if (state.State.IsLoaded)
@@ -53,6 +69,7 @@ await dbCtx
5369
state.State.Motto = entity.Motto ?? string.Empty;
5470
state.State.Figure = entity.Figure ?? string.Empty;
5571
state.State.Gender = entity.Gender;
72+
state.State.AchievementScore = 0;
5673
state.State.CreatedAt = entity.CreatedAt;
5774
state.State.LastUpdated = DateTime.UtcNow;
5875
state.State.IsLoaded = true;
@@ -95,6 +112,7 @@ public Task<PlayerSummarySnapshot> GetSummaryAsync(CancellationToken ct) =>
95112
Motto = state.State.Motto,
96113
Figure = state.State.Figure,
97114
Gender = state.State.Gender,
115+
AchievementScore = state.State.AchievementScore,
98116
CreatedAt = state.State.CreatedAt,
99117
}
100118
);
@@ -110,7 +128,7 @@ public Task<PlayerExtendedProfileSnapshot> GetExtendedProfileSnapshotAsync(Cance
110128
Figure = s.Figure,
111129
Motto = s.Motto,
112130
CreationDate = s.CreatedAt.ToString("yyyy-MM-dd"),
113-
AchievementScore = 0,
131+
AchievementScore = s.AchievementScore,
114132
FriendCount = 0,
115133
IsFriend = false,
116134
IsFriendRequestSent = false,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
using Turbo.Primitives.Messages.Outgoing.Avatar;
4+
using Turbo.Primitives.Messages.Outgoing.Room.Engine;
5+
using Turbo.Primitives.Orleans;
6+
using Turbo.Primitives.Orleans.Snapshots.Players;
7+
8+
namespace Turbo.Players.Grains;
9+
10+
internal sealed partial class PlayerPresenceGrain
11+
{
12+
public async Task OnFigureUpdatedAsync(PlayerSummarySnapshot snapshot, CancellationToken ct)
13+
{
14+
await SendComposerAsync(
15+
new FigureUpdateEventMessageComposer
16+
{
17+
Figure = snapshot.Figure,
18+
Gender = snapshot.Gender,
19+
}
20+
);
21+
22+
if (_state.ActiveRoomId > 0)
23+
{
24+
await SendComposerAsync(
25+
new UserChangeMessageComposer
26+
{
27+
ObjectId = -1,
28+
Figure = snapshot.Figure,
29+
Gender = snapshot.Gender,
30+
CustomInfo = snapshot.Motto,
31+
AchievementScore = snapshot.AchievementScore,
32+
}
33+
);
34+
35+
var room = _grainFactory.GetRoomGrain(_state.ActiveRoomId);
36+
37+
await room.UpdateAvatarWithPlayerAsync(snapshot, ct);
38+
}
39+
}
40+
}

Turbo.Primitives/Messages/Incoming/Register/UpdateFigureDataMessage.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,8 @@
22

33
namespace Turbo.Primitives.Messages.Incoming.Register;
44

5-
public record UpdateFigureDataMessage : IMessageEvent { }
5+
public record UpdateFigureDataMessage : IMessageEvent
6+
{
7+
public required string Figure { get; init; }
8+
public required string Gender { get; init; }
9+
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
using Orleans;
22
using Turbo.Primitives.Networking;
3+
using Turbo.Primitives.Rooms.Enums;
34

45
namespace Turbo.Primitives.Messages.Outgoing.Avatar;
56

67
[GenerateSerializer, Immutable]
78
public sealed record FigureUpdateEventMessageComposer : IComposer
89
{
9-
// TODO: add properties if/when identified
10+
[Id(0)]
11+
public required string Figure { get; init; }
12+
13+
[Id(1)]
14+
public required AvatarGenderType Gender { get; init; }
1015
}
Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11
using Orleans;
22
using Turbo.Primitives.Networking;
3+
using Turbo.Primitives.Rooms.Enums;
4+
using Turbo.Primitives.Rooms.Object;
35

46
namespace Turbo.Primitives.Messages.Outgoing.Room.Engine;
57

68
[GenerateSerializer, Immutable]
79
public sealed record UserChangeMessageComposer : IComposer
810
{
9-
// TODO: add properties if/when identified
11+
[Id(0)]
12+
public required RoomObjectId ObjectId { get; init; }
13+
14+
[Id(1)]
15+
public required string Figure { get; init; }
16+
17+
[Id(2)]
18+
public required AvatarGenderType Gender { get; init; }
19+
20+
[Id(3)]
21+
public required string CustomInfo { get; init; }
22+
23+
[Id(4)]
24+
public required int AchievementScore { get; init; }
1025
}

Turbo.Primitives/Messages/Outgoing/Users/UserNameChangedMessageComposer.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,12 @@ namespace Turbo.Primitives.Messages.Outgoing.Users;
66
[GenerateSerializer, Immutable]
77
public sealed record UserNameChangedMessageComposer : IComposer
88
{
9-
// TODO: add properties if/when identified
9+
[Id(0)]
10+
public required int WebId { get; init; }
11+
12+
[Id(1)]
13+
public required int Id { get; init; }
14+
15+
[Id(2)]
16+
public required string Name { get; init; }
1017
}

Turbo.Primitives/Orleans/Snapshots/Players/PlayerSummarySnapshot.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,8 @@ public sealed record PlayerSummarySnapshot
2424
public required AvatarGenderType Gender { get; init; }
2525

2626
[Id(5)]
27+
public required int AchievementScore { get; init; }
28+
29+
[Id(6)]
2730
public required DateTime CreatedAt { get; init; }
2831
}

Turbo.Primitives/Orleans/States/Players/PlayerState.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ public sealed class PlayerState
2020
public required AvatarGenderType Gender { get; set; } = AvatarGenderType.Male;
2121

2222
[Id(4)]
23-
public required DateTime CreatedAt { get; set; } = DateTime.UtcNow;
23+
public required int AchievementScore { get; set; } = 0;
2424

2525
[Id(5)]
26-
public required DateTime LastUpdated { get; set; } = DateTime.UtcNow;
26+
public required DateTime CreatedAt { get; set; } = DateTime.UtcNow;
2727

2828
[Id(6)]
29+
public required DateTime LastUpdated { get; set; } = DateTime.UtcNow;
30+
31+
[Id(7)]
2932
public required bool IsLoaded { get; set; } = false;
3033
}

Turbo.Primitives/Players/Grains/IPlayerGrain.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
using System.Threading.Tasks;
33
using Orleans;
44
using Turbo.Primitives.Orleans.Snapshots.Players;
5+
using Turbo.Primitives.Rooms.Enums;
56

67
namespace Turbo.Primitives.Grains.Players;
78

89
public interface IPlayerGrain : IGrainWithIntegerKey
910
{
11+
public Task SetFigureAsync(string figure, AvatarGenderType gender, CancellationToken ct);
1012
public Task<PlayerSummarySnapshot> GetSummaryAsync(CancellationToken ct);
1113

1214
public Task<PlayerExtendedProfileSnapshot> GetExtendedProfileSnapshotAsync(

0 commit comments

Comments
 (0)