public static void HandlePacket(object session, string packet)
        {
            string[] packetSplit = packet.Split(' ');
            if (packetSplit.Length < 4)
            {
                return;
            }
            GroupJoinPacket packetDefinition = new GroupJoinPacket();

            if (Enum.TryParse(packetSplit[2], out GroupRequestType requestType) && long.TryParse(packetSplit[3], out long characterId))
            {
                packetDefinition.RequestType = requestType;
                packetDefinition.CharacterId = characterId;
                packetDefinition.ExecuteHandler(session as ClientSession);
            }
        }
        private void ExecuteHandler(ClientSession session)
        {
            switch (Type)
            {
            case 0:
                if (session.Character.Group?.IsLeader(session) == true &&
                    session.Character.Group.GroupType != GroupType.Group &&
                    ServerManager.Instance.GroupList.Any(s => s.GroupId == session.Character.Group.GroupId))
                {
                    session.SendPacket(UserInterfaceHelper.GenerateRl(1));
                }
                else if (session.Character.Group != null && session.Character.Group.GroupType != GroupType.Group &&
                         session.Character.Group.IsLeader(session))
                {
                    session.SendPacket(UserInterfaceHelper.GenerateRl(2));
                }
                else if (session.Character.Group != null)
                {
                    session.SendPacket(UserInterfaceHelper.GenerateRl(3));
                }
                else
                {
                    session.SendPacket(UserInterfaceHelper.GenerateRl(0));
                }
                break;

            case 1:
                if (session.Character.Group != null && session.Character.Group.GroupType != GroupType.Group &&
                    ServerManager.Instance.GroupList.All(s => s.GroupId != session.Character.Group.GroupId) &&
                    session.Character.Group.Raid?.InstanceBag?.Lock == false)
                {
                    ServerManager.Instance.GroupList.Add(session.Character.Group);
                    session.SendPacket(UserInterfaceHelper.GenerateRl(1));
                    session.SendPacket(
                        UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("RAID_REGISTERED")));
                    ServerManager.Instance.Broadcast(session,
                                                     $"qnaml 100 #rl {string.Format(Language.Instance.GetMessageFromKey("SEARCH_TEAM_MEMBERS"), session.Character.Name, session.Character.Group.Raid?.Label)}",
                                                     ReceiverType.AllExceptGroup);
                }

                break;

            case 2:
                if (session.Character.Group != null && session.Character.Group.GroupType != GroupType.Group &&
                    ServerManager.Instance.GroupList.Any(s =>
                                                         s.GroupId == session.Character.Group.GroupId))
                {
                    ServerManager.Instance.GroupList.Remove(session.Character.Group);
                    session.SendPacket(UserInterfaceHelper.GenerateRl(2));
                    session.SendPacket(
                        UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("RAID_UNREGISTERED")));
                }
                break;

            case 3:
                ClientSession cl = ServerManager.Instance.GetSessionByCharacterName(CharacterName);
                if (cl != null)
                {
                    cl.Character.GroupSentRequestCharacterIds.Add(session.Character.CharacterId);
                    GroupJoinPacket.HandlePacket(session, $"1 pjoin {GroupRequestType.Accepted} {cl.Character.CharacterId}");
                }
                break;
            }
        }
        private void ExecuteHandler(ClientSession session)
        {
            if (session.HasCurrentMapInstance)
            {
                Group grp;
                switch (Type)
                {
                // Join Raid
                case 1:
                    if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.RaidInstance)
                    {
                        return;
                    }

                    ClientSession target = ServerManager.Instance.GetSessionByCharacterId(CharacterId);
                    if (Parameter == null && target?.Character?.Group == null &&
                        session.Character.Group.IsLeader(session))
                    {
                        GroupJoinPacket.HandlePacket(session, $"1 pjoin {GroupRequestType.Invited} {CharacterId}");
                    }
                    else if (session.Character.Group == null)
                    {
                        GroupJoinPacket.HandlePacket(session, $"1 pjoin {GroupRequestType.Accepted} {CharacterId}");
                    }

                    break;

                // Leave Raid
                case 2:
                    ClientSession sender = ServerManager.Instance.GetSessionByCharacterId(CharacterId);
                    if (sender?.Character?.Group == null)
                    {
                        return;
                    }

                    session.SendPacket(
                        UserInterfaceHelper.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("LEFT_RAID")),
                                                        0));
                    if (session.CurrentMapInstance?.MapInstanceType == MapInstanceType.RaidInstance)
                    {
                        ServerManager.Instance.ChangeMap(session.Character.CharacterId, session.Character.MapId,
                                                         session.Character.MapX, session.Character.MapY);
                    }

                    grp = sender.Character?.Group;
                    session.SendPacket(session.Character.GenerateRaid(1, true));
                    session.SendPacket(session.Character.GenerateRaid(2, true));

                    grp.Characters.ForEach(s =>
                    {
                        s.SendPacket(grp.GenerateRdlst());
                        s.SendPacket(grp.GeneraterRaidmbf(s));
                        s.SendPacket(s.Character.GenerateRaid(0));
                    });
                    break;

                // Kick from Raid
                case 3:
                    if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.RaidInstance)
                    {
                        return;
                    }

                    if (session.Character.Group?.IsLeader(session) == true)
                    {
                        ClientSession chartokick = ServerManager.Instance.GetSessionByCharacterId(CharacterId);
                        if (chartokick.Character?.Group == null)
                        {
                            return;
                        }

                        chartokick.SendPacket(
                            UserInterfaceHelper.GenerateMsg(Language.Instance.GetMessageFromKey("KICK_RAID"), 0));
                        grp = chartokick.Character?.Group;
                        chartokick.SendPacket(chartokick.Character?.GenerateRaid(1, true));
                        chartokick.SendPacket(chartokick.Character?.GenerateRaid(2, true));
                        grp?.LeaveGroup(chartokick);
                        grp?.Characters.ForEach(s =>
                        {
                            s.SendPacket(grp.GenerateRdlst());
                            s.SendPacket(s.Character.GenerateRaid(0));
                        });
                    }

                    break;

                // Disolve Raid
                case 4:
                    if (session.CurrentMapInstance.MapInstanceType == MapInstanceType.RaidInstance)
                    {
                        return;
                    }

                    if (session.Character.Group?.IsLeader(session) == true)
                    {
                        grp = session.Character.Group;

                        ClientSession[] grpmembers = new ClientSession[40];
                        grp.Characters.CopyTo(grpmembers);
                        foreach (ClientSession targetSession in grpmembers)
                        {
                            if (targetSession != null)
                            {
                                targetSession.SendPacket(targetSession.Character.GenerateRaid(1, true));
                                targetSession.SendPacket(targetSession.Character.GenerateRaid(2, true));
                                targetSession.SendPacket(
                                    UserInterfaceHelper.GenerateMsg(
                                        Language.Instance.GetMessageFromKey("RAID_DISOLVED"), 0));
                                grp.LeaveGroup(targetSession);
                            }
                        }

                        ServerManager.Instance.GroupList.RemoveAll(s => s.GroupId == grp.GroupId);
                        ServerManager.Instance.GroupsThreadSafe.Remove(grp.GroupId);
                    }

                    break;
                }
            }
        }