// ==UserScript==
// @name Display additional information in VK profile
// @name:ru Отображение доп. информации на странице ВКонтакте
// @namespace https://greasyfork.org/ru/users/155145-inlifeuser
// @version 2017.10.13
// @description Display registration date, last profile edit and last seen in VK user profile
// @description:ru Отображение даты регистрации, последнего редактирования страницы и последний заход на странице пользователя ВКонтакте
// @author Inlifeuser
// @license MIT
// @include *://vk.com/*
// @exclude *://vk.com/notifier.php*
// @exclude *://vk.com/*widget*.php*
// @run-at document-end
// @grant GM_xmlhttpRequest
// @connect vk.com
// @downloadURL none
// ==/UserScript==
"use strict";
function addLeadingZeroToDate(date) {
return ("0" + date).slice(-2);
}
function convert24HoursTo12Hours(hours) {
hours = hours % 12;
return hours ? hours : 12;
}
function convert24HoursToAmPmLc(hours) {
return hours >= 12 ? "pm" : "am";
}
(function() {
function insertToVkProfile() {
var vkUserProfile = document.body.querySelector("#profile_short:not(.display_additional_information_in_vk_profile)");
if (!vkUserProfile) return;
var vkUserWall = document.body.querySelector("a.ui_tab_sel[href*=\"/wall\"]");
if (!vkUserWall) return;
var vkUserId = (vkUserWall.href.match(/wall(\d+)/i) || [])[1];
if (!vkUserId) return;
vkUserProfile.className += " display_additional_information_in_vk_profile";
var vkPageLang = document.body.querySelector("a.ui_actions_menu_item[onclick*=\"lang_dialog\"]");
var vkCurrentLang;
if (vkPageLang) {
vkCurrentLang = vkPageLang.textContent;
} else {
vkCurrentLang = navigator.language.substring(0,2);
}
var vkLang, vkRegMonthName, vkLastSeenPlatformName;
if (vkCurrentLang == "Language: english" || vkCurrentLang == "en") {
vkLang = "en";
vkRegMonthName = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
vkLastSeenPlatformName = ["mobile website version or unofficial mobile app", "official app for iPhone", "official app for iPad", "official app for Android", "official app for Windows Phone", "official app for Windows 10", "full website version or unofficial app"];
} else if (vkCurrentLang == "Язык: русский" || vkCurrentLang == "ru") {
vkLang = "ru";
vkRegMonthName = ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"];
vkLastSeenPlatformName = ["мобильная версия сайта или неофициальное мобильное приложение", "оф. приложение для iPhone", "оф. приложение для iPad", "оф. приложение для Android", "оф. приложение для Windows Phone", "оф. приложение для Windows 10", "полная версия сайта или неофициальное приложение"];
} else {
vkLastSeenPlatformName = ["mobile website version or unofficial mobile app", "official app for iPhone", "official app for iPad", "official app for Android", "official app for Windows Phone", "official app for Windows 10", "full website version or unofficial app"];
}
var i = 0;
while (i < 3) {
var vkUserProfileElement = document.createElement("div");
vkUserProfileElement.style.display = "none";
vkUserProfile.insertBefore(vkUserProfileElement, vkUserProfile.firstChild);
i++;
}
GM_xmlhttpRequest({
method: "GET",
url: "/foaf.php?id=" + vkUserId,
onload: function(vkFoafResponse) {
if (vkFoafResponse.status == 200) {
var vkFoafRegDate = (vkFoafResponse.responseText.match(/ya:created dc:date="(.+)"/i) || [])[1];
var vkFoafLastProfileEditDate = (vkFoafResponse.responseText.match(/ya:modified dc:date="(.+)"/i) || [])[1];
if (vkFoafRegDate) {
var vkRegDate = new Date(vkFoafRegDate);
var vkRegDateElement = document.createElement("div");
vkRegDateElement.className = "clear_fix profile_info_row";
if (vkLang == "en") {
vkRegDateElement.innerHTML = "
Registration date:
" + vkRegMonthName[vkRegDate.getMonth()] + " " + vkRegDate.getDate() + ", " + vkRegDate.getFullYear() + " at " + convert24HoursTo12Hours(vkRegDate.getHours()) + ":" + addLeadingZeroToDate(vkRegDate.getMinutes()) + ":" + addLeadingZeroToDate(vkRegDate.getSeconds()) + " " + convert24HoursToAmPmLc(vkRegDate.getHours()) + "
";
} else if (vkLang == "ru") {
vkRegDateElement.innerHTML = "Дата регистрации:
" + vkRegDate.getDate() + " " + vkRegMonthName[vkRegDate.getMonth()] + " " + vkRegDate.getFullYear() + " г. " + vkRegDate.getHours() + ":" + addLeadingZeroToDate(vkRegDate.getMinutes()) + ":" + addLeadingZeroToDate(vkRegDate.getSeconds()) + "
";
} else {
vkRegDateElement.innerHTML = "Registration date:
" + addLeadingZeroToDate(vkRegDate.getDate()) + "." + addLeadingZeroToDate(vkRegDate.getMonth()+1) + "." + vkRegDate.getFullYear() + " " + addLeadingZeroToDate(vkRegDate.getHours()) + ":" + addLeadingZeroToDate(vkRegDate.getMinutes()) + ":" + addLeadingZeroToDate(vkRegDate.getSeconds()) + "
";
}
vkUserProfile.replaceChild(vkRegDateElement, vkUserProfile.childNodes[0]);
} else {
console.info("Registration date on VK FOAF profile is empty or unavailable");
}
if (vkFoafLastProfileEditDate) {
var vkLastProfileEditDate = new Date(vkFoafLastProfileEditDate);
var vkLastProfileEditDateElement = document.createElement("div");
vkLastProfileEditDateElement.className = "clear_fix profile_info_row";
if (vkLang == "en") {
vkLastProfileEditDateElement.innerHTML = "Last profile edit:
" + vkRegMonthName[vkLastProfileEditDate.getMonth()] + " " + vkLastProfileEditDate.getDate() + ", " + vkLastProfileEditDate.getFullYear() + " at " + convert24HoursTo12Hours(vkLastProfileEditDate.getHours()) + ":" + addLeadingZeroToDate(vkLastProfileEditDate.getMinutes()) + ":" + addLeadingZeroToDate(vkLastProfileEditDate.getSeconds()) + " " + convert24HoursToAmPmLc(vkLastProfileEditDate.getHours()) + "
";
} else if (vkLang == "ru") {
vkLastProfileEditDateElement.innerHTML = "Посл. ред. стр.:
" + vkLastProfileEditDate.getDate() + " " + vkRegMonthName[vkLastProfileEditDate.getMonth()] + " " + vkLastProfileEditDate.getFullYear() + " г. " + vkLastProfileEditDate.getHours() + ":" + addLeadingZeroToDate(vkLastProfileEditDate.getMinutes()) + ":" + addLeadingZeroToDate(vkLastProfileEditDate.getSeconds()) + "
";
} else {
vkLastProfileEditDateElement.innerHTML = "Last profile edit:
" + addLeadingZeroToDate(vkLastProfileEditDate.getDate()) + "." + addLeadingZeroToDate(vkLastProfileEditDate.getMonth()+1) + "." + vkLastProfileEditDate.getFullYear() + " " + addLeadingZeroToDate(vkLastProfileEditDate.getHours()) + ":" + addLeadingZeroToDate(vkLastProfileEditDate.getMinutes()) + ":" + addLeadingZeroToDate(vkLastProfileEditDate.getSeconds()) + "
";
}
vkUserProfile.replaceChild(vkLastProfileEditDateElement, vkUserProfile.childNodes[1]);
} else {
console.info("Last profile editing date on VK FOAF profile is empty or unavailable");
}
} else {
console.error("Failed to get VK FOAF profile (registration date and last profile edit date): " + vkFoafResponse.status + " " + vkFoafResponse.statusText);
}
},
onerror: function() {
console.error("Failed to get VK FOAF profile (registration date and last profile edit date)");
}
});
GM_xmlhttpRequest({
method: "GET",
url: "https://api.vk.com/method/users.get?user_ids=" + vkUserId + "&fields=last_seen&v=5.68",
onload: function(vkApiUsersGetResponse) {
if (vkApiUsersGetResponse.status == 200) {
var vkApiUsersGetObject = JSON.parse(vkApiUsersGetResponse.responseText);
var vkLastSeenUnixtime = vkApiUsersGetObject.response[0].last_seen.time;
if (vkLastSeenUnixtime) {
var vkLastSeenDate = new Date(vkLastSeenUnixtime*1000);
var vkLastSeenDateElement = document.createElement("div");
vkLastSeenDateElement.className = "clear_fix profile_info_row";
var vkLastSeenPlatform = vkApiUsersGetObject.response[0].last_seen.platform;
if (vkLang == "en") {
vkLastSeenDateElement.innerHTML = "Last seen:
" + vkRegMonthName[vkLastSeenDate.getMonth()] + " " + vkLastSeenDate.getDate() + ", " + vkLastSeenDate.getFullYear() + " at " + convert24HoursTo12Hours(vkLastSeenDate.getHours()) + ":" + addLeadingZeroToDate(vkLastSeenDate.getMinutes()) + ":" + addLeadingZeroToDate(vkLastSeenDate.getSeconds()) + " " + convert24HoursToAmPmLc(vkLastSeenDate.getHours()) + " (" + vkLastSeenPlatformName[vkLastSeenPlatform-1] + ")
";
} else if (vkLang == "ru") {
vkLastSeenDateElement.innerHTML = "Последний заход:
" + vkLastSeenDate.getDate() + " " + vkRegMonthName[vkLastSeenDate.getMonth()] + " " + vkLastSeenDate.getFullYear() + " г. " + vkLastSeenDate.getHours() + ":" + addLeadingZeroToDate(vkLastSeenDate.getMinutes()) + ":" + addLeadingZeroToDate(vkLastSeenDate.getSeconds()) + " (" + vkLastSeenPlatformName[vkLastSeenPlatform-1] + ")
";
} else {
vkLastSeenDateElement.innerHTML = "Last seen:
" + addLeadingZeroToDate(vkLastSeenDate.getDate()) + "." + addLeadingZeroToDate(vkLastSeenDate.getMonth()+1) + "." + vkLastSeenDate.getFullYear() + " " + addLeadingZeroToDate(vkLastSeenDate.getHours()) + ":" + addLeadingZeroToDate(vkLastSeenDate.getMinutes()) + ":" + addLeadingZeroToDate(vkLastSeenDate.getSeconds()) + " (" + vkLastSeenPlatformName[vkLastSeenPlatform-1] + ")
";
}
vkUserProfile.replaceChild(vkLastSeenDateElement, vkUserProfile.childNodes[2]);
} else {
console.info("Last seen date and platform on VK API profile is empty or unavailable");
}
} else {
console.error("Failed to get VK API profile (last seen date and platform): " + vkApiUsersGetResponse.status + " " + vkApiUsersGetResponse.statusText);
}
},
onerror: function() {
console.error("Failed to get VK API profile (last seen date and platform)");
}
});
}
new MutationObserver(insertToVkProfile).observe(document.body, {childList: true, subtree: true});
})();