NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name WhatsApp Blast
// @description Tools yang digunakan untuk mengirim pesan WhatsApp Secara Otomatis.
// @copyright 2018, rzlnhd (https://github.com/rzlnhd/)
// @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @icon https://wab.anggunsetya.com/files/assets/icon.png
// @homepageURL https://wab.anggunsetya.com/
// @supportURL https://wab.anggunsetya.com/
// @version 3.6.4
// @date 2021-5-24
// @author Rizal Nurhidayat
// @match https://web.whatsapp.com/
// @grant GM_getResourceText
// @grant GM_xmlhttpRequest
// @grant GM_deleteValue
// @grant GM_setValue
// @grant GM_getValue
// @grant GM.getResourceText
// @grant GM.xmlhttpRequest
// @grant GM.deleteValue
// @grant GM.setValue
// @grant GM.getValue
// @connect wab.anggunsetya.com
// @updateURL https://wab.anggunsetya.com/files/update.meta.js
// @downloadURL https://wab.anggunsetya.com/files/install.user.js
// @resource pnl https://wab.anggunsetya.com/files/assets/view.html
// @resource clr https://wab.anggunsetya.com/files/assets/colors.json
// @resource css https://wab.anggunsetya.com/files/assets/style.min.css
// ==/UserScript==
// ==OpenUserJS==
// @author rzlnhd
// ==/OpenUserJS==
/* jshint esversion: 6 */
/**=====================================
Declaring Class Object
=====================================*/
/** Users Class */
class Users {
constructor() {
this.user = null; this.url = "https://wab.anggunsetya.com/user/api/";
this.setUser();
}
getUphone() {
return getElm("header img") ? (getElm("header img").src.split("&")[2].match(/\d+/).join('')) : 0;
}
setUser(u = this.getUser()) {
if (u) {
let e = u.reg ? new Date(u.reg) : null,
exp = u.expires ? new Date(u.expires) : null;
if(e) {e.setMonth(e.getMonth() + Number(u.mon))};
this.user = {
"name": u.name || '', "phone": u.phone,
"attempt": u.attempt ? Number(u.attempt) : 0,
"expires": exp ? exp.getTime() : null,
"end": e ? e.getTime() : null
};
} else { this.user = null; }
this.saveUser(this.user);
}
getUser() {return JSON.parse(getVal('user', null))}
saveUser(user = this.user) {
setVal('user', JSON.stringify(user));
}
getingData(add = {}, loop = true){
let url = this.url, data = Object.assign({ phone: this.getUphone(), version: version }, add);
xmlReq({
method: "POST", url: url,
headers: { 'Content-Type': 'application/json' }, data: JSON.stringify(data),
ontimeout: rto => { users.errRes(rto, "rto", loop) },
onerror: err => { users.errRes(err, "err", loop) },
onload: res => { users.xhrRes(res, loop) },
});
}
errRes(data, type, loop){
let msg = type == "rto" ? 'Request Time Out' : 'Request Error';
console.log(msg, data.status);
if(loop) setTimeout(users.getingData, 10000);
}
xhrRes(data, loop){
let usr = JSON.parse(data.responseText); users.setUser(usr || null);
if (loop && (!users.user && !(users.isPremium() || users.isTrial()))) setTimeout(users.getingData, 20000);
}
push(type = "add"){
let attempt = Number(this.user.attempt), tDy = new Date(),
arr = { attempt: attempt += 1, action: type };
if(type == "add"){
let expires = tDy.setDate(tDy.getDate() + 2), end = new Date(expires).toLocaleString();
arr = { expires: end, action: type}; this.user.expires = expires;
} else {
this.user.attempt = attempt;
}
this.saveUser(); this.getingData(arr, false);
}
isPremium(){
return this.user ? (new Date()).getTime() <= this.user.end : false;
}
isTrial() {
return this.user && this.user.expires ? (this.user.attempt < 5 && (new Date()).getTime() <= this.user.expires) : false;
}
trialPrompt(e) {
if(!this.user.expires){
return !e ? (confirm("Apakah Anda mau mencoba 2 hari Trial?") ? (this.push(), true) : false) : e;
}
return e;
}
getAlrt(i, on = false) {
let user = this.user, msg = [
"Halo kak " + setName(user.name, 1) + "!"
+ "\nSelamat menggunakan fitur Pengguna Premium."
+ "\nMasa aktif Kakak berakhir hari " + dateFormat(user.end) + " ya...",
"Saat ini Anda sedang menggunakan versi Trial."
+ "\nAnda dapat menggunakan fitur premium sebanyak " + (5 - user.attempt) + " kali lagi,"
+ "\nAtau masa Trial Anda berakhir hari " + dateFormat(user.expires) + " ya...",
"Saat ini Anda sedang menggunakan versi Trial."
+ "\nAnda masih dapat menggunakan fitur premium sebanyak " + (5 - user.attempt) + " kali lagi.",
"Masa Trial Anda sudah berakhir."
+ "\nSilahkan berlanganan untuk menggunakan fitur premium kembali."
];
alrt = alrt || on ? (alert(msg[i]), false) : alrt;
}
}
/** Option Class */
class Options {
constructor(){
this.default = {
'wabColor':'var(--butterbar-connection-background)', 'wabTbp':100, 'maxQueue':100,
'wabDate':'auto', 'wabCaption':'caption', 'wabOpn':true, 'wabTab':0};
this.options = {};
};
load(opt){
let inp = getElmAll(".inp input[type='range']"), slc = getElmAll(".inp select");
this.options = opt ? Object.assign(this.default, JSON.parse(opt)) : this.default;
this.colorList(); this.fillList();
inp.forEach(e => {
let val = e.value, out = e.parentElement.querySelector('output');
out.innerText = val; e.addEventListener("input", this.sliderVal);
});
slc.forEach(e => {e.addEventListener("change", this.selectVal)});
getById('wabPanel').style.backgroundColor = this.options.wabColor;
setVal('options', JSON.stringify(this.options));
console.log('Options loaded Successfully');
}
setOpt(key, val){
this.options[key] = val; setVal('options', JSON.stringify(this.options));
}
sliderVal(e) {
let val = e.currentTarget.value, id = e.currentTarget.id,
out = (e.currentTarget.parentElement).querySelector('output');
out.innerText = val; options.setOpt(id, Number(val));
}
selectVal(e) {
let val = e.currentTarget.value, id = e.currentTarget.id;
switch(id){
case 'wabColor' : getById('wabPanel').style.backgroundColor = val; break;
case 'wabDate' : options.optDate(val); break;
case 'wabCaption' : options.optCapt(val); break;
}
options.setOpt(id, val);
}
optDate(val){
if(val != 'auto'){
val = Number(val);
isFormat = (val == 2);
mIdx_ = val != 2 ? val : null;
} else {
isFormat = false;
if(queue.size != 0 || getById('getFile').value != ''){
getById('getFile').value = ''; queue.reset(); updateUI();
alert(
"Untuk opsi Deteksi Tanggal Otomatis, Silahkan masukkan ulang file penerima pesan."
);
}
}
}
optCapt(val){
let e = getById('capt'), c = val != 'caption';
e.disabled = c; e.readOnly = c;
e.title = c ? 'Caption menggunakan pesan' : '';
}
fillList(){
Object.entries(this.options).forEach(e => {
const [key, val] = e, elm = getById(key); if(elm) elm.value = val;
});
}
colorList(){
let bg = getElm('select#wabColor'), colors = JSON.parse(getRes('clr')).colors;
colors.forEach(e => {
let opt = document.createElement('option');
opt.value = e.key; opt.text = e.val;
bg.appendChild(opt);
});
}
}
/** Queue Class By Kate Morley - http://code.iamkate.com/ */
class Queue {
constructor() {
this.queue = []; this.res = []; this.offset = 0;
}
set data(data) {this.queue = data; this.res = data;};
get now() {return (this.queue.length > 0 ? this.queue[this.offset] : undefined);};
get size() {return (this.queue.length - this.offset);};
run() {
if (this.queue.length == 0) return undefined;
let item = this.queue[this.offset];
if (++ this.offset * 2 >= this.queue.length) {
this.queue = this.queue.slice(this.offset); this.offset = 0;
}
updateUI(); return item;
};
reset() {this.queue = []; this.res = []; runL = 0; this.offset = 0;};
reload() {this.queue = this.res; this.offset = 0; updateUI();};
}
/** Declaring Message Class */
class Message {
constructor() {
this.kons = ''; this.name = ""; this.phone = ""; this.bp = "";
this.date = ""; this.msg = ""; this.invs = ""; this.other = [];
}
setMsg(msgs, args) {
if(isNaN(args[0])) args.unshift('');
[this.kons, this.name, this.phone, this.bp, this.date, this.invs, ...this.other] = args;
this.msg = msgs ? this.subtitute(msgs) : '';
}
get encodedMsg() {
return encodeURIComponent(this.msg).replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29");
}
get link() {
let absLink = "api.whatsapp.com/send?phone=", txt;
txt = this.msg ? "&text=" + this.encodedMsg : '';
return absLink + setPhone(this.phone) + txt;
}
setMessage(msg, col, val, size) {
let opt = options.options, i = col, rgx, kBp, tBp = opt.wabTbp;
for(i; i < (size > 3 ? 3 : size); i++){
if (i == 2 && val.length > 3 && !datePattern.test(val)) msg = msg.replace(/F_INVS/g, setName(val, 1)).replace(/INVS/g, setName(val));
if (i == 1 && datePattern.test(val)) msg = msg.replace(/L_DAY/g, this.lastDay(val)).replace(/S_DAY/g, this.lastDay(val, 1));
if (i == 0 && val.length <= 3) {
kBp = tBp - Number(val); kBp = (kBp < 0) ? 0 : kBp;
msg = msg.replace(/P_BP/g, val + " BP").replace(/K_BP/g, kBp + " BP");
};
}
msg = col > 2 ? (rgx = new RegExp('DATA_'+ (col - 2), 'g'), msg.replace(rgx, val)) : msg;
return msg;
}
subtitute(str){
let col = [this.bp, this.date, this.invs, ...this.other];
str = str.replace(/F_NAMA/g, setName(this.name, 1)).replace(/NAMA/g, setName(this.name));
str = this.kons != '' ? str.replace(/NO_KONS/g, this.kons) : str;
col.forEach((e, i) => {str = e ? this.setMessage(str, i, e, col.length) : str});
return str;
}
lastDay(dateStr, i = 0) {
let str = (!isFormat && (mIdx != mIdx_)) ?
(arrMove(dateStr.split("/"), mIdx_, mIdx).join("/")) : dateStr, d = new Date(str);
if(i == 0){d.setDate(d.getDate() + 30);}
return dateFormat(d, i);
}
sendImg(imgFile, caption, done = undefined) {
return window.Store.Chat.find(setPhone(this.phone) + "@c.us").then(chat => {
let mc = new window.Store.MediaCollection(chat);
mc.processAttachments([{ file: imgFile }, 1], chat, 1).then(() => {
let media = mc.models[0];
media.sendToChat(chat, { caption: this.subtitute(caption) });
if (done !== undefined) done(true);
});
});
};
}
/** Declaring Report Class */
class Report {
constructor() {
this.sukses = 0; this.gagal = 0; this.error = 0;
this.a_gagal = []; this.a_error = []; this.auto = false;
}
reset(a) {
this.sukses = 0; this.gagal = 0; this.error = 0;
this.a_gagal = []; this.a_error = []; this.auto = a;
};
createData(arr) {
let size = arr.length, str = "", i = 0;
for (i; i < size; i++) {
str = (i === 0) ? (" (") : str;
str += (i != (size - 1)) ? (arr[i] + ", ")
: (arr[i] + ")");
}
return str;
}
success() {this.sukses++;}
fail(i, err) {i--; (err == 1) ? this.a_error[this.error++] = i : this.a_gagal[this.gagal++] = i;}
showReport() {
runL = !queue.now ? (getById('getFile').value = '', queue.reset(), 0) : runL;
alert(
this.auto ? "[REPORT] Kirim Pesan Otomatis Selesai."
+ "\n • SUKSES = " + this.sukses
+ "\n • GAGAL = " + this.gagal + this.createData(this.a_gagal)
+ "\n • ERROR = " + this.error + this.createData(this.a_error)
: "[REPORT] Penulisan Link Selesai. " + this.sukses + " Link Berhasil Ditulis"
);
if (this.auto && !users.isPremium()) {users.getAlrt(!users.isTrial() ? (getById("auto").click(), 3) : 2, true);}
}
}
/** Interval Class */
class Interval {
constructor() {
this.timer = false; this.time = ""; this.fn = "";
}
get isRunning() {return this.timer !== false;};
loop(t, fn) {this.time = t; this.fn = fn;};
start() {
if (!this.isRunning) {
this.timer = setInterval(this.fn, this.time); setStatus(true);
}
};
break(){
clearInterval(this.timer); this.timer = false; setStatus(false);
}
stop(report) {
this.break(); this.time = ""; this.fn = ""; report.showReport();
};
}
/**=====================================
Initial Function
=====================================*/
/** Global Minify Function */
const getElmAll = q => {return document.querySelectorAll(q);},
getById = q => {return document.getElementById(q);},
getElm = q => {return document.querySelector(q);},
xmlReq = ("function" == typeof GM_xmlhttpRequest) ? GM_xmlhttpRequest : GM.xmlhttpRequest,
getRes = ("function" == typeof GM_getResourceText) ? GM_getResourceText : GM.getResourceText,
delVal = ("function" == typeof GM_deleteValue) ? GM_deleteValue : GM.deleteValue,
getVal = ("function" == typeof GM_getValue) ? GM_getValue : GM.getValue,
setVal = ("function" == typeof GM_setValue) ? GM_setValue : GM.setValue;
/** Global Variables */
const version = "v3.6.4", upDate = "24 Mei 2021", qACR = "._2GVnY", qSend = "#main span[data-icon='send']",
qInp = "#main div[contenteditable='true']", datePattern = /\d{1,4}[\/|-|:]\d{1,2}[\/|-|:]\d{2,4}/, options = new Options(),
queue = new Queue(), mesej = new Message(), doBlast = new Interval(), report = new Report(), users = new Users();
/** Global Reuseable Variable */
var imgFile, code, pinned, user, mIdx_, runL = 0, mIdx = 0, isFormat = false, doing = false, alrt = true, spliter = /,/;
/** First Function */
console.log("WhatsApp Blast " + version + " - Waiting for WhatsApp to load...");
var timer = setInterval(general, 1000);
function general(){
if (getElm("div.two")){
let head = getElmAll("header"); if(head.length < 2){
let pnl = getById("side"), itm = getElm("header"), e = itm.cloneNode(true), opt = getVal('options', null);
loadModule(); initComponents(e); pnl.insertBefore(e, pnl.childNodes[1]); options.load(opt); initListener();
console.log("WhatsApp Blast " + version + " - Blast Your Follow Up NOW!");
}
users.getingData(); clearInterval(timer);
}
}
/** Load WAPI Module for Send Message & Image */
function loadModule(){
function getStore(modules) {
const storeObjects = [
{ id: "Store", conditions: (module) => (module.default && module.default.Chat && module.default.Msg) ? module.default : null},
{ id: "MediaCollection", conditions: (module) => (module.default && module.default.prototype && module.default.prototype.processAttachments) ? module.default : null }
];
let foundCount = 0;
for (let idx in modules) {
if ((typeof modules[idx] === "object") && (modules[idx] !== null)) {
storeObjects.forEach((needObj) => {
if (!needObj.conditions || needObj.foundedModule) return;
let neededModule = needObj.conditions(modules[idx]);
if (neededModule !== null) { foundCount++; needObj.foundedModule = neededModule;
}
});
if (foundCount == storeObjects.length) {break;}
}
}
let neededStore = storeObjects.find((needObj) => needObj.id === "Store");
window.Store = neededStore.foundedModule ? neededStore.foundedModule : {};
storeObjects.splice(storeObjects.indexOf(neededStore), 1);
storeObjects.forEach((needObj) => {
if (needObj.foundedModule) {window.Store[needObj.id] = needObj.foundedModule;}
});
return window.Store;
}
const parasite = `parasite${Date.now()}`;
if (typeof webpackChunkbuild !== 'function') {
webpackChunkbuild.push([[parasite], {}, function (o, e, t) {
let modules = [];
for (let idx in o.m) { modules.push(o(idx)); }
getStore(modules);
}]);
console.log('WAPI Module loaded Successfully');
} else { console.log('Failed to load WAPI Module!') }
}
/** Load UI Component */
function initComponents(e){
let pnl = getRes("pnl").replace(/VERSION/g, version), style = getRes('css');
e.style.zIndex = 0; e.style.display = "block"; e.style["justify-content"] = "flex-start";
e.style["background-color"] = 'var(--butterbar-connection-background)'; e.style.height = "auto";
e.style.padding = "0px"; e.id = 'wabPanel'; e.innerHTML = pnl; addStyle(style);
console.log('Components loaded Successfully');
}
/** Set All Component Listeners */
function initListener(){
let clk = [{ "id": "blast", "fn": blast }, { "id": "del", "fn": prevImg }, { "id": "changeLog", "fn": changeLog }],
tab = getElmAll("#wbBody .tablinks"), chk = getElmAll("input.premium"), opt = options.options;
clk.forEach(e => { getById(e.id).addEventListener("click", e.fn); });
chk.forEach(e => { e.addEventListener("click", getPremium); });
tab.forEach(e => { e.addEventListener("click", openMenu); });
getById("toggleApp").addEventListener("click", toggleApp);
getById("getFile").addEventListener("change", prevDat);
getById("getImg").addEventListener("change", prevImg);
getById("s_mg").addEventListener("click", checking);
tab[opt.wabTab].click(); if (opt.wabOpn) getById("toggleApp").click();
console.log('EventListener setted Successfully');
}
/**=====================================
Main Function
=====================================*/
/** Main Blast! Function */
function blast(){
if (doBlast.isRunning){if(confirm("Stop WhatsApp Blast?")){doBlast.stop(report);} return;}
if (runL !== 0 && !!queue.now){
if (!confirm("Lanjutkan Blast dari data ke-" + (runL + 1) + "?")){
if (confirm("Blast ulang dari awal?")){queue.reload(); runL = 0;} else{return;}
}
}
let obj = getById("message").value, auto = getById("auto").checked, c_img = getById("s_mg").checked, opt = options.options,
capt = getById("capt").value, l = runL, b = queue.size + l, no = l + 1, time = 10, clm = [], lg, ig, ch, psn, err, snd, btn;
if (!obj){alert("Silahkan Masukkan Pesan terlebih dahulu..."); return;}
if (b === 0){alert("Silahkan Masukkan File Penerima Pesan..."); return;}
if (!getElm(qInp)){alert("Silahkan Pilih Chatroom Terlebih dahulu"); return;}
if (auto){
code = getCode(); pinned = getPinned(); time = 6000;
if (!code){alert("Chatroom Tidak Memiliki Foto Profil!"); return;}
if (!pinned){alert("Chatroom Belum di PIN!"); return;}
if (queue.size > opt.maxQueue){alert("Blast Auto tidak boleh lebih dari "+opt.maxQueue+" Nomor!"); return;}
if (opt.wabCaption != 'caption'){capt = obj; obj = '';}
if (users.isTrial()) {users.push('update');}
}
report.reset(auto);
console.log("Blast!: Ignite Engine");
function execute() {
if (!doBlast.isRunning){doBlast.start();}
if (auto && getCode() != code) {
doBlast.break(); back(code); setTimeout(execute, 50);
} else if (doBlast.isRunning && !!queue.now){
clm = queue.run().split(spliter); mesej.setMsg(obj, clm); lg = "Link ke-" + no;
dispatch(getElm(qInp), (no + "). " + mesej.link));
getElm(qSend).click();
if (auto){
console.log(lg + ": [TULIS]");
setTimeout(() => {
ch = getElmAll("#main div.message-out");
while (getRM(ch)){getRM(ch).click();}
ch[ch.length-1].querySelector('a').click();
console.log(lg + ": [EKSEKUSI]");
}, 500);
setTimeout(() => {
err = getElm(".overlay div[role='button']");
snd = err ? (
psn = (err.innerText.includes("OK")) ? (report.fail(no, 1), "ERROR"
) : (report.fail(no, 0), "GAGAL"), err.click(), false
) : (
(btn = obj ? getElm(qSend).click() : ''), ig = (c_img && imgFile) ? (
mesej.sendImg(imgFile, capt), true
) : false, report.success(), psn = "SUKSES", true
);
console.log(lg + ": [EKSEKUSI " + psn + "]", snd);
if (ig){console.log(lg + ": [GAMBAR SUKSES DIKIRIM]");}
}, 4000);
setTimeout(back, 5000, code);
} else{report.success();}
showProgress(no, b); no++; l++; runL = l;
} else{
doBlast.stop(report);
}
}
doBlast.loop(time, execute); execute();
}
/** Create The Real Data */
function loadData(arr){
let data = [], dt = [], i = 0, j = 0, opt = options.options, s;
spliter = arr[0].includes(';') ? /;/ : /,/;
arr.forEach(e => {
if (e && break_f(e)) {
data[i] = e; i++; s = getSgDate(e); if(s) {dt[j] = s; j++};
}
});
mIdx_ = opt.wabDate != 'auto' ? opt.wabDate : dt.length > 0 ? mPos(dt) : mIdx;
isFormat = (opt.wabDate == 2);
return data;
}
/** Get Sign Up Date Data */
function getSgDate(d) {
if (datePattern.exec(d)){
return datePattern.exec(d).toString();
}
return null;
}
/** Break When Name is Empty */
function break_f(e){return !!e.split(spliter)[0];}
/** Set Name of the Recipient */
function setName(nama, opt = 0){
let fname = nama.split(' '), new_name = titleCase(fname[0]), i;
if (opt != 0){
for (i = 1; i < fname.length; i++){
new_name += " " + titleCase(fname[i]);
}
}
return new_name;
}
/** Title Case Text Transform */
function titleCase(str){str = str.toLowerCase(); return str.charAt(0).toUpperCase() + str.slice(1);}
/** Set the Recipient's Phone Number */
function setPhone(ph){
ph = ph.match(/\d+/g).join('');
return (!ph || ph.charAt(0) === "6") ? ph
: (ph.charAt(0) === "0") ? "62" + ph.substr(1)
: "62" + ph;
}
/**=====================================
Utilities Function
=====================================*/
/** Setting "BLAST" Status */
function addStyle(styles) {
var css = document.createElement("style");
css.type = "text/css";css.id = "wab-style";
css.appendChild(document.createTextNode(styles));
getElm("head").appendChild(css);
}
/** Setting "BLAST" Status */
function setStatus(stat){
let path = getById("blast"), ico = getById("blastIc"), side = getById("pane-side"),
stopIc = "M505.16405,19.29688c-1.176-5.4629-6.98736-11.26563-12.45106-12.4336C460.61647,0,435.46433,0,410.41962,0,307.2013,0,245.30155,55.20312,199.09162,128H94.88878c-16.29733,0-35.599,11.92383-42.88913,26.49805L2.57831,253.29688A28.39645,28.39645,0,0,0,.06231,264a24.008,24.008,0,0,0,24.00353,24H128.01866a96.00682,96.00682,0,0,1,96.01414,96V488a24.008,24.008,0,0,0,24.00353,24,28.54751,28.54751,0,0,0,10.7047-2.51562l98.747-49.40626c14.56074-7.28515,26.4746-26.56445,26.4746-42.84374V312.79688c72.58882-46.3125,128.01886-108.40626,128.01886-211.09376C512.07522,76.55273,512.07522,51.40234,505.16405,19.29688ZM384.05637,168a40,40,0,1,1,40.00589-40A40.02,40.02,0,0,1,384.05637,168ZM35.68474,352.06641C9.82742,377.91992-2.94985,442.59375.57606,511.41016c69.11565,3.55859,133.61147-9.35157,159.36527-35.10547,40.28913-40.2793,42.8774-93.98633,6.31147-130.54883C129.68687,309.19727,75.97,311.78516,35.68474,352.06641Zm81.63312,84.03125c-8.58525,8.584-30.08256,12.88672-53.11915,11.69922-1.174-22.93555,3.08444-44.49219,11.70289-53.10938,13.42776-13.42578,31.33079-14.28906,43.51813-2.10352C131.60707,404.77148,130.74562,422.67188,117.31786,436.09766Z",
blastIc = "M505.12019,19.09375c-1.18945-5.53125-6.65819-11-12.207-12.1875C460.716,0,435.507,0,410.40747,0,307.17523,0,245.26909,55.20312,199.05238,128H94.83772c-16.34763.01562-35.55658,11.875-42.88664,26.48438L2.51562,253.29688A28.4,28.4,0,0,0,0,264a24.00867,24.00867,0,0,0,24.00582,24H127.81618l-22.47457,22.46875c-11.36521,11.36133-12.99607,32.25781,0,45.25L156.24582,406.625c11.15623,11.1875,32.15619,13.15625,45.27726,0l22.47457-22.46875V488a24.00867,24.00867,0,0,0,24.00581,24,28.55934,28.55934,0,0,0,10.707-2.51562l98.72834-49.39063c14.62888-7.29687,26.50776-26.5,26.50776-42.85937V312.79688c72.59753-46.3125,128.03493-108.40626,128.03493-211.09376C512.07526,76.5,512.07526,51.29688,505.12019,19.09375ZM384.04033,168A40,40,0,1,1,424.05,128,40.02322,40.02322,0,0,1,384.04033,168Z";
side.style.overflowY = (stat ? (ico.setAttribute("d", stopIc), path.setAttribute("title", "STOP!"), console.log("Blasting..."), 'hidden')
: (ico.setAttribute("d", blastIc), path.setAttribute("title", "BLAST!"), console.log("Stoped."), 'auto'));
doing = stat;
}
/** Update UI */
function updateUI(){
let ok = getById("fileOk"), eNum = getById("numbDat"), num = queue.size, t = ("Data: Loaded, " + num + " Nomor");
ok.style.display = !num ? (queue.reset(), t = "", "none") : "inline-block";
ok.title = t; eNum.innerText = num;
}
/** Show Progress Bar */
function showProgress(p = .5, t = 100){
let eBar = getById("waBar"), w = (p / t) * 100;
if(w > 1) eBar.setAttribute("title", p + '/' + t);
eBar.style.width = w + '%';
}
/** Formating Date Data */
function dateFormat(e, i = 0) {
let opt = {year: 'numeric', month: 'long', day: 'numeric' };
opt.weekday = i == 0 ? 'long' : undefined; e = new Date(e);
return e.toLocaleDateString('id-ID', opt);
}
/** Moving Array Elements */
function arrMove(arr, oIdx, nIdx){
if (nIdx >= arr.length){
let k = nIdx - arr.length + 1;
while (k--){arr.push(undefined);}
}
arr.splice(nIdx, 0, arr.splice(oIdx, 1)[0]);
return arr;
}
/** Getting Month Index */
function mPos(d){
let i, x, y, bb = 1, cc = 1, formatted = /\d{4}[\/|-|:]\d{1,2}[\/|-|:]\d{1,2}/;
if(formatted.test(d[0])){
isFormat = formatted.test(d[0]); return 2;
} else {
for (i = 0; i < d.length; i++){
let [a, b] = d[i].split(/\/|:|-/);
if (i === 0){x = a; y = b;}
if (Number(a) > 12){return 1;}
else if (Number(b) > 12){return 0;}
else{
bb += (a == x) ? 1 : 0;
cc += (b == y) ? 1 : 0;
}
}
return (bb < cc) ? 1 : 0
};
}
/** Back to the First Chatroom */
function back(a){
let elm = getElm("#pane-side img[src='" + a + "']");
eventFire(elm, "mousedown");
}
/** EventFire Function */
function eventFire(node, eventType){
let clickEvent = document.createEvent("MouseEvents");
clickEvent.initMouseEvent(eventType, true, false);
node.dispatchEvent(clickEvent);
}
/** Dispatch Function */
function dispatch(input, message){
let evt = new InputEvent("input", {bubbles : true, composer : true});
input.innerHTML = message; input.dispatchEvent(evt);
}
/** Getting code from Selected Chatroom */
function getCode(){let elm = getElm("div" + qACR + " img"); return elm ? elm.src : elm;}
/** Getting Pinned Status from Selected Chatroom*/
function getPinned(){return !!getElm("div" + qACR + " span[data-icon='pinned']");}
/** Get Read More Button */
function getRM(e){return e[e.length - 1].querySelector("span[role='button']");}
/**=====================================
Listener Function Handler
=====================================*/
/** Preview the Selected Image File */
function prevImg(e){
let output = getById("o_img"), btn = e.currentTarget.getAttributeNode("data-value"), b,
res = null, del = getById("del"), mByte = Math.pow(1024, 2), maxSize = 4 * mByte;
b = btn ? (getById(btn.value).value = '', true) : (
res = e.currentTarget.files[0],
imgFile = (res.size <= maxSize) ? res : (
alert("Ukuran gambar tidak boleh lebih dari 4MB"),
e.currentTarget.value = '', res = null, null
), false
);
del.style.display = res ? (output.src = URL.createObjectURL(res), "block")
: (output.removeAttribute("src"), "none");
}
/** Preview and Load Data */
function prevDat(e){
let reader = new FileReader(); queue.reset(); updateUI(); showProgress();
reader.onload = f => {
let lines = f.currentTarget.result.split(/\r\n|\r|\n/), d = loadData(lines); queue.data = d;
console.log("Blast!: Data Loaded,", !!queue.now, queue.size); updateUI(); showProgress();
};
reader.readAsText(e.currentTarget.files[0]);
}
/** Listeners for Checkbox */
function checking(e){
let form = getById(e.currentTarget.value), opt = options.options,
attr = e.currentTarget.getAttributeNode("capt-id");
getById(attr.value).disabled = opt.wabCaption == 'caption' ? !e.currentTarget.checked : true;
form.disabled = !e.currentTarget.checked;
}
/** Toggle Apps Listener */
function toggleApp(e){
let butn = e.currentTarget, id = butn.getAttribute("value"),
acdBody = getById(id), a = butn.classList.toggle("active");
acdBody.style.height = acdBody.style.height ? null : acdBody.scrollHeight + "px";
options.setOpt("wabOpn", a);
}
/** Tabview Event Listeners */
function openMenu(e){
let elm = e.currentTarget, tablinks = getElmAll("#wbBody .tablinks"),
menuName = elm.value, no, tabcontent = getElmAll("#wbBody .tabcontent");
tabcontent.forEach(i => {i.style.display = 'none';});
tablinks.forEach((e, i) => {e.className = e.className.replace(" active", ""); if(elm == e) no = i;});
getById(menuName).style.display = "block"; elm.className += " active"; options.setOpt('wabTab', no);
}
/** Show Change Log */
function changeLog(){
let cLog = "WhatsApp Blast " + version + " (Last Update: " + upDate + ").";
cLog += "\n▫ Perbaikan logic alert."
+ "\n▫ Pesan mendukung karakter kurung '()'."
+ "\n▫ Perubahan aturan pada Mode Trial."
+ "\n▫ Migrasi file aplikasi beserta asetnya."
+ "\n\nVersion v3.6.3 (5 Mei 2021)."
+ "\n▫ Meningkatkan algoritma pemrosesan kata kunci pesan."
+ "\n▫ Refactoring code."
+ "\n▫ Bug Fixing."
+ "\n\nVersion v3.6.2 (21 April 2021)."
+ "\n▫ Meningkatkan algoritma pembacaan data Sign Up Date."
+ "\n\nVersion v3.6.1 (27 Maret 2021)."
+ "\n▫ Meningkatkan algoritma fungsi utama."
+ "\n▫ Mengubah perlakuan pada fungsi keamanan."
+ "\n\nVersion v3.6.0 (21 Maret 2021)."
+ "\n▫ Update panel: 1.2.01 (Menambah panel pengaturan)."
+ "\n▫ Opsi ubah warna panel."
+ "\n▫ Opsi target BP dipindah ke panel pengaturan."
+ "\n▫ Opsi ubah format tanggal."
+ "\n▫ Opsi penerima pesan sampai 200 nomor."
+ "\n▫ Menghapus kata kunci BC (tidak diperlukan lagi)."
+ "\n▫ Dukungan untuk format CSV diperluas.";
alert(cLog);
}
/**=====================================
For Credits Purpose
=====================================*/
/** Get Premium User */
function getPremium(e){
let at = getById("auto").checked, ig = getById("s_mg").checked, id = e.currentTarget.id;
if (e.currentTarget.checked){
e.currentTarget.checked = users.isPremium() ? (users.getAlrt(0), true) : (
(users.trialPrompt(users.isTrial())) ? (users.getAlrt(1), true) : (
alert("Maaf, fitur ini hanya untuk Pengguna Premium."
+ "\nTampaknya Anda belum terdaftar sebagai Pengguna Premium,"
+ "\nAtau masa berlangganan Anda mungkin telah habis."
+ "\n\nInformasi lebih lanjut, silahkan hubungi saya."
), alrt = true, false)
);
if (id == "s_mg")if(!at){getById("auto").checked = e.currentTarget.checked;}
}
if (id == "auto"){if(ig){getById("s_mg").click();}}
}