public async ValueTask HandleAsync(Msg msg, CancellationToken cancellationToken) { var query = GetPlayerRequest.Parser.ParseFrom(msg.Data); var playerReg = await m_PlayerService.GetAsync(new GetPlayerBySessionIdQuery { SessionId = query.SessionId }).ConfigureAwait(false); var reply = new GetPlayerResponse(); if (playerReg != null) { reply.Player = new PlayerInfo { SessionId = playerReg.SessionId, ConnectorId = playerReg.ConnectorId, Name = playerReg.Name }; await m_MessageQueueService.PublishAsync(msg.Reply, reply.ToByteArray()).ConfigureAwait(false); } else { reply.Player = null; await m_MessageQueueService.PublishAsync(msg.Reply, reply.ToByteArray()).ConfigureAwait(false); } }
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."); }
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); }
public async ValueTask HandleAsync(Msg msg, CancellationToken cancellationToken) { var request = RoomSessionsRequest.Parser.ParseFrom(msg.Data); var sessionIds = m_RoomSessionsService .QueryAsync(new RoomSessionsQuery { Room = request.Room }) .ToEnumerable() .ToArray(); var allPlayers = m_PlayerInfoService.QueryAsync(new PlayerInfoQuery { SessionIds = sessionIds }); var response = new RoomSessionsResponse(); response.Players.AddRange(allPlayers .Select(player => new Chat.Protos.PlayerInfo { SessionId = player.SessionId, ConnectorId = player.ConnectorId, Name = player.Name }) .ToEnumerable()); await m_MessageQueueService.PublishAsync(msg.Reply, response.ToByteArray()); }
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()); }
public ValueTask ExecuteAsync(SendQueueCommand command) { var packet = new QueuePacket { SessionId = command.SessionId, Payload = command.Payload }; return(m_MessageQueueService.PublishAsync(command.Subject, packet.ToByteArray())); }
public Task Execute(IJobExecutionContext context) { var allSessionIds = m_SocketRepository.Keys; var sendData = new ActiveSessionsRequest(); sendData.SessionIds.AddRange(allSessionIds); return(m_MessageQueueService.PublishAsync("session.active", sendData.ToByteArray()).AsTask()); }
public async ValueTask HandleAsync(Msg msg, CancellationToken cancellationToken) { var registration = UnregisterRequest.Parser.ParseFrom(msg.Data); await m_UnregisterSessionService.ExecuteAsync(new UnregisterSessionCommand { SessionId = registration.SessionId }).ConfigureAwait(false); await m_MessageQueueService.PublishAsync(msg.Reply, Array.Empty <byte>()).ConfigureAwait(false); m_Logger.LogInformation($"({registration.SessionId}) unregistered."); }
public async ValueTask HandleAsync(Msg msg, CancellationToken cancellationToken) { var request = GetRoomBySessionIdRequest.Parser.ParseFrom(msg.Data); var room = await m_GetRoomService .GetAsync(new GetRoomBySessionIdQuery { SessionId = request.SessionId }) .ConfigureAwait(false); var response = new GetRoomBySessionIdResponse { Room = room ?? string.Empty }; await m_MessageQueueService.PublishAsync( msg.Reply, response.ToByteArray()).ConfigureAwait(false); }
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; } }
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); } }