Skip to content

Commit 608006e

Browse files
author
billsonnn
committed
Start chat
1 parent a729d74 commit 608006e

7 files changed

Lines changed: 97 additions & 5 deletions

File tree

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.Primitives/Messages/Outgoing/Room/Chat/ChatMessageComposer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
using Orleans;
33
using Turbo.Primitives.Networking;
44
using Turbo.Primitives.Rooms.Enums;
5+
using Turbo.Primitives.Rooms.Object;
56

67
namespace Turbo.Primitives.Messages.Outgoing.Room.Chat;
78

89
[GenerateSerializer, Immutable]
910
public record ChatMessageComposer : IComposer
1011
{
1112
[Id(0)]
12-
public required int UserId { get; init; }
13+
public required RoomObjectId ObjectId { get; init; }
1314

1415
[Id(1)]
1516
public required string Text { get; init; }

Turbo.Primitives/Rooms/Grains/IRoomGrain.Avatar.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using System.Collections.Immutable;
23
using System.Threading;
34
using System.Threading.Tasks;
@@ -36,12 +37,19 @@ public Task<bool> SetAvatarDanceAsync(
3637
AvatarDanceType danceType,
3738
CancellationToken ct
3839
);
39-
4040
public Task<bool> SetAvatarExpressionAsync(
4141
ActionContext ctx,
4242
AvatarExpressionType expressionType,
4343
CancellationToken ct
4444
);
45+
public Task SendChatFromPlayerAsync(
46+
PlayerId playerId,
47+
string text,
48+
AvatarGestureType gesture,
49+
int styleId,
50+
List<(string, string, bool)> links,
51+
int trackingId
52+
);
4553

4654
public Task<ImmutableArray<RoomAvatarSnapshot>> GetAllAvatarSnapshotsAsync(
4755
CancellationToken ct

Turbo.Revisions/Revision20260112/Serializers/Room/Chat/ChatMessageComposerSerializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ internal class ChatMessageComposerSerializer(int header)
99
protected override void Serialize(IServerPacket packet, ChatMessageComposer message)
1010
{
1111
packet
12-
.WriteInteger(message.UserId)
12+
.WriteInteger(message.ObjectId)
1313
.WriteString(message.Text)
1414
.WriteInteger((int)message.Gesture)
1515
.WriteInteger(message.StyleId)

Turbo.Rooms/Grains/RoomGrain.Avatar.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Collections.Immutable;
34
using System.Threading;
45
using System.Threading.Tasks;
@@ -176,6 +177,15 @@ CancellationToken ct
176177
}
177178
}
178179

180+
public Task SendChatFromPlayerAsync(
181+
PlayerId playerId,
182+
string text,
183+
AvatarGestureType gesture,
184+
int styleId,
185+
List<(string, string, bool)> links,
186+
int trackingId
187+
) => ChatSystem.SendChatFromPlayerAsync(playerId, text, gesture, styleId, links, trackingId);
188+
179189
public Task<ImmutableArray<RoomAvatarSnapshot>> GetAllAvatarSnapshotsAsync(
180190
CancellationToken ct
181191
) => AvatarModule.GetAllAvatarSnapshotsAsync(ct);

Turbo.Rooms/Grains/RoomGrain.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public sealed partial class RoomGrain : Grain, IRoomGrain
5555
public readonly RoomAvatarTickSystem AvatarTickSystem;
5656
public readonly RoomRollerSystem RollerSystem;
5757
public readonly RoomWiredSystem WiredSystem;
58+
public readonly RoomChatSystem ChatSystem;
5859

5960
public RoomId RoomId => _state.RoomId;
6061

@@ -93,6 +94,7 @@ IGrainFactory grainFactory
9394
AvatarTickSystem = new(this);
9495
RollerSystem = new(this);
9596
WiredSystem = new(this);
97+
ChatSystem = new(this);
9698

9799
EventModule.Register(RollerSystem);
98100
EventModule.Register(WiredSystem);
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
using Turbo.Primitives.Messages.Outgoing.Room.Chat;
4+
using Turbo.Primitives.Players;
5+
using Turbo.Primitives.Rooms.Enums;
6+
using Turbo.Primitives.Rooms.Object;
7+
8+
namespace Turbo.Rooms.Grains.Systems;
9+
10+
public sealed class RoomChatSystem(RoomGrain roomGrain)
11+
{
12+
private readonly RoomGrain _roomGrain = roomGrain;
13+
14+
public async Task SendChatAsync(
15+
RoomObjectId objectId,
16+
string text,
17+
AvatarGestureType gesture,
18+
int styleId,
19+
List<(string, string, bool)> links,
20+
int trackingId
21+
)
22+
{
23+
await _roomGrain.SendComposerToRoomAsync(
24+
new ChatMessageComposer
25+
{
26+
ObjectId = objectId,
27+
Text = text,
28+
Gesture = gesture,
29+
StyleId = styleId,
30+
Links = links,
31+
TrackingId = trackingId,
32+
}
33+
);
34+
}
35+
36+
public async Task SendChatFromPlayerAsync(
37+
PlayerId playerId,
38+
string text,
39+
AvatarGestureType gesture,
40+
int styleId,
41+
List<(string, string, bool)> links,
42+
int trackingId
43+
)
44+
{
45+
if (
46+
!_roomGrain._state.AvatarsByPlayerId.TryGetValue(playerId, out var objectId)
47+
|| !_roomGrain._state.AvatarsByObjectId.TryGetValue(objectId, out var avatar)
48+
)
49+
return;
50+
51+
await SendChatAsync(avatar.ObjectId, text, gesture, styleId, links, trackingId);
52+
}
53+
}

0 commit comments

Comments
 (0)