From f9cbc4461d2192ade895efb761401f7a906f59d2 Mon Sep 17 00:00:00 2001 From: kozhilya Date: Mon, 27 Mar 2023 16:51:45 +0400 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D1=88?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/april-fools.md | 174 --------------------------------- src/handler.ts | 22 ++--- src/jokes/carnival.ts | 60 ++++++++++++ src/jokes/crazy_letters.ts | 35 +++++++ src/jokes/humanitarian_hell.ts | 30 ++++++ src/jokes/mirror.ts | 25 +++++ src/jokes/shake.ts | 6 +- tsconfig.json | 3 +- 8 files changed, 166 insertions(+), 189 deletions(-) delete mode 100644 docs/april-fools.md create mode 100644 src/jokes/carnival.ts create mode 100644 src/jokes/crazy_letters.ts create mode 100644 src/jokes/humanitarian_hell.ts create mode 100644 src/jokes/mirror.ts diff --git a/docs/april-fools.md b/docs/april-fools.md deleted file mode 100644 index da16f21..0000000 --- a/docs/april-fools.md +++ /dev/null @@ -1,174 +0,0 @@ -## Classes - -
-
AprilFoolsJokeClass
-

Блок обработки перво-апрельских шуток

-
Joke
-

Объект, описывающий шутку

-
ShakeJoke
-

Форумо-трясение

-

Страница форума начинает трястись

-
- -## Members - -
-
AprilFoolsJokeClass
-

Объект хранения шуток

-
Joke
-

Объект, описывающий шутку, которая может быть остановлена

-
- - - -## AprilFoolsJokeClass -

Блок обработки перво-апрельских шуток

- -**Kind**: global class -**Author**: Kozhilya - -* [AprilFoolsJokeClass](#AprilFoolsJokeClass) - * [.add(joke)](#AprilFoolsJokeClass+add) - * [.setSettings(settings)](#AprilFoolsJokeClass+setSettings) - * [.check(chance)](#AprilFoolsJokeClass+check) ⇒ boolean - * [.start(id, forced)](#AprilFoolsJokeClass+start) - * [.startAll()](#AprilFoolsJokeClass+startAll) - - - -### aprilFoolsJokeClass.add(joke) -

Добавление шутки

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) - -| Param | -| --- | -| joke | - - - -### aprilFoolsJokeClass.setSettings(settings) -

Запись новых настроек

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) - -| Param | -| --- | -| settings | - - - -### aprilFoolsJokeClass.check(chance) ⇒ boolean -

Проверка вероятности

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) -**Returns**: boolean -

Флаг срабатывания (true - сработало)

- -| Param | Type | Description | -| --- | --- | --- | -| chance | number |

Вероятность срабатывания

| - - - -### aprilFoolsJokeClass.start(id, forced) -

Запуск шутки

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) - -| Param | Type | Default | -| --- | --- | --- | -| id | | | -| forced | boolean | false | - - - -### aprilFoolsJokeClass.startAll() -

Запуск всех шуток

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) - - -## Joke -

Объект, описывающий шутку

- -**Kind**: global class - - -## ShakeJoke -

Форумо-трясение

-

Страница форума начинает трястись

- -**Kind**: global class -**Author**: Kozhilya - - -## AprilFoolsJokeClass -

Объект хранения шуток

- -**Kind**: global variable - -* [AprilFoolsJokeClass](#AprilFoolsJokeClass) - * [.add(joke)](#AprilFoolsJokeClass+add) - * [.setSettings(settings)](#AprilFoolsJokeClass+setSettings) - * [.check(chance)](#AprilFoolsJokeClass+check) ⇒ boolean - * [.start(id, forced)](#AprilFoolsJokeClass+start) - * [.startAll()](#AprilFoolsJokeClass+startAll) - - - -### aprilFoolsJokeClass.add(joke) -

Добавление шутки

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) - -| Param | -| --- | -| joke | - - - -### aprilFoolsJokeClass.setSettings(settings) -

Запись новых настроек

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) - -| Param | -| --- | -| settings | - - - -### aprilFoolsJokeClass.check(chance) ⇒ boolean -

Проверка вероятности

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) -**Returns**: boolean -

Флаг срабатывания (true - сработало)

- -| Param | Type | Description | -| --- | --- | --- | -| chance | number |

Вероятность срабатывания

| - - - -### aprilFoolsJokeClass.start(id, forced) -

Запуск шутки

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) - -| Param | Type | Default | -| --- | --- | --- | -| id | | | -| forced | boolean | false | - - - -### aprilFoolsJokeClass.startAll() -

Запуск всех шуток

- -**Kind**: instance method of [AprilFoolsJokeClass](#AprilFoolsJokeClass) - - -## Joke -

Объект, описывающий шутку, которая может быть остановлена

- -**Kind**: global variable diff --git a/src/handler.ts b/src/handler.ts index aa68699..0786f1f 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -6,6 +6,16 @@ import { Joke, JokeSettings } from "./joke"; * @author Kozhilya */ export class AprilFoolsJokeClass { + /** + * Проверка вероятности + * + * @param {number} chance Вероятность срабатывания + * @returns {boolean} Флаг срабатывания (true - сработало) + */ + static check(chance: number): boolean { + return Math.random() < 0.01 * chance; + } + /** * Добавление шутки * @@ -29,16 +39,6 @@ export class AprilFoolsJokeClass { } } - /** - * Проверка вероятности - * - * @param {number} chance Вероятность срабатывания - * @returns {boolean} Флаг срабатывания (true - сработало) - */ - check(chance: number): boolean { - return Math.random() < 0.01 * chance; - } - /** * Запуск шутки * @@ -51,7 +51,7 @@ export class AprilFoolsJokeClass { const joke = this.jokes[id]; - if (!forced && !this.check(joke.settings.chance)) { + if (!forced && !AprilFoolsJokeClass.check(joke.settings.chance)) { return; } diff --git a/src/jokes/carnival.ts b/src/jokes/carnival.ts new file mode 100644 index 0000000..1f62a3f --- /dev/null +++ b/src/jokes/carnival.ts @@ -0,0 +1,60 @@ +import { Joke, JokeSettings, StopableJoke } from "../joke"; +import $ from "jquery"; +import { AprilFoolsJokeClass } from "../handler"; + +/** + * **Зеркало** + * + * Элементы форума отражаются (по крайней мере, пытаются) + * + * @author Kozhilya + */ +export class CarnivalJoke extends Joke { + settings: CarnivalJokeSettings; + + start(): void { + $(this.settings.selector).each((_, elem) => { + const filters: string[] = []; + + for (const entry of Object.entries(this.settings.variants)) { + if (!AprilFoolsJokeClass.check(this.settings.variant_chance)) { + continue; + } + + filters.push(entry[0].replace('{0}', Math.round(Math.random() * entry[1]).toString())); + } + + if (filters.length > 0) { + $(elem).css('filter', filters.join(' ')); + } + }); + } +} + +export class CarnivalJokeSettings implements JokeSettings { + chance: number = 30; + + /** + * Селектор всех элементов, которые будут трястись + */ + selector: string = 'img[src*="/avatars/"]'; + + /** + * Вероятность применения фильтра + */ + variant_chance: number = 20; + + /** + * Список фильтров и диапозона случайных параметров + */ + variants: CarnivalJokeFilters = { + 'sepia({0}%)': 100, + 'saturate({0}%)': 100, + 'hue-rotate({0}deg)': 360, + 'invert({0}%)': 100, + } +} + +export interface CarnivalJokeFilters { + [key: string]: number; +} \ No newline at end of file diff --git a/src/jokes/crazy_letters.ts b/src/jokes/crazy_letters.ts new file mode 100644 index 0000000..6ff6a3b --- /dev/null +++ b/src/jokes/crazy_letters.ts @@ -0,0 +1,35 @@ +import { Joke, JokeSettings, StopableJoke } from "../joke"; +import $ from "jquery"; + +/** + * **Ад гуманитария** + * + * Все "тся" заменяются на "ться", а все "ться" на "тся". + * + * @author Kozhilya + */ +export class CrazyLettersJoke extends Joke { + settings: CrazyLettersJokeSettings; + + start(): void { + $(this.settings.selector).each((_, elem) => { + let text = $(this).text(); + let result = ''; + + for (let i = 0; i < text.length; i++) { + result += text[i][(i % 2) ? 'toLowerCase' : 'toUpperCase'](); + } + + $(this).text(result); + }); + } +} + +export class CrazyLettersJokeSettings implements JokeSettings { + chance: number = 20; + + /** + * Селектор всех элементов, которые будут затронуты + */ + selector: string = '.pa-author a'; +} \ No newline at end of file diff --git a/src/jokes/humanitarian_hell.ts b/src/jokes/humanitarian_hell.ts new file mode 100644 index 0000000..77fd205 --- /dev/null +++ b/src/jokes/humanitarian_hell.ts @@ -0,0 +1,30 @@ +import { Joke, JokeSettings, StopableJoke } from "../joke"; +import $ from "jquery"; + +/** + * **Ад гуманитария** + * + * Все "тся" заменяются на "ться", а все "ться" на "тся". + * + * @author Kozhilya + */ +export class HumanitarianHellJoke extends Joke { + settings: HumanitarianHellJokeSettings; + + start(): void { + $(this.settings.selector).each(function () { + $(this).html($(this).html().replace(/(ть?ся)/g, function (fnd) { + return (fnd.indexOf('ь') > 0) ? 'тся' : 'ться'; + })); + }); + } +} + +export class HumanitarianHellJokeSettings implements JokeSettings { + chance: number = 20; + + /** + * Селектор всех элементов, которые будут затронуты + */ + selector: string = '.post-content'; +} \ No newline at end of file diff --git a/src/jokes/mirror.ts b/src/jokes/mirror.ts new file mode 100644 index 0000000..b3a2be4 --- /dev/null +++ b/src/jokes/mirror.ts @@ -0,0 +1,25 @@ +import { Joke, JokeSettings, StopableJoke } from "../joke"; +import $ from "jquery"; + +/** + * **Зеркало** + * + * Элементы форума отражаются (по крайней мере, пытаются) + * + * @author Kozhilya + */ +export class MirrorJoke extends Joke { + settings: MirrorJokeSettings; + + start(): void { + $('.post, .post h3, .post-links, .post-author, .post-content') + .css('transform', 'scaleX(-1)').css('-moz-transform', 'scaleX(-1)').css('-moz-transform', 'scaleX(-1)').css('filter', 'FlipH').css('-ms-filter', '"FlipH"'); + $('#pun-title #title-logo').animate('') + $('.post-links, .post-links ul, .post h3 span').css('margin-left', '0'); + $('.post h3 span').css('margin-right', '25em'); + } +} + +export class MirrorJokeSettings implements JokeSettings { + chance: number = 30; +} \ No newline at end of file diff --git a/src/jokes/shake.ts b/src/jokes/shake.ts index b47c671..d66a042 100644 --- a/src/jokes/shake.ts +++ b/src/jokes/shake.ts @@ -1,7 +1,8 @@ import { Joke, JokeSettings, StopableJoke } from "../joke"; +import $ from "jquery"; /** - * Форумо-трясение + * **Форумо-трясение** * * Страница форума начинает трястись * @@ -17,7 +18,6 @@ export class ShakeJoke extends StopableJoke { private data_name: string = 'april-fools-shake'; - rand(a: number): number { return a + this.settings.force * (Math.random() * 2 - 1); } @@ -85,6 +85,6 @@ export class ShakeJokeSettings implements JokeSettings { force: number = 0.5; } -interface ShakeJokeMargin { +export interface ShakeJokeMargin { [key: string]: number; } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index ea26055..6f69732 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,8 @@ "lib": ["es2017", "dom"], "rootDir": "./src/", "outFile": "./bin/april-fools.js", - "moduleResolution": "nodenext" + "moduleResolution": "nodenext", + "esModuleInterop": true }, "files": [ "src/main.ts"