Wapi
Wapi
* Skrip ini berisi fungsi WAPI yang harus dijalankan dalam konteks halaman web
*/
/**
* Penemuan otomatis referensi objek webpack dari instance yang berisi semua fungsi
yang digunakan oleh WAPI
* berfungsi dan membuat objek Store.
*/
jika (!window.Store) {
(fungsi () {
fungsi getStore(modul) {
biarkan foundCount = 0;
biarkan Obyek yang dibutuhkan = [
{ id: "Store", kondisi: (modul) => (module.default &&
module.default.Chat && module.default.Msg) ? module.default : null },
{ id: "MediaCollection", kondisi: (modul) => (module.default &&
module.default.prototype && module.default.prototype.processAttachments) ?
module.default : null },
{ id: "Proses Media", kondisi: (modul) => (modul.BLOB) ? modul :
null },
{ id: "Wap", kondisi: (modul) => (module.createGroup) ? modul :
null },
{ id: "ServiceWorker", kondisi: (module) => (module.default &&
module.default.killServiceWorker) ? modul : null },
{ id: "State", kondisi: (modul) => (module.STATE &&
module.STREAM) ? modul : null },
{ id: "WapDelete", kondisi: (module) =>
(module.sendConversationDelete && module.sendConversationDelete.length == 2) ?
modul : null },
{ id: "Conn", kondisi: (modul) => (module.default &&
module.default.ref && module.default.refTTL) ? module.default : null },
{ id: "WapQuery", kondisi: (modul) => (module.queryExist) ? modul :
((module.default && module.default.queryExist) ? module.default : null) },
{ id: "CryptoLib", kondisi: (modul) => (module.decryptE2EMedia) ?
modul : null },
{ id: "OpenChat", kondisi: (modul) => (module.default &&
module.default.prototype && module.default.prototype.openChat) ? module.default :
null },
{ id: "UserConstructor", kondisi: (module) => (module.default &&
module.default.prototype && module.default.prototype.isServer &&
module.default.prototype.isUser) ? module.default : null },
{ id: "SendTextMsgToChat", kondisi: (module) =>
(module.sendTextMsgToChat) ? module.sendTextMsgToChat : null },
{ id: "SendSeen", kondisi: (module) => (module.sendSeen) ?
module.sendSeen : null },
{ id: "sendDelete", kondisi: (module) => (module.sendDelete) ?
module.sendDelete : null }
];
untuk (biarkan idx dalam modul) {
if ((typeof modules[idx] === "objek") && (modules[idx] !== null)) {
needObjects.forEach((needObj) => {
jika (!needObj.kondisi || needObj.foundedModule)
kembali;
biarkan needModule = needObj.conditions(modules[idx]);
if (neededModule !== null) {
ditemukan Hitung++;
needObj.foundedModule = needModule;
}
});
if (foundCount == neededObjects.length) {
merusak;
}
}
}
jendela kembali.Store;
}
},
fungsi (o, e, t) {
biarkan modul = [];
untuk (biarkan idx di om) {
biarkan modul = o(idx);
modules.push(modul);
}
getStore(modul);
}
]);
}
})();
}
jendela.WAPI = {
lastRead: {}
};
kembalikan Object.assign(window.WAPI._serializeRawObj(obj), {
jenis : obj.jenis,
isGroup : obj.isGroup,
kontak : obj['kontak'] ? jendela.WAPI._serializeContactObj(obj['kontak']):
null,
groupMetadata: obj["groupMetadata"] ?
window.WAPI._serializeRawObj(obj["groupMetadata"]): null,
kehadiran : obj["kehadiran"] ?
window.WAPI._serializeRawObj(obj["kehadiran"]): null,
pesan: null
});
};
kembalikan Object.assign(window.WAPI._serializeRawObj(obj), {
formattedName : obj.formattedName,
isHighLevelVerified: obj.isHighLevelVerified,
isMe : obj.isMe,
isMyContact : obj.isMyContact,
isPSA : obj.isPSA,
isUser : obj.isUser,
isVerified : obj.isVerified,
isWAContact : obj.isWAContact,
profilePicThumbObj : obj.profilePicThumb ?
WAPI._serializeProfilePicThumb(obj.profilePicThumb): {},
statusMute : obj.statusMute,
pesan: null
});
};
kembalikan Object.assign(window.WAPI._serializeRawObj(obj), {
id : obj.id._serialized,
pengirim : obj["senderObj"] ? WAPI._serializeContactObj(obj["senderObj"]):
nol,
cap waktu : obj["t"],
isi : obj["tubuh"],
isGroupMsg : obj.isGroupMsg,
isLink : obj.isLink,
isMMS : obj.isMMS,
isMedia : obj.isMedia,
isNotification: obj.isNotification,
isPSA : obj.isPSA,
ketik : obj.tipe,
obrolan : WAPI._serializeChatObj(obj['chat']),
chatId : obj.id.remote,
dikutipMsgObj : WAPI._serializeMessageObj(obj['_quotedMsgObj']),
mediaData : window.WAPI._serializeRawObj(obj['mediaData'])
});
};
mengembalikan Object.assign({}, {
id : obj.jid,
status : obj.status,
isBusiness : (obj.biz === benar),
canReceiveMessage: (obj.status === 200)
});
};
mengembalikan Object.assign({}, {
eurl : obj.eurl,
id : obj.id,
img : obj.img,
imgFull: obj.imgFull,
mentah : obj.raw,
tag : obj.tag
});
}
/**
* Mengambil semua objek kontak dari toko, memfilternya
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar kontak
*/
window.WAPI.getMyContacts = fungsi (selesai) {
const kontak = window.Store.Contact.filter((kontak) => contact.isMyContact ===
true).map((kontak) => WAPI._serializeContactObj(kontak));
if (selesai !== undefined) selesai(kontak);
kontak kembali;
};
/**
* Mengambil objek kontak dari toko dengan ID
*
* @param id ID kontak
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {T|*} Objek kontak
*/
window.WAPI.getContact = function (id, selesai) {
const ditemukan = window.Store.Contact.get(id);
/**
* Mengambil semua objek obrolan dari toko
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar obrolan
*/
window.WAPI.getAllChats = fungsi (selesai) {
const obrolan = window.Store.Chat.map((obrolan) =>
WAPI._serializeChatObj(obrolan));
/**
* Mengambil semua ID obrolan dari toko
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar id obrolan
*/
window.WAPI.getAllChatIds = fungsi (selesai) {
const chatIds = window.Store.Chat.map((chat) => chat.id._serialized ||
chat.id);
/**
* Mengambil semua objek grup dari toko
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar obrolan
*/
window.WAPI.getAllGroups = fungsi (selesai) {
grup const = window.Store.Chat.filter((chat) => chat.isGroup);
/**
* Mengambil objek obrolan dari toko dengan ID
*
* @param id ID obrolan
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {T|*} Objek obrolan
*/
window.WAPI.getChat = fungsi (id, selesai) {
id = typeof id == "string" ? id : id._serialized;
const ditemukan = window.Store.Chat.get(id);
ditemukan.sendMessage = (ditemukan.sendMessage) ? found.sendMessage : function
() { return window.Store.sendMessage.apply(ini, argumen); };
if (selesai !== undefined) selesai(ditemukan);
kembali ditemukan;
}
msgWithImg.id.id = window.WAPI.getNewId();
msgWithImg.id.remote = chatId;
msgWithImg.t = Math.ceil(new Date().getTime() / 1000);
msgWithImg.to = chatId;
msgWithImg.collection.send(msgWithImg).lalu(fungsi (e) {
msgWithImg.caption = Keterangan lama;
});
kembali benar;
};
jendela.WAPI.getNewId = fungsi () {
var teks = "";
var mungkin = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
/**
* Saya mengembalikan semua pesan yang belum dibaca dari obrolan yang diminta dan
menandainya sebagai sudah dibaca.
*
* :param id: id obrolan
* :ketik id: string
*
* :param includeMe: menunjukkan apakah pesan pengguna harus disertakan
* :ketik includeMe: boolean
*
* :param includeNotifications: menunjukkan apakah notifikasi harus disertakan
* :type includeNotifications: boolean
*
* :param selesai: panggilan balik diteruskan oleh Selenium
* :ketik selesai: fungsi
*
* :returns: daftar pesan yang belum dibaca dari chat yang ditanyakan
* :rtype: objek
*/
window.WAPI.getUnreadMessagesInChat = function (id, includeMe,
includeNotifications, done) {
// dapatkan obrolan dan pesannya
biarkan obrolan = WAPI.getChat(id);
biarkan pesan = chat.msgs._models;
// cari pesan yang belum dibaca, yang terbaru ada di akhir array
for (biarkan i = pesan.panjang - 1; i >= 0; i--) {
// pesan sistem: lewati saja
if (i === "hapus") {
melanjutkan;
}
// dapatkan pesan
biarkan pesanObj = pesan[i];
/**
* Muat lebih banyak pesan di objek obrolan dari toko berdasarkan ID
*
* @param id ID obrolan
* @param selesai Fungsi callback opsional untuk eksekusi async
* @mengembalikan Tidak ada
*/
window.WAPI.loadEarlierMessages = fungsi (id, selesai) {
const ditemukan = WAPI.getChat(id);
if (selesai !== undefined) {
ditemukan.loadEarlierMsgs().then(fungsi () {
selesai()
});
} kalau tidak {
ditemukan.loadEarlierMsgs();
}
};
/**
* Muat lebih banyak pesan di objek obrolan dari toko berdasarkan ID
*
* @param id ID obrolan
* @param selesai Fungsi callback opsional untuk eksekusi async
* @mengembalikan Tidak ada
*/
window.WAPI.loadAllEarlierMessages = fungsi (id, selesai) {
const ditemukan = WAPI.getChat(id);
x = fungsi () {
if (!found.msgs.msgLoadState.noEarlierMsgs) {
found.loadEarlierMsgs().then(x);
} lain jika (selesai) {
selesai();
}
};
x();
};
/**
* Muat lebih banyak pesan di objek obrolan dari toko berdasarkan ID hingga tanggal
tertentu
*
* @param id ID obrolan
* @param lastMessage stempel waktu UTC dari pesan terakhir yang akan dimuat
* @param selesai Fungsi callback opsional untuk eksekusi async
* @mengembalikan Tidak ada
*/
/**
* Mengambil semua objek metadata grup dari toko
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar metadata grup
*/
window.WAPI.getAllGroupMetadata = fungsi (selesai) {
const groupData = window.Store.GroupMetadata.map((groupData) => groupData.all);
/**
* Mengambil objek metadata grup dari penyimpanan berdasarkan ID
*
* @param id ID grup
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {T|*} Objek metadata grup
*/
window.WAPI.getGroupMetadata = fungsi async (id, selesai) {
biarkan output = window.Store.GroupMetadata.get(id);
};
/**
* Mengambil peserta grup
*
* @param id ID grup
* @returns {Janji.<*>} Menghasilkan metadata grup
* @pribadi
*/
window.WAPI._getGroupParticipants = fungsi async (id) {
const metadata = menunggu WAPI.getGroupMetadata(id);
mengembalikan metadata.peserta;
};
/**
* Mengambil ID peserta grup
*
* @param id ID grup
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Janji.<Array|*>} Menghasilkan daftar ID
*/
window.WAPI.getGroupParticipantIDs = fungsi async (id, selesai) {
output const = (menunggu WAPI._getGroupParticipants(id))
.map((peserta) => peserta.id);
/**
* Mendapat objek yang mewakili pengguna yang masuk
*
* @returns {Array|*|$q.all}
*/
window.WAPI.getMe = fungsi (selesai) {
const rawMe = window.Store.Contact.get(window.Store.Conn.me);
var percobaan = 0;
pemeriksaan fungsi() {
for (biarkan i = chat.msgs.models.length - 1; i >= 0; i--) {
biarkan msg = chat.msgs.models[i];
firstChat = Store.Chat.models[0];
var originalID = firstChat.id;
firstChat.id = typeof originalID === "string" ? id : jendela
baru.Store.UserConstructor(id, { sengajaUsePrivateConstructor: true });
if (selesai !== undefined) {
firstChat.sendMessage(pesan).lalu(fungsi () {
firstChat.id = ID asli;
selesai(benar);
});
kembali benar;
} kalau tidak {
firstChat.sendMessage(pesan);
firstChat.id = ID asli;
kembali benar;
}
}
if (selesai !== undefined) selesai(false);
kembali salah;
}
var percobaan = 0;
pemeriksaan fungsi() {
for (biarkan i = chat.msgs.models.length - 1; i >= 0; i--) {
biarkan msg = chat.msgs.models[i];
function isChatMessage(pesan) {
jika (message.isSentByMe) {
kembali salah;
}
if (message.isNotification) {
kembali salah;
}
if (!message.isUserCreatedType) {
kembali salah;
}
kembali benar;
}
messageGroup.messages = [];
if (messageGroup.messages.length > 0) {
keluaran.push(messageGroup);
} else { // tidak ada pesan dengan isNewMsg benar
jika (use_unread_count) {
biarkan n = messageGroupObj.unreadCount; // akan menggunakan
atribut unreadCount untuk mengambil n pesan terakhir dari pengirim
for (biarkan i = pesan.panjang - 1; i >= 0; i--) {
biarkan pesanObj = pesan[i];
jika (n > 0) {
if (!messageObj.isSentByMe) {
biarkan pesan = WAPI.processMessageObj(messageObj,
includeMe, includeNotifications);
messageGroup.messages.unshift(message);
n -= 1;
}
} else if (n === -1) { // obrolan ditandai sebagai belum dibaca
sehingga akan mengambil pesan terakhir sebagai belum dibaca
if (!messageObj.isSentByMe) {
biarkan pesan = WAPI.processMessageObj(messageObj,
includeMe, includeNotifications);
messageGroup.messages.unshift(message);
merusak;
}
} else { // unreadCount = 0
merusak;
}
}
if (messageGroup.messages.length > 0) {
messageGroupObj.unreadCount = 0; // setel ulang penghitung yang
belum dibaca
keluaran.push(messageGroup);
}
}
}
}
if (selesai !== undefined) {
selesai (keluaran);
}
kembali keluaran;
};
};
grup = window.WAPI.getAllGroups();
xhr.onload = fungsi () {
jika (xhr.readyState == 4) {
if (xhr.status == 200) {
biarkan pembaca = new FileReader();
reader.readAsDataURL(xhr.response);
pembaca.onload = fungsi (e) {
selesai(reader.result.substr(reader.result.indexOf(',') + 1))
};
} kalau tidak {
console.error(xhr.statusText);
}
} kalau tidak {
console.log(err);
selesai (salah);
}
};
xhr.onload = fungsi () {
jika (xhr.readyState == 4) {
if (xhr.status == 200) {
biarkan pembaca = new FileReader();
reader.readAsDataURL(xhr.response);
pembaca.onload = fungsi (e) {
selesai(reader.result.substr(reader.result.indexOf(',') + 1))
};
} kalau tidak {
console.error(xhr.statusText);
}
} kalau tidak {
console.log(err);
selesai (salah);
}
};
if (! percakapan) {
if (selesai !== undefined) {
selesai (salah);
}
kembali salah;
}
kembali benar;
};
jika(!percakapan) {
if(selesai !== undefined) {
selesai (salah);
}
kembali salah;
}
if (!Array.isArray(messageArray)) {
PesanArray = [PesanArray];
}
biarkan pesanToDelete = messageArray.map(msgId => window.Store.Msg.get(msgId));
jika (cabut) {
percakapan.sendRevokeMsgs(messagesToDelete, percakapan);
} kalau tidak {
percakapan.sendDeleteMsgs(messagesToDelete, percakapan);
}
kembali benar;
};
kembali benar;
};
/**
* Pesan baru fungsi yang dapat diamati.
*/
window.WAPI._newMessagesQueue = [];
window.WAPI._newMessagesBuffer = (sessionStorage.getItem('saved_msgs') != null) ?
JSON.parse(sessionStorage.getItem('saved_msgs')) : [];
window.WAPI._newMessagesDebouncer = null;
window.WAPI._newMessagesCallbacks = [];
jendela.Store.Msg.off('tambahkan');
sessionStorage.removeItem('saved_msgs');
window.WAPI._newMessagesDebouncer = null;
window.WAPI._newMessagesQueue = [];
jendela.WAPI._newMessagesCallbacks.forEach(fungsi (callbackObj) {
if (callbackObj.callback !== undefined) {
callbackObj.callback(queuedMessages);
}
jika (callbackObj.rmAfterUse === benar) {
hapusCallbacks.push(callbackObj);
}
});
/**
* Mendaftarkan panggilan balik untuk dipanggil saat pesan baru tiba di WAPI.
* @param rmCallbackAfterUse - Boolean - Tentukan apakah callback hanya perlu
dijalankan sekali
* @param selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan baru
tiba.
* @returns {boolean}
*/
window.WAPI.waitNewMessages = fungsi (rmCallbackAfterUse = true, selesai) {
window.WAPI._newMessagesCallbacks.push({ callback: selesai, rmAfterUse:
rmCallbackAfterUse });
kembali benar;
};
/**
* Membaca pesan baru buffered.
* @param selesai - fungsi - Fungsi panggilan balik untuk dipanggil berisi pesan
buffer.
* @returns {Array}
*/
window.WAPI.getBufferedNewMessages = fungsi (selesai) {
biarkan bufferedMessages = window.WAPI._newMessagesBuffer;
window.WAPI._newMessagesBuffer = [];
if (selesai !== undefined) {
selesai(bufferedMessages);
}
kembali pesan buffered;
};
/** Mengakhiri pesan baru fungsi yang dapat diamati **/
window.WAPI.sendImage = function (imgBase64, chatid, nama file, caption, selesai) {
//var idUser = jendela baru.Store.UserConstructor(chatid);
var idUser = jendela baru.Store.UserConstructor(chatid,
{ sengajaUsePrivateConstructor: true });
// buat obrolan baru
return Store.Chat.find(idUser).then((chat) => {
var mediaBlob = window.WAPI.base64ImageToFile(imgBase64, namafile);
var mc = Store.MediaCollection(obrolan);
mc.processAttachments([{file: mediaBlob}, 1], obrolan, 1).then(() => {
var media = mc.model[0];
media.sendToChat(obrolan, { keterangan: keterangan });
if (selesai !== undefined) selesai(benar);
});
});
}
sementara (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
/**
* Kirim kartu kontak ke obrolan tertentu menggunakan id obrolan
*
* @param {string} ke '000000000000@c.us'
* @param {string|array} kontak '111111111111@c.us' | ['222222222222@c.us',
'333333333333@c.us, ... 'nnnnnnnnnnnn@c.us']
*/
window.WAPI.sendContact = fungsi (untuk, kontak) {
if (!Array.isArray(kontak)) {
kontak = [kontak];
}
kontak = kontak.peta((c) => {
return WAPI.getChat(c).__x_contact;
});
/**
* Buat ID obrolan berdasarkan yang dikloning
*
* @param {string} chatId '000000000000@c.us'
*/
window.WAPI.getNewMessageId = function (chatId) {
var newMsgId = Store.Msg.models[0].__x_id.clone();
newMsgId.fromMe = true;
newMsgId.id = WAPI.getNewId().toUpperCase();
newMsgId.remote = chatId;
newMsgId._serialized = `${newMsgId.fromMe}_${newMsgId.remote}_${newMsgId.id}`
return newMsgId;
};
/**
* Kirim VCard Khusus tanpa perlu kontak menjadi Kontak Whatsapp
*
* @param {string} chatId '000000000000@c.us'
* @param {objek|array} vcard { displayName: 'Nama Kontak', vcard: 'BEGIN:VCARD\
nVERSION:3.0\nN:;Nama Kontak;;;\nEND:VCARD' } | [{ displayName: 'Nama Kontak 1',
vcard: 'BEGIN:VCARD\nVERSI:3.0\nN:;Nama Kontak 1;;;\nEND:VCARD' }, { displayName:
'Nama Kontak 2', vcard: 'BEGIN :VCARD\nVERSION:3.0\nN:;Nama Kontak 2;;;\nEND:VCARD'
}]
*/
window.WAPI.sendVCard = function (chatId, vcard) {
var obrolan = Store.Chat.get(chatId);
var tempMsg = Object.create(Store.Msg.models.filter(msg => msg.__x_isSentByMe)
[0]);
var newId = window.WAPI.getNewMessageId(chatId);
var memperpanjang = {
ack : 0,
id : id baru,
lokal : !0,
diri : "keluar",
t : parseInt(new Date().getTime() / 1000),
ke : chatId,
isNewMsg: !0,
};
if (Array.isArray(vcard)) {
Objek.menetapkan(memperpanjang, {
ketik : "multi_vcard",
vcardList: vcard
});
hapus perpanjangan.tubuh;
} kalau tidak {
Objek.menetapkan(memperpanjang, {
ketik : "vcard",
subtipe: vcard.displayName,
body : vcard.vcard
});
hapus extend.vcardList;
}
Object.assign(tempMsg, perpanjang);
obrolan.addAndSendMsg(tempMsg);
};
/**
* Blokir kontak
* @param {string} id '000000000000@c.us'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
window.WAPI.contactBlock = fungsi (id, selesai) {
kontak const = window.Store.Contact.get(id);
if (kontak !== undefined) {
kontak.setBlock(!0);
selesai(benar);
kembali benar;
}
selesai (salah);
kembali salah;
}
/**
* buka Blokir kontak
* @param {string} id '000000000000@c.us'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
window.WAPI.contactUnblock = fungsi (id, selesai) {
kontak const = window.Store.Contact.get(id);
if (kontak !== undefined) {
kontak.setBlock(!1);
selesai(benar);
kembali benar;
}
selesai (salah);
kembali salah;
}
/**
* Hapus peserta Grup
* @param {*} idGroup '0000000000-00000000@g.us'
* @param {*} idParticipant '000000000000@c.us'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
window.WAPI.removeParticipantGroup = function (idGroup, idParticipant, selesai) {
window.Store.WapQuery.removeParticipants(idGroup, [idParticipant]).then(() => {
const metaDataGroup = window.Store.GroupMetadata.get(id)
checkParticipant = metaDataGroup.participants._index[idParticipant];
if (checkParticipant === undefined) {
selesai(benar); kembali benar;
}
})
}
/**
* Promosikan Peserta menjadi Admin di Grup
* @param {*} idGroup '0000000000-00000000@g.us'
* @param {*} idParticipant '000000000000@c.us'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
window.WAPI.promoteParticipantAdminGroup = function (idGroup, idParticipant,
selesai) {
window.Store.WapQuery.promoteParticipants(idGroup, [idParticipant]).then(() =>
{
const metaDataGroup = window.Store.GroupMetadata.get(id)
checkParticipant = metaDataGroup.participants._index[idParticipant];
if (checkParticipant !== undefined && checkParticipant.isAdmin) {
selesai(benar); kembali benar;
}
selesai (salah); kembali salah;
})
}
/**
* Turunkan Admin Grup
* @param {*} idGroup '0000000000-00000000@g.us'
* @param {*} idParticipant '000000000000@c.us'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
window.WAPI.demoteParticipantAdminGroup = function (idGroup, idParticipant,
selesai) {
window.Store.WapQuery.demoteParticipants(idGroup, [idParticipant]).then(() => {
const metaDataGroup = window.Store.GroupMetadata.get(id)
if (metaDataGroup === tidak terdefinisi) {
selesai (salah); kembali salah;
}
checkParticipant = metaDataGroup.participants._index[idParticipant];
if (checkParticipant !== undefined && checkParticipant.isAdmin) {
selesai (salah); kembali salah;
}
selesai(benar); kembali benar;
})
}