Last active
April 20, 2020 07:47
-
-
Save agungsp2000/b75bdcb493cd5e8b5569475f330b380e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(() => { | |
// | |
// GLOBAL VARS AND CONFIGS | |
// | |
var lastMessageOnChat = false; | |
var ignoreLastMsg = {}; | |
var elementConfig = { | |
"chats": [0, 0, 5, 2, 0, 3, 0, 0, 0], | |
"chat_icons": [0, 0, 1, 1, 1, 0], | |
"chat_title": [0, 0, 1, 0, 0, 0, 0], | |
"chat_lastmsg": [0, 0, 1, 1, 0, 0], | |
"chat_active": [0, 0], | |
"selected_title": [0, 0, 5, 3, 0, 1, 1, 0, 0, 0, 0] | |
}; | |
const jokeList = [ | |
` | |
Suami dan istri. | |
`, | |
` | |
Makan dan Minum. | |
` | |
] | |
// | |
// FUNCTIONS | |
// | |
// Get random value between a range | |
function rand(high, low = 0) { | |
return Math.floor(Math.random() * (high - low + 1) + low); | |
} | |
function getElement(id, parent){ | |
if (!elementConfig[id]){ | |
return false; | |
} | |
var elem = !parent ? document.body : parent; | |
var elementArr = elementConfig[id]; | |
elementArr.forEach(function(pos) { | |
if (!elem.childNodes[pos]){ | |
return false; | |
} | |
elem = elem.childNodes[pos]; | |
}); | |
return elem; | |
} | |
function getLastMsg(){ | |
var messages = document.querySelectorAll('.msg'); | |
var pos = messages.length-1; | |
while (messages[pos] && (messages[pos].classList.contains('msg-system') || messages[pos].querySelector('.message-in'))){ | |
pos--; | |
if (pos <= -1){ | |
return false; | |
} | |
} | |
if (messages[pos] && messages[pos].querySelector('.selectable-text')){ | |
return messages[pos].querySelector('.selectable-text').innerText.trim(); | |
} else { | |
return false; | |
} | |
} | |
function getUnreadChats(){ | |
var unreadchats = []; | |
var chats = getElement("chats"); | |
if (chats){ | |
chats = chats.childNodes; | |
for (var i in chats){ | |
if (!(chats[i] instanceof Element)){ | |
continue; | |
} | |
var icons = getElement("chat_icons", chats[i]).childNodes; | |
if (!icons){ | |
continue; | |
} | |
for (var j in icons){ | |
if (icons[j] instanceof Element){ | |
if (!(icons[j].childNodes[0].getAttribute('data-icon') == 'muted' || icons[j].childNodes[0].getAttribute('data-icon') == 'pinned')){ | |
unreadchats.push(chats[i]); | |
break; | |
} | |
} | |
} | |
} | |
} | |
return unreadchats; | |
} | |
function didYouSendLastMsg(){ | |
var messages = document.querySelectorAll('.msg'); | |
if (messages.length <= 0){ | |
return false; | |
} | |
var pos = messages.length-1; | |
while (messages[pos] && messages[pos].classList.contains('msg-system')){ | |
pos--; | |
if (pos <= -1){ | |
return -1; | |
} | |
} | |
if (messages[pos].querySelector('.message-out')){ | |
return true; | |
} | |
return false; | |
} | |
// Call the main function again | |
const goAgain = (fn, sec) => { | |
// const chat = document.querySelector('div.chat:not(.unread)') | |
// selectChat(chat) | |
setTimeout(fn, sec * 1000) | |
} | |
// Dispath an event (of click, por instance) | |
const eventFire = (el, etype) => { | |
var evt = document.createEvent("MouseEvents"); | |
evt.initMouseEvent(etype, true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null); | |
el.dispatchEvent(evt); | |
} | |
// Select a chat to show the main box | |
const selectChat = (chat, cb) => { | |
const title = getElement("chat_title",chat).title; | |
eventFire(chat.firstChild.firstChild, 'mousedown'); | |
if (!cb) return; | |
const loopFewTimes = () => { | |
setTimeout(() => { | |
const titleMain = getElement("selected_title").title; | |
if (titleMain !== undefined && titleMain != title){ | |
console.log('not yet'); | |
return loopFewTimes(); | |
} | |
return cb(); | |
}, 300); | |
} | |
loopFewTimes(); | |
} | |
// Send a message | |
const sendMessage = (chat, message, cb) => { | |
//avoid duplicate sending | |
var title; | |
if (chat){ | |
title = getElement("chat_title",chat).title; | |
} else { | |
title = getElement("selected_title").title; | |
} | |
ignoreLastMsg[title] = message; | |
messageBox = document.querySelectorAll("[contenteditable='true']")[1]; | |
//add text into input field | |
messageBox.innerHTML = message.replace(/ /gm,''); | |
//Force refresh | |
event = document.createEvent("UIEvents"); | |
event.initUIEvent("input", true, true, window, 1); | |
messageBox.dispatchEvent(event); | |
//Click at Send Button | |
eventFire(document.querySelector('span[data-icon="send"]'), 'click'); | |
cb(); | |
} | |
// | |
// MAIN LOGIC | |
// | |
const start = (_chats, cnt = 0) => { | |
// get next unread chat | |
const chats = _chats || getUnreadChats(); | |
const chat = chats[cnt]; | |
var processLastMsgOnChat = false; | |
var lastMsg; | |
if (!lastMessageOnChat){ | |
if (false === (lastMessageOnChat = getLastMsg())){ | |
lastMessageOnChat = true; //to prevent the first "if" to go true everytime | |
} else { | |
lastMsg = lastMessageOnChat; | |
} | |
} else if (lastMessageOnChat != getLastMsg() && getLastMsg() !== false && !didYouSendLastMsg()){ | |
lastMessageOnChat = lastMsg = getLastMsg(); | |
processLastMsgOnChat = true; | |
} | |
if (!processLastMsgOnChat && (chats.length == 0 || !chat)) { | |
//console.log(new Date(), 'nothing to do now... (1)', chats.length, chat); | |
return goAgain(start, 3); | |
} | |
// get infos | |
var title; | |
if (!processLastMsgOnChat){ | |
title = getElement("chat_title",chat).title + ''; | |
lastMsg = (getElement("chat_lastmsg", chat) || { innerText: '' }).title.replace(/[\u2000-\u206F]/g, ""); | |
//.last-msg returns null when some user is typing a message to me | |
} else { | |
title = getElement("selected_title").title; | |
} | |
// avoid sending duplicate messaegs | |
if (ignoreLastMsg[title] && (ignoreLastMsg[title]) == lastMsg) { | |
//console.log(new Date(), 'nothing to do now... (2)', title, lastMsg); | |
return goAgain(() => { start(chats, cnt + 1) }, 0.1); | |
} | |
// what to answer back? | |
let sendText | |
//MENU | |
if (lastMsg.toUpperCase().indexOf('@HELP') > -1){ | |
sendText = ` | |
Cool ${title}! Ketik: | |
1. *@TIME* | |
2. *@JOKE*` | |
} | |
if (lastMsg.toUpperCase().indexOf('@TIME') > -1){ | |
sendText = ` | |
Waktu menunjukan: | |
*${new Date()}*` | |
} | |
if (lastMsg.toUpperCase().indexOf('NGAPAIN') > -1){ | |
sendText = ` | |
Ada apa ?` | |
} | |
if (lastMsg.toUpperCase().indexOf('@JOKE') > -1){ | |
sendText = jokeList[rand(jokeList.length - 1)]; | |
} | |
//END MENU | |
if (!sendText) { | |
ignoreLastMsg[title] = lastMsg; | |
console.log(new Date(), 'new message ignored -> ', title, lastMsg); | |
return goAgain(() => { start(chats, cnt + 1) }, 0.1); | |
} | |
//console.log(new Date(), 'new message to process, uhull -> ', title, lastMsg); | |
// select chat and send message | |
if (!processLastMsgOnChat){ | |
selectChat(chat, () => { | |
sendMessage(chat, sendText.trim(), () => { | |
goAgain(() => { start(chats, cnt + 1) }, 1); | |
}); | |
}) | |
} else { | |
sendMessage(null, sendText.trim(), () => { | |
goAgain(() => { start(chats, cnt + 1) }, 1); | |
}); | |
} | |
} | |
start(); | |
})() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment