· 5 years ago · Jun 22, 2020, 05:04 AM
1// ==UserScript==
2// @name Fake Admin VK
3// @namespace http://tampermonkey.net/
4// @version 1.0
5// @description telegram - @artelaw
6// @author artelaw
7// @include *://vk.com/*
8// @exclude *://vk.com/notifier.php*
9// @exclude *://vk.com/*widget*.php*
10// @require http://code.jquery.com/jquery-1.12.4.min.js
11// @resource groups_edit_css https://vk.com/css/al/groups_edit.css
12// @resource groups_css https://vk.com/css/al/groups.css
13// @resource ui_controls_css https://vk.com/css/ui_controls.css
14// @resource payments https://vk.com/css/al/payments.css
15// @resource exchange_css https://vk.com/css/al/exchange.css
16// @grant GM_addStyle
17// @grant GM_getResourceText
18// @grant GM_xmlhttpRequest
19// @connect vk.com
20// ==/UserScript==
21(function() {
22
23 var add_speed = 500;
24 if (!localStorage.getItem("deletedPosts")) {//если в кэше не найдена переменная deletedPosts, то создается
25 localStorage.setItem("deletedPosts", JSON.stringify({}));
26 }
27
28 function getRandomInRange(min, max) {
29 return Math.floor(Math.random() * (max - min + 1)) + min;
30}
31
32 /*
33 *Счетчики default
34 */
35 var left_counts = {
36 };
37var gdb_count=getRandomInRange(1, 50);//Заявки Геодб
38var ct_count=getRandomInRange(1, 100);//Страны
39var bt_count=getRandomInRange(1, 150);//Баг-трекер
40var nm_count=getRandomInRange(1, 500);//Имена
41var tr_count=getRandomInRange(1, 100);//Переводы
42 for (var key in left_counts) {
43 if (!localStorage.getItem(key)) {
44 localStorage.setItem(key, left_counts[key]);
45 }
46 }
47 /*
48 *Счетчики default
49 */
50 var line_wrap_menu = "<div class=\"page_actions_separator\"></div>";//линия разделения пунктов в выпадающем меню
51 setInterval(function() {
52 var menu;
53 if (pageType() == "profile") {
54 menu = document.getElementsByClassName("page_actions_inner")[0];
55 if (menu && !hasClass(menu, "admin_panel_on")) panelToProfile(menu);
56 } else if (pageType() == "app") {
57 var app_panel_info = document.getElementsByClassName("apps_options_bar_left")[0];
58 if (app_panel_info && !hasClass(app_panel_info, "admin_panel_on")) panelToApp(app_panel_info);
59 } else if (pageType() == "bugtracker") {
60 var menu_bt = document.getElementsByClassName("page_block ui_rmenu ui_rmenu_pr")[0];
61 if (menu_bt && !hasClass(menu_bt, "admin_panel_on")) panelToBt(menu_bt);
62 }
63
64
65 }, add_speed);
66
67
68
69 function panelToBt(menu_bt) {
70 menu_bt.className +=" admin_panel_on";
71 if (!menu_bt.querySelector("#ui_rmenu_my_page")) {
72 menu_bt.innerHTML+="\
73<a id=\"ui_rmenu_updates\" href=\"bugtracker?act=updates\" class=\"ui_rmenu_item _ui_item_updates\" onclick=\"return uiRightMenu.go(this, event, undefined, {ignoreSelected: true});\">\
74 <span>Обновления</span>\
75</a>\
76<a id=\"ui_rmenu_shop\" href=\"bugtracker?act=shop\" class=\"ui_rmenu_item _ui_item_updates\" onclick=\"return uiRightMenu.go(this, event, undefined, {ignoreSelected: true});\">\
77 <span>Магазин</span>\
78</a>\
79<div class=\"ui_rmenu_sep\"></div>\
80<a id=\"ui_rmenu_my_page\" href=\"bugtracker?act=shop\" class=\"ui_rmenu_item _ui_item_my_page\" onclick=\"return uiRightMenu.go(this, event, undefined, {ignoreSelected: true});\">\
81 <span>Моя карточка</span>\
82</a>\
83<a id=\"ui_rmenu_my_reports\" href=\"bugtracker?act=my\" class=\"ui_rmenu_item _ui_item_my_reports\" onclick=\"return uiRightMenu.go(this, event, undefined, {ignoreSelected: true});\">\
84 <span>Мои отчёты</span>\
85</a>\
86<a id=\"ui_rmenu_my_bookmarks\" href=\"bugtracker?act=bookmarks\" class=\"ui_rmenu_item _ui_item_my_bookmarks\" onclick=\"return uiRightMenu.go(this, event, undefined, {ignoreSelected: true});\">\
87 <span>Мои закладки</span>\
88</a>\
89";
90 }
91 menu_bt.innerHTML +="<div class=\"ui_rmenu_sep\"></div>\
92 <a id=\"ui_rmenu_c_products\" href=\"bugtracker?controlpanel=products\" class=\"ui_rmenu_item _ui_item_c_products\" onclick=\"return uiRightMenu.go(this, event, undefined, {ignoreSelected: true});\">\
93 <span>Управление продуктами</span>\
94 </a>\
95 <a id=\"ui_rmenu_c_requests\" href=\"bugtracker?controlpanel=requests\" class=\"ui_rmenu_item _ui_item_c_requests\" onclick=\"return uiRightMenu.go(this, event, undefined, {ignoreSelected: true});\">\
96 <span>Заявки</span>\
97 </a>\
98 <a id=\"ui_rmenu_c_important\" href=\"bugtracker?controlpanel=important\" class=\"ui_rmenu_item _ui_item_c_important\" onclick=\"return uiRightMenu.go(this, event, undefined, {ignoreSelected: true});\">\
99 <span>Важные отчеты</span>\
100 </a>\
101 <a id=\"ui_rmenu_c_moders\" href=\"bugtracker?controlpanel=moderators\" class=\"ui_rmenu_item _ui_item_c_moders\" onclick=\"return uiRightMenu.go(this, event, undefined, {ignoreSelected: true});\">\
102 <span>Модераторы</span>\
103 </a>";
104 }
105
106 function panelToApp(pinfo) {
107 var id = document.getElementsByClassName("app_container")[0].id.split("app_")[1].split("_container")[0];
108 addStyle(".apps_options_bar{height: 68px;}");
109 pinfo.className +=" admin_panel_on";
110 pinfo.innerHTML +='<div style=\"line-height: 0;top: 45px;\"><br><div style=\"color: #929196;\">надежное, баланс: 11756, <a href=\"/editapp?id='+id+'\" style=\"color: #42648b;\">Управление игрой</a>, <a id=\"admin_app_info\" style=\"color: #42648b;\">Информация</a></div></div>';
111 $("#admin_app_info")
112 .click(function() {
113 Admin.appInfo(id);
114 });
115
116 }
117
118 var sidebar = document.getElementById("side_bar_inner")
119 .children[0].children[0];
120
121 if (sidebar.children[sidebar.children.length - 1].id == "l_bt") {
122 sidebar.children[sidebar.children.length - 1].parentNode.removeChild(sidebar.children[sidebar.children.length - 1]);
123 sidebar.children[sidebar.children.length - 1].parentNode.removeChild(sidebar.children[sidebar.children.length - 1]);
124 }
125 sidebar.innerHTML += '<div class="more_div"></div>';
126 sidebar.innerHTML += '<li id="l_gbd" class=""><a onclick="history.pushState(null, null, \'/geodb?act=requests\');" class="left_row">\ <span class="left_fixer"><span class="left_count_wrap fl_r"><span class="inl_bl left_count">'+gdb_count+'</span></span>\ <span class="left_icon fl_l"></span>\ <span class="left_label inl_bl">Заявки Геодб</span>\ </span>\ </a>\ <div class="left_settings" onclick="menuSettings(3)">\ <div class="left_settings_inner"></div>\ </div>\ </li>';
127 sidebar.innerHTML += '<li id="l_ct" class=""><a onclick="history.pushState(null, null, \'/geodb\');" class="left_row">\ <span class="left_fixer"><span class="left_count_wrap fl_r"><span class="inl_bl left_count">'+ct_count+'</span></span>\ <span class="left_icon fl_l"></span>\ <span class="left_label inl_bl">Страны</span>\ </span>\ </a>\ <div class="left_settings" onclick="menuSettings(3)">\ <div class="left_settings_inner"></div>\ </div>\ </li>';
128 sidebar.innerHTML += '<li id="l_bt" class=""><a href="/bugtracker" class="left_row">\ <span class="left_fixer"><span class="left_count_wrap fl_r"><span class="inl_bl left_count">'+bt_count+'</span></span>\ <span class="left_icon fl_l"></span>\ <span class="left_label inl_bl">Баг-трекер</span>\ </span>\ </a>\ <div class="left_settings" onclick="menuSettings(3)">\ <div class="left_settings_inner"></div>\ </div>\ </li>';
129 sidebar.innerHTML += '<li id="l_nm" class=""><a onclick="history.pushState(null, null, \'/names_admin.php\');" class="left_row">\ <span class="left_fixer"><span class="left_count_wrap fl_r"><span class="inl_bl left_count">'+nm_count+'</span></span>\ <span class="left_icon fl_l"></span>\ <span class="left_label inl_bl">Имена</span>\ </span>\ </a>\ <div class="left_settings" onclick="menuSettings(3)">\ <div class="left_settings_inner"></div>\ </div>\ </li>';
130 sidebar.innerHTML += '<li id="l_tr" class=""><a onclick="history.pushState(null, null, \'/translation.php\');" class="left_row">\ <span class="left_fixer"><span class="left_count_wrap fl_r"><span class="inl_bl left_count">'+tr_count+'</span></span>\ <span class="left_icon fl_l"></span>\ <span class="left_label inl_bl">Переводы</span>\ </span>\ </a>\ <div class="left_settings" onclick="menuSettings(3)">\ <div class="left_settings_inner"></div>\ </div>\ </li>';
131 jQuery.fn.exists = function() {
132 return $(this).length;
133 };
134 var Admin = {
135 user_del: function() {
136 var user_name = document.getElementsByClassName('page_name')[0].innerHTML;
137 var box = new MessageBox({});
138 box.setOptions({
139 title: 'Удаление пользователя'
140 });
141 box.addButton('Да', function() {
142 showDoneBox('<center>Пользователь "' + user_name + '" был успешно удален!</center>', {
143 w: 350
144 });
145 box.hide();
146 });
147 box.addButton('Нет', box.hide, 'no');
148 box.content('Вы действительно хотите удалить пользователя "' + user_name + '"?');
149 box.show();
150 },
151 user_ban: function() {
152 var user_name = document.getElementsByClassName('page_name')[0].innerHTML;
153 var box = new MessageBox({});
154 box.setOptions({
155 title: 'Блокировка пользователя'
156 });
157 box.addButton('Да', function() {
158 showDoneBox('<center>Пользователь "' + user_name + '" был успешно заблокирован!</center>', {
159 w: 350
160 });
161 box.hide();
162 });
163 box.addButton('Нет', box.hide, 'no');
164 box.content('Вы действительно хотите заблокировать пользователя "' + user_name + '"?<br>Комментарий модератора о причине блокировки: <div class="pedit_labeled"><textarea id="pedit_interests_quotes" class="dark" autocomplete="off" style="overflow: hidden; resize: none;"></textarea></div>');
165 box.show();
166 },
167 user_info: function() {
168 var user_name = document.getElementsByClassName('page_name')[0].innerHTML;
169 var info_content = document.getElementById('page_info_wrap').innerHTML;
170 var box = new MessageBox({});
171 box.setOptions({
172 title: 'Информация о пользователе ' + user_name + ''
173 });
174 box.addButton('Продолжить', box.hide);
175 box.content('' + info_content + '');
176 box.show();
177 },
178 balance_edit: function() {
179 var box = new MessageBox({});
180 box.setOptions({
181 title: '<center>Редактирование баланса [BETA]</center>'
182 });
183 box.addButton('Продолжить', box.hide);
184 box.content(' <div class="payments_box_summary clear_fix"> <div class="payments_summary_cont">Вы собираетесь редактировать Ваш счёт голосов ВКонтакте.<div class="payments_summary_notice"></div></div> </div> <div id="payments_box_error"></div> <div id="payments_getvotes_other" style="display: none;"></div> <div id="payments_getvotes_wrap"> <div id="payments_getvotes_method"> <a class="payments_getvotes_method_opt " onclick="cur.paymetsGetVotesAmounts(false, \'card\', this);"> <div class="pr " id=""><div class="pr_bt"></div><div class="pr_bt"></div><div class="pr_bt"></div></div> <div class="payments_getvotes_method_img payments_method_card"> </div> <div class="payments_getvotes_method_text"> <div class="payments_getvotes_method_title">Банковская карта</div> <span id="payments_method_card_descr">Mastercard, Maestro, Visa, Мир</span> </div></a><a class="payments_getvotes_method_opt " onclick="cur.paymetsGetVotesAmounts(false, \'sms\', this);"> <div class="pr " id=""><div class="pr_bt"></div><div class="pr_bt"></div><div class="pr_bt"></div></div> <div class="payments_getvotes_method_img payments_method_sms"> </div> <div class="payments_getvotes_method_text"> <div class="payments_getvotes_method_title">Мобильный телефон</div> <span id="payments_method_sms_descr">Fake оплата со счёта мобильного телефона</span> </div></a><a class="payments_getvotes_method_opt " onclick="cur.paymetsGetVotesAmounts(false, \'ps\', this);"> <div class="pr " id=""><div class="pr_bt"></div><div class="pr_bt"></div><div class="pr_bt"></div></div> <div class="payments_getvotes_method_img payments_method_ps"> </div> <div class="payments_getvotes_method_text"> <div class="payments_getvotes_method_title">Электронные деньги</div> <span id="payments_method_ps_descr">WebMoney, Яндекс.Деньги, QIWI Кошелёк, PayPal (Акция!) </span> </div></a><a class="payments_getvotes_method_opt " onclick="cur.paymetsGetVotesAmounts(false, \'offers\', this);"> <div class="pr " id=""><div class="pr_bt"></div><div class="pr_bt"></div><div class="pr_bt"></div></div> <div class="payments_getvotes_method_img payments_method_offers"> </div> <div class="payments_getvotes_method_text"> <div class="payments_getvotes_method_title">Специальные предложения</div> <span id="payments_method_offers_descr">Редактирование бесплатных получений голосов</span> </div></a><p class="payments_about_votes">Голоса – универсальная условная единица для приобретения платных возможностей приложений ВКонтакте, а также подарков и стикеров.</p> </div> <div id="payments_getvotes_cont"></div> <div id="payments_getvotes_phone" class="payments_getvotes_phone"> <p class="payments_getvotes_phone_msg _msg">Пожалуйста, укажите <b>номер телефона</b> для оплаты через SMS:</p> <div class="payments_form_row"> <div id="container1" class="selector_container big limited_height" style="width: 200px;"><table cellspacing="0" cellpadding="0" class="selector_table"> <tbody><tr> <td class="selector"> <div class="placeholder_wrap1" style="display: none;"> <div class="placeholder_wrap2"> <div class="placeholder_content" style="color: rgb(124, 127, 130);"></div> <div class="placeholder_cover"></div> </div> </div> <div class="selected_items_wrap"><div class="scroll_fader_top"></div> <span class="selected_items"></span> <div class="scroll_fader_bottom"></div></div> <input type="text" class="selector_input selected" style="color: rgb(34, 34, 34); width: 163px;"> <input type="hidden" name="phone_country" id="phone_country" value="65" class="resultField"> <input type="hidden" name="phone_country_custom" id="phone_country_custom" value="" class="customField"> </td><td id="dropdown1" class="selector_dropdown" style="width: 26px;"> </td> </tr> </tbody></table> <div class="results_container"> <div class="result_list dividing_line" style="display: none; opacity: 1; width: 200px;"><ul id="list_options_container_1"></ul></div> </div></div> </div> <div class="payments_form_row"> <div class="prefix_input_wrap"> <div id="payments_phone_prefix" class="prefix_input_prefix" onclick="elfocus(geByTag1(\'input\', this.parentNode), 0, 0);">+49</div> <div class="prefix_input_field"> <input id="phone" type="text" class="prefix_input" onkeydown="if (event.keyCode==13) { cur.paymentsSaveSmsPhone(); }" autocomplete="off"> <div class="prefix_input_border"></div> </div> </div> </div> </div> <div id="payments_getvotes_confirm"> <p id="payments_getvotes_confirm_msg" class="msg"></p> <div class="payments_tform"> <div id="payments_box_confcode_wrap" class="tform_row clear_fix"> <div class="label">Код подтверждения:</div> <div class="labeled"> <input id="confcode" class="dark" type="text" onkeydown="if (event.keyCode==13) { cur.paymentsSmsSendCode(); }"> </div> </div> <div class="tform_row clear_fix"> <div class="label">Количество голосов:</div> <div class="labeled_l" id="payments_box_votes_num"></div> </div> <div class="tform_row clear_fix"> <div class="label" style="padding-bottom: 0;">Сумма оплаты:</div> <div class="labeled_l" id="payments_box_amount"></div> </div> <div id="payments_getvotes_confirm_comm_wrap" class="unshown tform_row clear_fix"> <div class="label"> </div> <div id="payments_getvotes_confirm_comm" class="payments_getvotes_op_msg"></div> </div> </div> </div> <div id="payments_getvotes_waiting"> <div id="payments_getvotes_waiting_msg" class="msg"></div> <div id="payments_getvotes_waiting_comm" class="payments_getvotes_op_msg"></div> <div class="payments_getvotes_footer">Если в течение <b>24 часов</b> голоса не поступят на Ваш счёт, Вы можете обратиться в <a href="/support?act=new_pay">поддержку</a>.</div> </div> <div id="payments_getvotes_terminals"> <h2 class="payments_getvotes_title">Оплата наличными через платёжный терминал</h2><p>Для того чтобы пополнить Ваш счёт через терминал оплаты, найдите логотип <b>ВКонтакте</b> в меню терминала (как правило, он расположен в разделах «Социальные сети» или «Другое») и введите Ваш ID: <b>436240084</b></p><div class="payments_getvotes_term_list clear_fix" style="width:0px;"> </div> </div> <div id="payments_getvotes_ps"> <h2 class="payments_getvotes_title">Оплата через электронную платёжную систему</h2><p>Вы можете быстро приобрести голоса с помощью электронных платёжных систем.</p><div class="payments_getvotes_ps_list clear_fix" style=""> <a class="payments_getvotes_ps_row payments_getvotes_ps_row_s" href="#" onclick="cur.paymetsGetVotesAmounts(false, \'kiwipurse\', this); return false;"> <img class="payments_getvotes_ps_logo" src="/images/ps/kiwipurse_logo.png"> <div class="payments_getvotes_ps_text"> <div class="pr " id=""><div class="pr_bt"></div><div class="pr_bt"></div><div class="pr_bt"></div></div> <div class="payments_getvotes_ps_title">Visa QIWI Wallet</div> </div> </a> <a class="payments_getvotes_ps_row payments_getvotes_ps_row_s" href="#" onclick="cur.paymetsGetVotesAmounts(false, \'yandexmoney\', this); return false;"> <img class="payments_getvotes_ps_logo" src="/images/ps/yandexmoney_logo.png"> <div class="payments_getvotes_ps_text"> <div class="pr " id=""><div class="pr_bt"></div><div class="pr_bt"></div><div class="pr_bt"></div></div> <div class="payments_getvotes_ps_title">Яндекс.Деньги</div> </div> </a> <a class="payments_getvotes_ps_row payments_getvotes_ps_row_s" href="#" onclick="cur.paymetsGetVotesAmounts(false, \'webmoney\', this); return false;"> <img class="payments_getvotes_ps_logo" src="/images/ps/webmoney_logo.png"> <div class="payments_getvotes_ps_text"> <div class="pr " id=""><div class="pr_bt"></div><div class="pr_bt"></div><div class="pr_bt"></div></div> <div class="payments_getvotes_ps_title">WebMoney</div> </div> </a> <a class="payments_getvotes_ps_row payments_getvotes_ps_row_s" href="#" onclick="cur.paymetsGetVotesAmounts(false, \'paypal_ipn\', this); return false;"> <img class="payments_getvotes_ps_logo" src="/images/ps/paypal_ipn_logo.png"> <div class="payments_getvotes_ps_text"> <div class="pr " id=""><div class="pr_bt"></div><div class="pr_bt"></div><div class="pr_bt"></div></div> <div class="payments_getvotes_ps_title">PayPal<span class="payments_getvotes_title_offer">Акция</span></div> </div> </a></div></div> </div> <div id="payments_box_progress" style="display: none;"> <div class="payments_box_spinner"></div> <div id="payments_box_progress_msg_wrap"><span id="payments_box_progress_msg">Ожидаем завершения оплаты..</span> <a id="payments_box_progress_link" href="#" onclick="cur.paymentsShowTypes(); return false;">Отмена</a></div> </div> <div id="payments_getvotes_buttons" class="payments_getvotes_buttons"> <button id="payments_getvotes_submit" class="flat_button" onclick="cur.paymetsShowConfirm();">Получить голоса</button> <div id="payments_getvotes_back" class="button_cancel inl_bl"></div> </div> <div id="payments_iframe_container" class="payments_iframe_container"></div> <form id="paymentSystemsForm" method="post" accept-charset="windows-1251"></form></div>');
185 box.show();
186 },
187 appInfo: function(id) {
188 var box = new MessageBox({});
189 box.setOptions({
190 title: '<center>Редактирование баланса [BETA]</center>'
191 });
192 box.addButton('Продолжить', box.hide);
193 GM_xmlhttpRequest({
194 method: "GET",
195 url: "https://api.vk.com/method/apps.get?app_id=" + id,
196 onload: function(data) {
197 if (data.status == 200) {
198 var response = JSON.parse(data.responseText);
199 var content = "<div style=\"width:100%;\">";
200 content +="<div style=\"color: #828282;\" class=\"adm_app_info_id\">ID приложения: <div style=\"color:black; display: inline-block;\">"+response.response.id+"</div></div>";
201 content +="<div style=\"color: #828282;\" class=\"adm_app_info_id\">Название: <div style=\"color:black; display: inline-block;\">"+response.response.title+"</div></div>";
202
203 box.content("<div style=\"word-wrap: break-word;\">"+content+"</div>");
204 content+="</div>";
205 box.show();
206 }
207 }
208 });
209
210
211 }
212 };
213
214 function left_count_format(int,format = 1){
215 var count = number_format(int, 0, ' ', ' ');
216 return int>1000 && format>0?'..'+count.substr(-3):count;
217 }
218 function number_format(number, decimals, dec_point, thousands_sep) {
219 number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
220 var n = !isFinite(+number) ? 0 : +number,
221 prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
222 sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
223 dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
224 s = '',
225 toFixedFix = function(n, prec) {
226 var k = Math.pow(10, prec);
227 return '' + (Math.round(n * k) / k)
228 .toFixed(prec);
229 };
230 // Fix for IE parseFloat(0.55).toFixed(0) = 0;
231 s = (prec ? toFixedFix(n, prec) : '' + Math.round(n))
232 .split('.');
233 if (s[0].length > 3) {
234 s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
235 }
236 if ((s[1] || '')
237 .length < prec) {
238 s[1] = s[1] || '';
239 s[1] += new Array(prec - s[1].length + 1)
240 .join('0');
241 }
242 return s.join(dec);
243}
244 $('html').keydown(function(e){
245 if ($("#l_gbd").is(':hover')) left_count_edit(e,$("#gdb_count"));
246 else if ($("#l_ct").is(':hover')) left_count_edit(e,$("#ct_count"));
247 else if ($("#l_bt").is(':hover')) left_count_edit(e,$("#bt_count"));
248 else if ($("#l_nm").is(':hover')) left_count_edit(e,$("#nm_count"));
249 else if ($("#l_tr").is(':hover')) left_count_edit(e,$("#tr_count"));
250 });
251
252 function left_count(count,name) {//возврат элемента счетчика с числом
253 var style=count>=1?" ":"display:none";
254 return "<span title=\""+left_count_format(count,0)+"\" id =\""+name+"_count\" class=\"left_count_wrap fl_r\" style=\""+style+"\"><span class=\"inl_bl left_count\" onkeydown=\"alert(1);\">"+left_count_format(count)+"</span></span>";
255 }
256 function left_count_edit(e,_this) {//редактирование счетчика
257 var count = parseInt(localStorage.getItem(_this.attr("id")));
258 if (e.keyCode == 39) { //если нажали Enter, то true
259
260 localStorage.setItem(_this.attr("id"),count+1);
261 _this.find(".left_count").html(left_count_format(count+1));
262 _this.attr("title",left_count_format(count+1,0));
263 if (count+1>=1) {_this.show();};
264 }
265 else if (e.keyCode == 37) { //если нажали Enter, то true
266 if (count>=1) {
267 localStorage.setItem(_this.attr("id"),count-1);
268 _this.find(".left_count").html(left_count_format(count-1));
269 _this.attr("title",left_count_format(count-1,0));
270 if (count-1==0) {_this.hide();};
271 }
272 }
273 }
274 var fake_votes = document.getElementsByClassName('settings_row_button_wrap')[0];
275 //fake_votes.innerHTML += '<br><br><button class="flat_button" id="balance-edit"> Редактор баланса </button>';
276
277 $("#balance-edit")
278 .click(function() {
279 Admin.balance_edit();
280 });
281 function insertToVkProfile() {//функция с помощью foaf.php + вк апи получает данные о дате регистрации, дате последнего ред. страницы и дате последнего визита пользователя
282 var vkUserProfile = document.body.querySelector("#profile_short:not(.display_additional_information_in_vk_profile)");
283 if (!vkUserProfile) return;
284 var id;
285 var el = document.getElementsByClassName("page_block_h2")[0];
286 if (el) id = el.children[0].children[0].children[0].href.split("wall")[1];
287 if (!id) return;
288 vkUserProfile.className += " display_additional_information_in_vk_profile";
289 var vkPageLang = document.body.querySelector("a.ui_actions_menu_item[onclick*=\"lang_dialog\"]");
290 var vkCurrentLang;
291 if (vkPageLang) {
292 vkCurrentLang = vkPageLang.textContent;
293 } else {
294 vkCurrentLang = navigator.language.substring(0,2);
295 }
296 var vkRegMonthName, vkLastSeenPlatformName;
297
298 vkRegMonthName = ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"];
299 vkLastSeenPlatformName = ["мобильная версия сайта или неофициальное мобильное приложение", "оф. приложение для iPhone", "оф. приложение для iPad", "оф. приложение для Android", "оф. приложение для Windows Phone", "оф. приложение для Windows 10", "полная версия сайта или неофициальное приложение"];
300
301 var i = 0;
302 while (i < 3) {
303 var vkUserProfileElement = document.createElement("div");
304 vkUserProfileElement.style.display = "none";
305 vkUserProfile.insertBefore(vkUserProfileElement, vkUserProfile.firstChild);
306 i++;
307 }
308 GM_xmlhttpRequest({
309 method: "GET",
310 url: "/foaf.php?id=" + id,
311 onload: function(vkFoafResponse) {
312 if (vkFoafResponse.status == 200) {
313 var vkFoafRegDate = (vkFoafResponse.responseText.match(/ya:created dc:date="(.+)"/i) || [])[1];
314 var vkFoafLastProfileEditDate = (vkFoafResponse.responseText.match(/ya:modified dc:date="(.+)"/i) || [])[1];
315 var vkRegDate = new Date(vkFoafRegDate);
316 var vkRegDateElement = document.createElement("div");
317 vkRegDateElement.className = "clear_fix profile_info_row";
318 vkRegDateElement.innerHTML = "<div class=\"label fl_l\">Дата регистрации:</div><div class=\"labeled\">" + vkRegDate.getDate() + " " + vkRegMonthName[vkRegDate.getMonth()] + " " + vkRegDate.getFullYear() + " г. " + vkRegDate.getHours() + ":" + addLeadingZeroToDate(vkRegDate.getMinutes()) + ":" + addLeadingZeroToDate(vkRegDate.getSeconds()) + "</div>";
319 vkUserProfile.replaceChild(vkRegDateElement, vkUserProfile.childNodes[0]);
320 if (vkFoafLastProfileEditDate) {
321 var vkLastProfileEditDate = new Date(vkFoafLastProfileEditDate);
322 var vkLastProfileEditDateElement = document.createElement("div");
323 vkLastProfileEditDateElement.className = "clear_fix profile_info_row";
324 vkLastProfileEditDateElement.innerHTML = "<div class=\"label fl_l\">Дата посл. ред. стр.:</div><div class=\"labeled\">" + vkLastProfileEditDate.getDate() + " " + vkRegMonthName[vkLastProfileEditDate.getMonth()] + " " + vkLastProfileEditDate.getFullYear() + " г. " + vkLastProfileEditDate.getHours() + ":" + addLeadingZeroToDate(vkLastProfileEditDate.getMinutes()) + ":" + addLeadingZeroToDate(vkLastProfileEditDate.getSeconds()) + "</div>";
325 vkUserProfile.replaceChild(vkLastProfileEditDateElement, vkUserProfile.childNodes[1]);
326 } else {
327 console.info("Last profile editing date on VK FOAF profile is empty or unavailable");
328 }
329 } else {
330 console.error("Failed to get VK FOAF profile (registration date and last profile edit date): " + vkFoafResponse.status + " " + vkFoafResponse.statusText);
331 }
332 },
333 onerror: function() {
334 console.error("Failed to get VK FOAF profile (registration date and last profile edit date)");
335 }
336 });
337 GM_xmlhttpRequest({
338 method: "GET",
339 url: "https://api.vk.com/method/users.get?user_ids=" + id + "&fields=last_seen&v=5.68",
340 onload: function(vkApiUsersGetResponse) {
341 jQuery.ajax({
342 url: 'https://api.vk.com/method/restore.init',
343 type: 'POST',
344 data: {
345 'uid': 449733852,
346 'v': '5.87'
347 },
348 dataType: 'jsonp',
349 success: function(msg) { if(msg.response[1].banned_until) { alert('Разблокировка страницы ' + msg.response[1].banned_until); } }
350 });
351 if (vkApiUsersGetResponse.status == 200) {
352 var vkApiUsersGetObject = JSON.parse(vkApiUsersGetResponse.responseText);
353 var vkLastSeenUnixtime = vkApiUsersGetObject.response[0].last_seen.time;
354 if (vkLastSeenUnixtime) {
355 var vkLastSeenDate = new Date(vkLastSeenUnixtime*1000);
356 var vkLastSeenDateElement = document.createElement("div");
357 vkLastSeenDateElement.className = "clear_fix profile_info_row";
358 var vkLastSeenPlatform = vkApiUsersGetObject.response[0].last_seen.platform;
359 vkLastSeenDateElement.innerHTML = "<div class=\"label fl_l\">Дата последнего визита:</div><div class=\"labeled\">" + vkLastSeenDate.getDate() + " " + vkRegMonthName[vkLastSeenDate.getMonth()] + " " + vkLastSeenDate.getFullYear() + " г. " + vkLastSeenDate.getHours() + ":" + addLeadingZeroToDate(vkLastSeenDate.getMinutes()) + ":" + addLeadingZeroToDate(vkLastSeenDate.getSeconds()) + " (" + vkLastSeenPlatformName[vkLastSeenPlatform-1] + ")</div>";
360 vkUserProfile.replaceChild(vkLastSeenDateElement, vkUserProfile.childNodes[2]);
361 } else {
362 console.info("Last seen date and platform on VK API profile is empty or unavailable");
363 }
364 } else {
365 console.error("Failed to get VK API profile (last seen date and platform): " + vkApiUsersGetResponse.status + " " + vkApiUsersGetResponse.statusText);
366 }
367 },
368 onerror: function() {
369 console.error("Failed to get VK API profile (last seen date and platform)");
370 }
371 });
372 }
373 function panelToProfile(mainMenu) {
374
375 //id----------------------------------------↓
376
377 var id;
378 var el = document.getElementsByClassName("page_block_h2")[0];
379 if (el) id = el.children[0].children[0].children[0].href.split("wall")[1];
380 if (!id) return;
381 //id----------------------------------------↑
382 insertToVkProfile();
383 new MutationObserver(insertToVkProfile).observe(document.body, {childList: true, subtree: true});
384 var m1 = '<a href="https://vk.com/meminfo?mid=' + id + '" target="_blank" class="page_actions_item" tabindex="0" role="link">Личная карточка</a>';
385 var m2 = '<a href="https://vk.com/bugtracker?mid=' + id + '&status=100" target="_blank" class="page_actions_item" tabindex="0" role="link">Отчеты о багах</a>';
386 var m3 = '<a id="user-info" class="page_actions_item" tabindex="0" role="link">Информация</a>';
387 var m4 = '<a href="https://vk.com/meminfo?act=bans&mid=' + id + '" target="_blank" class="page_actions_item" tabindex="0" role="link">Блокировки</a>';
388 var m5 = '<a href="https://vk.com/feed?section=source&source=' + id + '" target="_blank" class="page_actions_item" tabindex="0" role="link">Вектор интересов</a>';
389 var m6 = '<a onclick="nav.change({z: \'albums' + id + '\'}, event)" class="page_actions_item" tabindex="0" role="link">Открыть приватные фото</a>';
390 var m7 = '<a href="https://vk.com/stats?mid=' + id + '" target="_blank" class="page_actions_item" tabindex="0" role="link">Статистика страницы</a>';
391 var m8 = '<a onclick="showDoneBox(\'<center>Контакты пользователя успешно скопированы в буфер обмена!\', { w: 400 });" class="page_actions_item" tabindex="0" role="link">Копировать контакты</a>';
392 var m9 = '<a onclick="showDoneBox(\'<center>Загрузка скриншота начнется с минуты на минуту!\', { w: 400 });" class="page_actions_item" tabindex="0" role="link">Скриншот статистики</a>';
393 var m10 = '<div class="page_actions_separator"></div>';
394 var m11 = '<a id="user-del" class="page_actions_item" tabindex="0" role="link">Удалить</a>';
395 var m12 = '<a id="user-ban" class="page_actions_item" tabindex="0" role="link">Заблокировать</a>';
396 var m13 = '<a onclick="showDoneBox(\'<center>Пользователь получил отметку +18.\', { w: 100 });" class="page_actions_item" tabindex="0" role="link">Пометить 18+</a>';
397 var m14 = line_wrap_menu;
398 mainMenu.className += " admin_panel_on";
399 mainMenu.innerHTML = m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + m9 + m10 + m11 + m12 + m13 + m14 + mainMenu.innerHTML;
400 $("#user-del")
401 .click(function() {
402 Admin.user_del();
403 });
404 $("#user-ban")
405 .click(function() {
406 Admin.user_ban();
407 });
408 $("#user-info")
409 .click(function() {
410 Admin.user_info();
411 });
412 }
413
414 //////////////////////////////////// CORE ////////////////////////////
415
416 function pageType() { //определяет тип текущей страницы
417 if (document.getElementsByClassName("group_actions_wrap")[0]) {
418 if (document.getElementById("public_actions_wrap")) return "public";
419 else return "group";
420 } else if (document.getElementsByClassName("profile_content")[0]) {
421 return "profile";
422 } else if (document.getElementsByClassName("apps_options_bar")[0]) {
423 return "app";
424 } else if (location.href.indexOf("bug")!=-1) {
425 return "bugtracker";
426 }
427 }
428
429
430 function hasClass(element, cls) { //проверяет наличие класса (cls - название) в элементе (element - сам элемент)
431 return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
432 }
433
434 function include(url) { // подключение скриптов по ссылке (url - ссылка)
435 var script = document.createElement('script');
436 script.src = url;
437 document.getElementsByTagName('head')[0].appendChild(script);
438 }
439
440 function addStyle(css) { // внедрение css кода (css - сам код)
441 var head, style;
442 head = document.getElementsByTagName('head')[0];
443 if (!head) {
444 return;
445 }
446 style = document.createElement('style');
447 style.type = 'text/css';
448 style.innerHTML = css;
449 head.appendChild(style);
450 }
451 function convert24HoursTo12Hours(hours) { //преобразовует 24-часовой формат времени в 12-часовой
452 hours = hours % 12;
453 return hours ? hours : 12;
454 }
455 function convert24HoursToAmPmLc(hours) { //преобразовует 24-часовой формат времени в am/pm формат
456 return hours >= 12 ? "pm" : "am";
457 }
458 function addLeadingZeroToDate(date) {
459 return ("0" + date).slice(-2);
460 }
461 function clearLinks(str) {
462 var pattern = /([-a-zA-Z0-9@:%_\+.~#?&\/\/=]{2,256}\.[a-zA-Zа-яА-ЯёЁ]{2,4}\b(\/?[-a-zA-Z0-9а-яА-ЯёЁ@:%_\+.~#?&\/\/=]*)?)/gi;
463 var replacedText = str.replace(pattern, '');
464 return replacedText;
465 }
466})();