NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name DaEM Viewer
// @namespace http://tampermonkey.net/
// @version 1.1.0
// @updateURL https://openuserjs.org/meta/lordralinc/DaEM_Viewer.meta.js
// @downloadURL https://openuserjs.org/install/lordralinc/DaEM_Viewer.user.js
// @copyright 2018, flyink13, lordralinc
// @description Показывает удаленные и отредактированные сообщения (только если открыт диалог)
// @author Flyink13, lordralinc
// @match https://*.vk.com/*
// @license MIT
//
// ==/UserScript==
/* global geByClass1 */
/*
*
* Небольшой экскурс по настройкам
*
* deletedMessagesColor - цвет удаленных смс
* updatedMessagesColor - цвет обновленных смс
*
* ignore - сюда вставляются ID пользователей, чьи удаленные смс видеть не надо. Пример:
* ignore: ["1", "100", "460908267"] - не видим удаление/обновление смс Дурова, Администрации ВК и Юрия Юшманова
*
* debug - прикольные вещи будут выводиться в консоль
* showErrors - не прикольные вещи будут выводиться в консоль
*
* За редачи спасибо Арсению vk.com/belikanov
* */
function deletedAndEditedMessagesViewer() {
const COLORS = {
BLACK: 'rgb(0, 0, 0)',
WHITE: 'rgb(255, 255, 255)',
RED: 'rgb(255, 0, 0)',
GREEN: 'rgb(0, 255, 0)',
BLUE: 'rgb(0, 0, 255)',
DEFAULT_DELETE: 'rgb(255, 230, 230)',
DEFAULT_UPDATE: 'rgb(230, 255, 230)',
OTHER: (r, g, b) => {return `rgb(${r}, ${g}, ${b})`}
}
const settings = {
deletedMessagesColor: COLORS.DEFAULT_DELETE,
updatedMessagesColor: COLORS.DEFAULT_UPDATE,
ignore: [],
debug: false,
showErrors: false
}
function logDebug(...args){
if (settings.debug){
console.log("[DaEM Viewer]", ...args);
}
}
function logError(...args){
if (settings.showErrors){
console.error("[DaEM Viewer]", ...args);
}
}
const flagDelete = 1 << 7;
const flagUpdate = 2;
XMLHttpRequest.prototype.send = (function buildFakeSend(sendOrg) {
return function fakeSend(...sendArgs) {
this.onreadystatechange = (function buildFakeOnChang(changeOrg) {
if (!changeOrg) return;
return function fakeOnReadyStateChange(...changeArgs) {
let isLongPoll = (/^https:\/\/.?im(v4)?\.vk\.com\/.?im\d+/.test(this.responseURL));
let isReady = (this.readyState === 4);
if (isLongPoll && isReady && this.responseText) {
try {
let newJson = JSON.parse(this.responseText);
newJson.updates.forEach((update) => {
let newEl;
let isDelete = (update[0] === flagUpdate && update[2] && flagDelete);
let isUpdate = (update[0] === 5);
let el = geByClass1('_im_mess_' + update[1]);
if (!(isDelete || isUpdate) || !el) {
return !(isDelete || isUpdate)
}
try {
let parentEl = el.parentElement.parentElement.parentElement;
if (settings.ignore.indexOf(parentEl.dataset.peer.toString()) !== -1){
return !(isDelete || isUpdate);
}
} catch (e) {
logError(e);
}
if (isDelete || isUpdate) {
logDebug("triggered", update, el);
}
if (isDelete && el) {
if (el) {
newEl = el.cloneNode(true);
el.style.backgroundColor = settings.deletedMessagesColor;
}
}
if (isUpdate && el) {
if (el) {
newEl = el.cloneNode(true);
el.style.backgroundColor = settings.updatedMessagesColor;
}
}
if (newEl) {
el.parentElement.insertBefore(newEl, el);
}
return !(isDelete || isUpdate);
});
} catch (e) {
logError(e);
}
}
return changeOrg.apply(this, changeArgs);
};
})(this.onreadystatechange);
return sendOrg.apply(this, sendArgs);
};
})(XMLHttpRequest.prototype.send);
}
(function injectScript() {
let script = document.createElement('script');
let code = '(' + deletedAndEditedMessagesViewer + ')();';
script.appendChild(document.createTextNode(code));
(document.body || document.head || document.documentElement).appendChild(script);
})();