private static void HandleEventGroupMemberAdded(IRpcProtocol protocol, IEventData eventData)
        {
            var groupMemberAdded = new GroupMemberAdded(protocol, eventData);

            if (!groupMemberAdded.IsValid)
            {
                _logger.ErrorFormat("[HandleEventGroupMemberAdded]: Received an invalid {0}", eventData.GetType());
                return;
            }

            MmoWorld.Instance.PrimaryFiber.Enqueue(() => DoGroupMemberAdded(groupMemberAdded));
        }
        private static void DoGroupMemberAdded(GroupMemberAdded groupMemberAdded)
        {
            Group group;

            if (!GroupManager.Instance.TryGetGroup(groupMemberAdded.GroupGuid, out group))
            {
                _logger.WarnFormat("[DoGroupMemberAdded]: Group (Guid={0}) not found.", groupMemberAdded.GroupGuid);
                return;
            }

            group.AddMember(groupMemberAdded.MemberInfo);
        }
        private OperationResponse HandleOperationLeaveWorld(OperationRequest operationRequest)
        {
            var operation = new LeaveWorld(Protocol, operationRequest);

            if (!operation.IsValid)
            {
                return new OperationResponse(operationRequest.OperationCode)
                       {
                           ReturnCode = (short)ResultCode.InvalidOperationParameter, DebugMessage = operation.GetErrorMessage()
                       }
            }
            ;

            SocialSession session;

            if (social.SessionCache.TryGetSessionBySessionId(operation.SessionId, out session))
            {
                session.LeaveWorld(operation.WorldId);
            }
            return(null);
        }

        #endregion

        #region Implementation of IWorld

        /// <summary>
        /// Gets the group manager
        /// </summary>
        IGroupManager IWorld.GroupManager
        {
            get
            {
                return(this);
            }
        }

        #endregion

        #region Implementation of IGroupManager

        void IGroupManager.FormGroup(MmoGuid groupGuid, GroupMemberStructure leader)
        {
            var groupFormed = new GroupFormed
            {
                GroupGuid  = groupGuid,
                LeaderInfo = leader,
            };

            this.SendEvent(new EventData((byte)ServerEventCode.GroupFormed, groupFormed), new SendParameters());
            this.DoAddMember(groupGuid, leader);
        }

        void IGroupManager.DisbandGroup(MmoGuid groupGuid)
        {
            var groupDisbanded = new GroupDisbanded
            {
                GroupGuid = groupGuid,
            };

            this.SendEvent(new EventData((byte)ServerEventCode.GroupDisbanded, groupDisbanded), new SendParameters());
        }

        void IGroupManager.AddMember(MmoGuid groupGuid, GroupMemberStructure member)
        {
            this.DoAddMember(groupGuid, member);
        }

        void DoAddMember(MmoGuid groupGuid, GroupMemberStructure member)
        {
            SocialSession session;

            if (social.SessionCache.TryGetSessionBySessionName(member.Name, out session))
            {
                var groupMemberAddedSession = new GroupMemberAddedSession
                {
                    GroupGuid  = groupGuid,
                    MemberInfo = member,
                    SessionId  = session.SessionId
                };
                this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberAddedSession, groupMemberAddedSession), new SendParameters());
            }
            else
            {
                var groupMemberAdded = new GroupMemberAdded
                {
                    GroupGuid  = groupGuid,
                    MemberInfo = member,
                };
                this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberAdded, groupMemberAdded), new SendParameters());
            }
        }

        void IGroupManager.RemoveMember(MmoGuid groupGuid, MmoGuid memberGuid)
        {
            var groupMemberRemoved = new GroupMemberRemoved
            {
                GroupGuid  = groupGuid,
                MemberGuid = memberGuid,
            };

            this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberRemoved, groupMemberRemoved), new SendParameters());
        }

        void IGroupManager.UpdateMemberStatus(MmoGuid groupGuid, MmoGuid memberGuid, OnlineStatus status)
        {
            switch (status)
            {
            case OnlineStatus.Online:
                var groupMemberOnline = new GroupMemberOnline
                {
                    GroupGuid  = groupGuid,
                    MemberGuid = memberGuid,
                };
                this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberOnline, groupMemberOnline), new SendParameters());
                break;

            case OnlineStatus.Offline:
                var groupMemberOffline = new GroupMemberOffline
                {
                    GroupGuid  = groupGuid,
                    MemberGuid = memberGuid,
                };
                this.SendEvent(new EventData((byte)ServerEventCode.GroupMemberOffline, groupMemberOffline), new SendParameters());
                break;
            }
        }

        #endregion
    }