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.11
  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]<br><br>'+
  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]<br><br>'+
  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]<br><br>'+
  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]<br><br>'+
  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]<br><br>'+
  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]<br><br>" +
  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]<br><br>'+
  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]<br><br>'+
  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]<br><br>'+
  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]<br><br>'+
  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. $(document).ready(() => {
  148. // Загрузка скрипта для обработки шаблонов
  149. $('body').append('<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>');
  150. // Добавление кнопок при загрузке страницы
  151. addButton('Тык', 'selectAnswer');
  152. // Поиск информации о теме
  153. const threadData = getThreadData();
  154. $('button#pin').click(() => editThreadData(PIN_PREFIX, true));
  155. $('button#accepted').click(() => editThreadData(ACCEPT_PREFIX, false));
  156. $('button#teamProject').click(() => editThreadData(COMMAND_PREFIX, true));
  157. $('button#close').click(() => editThreadData(CLOSE_PREFIX, false));
  158. $('button#unaccept').click(() => editThreadData(UNACCEPT_PREFIX, false));
  159. $(`button#selectAnswer`).click(() => {
  160. XF.alert(buttonsMarkup(buttons), null, 'Выберите ответ:');
  161. buttons.forEach((btn, id) => {
  162. if(id > 0) {
  163. $(`button#answers-${id}`).click(() => pasteContent(id, threadData, true));
  164. } else {
  165. $(`button#answers-${id}`).click(() => pasteContent(id, threadData, false));
  166. }
  167. });
  168. });
  169. });
  170. function addButton(name, id) {
  171. $('.button--icon--reply').before(
  172. `<button type="button" class="button rippleButton" id="${id}" style="margin: 3px;">${name}</button>`,
  173. );
  174. }
  175. function buttonsMarkup(buttons) {
  176. return `<div class="select_answer">${buttons
  177. .map(
  178. (btn, i) =>
  179. `<button id="answers-${i}" class="button--primary button ` +
  180. `rippleButton" style="margin:5px"><span class="button-text">${btn.title}</span></button>`,
  181. )
  182. .join('')}</div>`;
  183. }
  184. function pasteContent(id, data = {}, send = false) {
  185. const template = Handlebars.compile(buttons[id].content);
  186. if ($('.fr-element.fr-view p').text() === '') $('.fr-element.fr-view p').empty();
  187. $('span.fr-placeholder').empty();
  188. $('div.fr-element.fr-view p').append(template(data));
  189. $('a.overlay-titleCloser').trigger('click');
  190. if(send == true){
  191. editThreadData(buttons[id].prefix, buttons[id].status);
  192. $('.button--icon.button--icon--reply.rippleButton').trigger('click');
  193. }
  194. }
  195. function getThreadData() {
  196. const authorID = $('a.username')[0].attributes['data-user-id'].nodeValue;
  197. const authorName = $('a.username').html();
  198. const hours = new Date().getHours();
  199. return {
  200. user: {
  201. id: authorID,
  202. name: authorName,
  203. mention: `[USER=${authorID}]${authorName}[/USER]`,
  204. },
  205. greeting: () =>
  206. 4 < hours && hours <= 11
  207. ? 'Доброе утро'
  208. : 11 < hours && hours <= 15
  209. ? 'Добрый день'
  210. : 15 < hours && hours <= 21
  211. ? 'Добрый вечер'
  212. : 'Доброй ночи',
  213. };
  214. }
  215. function editThreadData(prefix, pin = false) {
  216. // Получаем заголовок темы, так как он необходим при запросе
  217. const threadTitle =
  218. $('.p-title-value')[0].lastChild.textContent;
  219. if(pin == false){
  220. fetch(`${document.URL}edit`, {
  221. method: 'POST',
  222. body: getFormData({
  223. prefix_id: prefix,
  224. title: threadTitle,
  225. _xfToken: XF.config.csrf,
  226. _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1],
  227. _xfWithData: 1,
  228. _xfResponseType: 'json',
  229. }),
  230. }).then(() => location.reload());
  231. }
  232. if(pin == true){
  233. fetch(`${document.URL}edit`, {
  234. method: 'POST',
  235. body: getFormData({
  236. prefix_id: prefix,
  237. title: threadTitle,
  238. sticky: 1,
  239. _xfToken: XF.config.csrf,
  240. _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1],
  241. _xfWithData: 1,
  242. _xfResponseType: 'json',
  243. }),
  244. }).then(() => location.reload());
  245. }
  246. }
  247. function getFormData(data) {
  248. const formData = new FormData();
  249. Object.entries(data).forEach(i => formData.append(i[0], i[1]));
  250. return formData;
  251. }
  252. })();