private void RoomMessageHandler(ClientSendMessageToRoom command, int streamId, CommandAnswerContext answerContext) { var result = new ServerResponseBase(); var message = command.Message; var room = command.Room; lock (_users) { var ctx = ValidateUser(streamId, answerContext, result); if (answerContext.Answered) { return; } if (!ctx.Rooms.Contains(room)) { result.Status = ServerResponseStatus.Error; result.Description = $"You not in the room '{room}'!"; answerContext.TryAnswer(result); return; } var dests = _users.Where(u => u.Rooms.Contains(room)).Select(u => u.Stream).ToArray(); var messageCmd = new ServerRoomMessage { FromUser = ctx.Name, Message = message, Room = room }; _commandHandler.Notify(messageCmd, dests); } }
private void JoinRoomHandler(ClientJoinRoomRequest command, int streamId, CommandAnswerContext answerContext) { var result = new ServerResponseBase(); UserContext ctx = null; var room = command.RoomName; lock (_users) { ctx = ValidateUser(streamId, answerContext, result); if (answerContext.Answered) { return; } if (ctx.Rooms.Contains(room)) { result.Status = ServerResponseStatus.Error; result.Description = $"Already in room {room}"; answerContext.TryAnswer(result); return; } ctx.Rooms.Add(room); } result.Status = ServerResponseStatus.Success; answerContext.TryAnswer(result); _commandHandler.Notify(new ServerServiceMessage() { Message = $"{ctx.Name}, welcome to '{room}'!" }, streamId); }
static void ProcessResponse(ServerResponseBase resp) { if (resp.Status != ServerResponseStatus.Error) { return; } Console.WriteLine($"Error: " + resp.Description); }
protected void Page_Load(object sender, EventArgs e) { IServerResponse res = ServerResponseBase.GetServerResponseInstance(); try { IPeerRequest rq = PeerRequestBase.GetRequestInstance(Request.RawUrl); Trace.Write("Request Object = " + rq); IPeer peer = PeerBase.GetPeer(); peer.IP = (string.IsNullOrEmpty(rq.IP)) ? Request.UserHostAddress : rq.IP; peer.Port = rq.Port; peer.PeerID = rq.PeerID; IPeerPoolManager manager = PeerPoolManagerBase.GetPeerPoolManager(); IPeerPool pool = manager.GetPeerPoolByInfoHash(rq.InfoHash); pool.AddPeer(peer); res.Interval = Convert.ToInt32(ConfigurationManager.AppSettings["Interval"]); res.MinInterval = Convert.ToInt32(ConfigurationManager.AppSettings["MinInterval"]); foreach (IPeer p in pool.GetPeerList()) { if (p.IP == peer.IP && p.Port == peer.Port) { continue; // skip the request peer itself } res.Peers.Add(p); } Response.Clear(); byte[] binRes = res.GetBinaryResponse(); Trace.Write("binRes=" + HexEncoding.ToString(binRes)); Response.BinaryWrite(binRes); } catch (Exception Ex) { Trace.Write("ERROR: " + Ex); res.FailureReason = Ex.ToString(); Response.Clear(); Response.Write(res); } Response.End(); }
private UserContext ValidateUser(int streamId, CommandAnswerContext answerContext, ServerResponseBase responseBase) { lock (_users) { var ctx = _users.FirstOrDefault(u => u.Stream == streamId); if (ctx == null) { responseBase.Status = ServerResponseStatus.Error; responseBase.Description = "User not logged in"; answerContext.TryAnswer(responseBase); return(null); } return(ctx); } }