private OperationResponse HandleOperationLeaveChatChannel(OperationRequest operationRequest)
        {
            var operation = new LeaveChannel(this.Protocol, operationRequest);

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

            Channel channel;

            if (channels.TryGetValue(operation.ChannelId, out channel))
            {
                ChatSession session;

                if (chat.SessionCache.TryGetSessionBySessionId(operation.SessionId, out session))
                {
                    channel.Leave(session);
                }
            }
            return(null);
        }

        #endregion
    }
예제 #2
0
        public async Task Process(LeaveChannel leaveChannel)
        {
            if (!IsLoggedIn)
            {
                return;
            }

            Channel channel;

            if (state.Rooms.TryGetValue(leaveChannel.ChannelName, out channel))
            {
                User user;
                if (channel.Users.TryRemove(Name, out user))
                {
                    var users = channel.Users.Keys.ToArray();
                    await SendCommand(new ChannelUserRemoved()
                    {
                        ChannelName = channel.Name, UserName = Name
                    });

                    await state.Broadcast(users, new ChannelUserRemoved()
                    {
                        ChannelName = channel.Name, UserName = Name
                    });
                }
            }
        }
예제 #3
0
        void HandleLeaveChannel(LeaveChannel packet)
        {
            if (string.IsNullOrEmpty(packet.ChannelName) && packet.ZoneChannelID == 0)
            {
                return;
            }

            AreaTableRecord zone = CliDB.AreaTableStorage.LookupByKey(GetPlayer().GetZoneId());

            if (packet.ZoneChannelID != 0)
            {
                ChatChannelsRecord channel = CliDB.ChatChannelsStorage.LookupByKey(packet.ZoneChannelID);
                if (channel == null)
                {
                    return;
                }

                if (zone == null || !GetPlayer().CanJoinConstantChannelInZone(channel, zone))
                {
                    return;
                }
            }

            ChannelManager cMgr = ChannelManager.ForTeam(GetPlayer().GetTeam());

            if (cMgr != null)
            {
                Channel channel = cMgr.GetChannel((uint)packet.ZoneChannelID, packet.ChannelName, GetPlayer(), true, zone);
                if (channel != null)
                {
                    channel.LeaveChannel(GetPlayer(), true);
                }

                if (packet.ZoneChannelID != 0)
                {
                    cMgr.LeftChannel((uint)packet.ZoneChannelID, zone);
                }
                else
                {
                    cMgr.LeftChannel(packet.ChannelName);
                }
            }
        }
예제 #4
0
        public async Task Process(LeaveChannel leaveChannel)
        {
            if (!IsLoggedIn)
            {
                return;
            }

            Channel channel;

            if (server.Channels.TryGetValue(leaveChannel.ChannelName, out channel))
            {
                User user;
                var  users = !channel.IsDeluge ? channel.Users.Keys.ToList() : channel.Users.Keys.Where(x => server.CanUserSee(x, Name)).ToList();
                if (channel.Users.TryRemove(Name, out user))
                {
                    await server.Broadcast(users, new ChannelUserRemoved()
                    {
                        ChannelName = channel.Name, UserName = Name
                    });
                }
            }
        }
        private async Task LeaveChannel(LeaveChannel msg)
        {
            if (!_ChannelActors.ContainsKey(msg.ChannelName))
            {
                return;
            }

            var actor = _ChannelActors[msg.ChannelName];
            await actor.GracefulStop(TimeSpan.FromSeconds(10));

            var config = _ChannelConfigurationActor.Ask <ChannelConfiguration>(new GetConfigurationForChannel(msg.ChannelName)).GetAwaiter().GetResult();

            if (config.ConnectedToChannel)
            {
                config.ConnectedToChannel = false;
                _ChannelConfigurationActor.Tell(new SaveConfigurationForChannel(msg.ChannelName, config));
            }


            Logger.Log(Akka.Event.LogLevel.InfoLevel, $"Actor for channel '{msg.ChannelName}' has been stopped.");
            _ChannelActors.Remove(msg.ChannelName);

            _FollowerActor.Tell(new StopTrackingFollowers(msg.ChannelName, ""));
        }