예제 #1
0
        public async ValueTask HandleAsync(Msg msg, CancellationToken cancellationToken)
        {
            var request = LeaveRoomRequest.Parser.ParseFrom(msg.Data);

            await m_LeaveRoomService.ExecuteAsync(new LeaveRoomCommand
            {
                SessionId = request.SessionId,
                Room      = request.Room
            }).ConfigureAwait(false);

            var roomSessionIds = m_ListRoomSessionsService
                                 .QueryAsync(new RoomSessionsQuery
            {
                Room = request.Room
            })
                                 .ToEnumerable();

            var refrashPacket = new SendPacket
            {
                Subject = "room.player.refrash"
            };

            refrashPacket.SessionIds.AddRange(roomSessionIds);

            await m_MessageQueueService.PublishAsync(
                "connect.send",
                refrashPacket.ToByteArray()).ConfigureAwait(false);

            await m_MessageQueueService.PublishAsync(msg.Reply, Array.Empty <byte>()).ConfigureAwait(false);

            m_Logger.LogInformation($"({request.SessionId}, {request.Room}) leaved.");
        }
예제 #2
0
        public async ValueTask HandleAsync(Msg msg, CancellationToken cancellationToken)
        {
            m_Logger.LogInformation($"RoomList received.");

            var packet = QueuePacket.Parser.ParseFrom(msg.Data);

            var rooms = m_ListRoomService.QueryAsync(new RoomListQuery());

            var response = new RoomList();

            response.Rooms.AddRange(rooms
                                    .Select(info => new Room
            {
                Name        = info.Name,
                HasPassword = info.HasPassword
            }).ToEnumerable());

            var sendMsg = new SendPacket
            {
                Subject = "chat.room.list"
            };

            sendMsg.SessionIds.Add(packet.SessionId);
            sendMsg.Payload = response.ToByteString();

            await m_MessageQueueService
            .PublishAsync("connect.send", sendMsg.ToByteArray())
            .ConfigureAwait(false);
        }
예제 #3
0
        public async ValueTask HandleAsync(Msg msg, CancellationToken cancellationToken)
        {
            var packet = QueuePacket.Parser.ParseFrom(msg.Data);

            m_Logger.LogInformation($"Receive packet from {packet.SessionId}");

            var content = ChatMessage.Parser.ParseFrom(packet.Payload);

            m_Logger.LogInformation($"Scope: {content.Scope}, Target: {content.Target}, Message: {content.Message}");

            var fromPlayerInfo = await m_QueryPlayerService
                                 .GetAsync(new PlayerInfoQuery
            {
                SessionId = packet.SessionId
            })
                                 .ConfigureAwait(false);

            if (fromPlayerInfo?.SessionId != packet.SessionId)
            {
                return;
            }

            var room = await m_GetRoomService.GetAsync(new GetRoomBySessionidQuery
            {
                SessionId = fromPlayerInfo.SessionId
            }).ConfigureAwait(false);

            if (string.IsNullOrEmpty(room))
            {
                return;
            }

            var sendContent = new ChatMessage
            {
                Scope   = content.Scope,
                From    = fromPlayerInfo.Name,
                Message = content.Message
            };

            var roomPlayers = m_RoomListService
                              .QueryAsync(new ListPlayerQuery
            {
                Room = room
            });

            switch (content.Scope)
            {
            case Scope.Room:
                var contentByteString = sendContent.ToByteString();

                await foreach (var g in roomPlayers.GroupBy(player => player.ConnectorId))
                {
                    var sendMsg = new SendPacket
                    {
                        Subject = "chat.receive"
                    };

                    sendMsg.SessionIds.AddRange(g.Select(player => player.SessionId).ToEnumerable());

                    sendMsg.Payload = contentByteString;

                    await m_MessageQueueService.PublishAsync(
                        $"connect.send.{g.Key}", sendMsg.ToByteArray()).ConfigureAwait(false);
                }
                break;

            case Scope.Person:

                var targetName = content.Target;

                var matchedPlayer = await roomPlayers
                                    .Where(player => player.SessionId != fromPlayerInfo.SessionId)
                                    .Where(player => player.Name.Equals(targetName, StringComparison.OrdinalIgnoreCase))
                                    .FirstOrDefaultAsync()
                                    .ConfigureAwait(false);

                if (matchedPlayer != null)
                {
                    sendContent.Target = matchedPlayer.Name;

                    if (fromPlayerInfo.ConnectorId == matchedPlayer.ConnectorId)
                    {
                        var sendMsg = new SendPacket
                        {
                            Subject = "chat.receive"
                        };

                        sendMsg.SessionIds.Add(matchedPlayer.SessionId);
                        sendMsg.SessionIds.Add(fromPlayerInfo.SessionId);

                        sendMsg.Payload = sendContent.ToByteString();

                        await m_MessageQueueService.PublishAsync(
                            $"connect.send.{matchedPlayer.ConnectorId}",
                            sendMsg.ToByteArray()).ConfigureAwait(false);
                    }
                    else
                    {
                        var sendMsg = new SendPacket
                        {
                            Subject = "chat.receive"
                        };

                        sendMsg.Payload = sendContent.ToByteString();

                        sendMsg.SessionIds.Add(matchedPlayer.SessionId);

                        await m_MessageQueueService.PublishAsync(
                            $"connect.send.{matchedPlayer.ConnectorId}",
                            sendMsg.ToByteArray()).ConfigureAwait(false);

                        sendMsg.SessionIds.Clear();
                        sendMsg.SessionIds.Add(fromPlayerInfo.SessionId);

                        await m_MessageQueueService.PublishAsync(
                            $"connect.send.{fromPlayerInfo.ConnectorId}",
                            sendMsg.ToByteArray()).ConfigureAwait(false);
                    }
                }
                else
                {
                    var sendMsg = new SendPacket
                    {
                        Subject = "chat.receive"
                    };

                    sendMsg.SessionIds.Add(fromPlayerInfo.SessionId);

                    sendContent.Target = fromPlayerInfo.Name;

                    var notFoundPlayerContent = new ChatMessage
                    {
                        Scope   = Scope.System,
                        Message = $"Can't send message to {targetName}",
                        From    = "System",
                        Target  = fromPlayerInfo.Name
                    };

                    sendMsg.Payload = notFoundPlayerContent.ToByteString();

                    await m_MessageQueueService.PublishAsync(
                        $"connect.send.{fromPlayerInfo.ConnectorId}",
                        sendMsg.ToByteArray()).ConfigureAwait(false);
                }
                break;
            }
        }
예제 #4
0
        public async ValueTask HandleAsync(Msg msg, CancellationToken cancellationToken)
        {
            var packet = QueuePacket.Parser.ParseFrom(msg.Data);

            m_Logger.LogInformation($"chat.player.list => Receive packet from {packet.SessionId}");

            var playerInRoom = await m_GetRoomService
                               .GetAsync(new GetRoomBySessionIdQuery
            {
                SessionId = packet.SessionId
            }).ConfigureAwait(false);

            if (string.IsNullOrEmpty(playerInRoom))
            {
                return;
            }

            var fromPlayerInfo = await m_PlayerQueryService
                                 .QueryAsync(new PlayerInfoQuery
            {
                SessionIds = new[] { packet.SessionId }
            })
                                 .FirstOrDefaultAsync()
                                 .ConfigureAwait(false);

            if (fromPlayerInfo?.SessionId != packet.SessionId)
            {
                return;
            }

            var responseSessionIds = m_RoomListService.QueryAsync(new RoomSessionsQuery
            {
                Room = playerInRoom
            });

            var playersContent = new PlayerList
            {
                Room = playerInRoom
            };

            var allPlayers = m_PlayerQueryService.QueryAsync(new PlayerInfoQuery
            {
                SessionIds = await responseSessionIds.ToArrayAsync().ConfigureAwait(false)
            });

            playersContent.Players.AddRange(allPlayers.Select(player => player.Name).ToEnumerable());

            var sendMsg = new SendPacket
            {
                Subject = "chat.player.list",
                Payload = playersContent.ToByteString()
            };

            sendMsg.SessionIds.Add(packet.SessionId);

            await m_MessageQueueService.PublishAsync($"connect.send.{fromPlayerInfo.ConnectorId}", sendMsg.ToByteArray());
        }
예제 #5
0
        public async ValueTask HandleAsync(Msg msg, CancellationToken cancellationToken)
        {
            var packet = QueuePacket.Parser.ParseFrom(msg.Data);

            var joinRoomData = JoinRoom.Parser.ParseFrom(packet.Payload);

            var roomSessionIds = m_ListRoomSessionsService
                                 .QueryAsync(new RoomSessionsQuery
            {
                Room = joinRoomData.Room
            })
                                 .ToEnumerable()
                                 .ToArray();

            try
            {
                await m_JoinRoomService.ExecuteAsync(new JoinRoomCommand
                {
                    SessionId = packet.SessionId,
                    Room      = joinRoomData.Room,
                    Password  = joinRoomData.Password
                }).ConfigureAwait(false);

                var response = new SendPacket
                {
                    Subject = "room.join.reply"
                };

                response.SessionIds.Add(packet.SessionId);

                var responseContent = new JoinRoomReply
                {
                    Status = JoinRoomStatus.Accpet
                };

                response.Payload = responseContent.ToByteString();

                await m_MessageQueueService.PublishAsync(
                    "connect.send",
                    response.ToByteArray()).ConfigureAwait(false);

                if (roomSessionIds.Length > 0)
                {
                    var broadcast = new SendPacket
                    {
                        Subject = "chat.receive"
                    };

                    broadcast.SessionIds.AddRange(roomSessionIds);

                    var chatMessage = new ChatMessage
                    {
                        Scope   = Scope.System,
                        From    = "System",
                        Message = $"New player joined!"
                    };

                    broadcast.Payload = chatMessage.ToByteString();

                    await m_MessageQueueService.PublishAsync(
                        "connect.send",
                        broadcast.ToByteArray()).ConfigureAwait(false);

                    var refrashPacket = new SendPacket
                    {
                        Subject = "room.player.refrash"
                    };

                    refrashPacket.SessionIds.AddRange(roomSessionIds);

                    await m_MessageQueueService.PublishAsync(
                        "connect.send",
                        refrashPacket.ToByteArray()).ConfigureAwait(false);
                }

                m_Logger.LogInformation($"({packet.SessionId}, {joinRoomData.Room}) joined.");
            }
            catch (Exception ex)
            {
                m_Logger.LogError(ex, string.Empty);

                var response = new SendPacket
                {
                    Subject = "room.join.reply"
                };

                response.SessionIds.Add(packet.SessionId);

                var responseContent = new JoinRoomReply
                {
                    Status = JoinRoomStatus.Reject,
                    Reason = "進房失敗"
                };

                response.Payload = responseContent.ToByteString();

                await m_MessageQueueService.PublishAsync(
                    "connect.send",
                    response.ToByteArray()).ConfigureAwait(false);
            }
        }