{"id":1116,"date":"2025-10-24T01:49:45","date_gmt":"2025-10-24T01:49:45","guid":{"rendered":"https:\/\/abatablaster.xyz\/?page_id=1116"},"modified":"2025-11-14T20:35:11","modified_gmt":"2025-11-14T20:35:11","slug":"auto-join-group","status":"publish","type":"page","link":"https:\/\/abatablaster.xyz\/index.php\/auto-join-group\/","title":{"rendered":"Auto Join\/Leave Group"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"ms\">\n\n<head>\n    <meta charset=\"UTF-8\" \/>\n    <title>Auto Join Group \u2013 AbataBlaster<\/title>\n    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" \/>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/sweetalert2@11\"><\/script>\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/xlsx@0.18.5\/dist\/xlsx.full.min.js\"><\/script>\n\n    <style>\n        \/* ============ Base ============ *\/\n        :root {\n            --green: #2e7d32;\n            --green-2: #226624;\n            --green-3: #215e2e;\n            --bg: #eef9f0;\n            --muted: #668d6b;\n            --card: #fcfffb;\n            --border: #cbe8d6;\n            --border-2: #e0e0e0;\n            --shadow: 0 4px 24px rgba(54, 196, 124, .07), 0 2px 10px rgba(0, 0, 0, .05);\n        }\n\n        * {\n            box-sizing: border-box\n        }\n\n        body {\n            background: var(--bg);\n            font-family: system-ui, 'Segoe UI Emoji', 'Noto Color Emoji', sans-serif;\n            margin: 0;\n            padding: 0;\n        }\n\n        h3 {\n            color: var(--green);\n            text-align: center;\n            margin: 8px 0 14px;\n        }\n\n        \/* ============ Forms & Layout ============ *\/\n        .form-label {\n            font-weight: 600;\n            margin-top: 14px;\n            display: block;\n            color: var(--green-2);\n        }\n\n        .form-input,\n        select,\n        textarea {\n            width: 100%;\n            padding: 9px 12px;\n            margin: 6px 0 8px 0;\n            border: 1.2px solid var(--border);\n            border-radius: 7px;\n            background: #f9fff5;\n            font-size: 16px;\n            font-family: inherit;\n        }\n\n        textarea {\n            min-height: 110px;\n            min-width: 220px;\n            \/* elak terlalu kecil *\/\n            resize: both;\n            \/* boleh kiri-kanan & atas-bawah *\/\n            overflow: auto;\n            max-width: 100%;\n        }\n\n        .row {\n            display: flex;\n            gap: 10px;\n            flex-wrap: wrap;\n            align-items: center;\n        }\n\n        .row>* {\n            flex: 1 1 220px;\n        }\n\n        \/* auto pecah baris bila sempit *\/\n\n        .muted {\n            color: var(--muted);\n            font-size: 13px;\n        }\n\n        .card {\n            border: 1px solid var(--border-2);\n            border-radius: 10px;\n            padding: 12px;\n            background: var(--card);\n        }\n\n        .stack>* {\n            margin-top: 10px;\n        }\n\n        \/* ============ Buttons ============ *\/\n        .btn {\n            background: var(--green);\n            color: #fff;\n            padding: 10px 16px;\n            border: none;\n            border-radius: 7px;\n            cursor: pointer;\n            font-size: 15px;\n            font-weight: 600;\n            margin-top: 6px;\n            transition: .15s;\n            box-shadow: 0 1.5px 4px rgba(54, 196, 124, .11);\n            display: inline-block;\n        }\n\n        .btn:hover,\n        .btn:focus {\n            background: #185734;\n        }\n\n        .btn.blue {\n            background: #1565c0;\n        }\n\n        .btn.gray {\n            background: #bdbdbd;\n            color: #333;\n        }\n\n        .btn.outline {\n            background: #fff;\n            color: var(--green);\n            border: 1px solid var(--green);\n        }\n\n        \/* ============ Logs ============ *\/\n        pre.log {\n            background: #0d232c;\n            color: #d7ffe5;\n            border-radius: 8px;\n            padding: 12px;\n            overflow: auto;\n            max-height: 360px;\n            font-size: 13px;\n            line-height: 1.45;\n        }\n\n        \/* Badge *\/\n        code.badge {\n            background: #e8f5e9;\n            color: var(--green-2);\n            border: 1px solid var(--border);\n            border-radius: 999px;\n            padding: 2px 7px;\n            font-size: 12px;\n        }\n\n        \/* ============ Numbers Grid ============ *\/\n        .gridNumbers {\n            display: grid;\n            gap: 12px;\n            grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n            \/* muat banyak pada telefon *\/\n        }\n\n        .numCard {\n            border: 1.5px dashed #cfe9da;\n            background: #f6fff8;\n            border-radius: 12px;\n            padding: 10px 12px;\n            display: flex;\n            align-items: center;\n            gap: 10px;\n            cursor: pointer;\n            transition: box-shadow .15s, background .15s, border-color .15s;\n            font-size: 14px;\n            line-height: 1.25;\n        }\n\n        .numCard:hover {\n            box-shadow: 0 2px 8px rgba(0, 0, 0, .06);\n            background: #f3fff7;\n        }\n\n        .numCard input[type=\"checkbox\"] {\n            transform: scale(1.05);\n        }\n\n        .numTitle {\n            display: flex;\n            flex-direction: column;\n        }\n\n        .numName {\n            font-weight: 600;\n            color: var(--green-3);\n        }\n\n        .numMeta {\n            color: #5b8a66;\n            font-size: 12px;\n        }\n\n        \/* status dot *\/\n        .dot {\n            width: 9px;\n            height: 9px;\n            border-radius: 50%;\n            display: inline-block;\n            margin-right: 6px;\n        }\n\n        .dot.green {\n            background: #15b34a;\n            box-shadow: 0 0 0 2px #e7f7ee inset;\n        }\n\n        .dot.red {\n            background: #e53935;\n            box-shadow: 0 0 0 2px #fde9e8 inset;\n        }\n\n        \/* Leave table hover *\/\n        #leaveGroupTable label:hover {\n            background: #f6fff8;\n        }\n\n        \/* ============ Responsive ============ *\/\n        @media (max-width:480px) {\n            .row>* {\n                flex-basis: 100%;\n            }\n\n            \/* telefon: satu lajur penuh *\/\n        }\n\n        @media (max-width:600px) {\n            #wrap {\n                padding: 10px 8px 18px;\n            }\n\n            h3 {\n                font-size: 18px;\n            }\n\n            .form-input,\n            select,\n            textarea {\n                font-size: 15px;\n            }\n\n            .btn {\n                width: 100%;\n            }\n\n            \/* butang penuh lebar *\/\n            pre.log {\n                max-height: 46vh;\n            }\n\n            \/* log tidak dominan di skrin kecil *\/\n            .numCard {\n                padding: 8px 10px;\n                font-size: 13px;\n            }\n\n            .numMeta {\n                font-size: 11px;\n            }\n        }\n\n        @media (min-width:640px) {\n\n            \/* tablet kecil \/ phone besar *\/\n            .gridNumbers {\n                grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n            }\n        }\n\n        @media (min-width:900px) {\n\n            \/* 3 select lebih seimbang bila lebar *\/\n            .row>div[style*=\"min-width:180px\"] {\n                flex: 1 1 0;\n            }\n        }\n\n        @media (min-width:1024px) {\n\n            \/* desktop *\/\n            .gridNumbers {\n                grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n            }\n        }\n\n        @media (min-width:1200px) {\n\n            \/* desktop besar *\/\n            pre.log {\n                max-height: 520px;\n            }\n        }\n\n        \/* elak gegaran bila scrollbar muncul\/hilang *\/\n        html {\n            scrollbar-gutter: stable both-edges;\n        }\n\n        html,\n        body {\n            overflow-x: hidden;\n        }\n\n        \/* Kontena utama \u2014 sentiasa center & melebar ikut skrin *\/\n        #wrap {\n            max-width: 1600px;\n            \/* ubah ikut selera *\/\n            width: min(96vw, 1600px);\n            \/* hampir penuh di desktop *\/\n            margin: clamp(12px, 4vw, 32px) auto;\n            padding: clamp(14px, 2.5vw, 28px);\n            background: #fff;\n            border-radius: 14px;\n            box-shadow: var(--shadow);\n        }\n\n        \/* optional \u2013 hanya jika CMS menghadkan lebar *\/\n        .container,\n        .site-content,\n        .entry-content,\n        .wp-block-group__inner-container {\n            max-width: 100% !important;\n        }\n\n        \/* Buang padding\/gutter parent di telefon *\/\n        @media (max-width: 640px) {\n            :where(.container, .site-content, .entry-content, .wp-block-group__inner-container) {\n                padding-left: 0 !important;\n                padding-right: 0 !important;\n            }\n\n            \/* Paksa kotak putih center & selebar viewport *\/\n            #wrap {\n                width: 100svw;\n                \/* elak kira scrollbar *\/\n                margin-left: calc(50% - 50svw);\n                margin-right: calc(50% - 50svw);\n                \/* optional: kalau nak ada ruang sisi sikit, guna padding-inline *\/\n                padding-inline: 12px;\n            }\n        }\n\n        \/* Fallback untuk browser lama yang tak sokong svw *\/\n        @supports not (width: 100svw) {\n            @media (max-width: 640px) {\n                #wrap {\n                    width: 100vw;\n                    margin-left: calc(50% - 50vw);\n                    margin-right: calc(50% - 50vw);\n                    padding-inline: 12px;\n                }\n            }\n        }\n\n        .actions-center {\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            gap: 10px;\n            flex-wrap: wrap;\n        }\n\n        .actions-center .muted {\n            width: 100%;\n            text-align: center;\n        }\n\n        \/* Seksyen Leave Group *\/\n        .leave {\n            margin-top: 18px;\n        }\n\n        .leave-controls {\n            display: flex;\n            gap: 12px;\n            justify-content: center;\n            align-items: flex-end;\n            flex-wrap: wrap;\n        }\n\n        .leave-controls .field {\n            min-width: 220px;\n            flex: 0 1 320px;\n        }\n\n        .leave-groups {\n            max-width: 820px;\n            margin: 12px auto;\n        }\n\n        .leave-actions {\n            margin-top: 10px;\n        }\n\n        \/* Butang besar dan center *\/\n        .btn.large {\n            padding: 12px 22px;\n            font-size: 16px;\n        }\n\n        .leave-actions .btn {\n            width: min(100%, 640px);\n        }\n\n        .leave-actions,\n        .leave-tip {\n            display: flex;\n            justify-content: center;\n        }\n\n        .leave-tip {\n            margin-top: 6px;\n        }\n    <\/style>\n\n    <!-- Firebase SDK (Compat seperti reference) -->\n    <script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.22.2\/firebase-app-compat.js\"><\/script>\n    <script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.22.2\/firebase-auth-compat.js\"><\/script>\n    <script src=\"https:\/\/www.gstatic.com\/firebasejs\/9.22.2\/firebase-firestore-compat.js\"><\/script>\n<\/head>\n\n<body>\n    <div id=\"wrap\" class=\"stack\">\n        <div style=\"text-align:center;margin-bottom:10px;\">\n            <img decoding=\"async\" src=\"https:\/\/abatablaster.xyz\/wp-content\/uploads\/2025\/05\/photo_2024-05-16_15-47-59.jpg\" alt=\"Logo\"\n                style=\"max-height:86px;border-radius:14px;\">\n        <\/div>\n        <h3>\ud83e\udd1d Auto Join Group (WhatsApp)<\/h3>\n\n        <!-- PILIH NOMBOR -->\n        <label class=\"form-label\">\ud83d\udcf1 Pilih Nombor WhatsApp:<\/label>\n\n        <!-- SOLO: dropdown (1 nombor sahaja) -->\n        <div id=\"wrapSolo\">\n            <select id=\"numberSolo\" class=\"form-input\">\n                <option value=\"\">(memuatkan\u2026)<\/option>\n            <\/select>\n            <div class=\"muted\">Mode <code class=\"badge\">solo<\/code> menggunakan satu nombor sahaja.<\/div>\n        <\/div>\n\n        <!-- GILIR\/PARALLEL: senarai dengan checkbox (grid, tak perlu scroll) -->\n        <div id=\"wrapMulti\" style=\"display:none\">\n            <div id=\"numbersChecklist\" class=\"gridNumbers\"><\/div>\n            <div class=\"muted\">Mode <code class=\"badge\">gilir \/ parallel<\/code> membenarkan pilih banyak nombor.\n            <\/div>\n        <\/div>\n\n        <!-- SETTING MODE -->\n        <div class=\"row\">\n            <div style=\"flex:1;min-width:180px\">\n                <label class=\"form-label\">\u2699\ufe0f Mode<\/label>\n                <select id=\"mode\" class=\"form-input\">\n                    <option value=\"solo\">solo \u2014 1 bot join semua link<\/option>\n                    <option value=\"gilir\" selected>gilir \u2014 bot bergilir ikut link<\/option>\n                    <option value=\"parallel\">parallel \u2014 semua bot join serentak (bergelombang)<\/option>\n                <\/select>\n            <\/div>\n            <div style=\"flex:1;min-width:180px\">\n                <label class=\"form-label\">\ud83e\udded Mapping<\/label>\n                <select id=\"mapping\" class=\"form-input\">\n                    <option value=\"same\" selected>same \u2014 semua nombor untuk group yang sama<\/option>\n                    <option value=\"distribute\">distribute \u2014 agih link ke nombor (subset berbeza)<\/option>\n                <\/select>\n            <\/div>\n            <div style=\"flex:1;min-width:180px\">\n                <label class=\"form-label\">\u23f1\ufe0f Speed<\/label>\n                <select id=\"speed\" class=\"form-input\">\n                    <option value=\"safe\" selected>safe (disaran)<\/option>\n                    <option value=\"normal\">normal<\/option>\n                    <option value=\"fast\">fast (untuk test ringkas)<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <!-- INPUT LINK -->\n        <label class=\"form-label\">\n            \ud83d\udd17 Invite Link Group (1 link setiap baris):\n            <span id=\"linkCount\" class=\"muted\" style=\"margin-left:4px;\">(0 link)<\/span>\n        <\/label>\n        <textarea id=\"links\" class=\"form-input\" placeholder=\"cth:\n            https:\/\/chat.whatsapp.com\/AAAAA11111\n            https:\/\/chat.whatsapp.com\/BBBBB22222\"><\/textarea>\n\n        <!-- UPLOAD FILE (CSV \/ Excel) -->\n        <div class=\"row\" style=\"margin-top:4px;\">\n            <div style=\"flex:1;min-width:220px\">\n                <label class=\"form-label\">\ud83d\udcc2 Muat naik fail link (CSV \/ Excel)<\/label>\n                <input type=\"file\" id=\"fileLinks\" class=\"form-input\" accept=\".csv,.xlsx,.xls\" \/>\n                <div class=\"muted\">\n                    Gunakan fail yang dimuat turun dari <b>Group Finder<\/b>.<br>\n                    Sistem akan auto ambil kolum <code>link<\/code> dan gabungkan dengan senarai sedia ada.\n                <\/div>\n            <\/div>\n            <div style=\"flex:0 0 auto;\">\n                <button type=\"button\" id=\"btnLoadFile\" class=\"btn gray\">\n                    \ud83d\udce5 Import Link dari Fail\n                <\/button>\n            <\/div>\n        <\/div>\n\n        <!-- TINDAKAN -->\n        <div class=\"actions-center\">\n            <button id=\"btnJoin\" class=\"btn blue\">\ud83d\ude80 Auto-Join Sekarang<\/button>\n            <span id=\"hintJoin\" class=\"muted\"><\/span>\n            <code id=\"statusPill\" class=\"badge\">IDLE<\/code> <!-- \u2795 pill status -->\n        <\/div>\n\n        <!-- LOG -->\n        <div class=\"card\">\n            <div class=\"row\" style=\"justify-content:space-between;align-items:center\">\n                <strong>Hasil &#038; Log<\/strong>\n                <div>\n                    <button id=\"btnClearLog\" class=\"btn gray\">Clear Log<\/button>\n                <\/div>\n            <\/div>\n            <pre id=\"log\" class=\"log\">\u2014 tiada log lagi \u2014<\/pre>\n        <\/div>\n\n        <!-- LEAVE GROUP -->\n        <h3 style=\"margin-top:18px;\">\ud83d\udeaa Leave Group (Undo)<\/h3>\n\n        <div class=\"leave\">\n            <!-- TOP: pilih nombor + extract -->\n            <div class=\"leave-controls\">\n                <div class=\"field\">\n                    <label class=\"form-label\">\ud83d\udcf1 Nombor (yang nak keluar)<\/label>\n                    <select id=\"leavePhone\" class=\"form-input\">\n                        <option value=\"\">&#8212; pilih &#8212;<\/option>\n                    <\/select>\n                <\/div>\n                <button id=\"btnExtractGroups\" class=\"btn gray\">\ud83d\udce5 Extract Group<\/button>\n            <\/div>\n\n            <!-- MIDDLE: senarai group ditemui (center) -->\n            <div id=\"leaveGroupList\" class=\"card leave-groups\" style=\"display:none\">\n                <div class=\"row\" style=\"justify-content:space-between;align-items:center\">\n                    <strong>Group ditemui<\/strong>\n                    <div>\n                        <button id=\"btnSelectAllGroups\" class=\"btn gray\" type=\"button\">Pilih Semua<\/button>\n                    <\/div>\n                <\/div>\n                <div id=\"leaveGroupTable\" style=\"margin-top:8px\"><\/div>\n            <\/div>\n\n            <!-- BOTTOM: butang Leave (center) -->\n            <div class=\"leave-actions actions-center\">\n                <button id=\"btnLeave\" class=\"btn outline large\">\ud83e\uddf9 Leave Selected<\/button>\n            <\/div>\n            <div class=\"leave-tip\">\n                <span class=\"muted\">Tick group di senarai &#038; tekan Leave Selected.<\/span>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <script src=\"\/js\/auto-join-group.js\"><\/script>\n<\/body>\n\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Auto Join Group \u2013 AbataBlaster \ud83e\udd1d Auto Join Group (WhatsApp) \ud83d\udcf1 Pilih Nombor WhatsApp: (memuatkan\u2026) Mode solo menggunakan satu nombor sahaja. Mode gilir \/ parallel membenarkan pilih banyak nombor. \u2699\ufe0f Mode solo \u2014 1 bot join semua linkgilir \u2014 bot bergilir ikut linkparallel \u2014 semua bot join serentak (bergelombang) \ud83e\udded Mapping same \u2014 semua nombor [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1116","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/pages\/1116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/comments?post=1116"}],"version-history":[{"count":22,"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/pages\/1116\/revisions"}],"predecessor-version":[{"id":1193,"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/pages\/1116\/revisions\/1193"}],"wp:attachment":[{"href":"https:\/\/abatablaster.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=1116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}