private void Group_OnPeerJoinRequest(JoinGroupRequest request) { if (AuthenticatePeer(request.Peer)) { request.Accept(null); OnPeerConnected(request.Peer); } else { request.Reject("", null); } }
public async Task <JoinGroupResponse> JoinAsync(IPeer peer, object arg) { // check if group is closed if (isClosed) { return(new JoinGroupResponse(GroupId, OperationCode, JoinGroupResponse.ResultType.Cancelled, string.Format("Group is closed."))); } // check if peer has joined if (peers.ContainsKey(peer.Id)) { return(new JoinGroupResponse(GroupId, OperationCode, JoinGroupResponse.ResultType.HasJoined, string.Format("Has joined in group"))); } // check if peer is in queue if (joinQueuing.Exists(req => req.Peer.Id == peer.Id)) { return(new JoinGroupResponse(GroupId, OperationCode, JoinGroupResponse.ResultType.InQueue, string.Format("Join request is in queue."))); } // check if peer is been handling if (joinHandling.Exists(req => req.Peer.Id == peer.Id)) { return(new JoinGroupResponse(GroupId, OperationCode, JoinGroupResponse.ResultType.Handling, string.Format("Join request is handling."))); } // add request into queue and waiting result JoinGroupRequest request = new JoinGroupRequest(GroupId, OperationCode, peer, arg); joinQueuing.Add(request); JoinGroupResponse result = await request.Task; joinHandling.Remove(request); // remove request from handling (because finished) if (result.type == JoinGroupResponse.ResultType.Accepted) { lock (peers) peers.Add(peer.Id, peer); peer.TrackGroup(this); try { if (OnPeerJoinedEvent != null) { OnPeerJoinedEvent.Invoke(peer); } } catch (Exception e) { debugger.LogError(e); } } return(result); }
public JoinGroupRequest DequeueJoinRequest() { lock (joinQueuing) { if (joinQueuing.Count < 0) { throw new InvalidOperationException("No queueing request."); } JoinGroupRequest request = joinQueuing[0]; joinQueuing.RemoveAt(0); // add request into handling joinHandling.Add(request); return(request); } }