Skip to content

Commit 8aee13b

Browse files
authored
Merge branch 'main' into feature/messenger
2 parents 04631fc + 608006e commit 8aee13b

61 files changed

Lines changed: 561 additions & 349 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
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
}
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
using System.Threading;
22
using System.Threading.Tasks;
3+
using Orleans;
34
using Turbo.Messages.Registry;
45
using Turbo.Primitives.Messages.Incoming.Room.Avatar;
6+
using Turbo.Primitives.Orleans;
57

68
namespace Turbo.PacketHandlers.Room.Avatar;
79

8-
public class ChangeMottoMessageHandler : IMessageHandler<ChangeMottoMessage>
10+
public class ChangeMottoMessageHandler(IGrainFactory grainFactory)
11+
: IMessageHandler<ChangeMottoMessage>
912
{
13+
private readonly IGrainFactory _grainFactory = grainFactory;
14+
1015
public async ValueTask HandleAsync(
1116
ChangeMottoMessage message,
1217
MessageContext ctx,
1318
CancellationToken ct
1419
)
1520
{
16-
await ValueTask.CompletedTask.ConfigureAwait(false);
21+
if (ctx.PlayerId < 0)
22+
return;
23+
24+
var player = _grainFactory.GetPlayerGrain(ctx.PlayerId);
25+
26+
await player.SetMottoAsync(message.Text, ct).ConfigureAwait(false);
1727
}
1828
}
Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,36 @@
11
using System.Threading;
22
using System.Threading.Tasks;
3+
using Orleans;
34
using Turbo.Messages.Registry;
45
using Turbo.Primitives.Messages.Incoming.Room.Chat;
6+
using Turbo.Primitives.Orleans;
57

68
namespace Turbo.PacketHandlers.Room.Chat;
79

8-
public class ChatMessageHandler : IMessageHandler<ChatMessage>
10+
public class ChatMessageHandler(IGrainFactory grainFactory) : IMessageHandler<ChatMessage>
911
{
12+
private readonly IGrainFactory _grainFactory = grainFactory;
13+
1014
public async ValueTask HandleAsync(
1115
ChatMessage message,
1216
MessageContext ctx,
1317
CancellationToken ct
1418
)
1519
{
16-
await ValueTask.CompletedTask.ConfigureAwait(false);
20+
if (ctx is null || ctx.PlayerId <= 0 || ctx.RoomId <= 0)
21+
return;
22+
23+
var roomChatGrain = _grainFactory.GetRoomGrain(ctx.RoomId);
24+
25+
await roomChatGrain
26+
.SendChatFromPlayerAsync(
27+
ctx.PlayerId,
28+
message.Text,
29+
0,
30+
message.StyleId,
31+
[],
32+
message.TrackingId
33+
)
34+
.ConfigureAwait(false);
1735
}
1836
}

Turbo.PacketHandlers/Room/Engine/GetHeightMapMessageHandler.cs

Lines changed: 0 additions & 24 deletions
This file was deleted.

Turbo.Players/Grains/Modules/PlayerInventoryModule.cs

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,6 @@ internal sealed class PlayerInventoryModule(PlayerPresenceGrain presenceGrain)
1414
{
1515
private readonly PlayerPresenceGrain _presenceGrain = presenceGrain;
1616

17-
private bool _isFurnitureInventoryPrimed = false;
18-
19-
public Task OnSessionAttachedAsync(CancellationToken ct)
20-
{
21-
_isFurnitureInventoryPrimed = false;
22-
return Task.CompletedTask;
23-
}
24-
25-
public async Task OnSessionDetachedAsync(CancellationToken ct)
26-
{
27-
_isFurnitureInventoryPrimed = false;
28-
29-
await _presenceGrain.SendComposerAsync(new FurniListInvalidateEventMessageComposer());
30-
}
31-
3217
public async Task OpenFurnitureInventoryAsync(CancellationToken ct)
3318
{
3419
var inventoryGrain = _presenceGrain._grainFactory.GetInventoryGrain(
@@ -77,27 +62,13 @@ await _presenceGrain.SendComposerAsync(
7762
Items = [.. fragmentItems],
7863
}
7964
);
80-
81-
_isFurnitureInventoryPrimed = true;
82-
}
83-
84-
public async Task OnFurnitureAddedAsync(FurnitureItemSnapshot snapshot, CancellationToken ct)
85-
{
86-
if (!_isFurnitureInventoryPrimed)
87-
return;
88-
89-
await _presenceGrain.SendComposerAsync(
90-
new FurniListAddOrUpdateEventMessageComposer { Item = snapshot }
91-
);
9265
}
9366

94-
public async Task OnFurnitureRemovedAsync(RoomObjectId itemId, CancellationToken ct)
95-
{
96-
if (!_isFurnitureInventoryPrimed)
97-
return;
67+
public Task OnFurnitureAddedAsync(FurnitureItemSnapshot snapshot, CancellationToken ct) =>
68+
_presenceGrain.SendComposerAsync(new FurniListInvalidateEventMessageComposer());
9869

99-
await _presenceGrain.SendComposerAsync(
70+
public Task OnFurnitureRemovedAsync(RoomObjectId itemId, CancellationToken ct) =>
71+
_presenceGrain.SendComposerAsync(
10072
new FurniListRemoveEventMessageComposer { ItemId = itemId }
10173
);
102-
}
10374
}

Turbo.Players/Grains/PlayerGrain.cs

Lines changed: 66 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,31 @@
44
using System.Threading.Tasks;
55
using Microsoft.EntityFrameworkCore;
66
using Orleans;
7-
using Orleans.Runtime;
87
using Turbo.Database.Context;
98
using Turbo.Logging;
109
using Turbo.Primitives;
1110
using Turbo.Primitives.Grains.Players;
1211
using Turbo.Primitives.Orleans;
1312
using Turbo.Primitives.Orleans.Snapshots.Players;
14-
using Turbo.Primitives.Orleans.States.Players;
1513
using Turbo.Primitives.Players;
14+
using Turbo.Primitives.Rooms.Enums;
1615

1716
namespace Turbo.Players.Grains;
1817

19-
internal sealed class PlayerGrain(
20-
[PersistentState(OrleansStateNames.PLAYER_STATE, OrleansStorageNames.PLAYER_STORE)]
21-
IPersistentState<PlayerState> state,
22-
IDbContextFactory<TurboDbContext> dbCtxFactory,
23-
IGrainFactory grainFactory
24-
) : Grain, IPlayerGrain
18+
internal sealed class PlayerGrain : Grain, IPlayerGrain
2519
{
26-
private readonly IDbContextFactory<TurboDbContext> _dbCtxFactory = dbCtxFactory;
27-
private readonly IGrainFactory _grainFactory = grainFactory;
20+
private readonly IDbContextFactory<TurboDbContext> _dbCtxFactory;
21+
private readonly IGrainFactory _grainFactory;
22+
23+
private readonly PlayerLiveState _state;
24+
25+
public PlayerGrain(IDbContextFactory<TurboDbContext> dbCtxFactory, IGrainFactory grainFactory)
26+
{
27+
_dbCtxFactory = dbCtxFactory;
28+
_grainFactory = grainFactory;
29+
30+
_state = new() { PlayerId = PlayerId.Parse((int)this.GetPrimaryKeyLong()) };
31+
}
2832

2933
public override async Task OnActivateAsync(CancellationToken ct)
3034
{
@@ -36,36 +40,54 @@ public override async Task OnDeactivateAsync(DeactivationReason reason, Cancella
3640
await WriteToDatabaseAsync(ct);
3741
}
3842

39-
private async Task HydrateAsync(CancellationToken ct)
43+
public async Task SetFigureAsync(string figure, AvatarGenderType gender, CancellationToken ct)
44+
{
45+
_state.Figure = figure;
46+
_state.Gender = gender;
47+
48+
await WriteToDatabaseAsync(ct);
49+
50+
var playerPresence = _grainFactory.GetPlayerPresenceGrain((int)this.GetPrimaryKeyLong());
51+
52+
await playerPresence.OnFigureUpdatedAsync(await GetSummaryAsync(ct), ct);
53+
54+
await WriteToDatabaseAsync(ct);
55+
}
56+
57+
public async Task SetMottoAsync(string text, CancellationToken ct)
4058
{
41-
if (state.State.IsLoaded)
42-
return;
59+
_state.Motto = text;
60+
61+
await WriteToDatabaseAsync(ct);
62+
63+
var playerPresence = _grainFactory.GetPlayerPresenceGrain((int)this.GetPrimaryKeyLong());
64+
65+
await playerPresence.OnPlayerUpdatedAsync(await GetSummaryAsync(ct), ct);
66+
67+
await WriteToDatabaseAsync(ct);
68+
}
4369

70+
private async Task HydrateAsync(CancellationToken ct)
71+
{
4472
await using var dbCtx = await _dbCtxFactory.CreateDbContextAsync(ct);
4573

4674
var entity =
4775
await dbCtx
4876
.Players.AsNoTracking()
49-
.SingleOrDefaultAsync(x => x.Id == (int)this.GetPrimaryKeyLong(), ct)
77+
.SingleOrDefaultAsync(x => x.Id == (int)_state.PlayerId, ct)
5078
?? throw new TurboException(TurboErrorCodeEnum.PlayerNotFound);
5179

52-
state.State.Name = entity.Name ?? string.Empty;
53-
state.State.Motto = entity.Motto ?? string.Empty;
54-
state.State.Figure = entity.Figure ?? string.Empty;
55-
state.State.Gender = entity.Gender;
56-
state.State.CreatedAt = entity.CreatedAt;
57-
state.State.LastUpdated = DateTime.UtcNow;
58-
state.State.IsLoaded = true;
80+
_state.Name = entity.Name;
81+
_state.Motto = entity.Motto ?? string.Empty;
82+
_state.Figure = entity.Figure;
83+
_state.Gender = entity.Gender;
84+
_state.AchievementScore = 0;
85+
_state.CreatedAt = entity.CreatedAt;
86+
_state.LastUpdated = entity.UpdatedAt;
5987

6088
await _grainFactory
6189
.GetPlayerDirectoryGrain()
62-
.SetPlayerNameAsync(
63-
PlayerId.Parse((int)this.GetPrimaryKeyLong()),
64-
state.State.Name,
65-
ct
66-
);
67-
68-
await state.WriteStateAsync(ct);
90+
.SetPlayerNameAsync(PlayerId.Parse((int)this.GetPrimaryKeyLong()), _state.Name, ct);
6991
}
7092

7193
private async Task WriteToDatabaseAsync(CancellationToken ct)
@@ -75,7 +97,7 @@ private async Task WriteToDatabaseAsync(CancellationToken ct)
7597
var snapshot = await GetSummaryAsync(ct);
7698

7799
await dbCtx
78-
.Players.Where(p => p.Id == (int)this.GetPrimaryKeyLong())
100+
.Players.Where(x => x.Id == (int)_state.PlayerId)
79101
.ExecuteUpdateAsync(
80102
up =>
81103
up.SetProperty(p => p.Name, snapshot.Name)
@@ -84,33 +106,35 @@ await dbCtx
84106
.SetProperty(p => p.Gender, snapshot.Gender),
85107
ct
86108
);
109+
110+
_state.LastUpdated = DateTime.Now;
87111
}
88112

89113
public Task<PlayerSummarySnapshot> GetSummaryAsync(CancellationToken ct) =>
90114
Task.FromResult(
91115
new PlayerSummarySnapshot
92116
{
93-
PlayerId = PlayerId.Parse((int)this.GetPrimaryKeyLong()),
94-
Name = state.State.Name,
95-
Motto = state.State.Motto,
96-
Figure = state.State.Figure,
97-
Gender = state.State.Gender,
98-
CreatedAt = state.State.CreatedAt,
117+
PlayerId = _state.PlayerId,
118+
Name = _state.Name,
119+
Motto = _state.Motto,
120+
Figure = _state.Figure,
121+
Gender = _state.Gender,
122+
AchievementScore = _state.AchievementScore,
123+
CreatedAt = _state.CreatedAt,
99124
}
100125
);
101126

102127
public Task<PlayerExtendedProfileSnapshot> GetExtendedProfileSnapshotAsync(CancellationToken ct)
103128
{
104-
var s = state.State;
105129
return Task.FromResult(
106130
new PlayerExtendedProfileSnapshot
107131
{
108-
UserId = PlayerId.Parse((int)this.GetPrimaryKeyLong()),
109-
UserName = s.Name,
110-
Figure = s.Figure,
111-
Motto = s.Motto,
112-
CreationDate = s.CreatedAt.ToString("yyyy-MM-dd"),
113-
AchievementScore = 0,
132+
UserId = _state.PlayerId,
133+
UserName = _state.Name,
134+
Figure = _state.Figure,
135+
Motto = _state.Motto,
136+
CreationDate = _state.CreatedAt.ToString("yyyy-MM-dd"),
137+
AchievementScore = _state.AchievementScore,
114138
FriendCount = 0,
115139
IsFriend = false,
116140
IsFriendRequestSent = false,
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using Turbo.Primitives.Players;
3+
using Turbo.Primitives.Rooms.Enums;
4+
5+
namespace Turbo.Players.Grains;
6+
7+
public sealed class PlayerLiveState
8+
{
9+
public required PlayerId PlayerId { get; init; }
10+
public string Name { get; set; } = string.Empty;
11+
public string Motto { get; set; } = string.Empty;
12+
public string Figure { get; set; } = string.Empty;
13+
public AvatarGenderType Gender { get; set; } = AvatarGenderType.Male;
14+
public int AchievementScore { get; set; } = 0;
15+
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
16+
public DateTime LastUpdated { get; set; } = DateTime.UtcNow;
17+
}

0 commit comments

Comments
 (0)