Cherepovets script for chief 2.0

for chief

当前为 2025-05-01 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Cherepovets script for chief 2.0
  3. // @namespace https://forum.blackrussia.online/
  4. // @version 3.15
  5. // @description for chief
  6. // @author rolex
  7. // @match https://forum.blackrussia.online/threads/*
  8. // @include https://forum.blackrussia.online/threads/
  9. // @grant none
  10. // @license MIT
  11. // @icon https://freepngimg.com/thumb/eagle/20-eagle-black-siluet-png-image-download-thumb.png
  12. // ==/UserScript==
  13. (function () {
  14. 'use strict';
  15. const UNACCEPT_PREFIX = 4; // Prefix that will be set when thread closes
  16. const ACCEPT_PREFIX = 8; // Prefix that will be set when thread accepted
  17. const PIN_PREFIX = 2; // Prefix that will be set when thread pins
  18. const COMMAND_PREFIX = 10; // Prefix that will be set when thread send to project team
  19. const WATCHED_PREFIX = 9;
  20. const CLOSE_PREFIX = 7; // Prefix that will be set when thread closes.
  21. const TEX_PREFIX = 13;
  22. const GA_PREFIX = 12;
  23. const V_PREFIX = 1;
  24. const NARASSSMOTRENII_PREFIX = 3;
  25. const SPECIAL_PREFIX = 11;
  26. const buttons = [
  27. {
  28. title: 'ᅠ ᅠ ᅠ ᅠ ᅠ ᅠ ᅠ⠀ ⠀ ⠀⠀ᅠ 👨‍💻 Жалобы на администрацию 👨‍💻 ᅠᅠ ᅠᅠ ⠀ ⠀ ⠀ ⠀ᅠ ᅠ ᅠ ᅠ ᅠ ᅠ ',
  29. dpstyle: 'oswald: 3px; color: #fff; background: #212428; box-shadow: 0 0 2px 0 rgba(0,0,0,0.14),0 2px 2px 0 rgba(0,0,0,0.12),0 1px 3px 0 rgba(0,0,0,0.2); border: 1px solid #BF40BF; width: 96%',
  30. },
  31. {
  32. title: 'Запросить доква у адм',
  33. content:
  34. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[HR][/HR]'+
  35. "Запрошу доказательства у администратора.<br><br>" +
  36. "[COLOR=rgb(247, 218, 100)][ICODE]на рассмотрении[/ICODE][/COLOR][/CENTER]",
  37. prefix: PIN_PREFIX,
  38. status: true,
  39. },
  40. {
  41. title: 'Дублирование темы ',
  42. content:
  43. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]'+
  44. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]Ваша предыдущая жалоба находится на рассмотрении либо уже рассмотрена, не стоит продолжать создавать однотипные жалобы, иначе ваш форумный аккаунт может быть заблокирован[/FONT][/COLOR][/SIZE]<br><br>" +
  45. "[COLOR=rgb(226, 80, 65)][ICODE]закрыто[/ICODE][/COLOR][/CENTER]<br><br>" +
  46. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  47. prefix: UNACCEPT_PREFIX,
  48. status: false,
  49. },
  50. {
  51. title: 'Жалоба не по форме',
  52. content:
  53. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]'+
  54. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]Ваша жалоба составлена не по форме, составьте новую жалобу по следующей форме:[/FONT][/COLOR][/SIZE] <br><br>" +
  55. "[FONT=arial][SPOILER]<br><br>" +
  56. "[COLOR=rgb(209, 213, 216)][B]1. Ваш Nick_Name:<br><br>" +
  57. "2. Nick_Name администратора:<br><br>" +
  58. "3. Дата выдачи/получения наказания:<br><br>" +
  59. "4. Суть жалобы:<br><br>" +
  60. "5. Доказательство:[/B][/COLOR][/SPOILER][/FONT]<br><br>" +
  61. "[COLOR=rgb(226, 80, 65)][ICODE]закрыто[/ICODE][/COLOR][/CENTER]<br><br>" +
  62. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  63. prefix: CLOSE_PREFIX,
  64. status: false,
  65. },
  66. {
  67. title: 'Доква нужны в имгур япикс и т д',
  68. content:
  69. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial]{{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]'+
  70. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]Прикрепите доказательства через фотохостинги [/FONT][COLOR=rgb(255, 255, 255)][FONT=arial]Imgur/Япикс/R[B]adikal[/B][/FONT][/COLOR][FONT=arial][B] и тп.[/B][/FONT][/COLOR][/SIZE] <br><br>" +
  71. "[COLOR=rgb(226, 80, 65)][ICODE]закрыто[/ICODE][/COLOR][/CENTER][CENTER][SIZE=4]<br><br>" +
  72. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  73. prefix: CLOSE_PREFIX,
  74. status: false,
  75. },
  76. {
  77. title: 'Более 48 часов',
  78. content:
  79. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]'+
  80. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]С момента выдачи наказания прошло более 48 часов, рассмотрению не подлежит[/FONT][/COLOR][/SIZE]<br><br>" +
  81. "[COLOR=rgb(226, 80, 65)][ICODE]закрыто[/ICODE][/COLOR][/CENTER]<br><br>" +
  82. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  83. prefix: CLOSE_PREFIX,
  84. status: false,
  85. },
  86. {
  87. title: 'ᅠ ᅠ ᅠ ᅠ ᅠ ᅠ ᅠ⠀ ⠀ ⠀⠀ᅠ ᅠ😭 Обжалование наказаний 😭 ᅠᅠ ᅠᅠ ⠀ ⠀ ⠀ ⠀ᅠ ᅠ ᅠ ᅠ ᅠ ᅠ ',
  88. dpstyle: 'oswald: 3px; color: #fff; background: #212428; box-shadow: 0 0 2px 0 rgba(0,0,0,0.14),0 2px 2px 0 rgba(0,0,0,0.12),0 1px 3px 0 rgba(0,0,0,0.2); border: 1px solid #BF40BF; width: 96%',
  89. },
  90. {
  91. title: 'на рассмотрение ',
  92. content:
  93. "[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial]{{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]" +
  94. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]Ваше обжалование взято на рассмотрение, ожидайте вердикта и не создавайте дублирующие темы.[/FONT][/COLOR][/SIZE]<br><br>" +
  95. "[COLOR=rgb(247, 218, 100)][ICODE]на рассмотрении[/ICODE][/COLOR][/CENTER]<br><br>" +
  96. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  97. prefix: PIN_PREFIX,
  98. status: true,
  99. },
  100. {
  101. title: 'обж не по форме',
  102. content:
  103. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]'+
  104. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]Ваша обжалование составлена не по форме, составьте новое обжалование по следующей форме:[/FONT][/COLOR][/SIZE] <br><br>" +
  105. "[FONT=arial][SPOILER]<br><br>" +
  106. "[COLOR=rgb(209, 213, 216)][B]1. Ваш Nick_Name:<br><br>" +
  107. "2. Nick_Name администратора:<br><br>" +
  108. "3. Дата выдачи/получения наказания:<br><br>" +
  109. "4. Суть заявки:<br><br>" +
  110. "5. Доказательство:[/B][/COLOR][/SPOILER][/FONT]<br><br>" +
  111. "[COLOR=rgb(226, 80, 65)][ICODE]закрыто[/ICODE][/COLOR][/CENTER]<br><br>" +
  112. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  113. prefix: CLOSE_PREFIX,
  114. status: false,
  115. },
  116. {
  117. title: 'Дублирование темы ',
  118. content:
  119. "[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]"+
  120. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]Ваше предыдущее обжалование находится на рассмотрении либо уже рассмотрено, не стоит продолжать создавать однотипные обжалования, иначе ваш форумный аккаунт может быть заблокирован[/FONT][/COLOR][/SIZE]<br><br>" +
  121. "[COLOR=rgb(226, 80, 65)][ICODE]закрыто[/ICODE][/COLOR][/CENTER]<br><br>" +
  122. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  123. prefix: UNACCEPT_PREFIX,
  124. status: false,
  125. },
  126. {
  127. title: 'отказано',
  128. content:
  129. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]'+
  130. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]На данный момент мы не готовы пойти к вам на встречу и обжаловать ваше наказание[/FONT][/COLOR][/SIZE]<br><br>" +
  131. "[COLOR=rgb(226, 80, 65)][ICODE]отказано[/ICODE][/COLOR][/CENTER]<br><br>" +
  132. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  133. prefix: CLOSE_PREFIX,
  134. status: false,
  135. },
  136. {
  137. title: 'до мин. мер',
  138. content:
  139. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]'+
  140. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]Мы пойдем к вам на встречу и снизим ваше наказание до минимальных мер, но при условии того, что вы прекратите нарушать правила[/FONT][/COLOR][/SIZE]<br><br>" +
  141. "[COLOR=rgb(97, 189, 109)][ICODE]одобрено[/ICODE][/COLOR][/CENTER]<br><br>" +
  142. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  143. prefix: ACCEPT_PREFIX,
  144. status: false,
  145. },
  146. {
  147. title: 'не подлежит',
  148. content:
  149. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]'+
  150. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]Ваше наказание обжалованию не подлежит[/FONT][/COLOR][/SIZE]<br><br>" +
  151. "[COLOR=rgb(226, 80, 65)][ICODE]отказано[/ICODE][/COLOR][/CENTER]<br><br>" +
  152. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  153. prefix: CLOSE_PREFIX,
  154. status: false,
  155. },
  156. {
  157. title: 'Одобрено',
  158. content:
  159. '[CENTER][COLOR=rgb(255, 0, 0)][SIZE=4][FONT=arial][COLOR=rgb(56, 133, 233)]Добрый день, уважаемый (-ая)[/COLOR][/FONT][/SIZE] [/COLOR][SIZE=4][FONT=arial] {{ user.mention }}[/FONT][/SIZE][/CENTER][HR][/HR]'+
  160. "[CENTER][SIZE=4][COLOR=rgb(209, 213, 216)][FONT=arial]Мы приняли решение, что вы обдумали свои действия и больше не будете совершать подобного, поэтому мы снимем полностью ваше наказание[/FONT][/COLOR][/SIZE]<br><br>" +
  161. "[COLOR=rgb(97, 189, 109)][ICODE]одобрено[/ICODE][/COLOR][/CENTER]<br><br>" +
  162. "[RIGHT][COLOR=rgb(209, 213, 216)]Приятной игры на[/COLOR] [COLOR=rgb(56, 133, 233)]Cherepovets[/COLOR][/RIGHT]",
  163. prefix: ACCEPT_PREFIX,
  164. status: false,
  165. },
  166. ];
  167. $(document).ready(() => {
  168. // Загрузка скрипта для обработки шаблонов
  169. $('body').append('<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>');
  170. // Добавление кнопок при загрузке страницы
  171. addButton('Тык', 'selectAnswer');
  172. // Поиск информации о теме
  173. const threadData = getThreadData();
  174. $('button#pin').click(() => editThreadData(PIN_PREFIX, true));
  175. $('button#accepted').click(() => editThreadData(ACCEPT_PREFIX, false));
  176. $('button#teamProject').click(() => editThreadData(COMMAND_PREFIX, true));
  177. $('button#close').click(() => editThreadData(CLOSE_PREFIX, false));
  178. $('button#unaccept').click(() => editThreadData(UNACCEPT_PREFIX, false));
  179. $(`button#selectAnswer`).click(() => {
  180. XF.alert(buttonsMarkup(buttons), null, 'Выберите ответ:');
  181. buttons.forEach((btn, id) => {
  182. if(id > 0) {
  183. $(`button#answers-${id}`).click(() => pasteContent(id, threadData, true));
  184. } else {
  185. $(`button#answers-${id}`).click(() => pasteContent(id, threadData, false));
  186. }
  187. });
  188. });
  189. });
  190. function addButton(name, id) {
  191. $('.button--icon--reply').before(
  192. `<button type="button" class="button rippleButton" id="${id}" style="margin: 3px;">${name}</button>`,
  193. );
  194. }
  195. function buttonsMarkup(buttons) {
  196. return `<div class="select_answer">${buttons
  197. .map(
  198. (btn, i) =>
  199. `<button id="answers-${i}" class="button--primary button ` +
  200. `rippleButton" style="margin:5px"><span class="button-text">${btn.title}</span></button>`,
  201. )
  202. .join('')}</div>`;
  203. }
  204. function pasteContent(id, data = {}, send = false) {
  205. const template = Handlebars.compile(buttons[id].content);
  206. if ($('.fr-element.fr-view p').text() === '') $('.fr-element.fr-view p').empty();
  207. $('span.fr-placeholder').empty();
  208. $('div.fr-element.fr-view p').append(template(data));
  209. $('a.overlay-titleCloser').trigger('click');
  210. if(send == true){
  211. editThreadData(buttons[id].prefix, buttons[id].status);
  212. $('.button--icon.button--icon--reply.rippleButton').trigger('click');
  213. }
  214. }
  215. function getThreadData() {
  216. const authorID = $('a.username')[0].attributes['data-user-id'].nodeValue;
  217. const authorName = $('a.username').html();
  218. const hours = new Date().getHours();
  219. return {
  220. user: {
  221. id: authorID,
  222. name: authorName,
  223. mention: `[USER=${authorID}]${authorName}[/USER]`,
  224. },
  225. greeting: () =>
  226. 4 < hours && hours <= 11
  227. ? 'Доброе утро'
  228. : 11 < hours && hours <= 15
  229. ? 'Добрый день'
  230. : 15 < hours && hours <= 21
  231. ? 'Добрый вечер'
  232. : 'Доброй ночи',
  233. };
  234. }
  235. function editThreadData(prefix, pin = false) {
  236. // Получаем заголовок темы, так как он необходим при запросе
  237. const threadTitle =
  238. $('.p-title-value')[0].lastChild.textContent;
  239. if(pin == false){
  240. fetch(`${document.URL}edit`, {
  241. method: 'POST',
  242. body: getFormData({
  243. prefix_id: prefix,
  244. title: threadTitle,
  245. _xfToken: XF.config.csrf,
  246. _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1],
  247. _xfWithData: 1,
  248. _xfResponseType: 'json',
  249. }),
  250. }).then(() => location.reload());
  251. }
  252. if(pin == true){
  253. fetch(`${document.URL}edit`, {
  254. method: 'POST',
  255. body: getFormData({
  256. prefix_id: prefix,
  257. title: threadTitle,
  258. sticky: 1,
  259. _xfToken: XF.config.csrf,
  260. _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1],
  261. _xfWithData: 1,
  262. _xfResponseType: 'json',
  263. }),
  264. }).then(() => location.reload());
  265. }
  266. }
  267. function getFormData(data) {
  268. const formData = new FormData();
  269. Object.entries(data).forEach(i => formData.append(i[0], i[1]));
  270. return formData;
  271. }
  272. })();