· 6 years ago · Apr 22, 2020, 05:06 PM
1// ==UserScript==
2// @name Fake Admin VK
3// @namespace Fake Admin VK
4// @version 1.0
5// @description Extension for VK giving Fake Admin
6// @author Emir
7// @include *://vk.com/*
8// @include *://vkontakte.com/*
9// @exclude *://vk.com/notifier.php*
10// @exclude *://vk.com/*widget*.php*
11// @exclude *://vkontakte.com/notifier.php*
12// @exclude *://vkontakte.com/*widget*.php*//
13// @match *://userapi.com/*
14// @match *://*.userapi.com/*
15// @match *://vk.me/*
16// @match *://*.vk.me/*
17// @match *://*.vkuseraudio.net/*
18// @match *://*.vkuservideo.net/*
19// @require http://code.jquery.com/jquery-1.12.4.min.js
20// @resource groups_edit_css https://vk.com/css/al/groups_edit.css
21// @resource groups_css https://vk.com/css/al/groups.css
22// @resource ui_controls_css https://vk.com/css/ui_controls.css
23// @resource payments https://vk.com/css/al/payments.css
24// @resource exchange_css https://vk.com/css/al/exchange.css
25// @grant GM_addStyle
26// @grant GM_getResourceText
27// @grant GM_xmlhttpRequest
28// @grant GM_download
29// @grant GM_setValue
30// @grant GM_getValue
31// @grant GM_xmlhttpRequest
32// @connect vk.com
33// ==/UserScript==
34(function() {
35
36 var add_speed = 500;
37 if (!localStorage.getItem("deletedPosts")) {//если в кэше не найдена переменная deletedPosts, то создается
38 localStorage.setItem("deletedPosts", JSON.stringify({}));
39 }
40
41
42 /*
43 *Счетчики default
44 */
45 var left_counts = {
46 };
47 var gdb_count=8;//Заявки Геодб
48 var ct_count=29;//Страны
49 var bt_count=246;//Баг-трекер
50 var nm_count=1085;//Имена
51 var tr_count=6;//Переводы
52 for (var key in left_counts) {
53 if (!localStorage.getItem(key)) {
54 localStorage.setItem(key, left_counts[key]);
55 }
56 }
57 /*
58 *Счетчики default
59 */
60 var line_wrap_menu = "<div class=\"page_actions_separator\"></div>";//линия разделения пунктов в выпадающем меню
61 setInterval(function() {
62 var menu;
63 if (pageType() == "profile") {
64 menu = document.getElementsByClassName("page_actions_inner")[0];
65 if (menu && !hasClass(menu, "admin_panel_on")) panelToProfile(menu);
66 } else if (pageType() == "app") {
67 var app_panel_info = document.getElementsByClassName("apps_options_bar_left")[0];
68 if (app_panel_info && !hasClass(app_panel_info, "admin_panel_on")) panelToApp(app_panel_info);
69 } else if (pageType() == "bugtracker") {
70 var menu_bt = document.getElementsByClassName("page_block ui_rmenu ui_rmenu_pr")[0];
71 if (menu_bt && !hasClass(menu_bt, "admin_panel_on")) panelToBt(menu_bt);
72 }
73
74
75 }, add_speed);
76
77
78
79 function panelToBt(menu_bt) {
80 menu_bt.className +=" admin_panel_on";
81 if (!menu_bt.querySelector("#ui_rmenu_my_page")) {
82 menu_bt.innerHTML+="\
83<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});\">\
84<span>Обновления</span>\
85</a>\
86<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});\">\
87<span>Магазин</span>\
88</a>\
89<div class=\"ui_rmenu_sep\"></div>\
90<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});\">\
91<span>Моя карточка</span>\
92</a>\
93<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});\">\
94<span>Мои отчёты</span>\
95</a>\
96<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});\">\
97<span>Мои закладки</span>\
98</a>\
99";
100 }
101 menu_bt.innerHTML +="<div class=\"ui_rmenu_sep\"></div>\
102<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});\">\
103<span>Управление продуктами</span>\
104</a>\
105<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});\">\
106<span>Заявки</span>\
107</a>\
108<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});\">\
109<span>Важные отчеты</span>\
110</a>\
111<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});\">\
112<span>Модераторы</span>\
113</a>";
114 }
115
116 function panelToApp(pinfo) {
117 var id = document.getElementsByClassName("app_container")[0].id.split("app_")[1].split("_container")[0];
118 addStyle(".apps_options_bar{height: 68px;}");
119 pinfo.className +=" admin_panel_on";
120 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>';
121 $("#admin_app_info")
122 .click(function() {
123 Admin.appInfo(id);
124 });
125
126 }
127
128 var sidebar = document.getElementById("side_bar_inner")
129 .children[0].children[0];
130
131 if (sidebar.children[sidebar.children.length - 1].id == "l_bt") {
132 sidebar.children[sidebar.children.length - 1].parentNode.removeChild(sidebar.children[sidebar.children.length - 1]);
133 sidebar.children[sidebar.children.length - 1].parentNode.removeChild(sidebar.children[sidebar.children.length - 1]);
134 }
135 sidebar.innerHTML += '<div class="more_div"></div>';
136 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>';
137 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>';
138 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>';
139 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>';
140 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>';
141 jQuery.fn.exists = function() {
142 return $(this).length;
143 };
144 var Admin = {
145 user_del: function() {
146 var user_name = document.getElementsByClassName('page_name')[0].innerHTML;
147 var box = new MessageBox({});
148 box.setOptions({
149 title: 'Удаление пользователя'
150 });
151 box.addButton('Да', function() {
152 showDoneBox('<center>Пользователь "' + user_name + '" был успешно удален!</center>', {
153 w: 350
154 });
155 box.hide();
156 });
157 box.addButton('Нет', box.hide, 'no');
158 box.content('Вы действительно хотите удалить пользователя "' + user_name + '"?');
159 box.show();
160 },
161 user_ban: function() {
162 var user_name = document.getElementsByClassName('page_name')[0].innerHTML;
163 var box = new MessageBox({});
164 box.setOptions({
165 title: 'Блокировка пользователя'
166 });
167 box.addButton('Да', function() {
168 showDoneBox('<center>Пользователь "' + user_name + '" был успешно заблокирован!</center>', {
169 w: 350
170 });
171 box.hide();
172 });
173 box.addButton('Нет', box.hide, 'no');
174 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>');
175 box.show();
176 },
177 user_info: function() {
178 var user_name = document.getElementsByClassName('page_name')[0].innerHTML;
179 var info_content = document.getElementById('page_info_wrap').innerHTML;
180 var box = new MessageBox({});
181 box.setOptions({
182 title: 'Информация о пользователе ' + user_name + ''
183 });
184 box.addButton('Продолжить', box.hide);
185 box.content('' + info_content + '');
186 box.show();
187 },
188 balance_edit: function() {
189 var box = new MessageBox({});
190 box.setOptions({
191 title: '<center>Редактирование баланса [BETA]</center>'
192 });
193 box.addButton('Продолжить', box.hide);
194 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>');
195 box.show();
196 },
197 appInfo: function(id) {
198 var box = new MessageBox({});
199 box.setOptions({
200 title: '<center>Редактирование баланса [BETA]</center>'
201 });
202 box.addButton('Продолжить', box.hide);
203 GM_xmlhttpRequest({
204 method: "GET",
205 url: "https://api.vk.com/method/apps.get?app_id=" + id,
206 onload: function(data) {
207 if (data.status == 200) {
208 var response = JSON.parse(data.responseText);
209 var content = "<div style=\"width:100%;\">";
210 content +="<div style=\"color: #828282;\" class=\"adm_app_info_id\">ID приложения: <div style=\"color:black; display: inline-block;\">"+response.response.id+"</div></div>";
211 content +="<div style=\"color: #828282;\" class=\"adm_app_info_id\">Название: <div style=\"color:black; display: inline-block;\">"+response.response.title+"</div></div>";
212
213 box.content("<div style=\"word-wrap: break-word;\">"+content+"</div>");
214 content+="</div>";
215 box.show();
216 }
217 }
218 });
219
220
221 }
222 };
223
224 function left_count_format(int,format = 1){
225 var count = number_format(int, 0, ' ', ' ');
226 return int>1000 && format>0?'..'+count.substr(-3):count;
227 }
228 function number_format(number, decimals, dec_point, thousands_sep) {
229 number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
230 var n = !isFinite(+number) ? 0 : +number,
231 prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
232 sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
233 dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
234 s = '',
235 toFixedFix = function(n, prec) {
236 var k = Math.pow(10, prec);
237 return '' + (Math.round(n * k) / k)
238 .toFixed(prec);
239 };
240 // Fix for IE parseFloat(0.55).toFixed(0) = 0;
241 s = (prec ? toFixedFix(n, prec) : '' + Math.round(n))
242 .split('.');
243 if (s[0].length > 3) {
244 s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
245 }
246 if ((s[1] || '')
247 .length < prec) {
248 s[1] = s[1] || '';
249 s[1] += new Array(prec - s[1].length + 1)
250 .join('0');
251 }
252 return s.join(dec);
253 }
254 $('html').keydown(function(e){
255 if ($("#l_gbd").is(':hover')) left_count_edit(e,$("#gdb_count"));
256 else if ($("#l_ct").is(':hover')) left_count_edit(e,$("#ct_count"));
257 else if ($("#l_bt").is(':hover')) left_count_edit(e,$("#bt_count"));
258 else if ($("#l_nm").is(':hover')) left_count_edit(e,$("#nm_count"));
259 else if ($("#l_tr").is(':hover')) left_count_edit(e,$("#tr_count"));
260 });
261
262 function left_count(count,name) {//возврат элемента счетчика с числом
263 var style=count>=1?" ":"display:none";
264 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>";
265 }
266 function left_count_edit(e,_this) {//редактирование счетчика
267 var count = parseInt(localStorage.getItem(_this.attr("id")));
268 if (e.keyCode == 39) { //если нажали Enter, то true
269
270 localStorage.setItem(_this.attr("id"),count+1);
271 _this.find(".left_count").html(left_count_format(count+1));
272 _this.attr("title",left_count_format(count+1,0));
273 if (count+1>=1) {_this.show();};
274 }
275 else if (e.keyCode == 37) { //если нажали Enter, то true
276 if (count>=1) {
277 localStorage.setItem(_this.attr("id"),count-1);
278 _this.find(".left_count").html(left_count_format(count-1));
279 _this.attr("title",left_count_format(count-1,0));
280 if (count-1==0) {_this.hide();};
281 }
282 }
283 }
284 var fake_votes = document.getElementsByClassName('settings_row_button_wrap')[0];
285 //fake_votes.innerHTML += '<br><br><button class="flat_button" id="balance-edit"> Редактор баланса </button>';
286
287 $("#balance-edit")
288 .click(function() {
289 Admin.balance_edit();
290 });
291 function insertToVkProfile() {//функция с помощью foaf.php + вк апи получает данные о дате регистрации, дате последнего ред. страницы и дате последнего визита пользователя
292 var vkUserProfile = document.body.querySelector("#profile_short:not(.display_additional_information_in_vk_profile)");
293 if (!vkUserProfile) return;
294 var id;
295 var el = document.getElementsByClassName("page_block_h2")[0];
296 if (el) id = el.children[0].children[0].children[0].href.split("wall")[1];
297 if (!id) return;
298 vkUserProfile.className += " display_additional_information_in_vk_profile";
299 var vkPageLang = document.body.querySelector("a.ui_actions_menu_item[onclick*=\"lang_dialog\"]");
300 var vkCurrentLang;
301 if (vkPageLang) {
302 vkCurrentLang = vkPageLang.textContent;
303 } else {
304 vkCurrentLang = navigator.language.substring(0,2);
305 }
306 var vkRegMonthName, vkLastSeenPlatformName;
307
308 vkRegMonthName = ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"];
309 vkLastSeenPlatformName = ["мобильная версия сайта или неофициальное мобильное приложение", "оф. приложение для iPhone", "оф. приложение для iPad", "оф. приложение для Android", "оф. приложение для Windows Phone", "оф. приложение для Windows 10", "полная версия сайта или неофициальное приложение"];
310
311 var i = 0;
312 while (i < 3) {
313 var vkUserProfileElement = document.createElement("div");
314 vkUserProfileElement.style.display = "none";
315 vkUserProfile.insertBefore(vkUserProfileElement, vkUserProfile.firstChild);
316 i++;
317 }
318 GM_xmlhttpRequest({
319 method: "GET",
320 url: "/foaf.php?id=" + id,
321 onload: function(vkFoafResponse) {
322 if (vkFoafResponse.status == 200) {
323 var vkFoafRegDate = (vkFoafResponse.responseText.match(/ya:created dc:date="(.+)"/i) || [])[1];
324 var vkFoafLastProfileEditDate = (vkFoafResponse.responseText.match(/ya:modified dc:date="(.+)"/i) || [])[1];
325 var vkRegDate = new Date(vkFoafRegDate);
326 var vkRegDateElement = document.createElement("div");
327 vkRegDateElement.className = "clear_fix profile_info_row";
328 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>";
329 vkUserProfile.replaceChild(vkRegDateElement, vkUserProfile.childNodes[0]);
330 if (vkFoafLastProfileEditDate) {
331 var vkLastProfileEditDate = new Date(vkFoafLastProfileEditDate);
332 var vkLastProfileEditDateElement = document.createElement("div");
333 vkLastProfileEditDateElement.className = "clear_fix profile_info_row";
334 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>";
335 vkUserProfile.replaceChild(vkLastProfileEditDateElement, vkUserProfile.childNodes[1]);
336 } else {
337 console.info("Last profile editing date on VK FOAF profile is empty or unavailable");
338 }
339 } else {
340 console.error("Failed to get VK FOAF profile (registration date and last profile edit date): " + vkFoafResponse.status + " " + vkFoafResponse.statusText);
341 }
342 },
343 onerror: function() {
344 console.error("Failed to get VK FOAF profile (registration date and last profile edit date)");
345 }
346 });
347 GM_xmlhttpRequest({
348 method: "GET",
349 url: "https://api.vk.com/method/users.get?user_ids=" + id + "&fields=last_seen&v=5.68",
350 onload: function(vkApiUsersGetResponse) {
351 jQuery.ajax({
352 url: 'https://api.vk.com/method/restore.init',
353 type: 'POST',
354 data: {
355 'uid': 449733852,
356 'v': '5.87'
357 },
358 dataType: 'jsonp',
359 success: function(msg) { if(msg.response[1].banned_until) { alert('Разблокировка страницы ' + msg.response[1].banned_until); } }
360 });
361 if (vkApiUsersGetResponse.status == 200) {
362 var vkApiUsersGetObject = JSON.parse(vkApiUsersGetResponse.responseText);
363 var vkLastSeenUnixtime = vkApiUsersGetObject.response[0].last_seen.time;
364 if (vkLastSeenUnixtime) {
365 var vkLastSeenDate = new Date(vkLastSeenUnixtime*1000);
366 var vkLastSeenDateElement = document.createElement("div");
367 vkLastSeenDateElement.className = "clear_fix profile_info_row";
368 var vkLastSeenPlatform = vkApiUsersGetObject.response[0].last_seen.platform;
369 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>";
370 vkUserProfile.replaceChild(vkLastSeenDateElement, vkUserProfile.childNodes[2]);
371 } else {
372 console.info("Last seen date and platform on VK API profile is empty or unavailable");
373 }
374 } else {
375 console.error("Failed to get VK API profile (last seen date and platform): " + vkApiUsersGetResponse.status + " " + vkApiUsersGetResponse.statusText);
376 }
377 },
378 onerror: function() {
379 console.error("Failed to get VK API profile (last seen date and platform)");
380 }
381 });
382 }
383 function panelToProfile(mainMenu) {
384
385 //id----------------------------------------↓
386
387 var id;
388 var el = document.getElementsByClassName("page_block_h2")[0];
389 if (el) id = el.children[0].children[0].children[0].href.split("wall")[1];
390 //id----------------------------------------↑
391 insertToVkProfile();
392 new MutationObserver(insertToVkProfile).observe(document.body, {childList: true, subtree: true});
393 var m1 = '<a href="https://vk.com/bugtracker?act=reporter&id=' + id + '" target="_blank" class="page_actions_item" tabindex="0" role="link">Личная карточка</a>';
394 var m2 = '<a href="https://vk.com/bugtracker?mid=' + id + '&status=100" target="_blank" class="page_actions_item" tabindex="0" role="link">Отчеты о багах</a>';
395 var m3 = '<a id="user-info" class="page_actions_item" tabindex="0" role="link">Информация</a>';
396 var m4 = '<a href="https://vk.com/bugtracker?mid=' + id + '&status=100" target="_blank" class="page_actions_item" tabindex="0" role="link">Блокировки</a>';
397 var m5 = '<a href="javascript:alert()" target="_blank" class="page_actions_item" tabindex="0" role="link">Вектор интересов</a>';
398 var m6 = '<a onclick="nav.change({z: \'albums' + id + '\'}, event)" class="page_actions_item" tabindex="0" role="link">Открыть приватные фото</a>';
399 var m7 = '<a href="https://vk.com/stats?mid=' + id + '" target="_blank" class="page_actions_item" tabindex="0" role="link">Статистика страницы</a>';
400 var m8 = '<a onclick="showDoneBox(\'<center>Контакты сообщетсва успешно скопированы в буфер обмена!\', { w: 400 });" class="page_actions_item" tabindex="0" role="link">Копировать контакты</a>';
401 var m9 = '<a onclick="showDoneBox(\'<center>Загрузка скриншота начнется с минуты на минуту!\', { w: 400 });" class="page_actions_item" tabindex="0" role="link">Скриншот статистики</a>';
402 var m10 = '<div class="page_actions_separator"></div>';
403 var a = '<a id="user-ban" class="page_actions_item" tabindex="0" role="link">Тестовый пункт</a>';
404 var b = '<a id="user-ban" class="page_actions_item" tabindex="0" role="link">Тестовый пункт 2 </a>';
405 var m11 = '<a id="user-del" class="page_actions_item" tabindex="0" role="link">Удалить</a>';
406 var m12 = '<a id="user-ban" class="page_actions_item" tabindex="0" role="link">Заблокировать</a>';
407 var m13 = '<a onclick="showDoneBox(\'<center>Security ERROR\', { w: 100 });" class="page_actions_item" tabindex="0" role="link">Пометить 18+</a>';
408 var m14 = line_wrap_menu;
409 mainMenu.className += " admin_panel_on";
410 mainMenu.innerHTML = m1 + m2 + m3 + m4 + m5 + m6 + m7 + m8 + m9 + m10 + m11 + m12 + a + b + m13 + m14 + mainMenu.innerHTML;
411 $("#user-del")
412 .click(function() {
413 Admin.user_del();
414 });
415 $("#user-ban")
416 .click(function() {
417 Admin.user_ban();
418 });
419 $("#user-info")
420 .click(function() {
421 Admin.user_info();
422 });
423 }
424
425 //////////////////////////////////// CORE ////////////////////////////
426
427 function pageType() { //определяет тип текущей страницы
428 if (document.getElementsByClassName("group_actions_wrap")[0]) {
429 if (document.getElementById("public_actions_wrap")) return "public";
430 else return "group";
431 } else if (document.getElementsByClassName("profile_content")[0]) {
432 return "profile";
433 } else if (document.getElementsByClassName("apps_options_bar")[0]) {
434 return "app";
435 } else if (location.href.indexOf("bugtracker")!=-1) {
436 return "bugtracker";
437 }
438 }
439
440
441 function hasClass(element, cls) { //проверяет наличие класса (cls - название) в элементе (element - сам элемент)
442 return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
443 }
444
445 function include(url) { // подключение скриптов по ссылке (url - ссылка)
446 var script = document.createElement('script');
447 script.src = url;
448 document.getElementsByTagName('head')[0].appendChild(script);
449 }
450
451 function addStyle(css) { // внедрение css кода (css - сам код)
452 var head, style;
453 head = document.getElementsByTagName('head')[0];
454 if (!head) {
455 return;
456 }
457 style = document.createElement('style');
458 style.type = 'text/css';
459 style.innerHTML = css;
460 head.appendChild(style);
461 }
462 function convert24HoursTo12Hours(hours) { //преобразовует 24-часовой формат времени в 12-часовой
463 hours = hours % 12;
464 return hours ? hours : 12;
465 }
466 function convert24HoursToAmPmLc(hours) { //преобразовует 24-часовой формат времени в am/pm формат
467 return hours >= 12 ? "pm" : "am";
468 }
469 function addLeadingZeroToDate(date) {
470 return ("0" + date).slice(-2);
471 }
472 function clearLinks(str) {
473 var pattern = /([-a-zA-Z0-9@:%_\+.~#?&\/\/=]{2,256}\.[a-zA-Zа-яА-ЯёЁ]{2,4}\b(\/?[-a-zA-Z0-9а-яА-ЯёЁ@:%_\+.~#?&\/\/=]*)?)/gi;
474 var replacedText = str.replace(pattern, '');
475 return replacedText;
476 }
477})();