Compare commits

..

8 Commits

4 changed files with 244 additions and 16 deletions

View File

@ -14,6 +14,7 @@ use Discord\Discord as discord,
Discord\Parts\Guild\Role as role, Discord\Parts\Guild\Role as role,
Discord\Parts\Guild\CommandPermissions as permissions, Discord\Parts\Guild\CommandPermissions as permissions,
Discord\Parts\User\Member as member, Discord\Parts\User\Member as member,
Discord\Parts\Guild\ScheduledEvent as schedule,
Discord\Parts\Interactions\Interaction as interaction, Discord\Parts\Interactions\Interaction as interaction,
Discord\WebSockets\Event as event, Discord\WebSockets\Event as event,
Discord\Parts\Interactions\Command\Command as command, Discord\Parts\Interactions\Command\Command as command,
@ -22,7 +23,9 @@ use Discord\Discord as discord,
Discord\Parts\Interactions\Command\Option as option; Discord\Parts\Interactions\Command\Option as option;
// Встроенные библиотеки // Встроенные библиотеки
use exception; use exception,
datetime,
datetimezone;
/** /**
* Контроллер головного управления * Контроллер головного управления
@ -57,6 +60,20 @@ final class index extends core
// Запись в буфер вывода (терминал) // Запись в буфер вывода (терминал)
echo "{$message->author->username}: {$message->content}", PHP_EOL; echo "{$message->author->username}: {$message->content}", PHP_EOL;
if ($message->author->id === '490821645028687873' || mb_stristr($message->content, 'мимк') !== false) {
// Сообщение от Дмитрия Демина (мимк) (vladimirbaryshkin) или содержит его псевдоним
// Добавление реакции на его сообщение
$message->react('😬');
}
if ($message->author->id === '380876873468608522' && rand(0, 100) < 2) {
// Сообщение от Даниила Богданова (godandem) и шанс 1%
// Отправка изображения: "надругался над даниилом богдановым"
$message->channel->sendMessage(_message::new()->addFile('images/daniil.png'));
}
foreach (explode(' ', $message->content) as $word) { foreach (explode(' ', $message->content) as $word) {
// Перебор слов из текста сообщения // Перебор слов из текста сообщения
@ -64,24 +81,74 @@ final class index extends core
$buffer = []; $buffer = [];
// Конвертация проверяемых слов // Конвертация проверяемых слов
$marina = self::ascii('марина', $buffer); $arsen = self::ascii('арсен', $buffer);
$marishka = self::ascii('маришка', $buffer); $arsenchik = self::ascii('арсенчик', $buffer);
$marinochka = self::ascii('мариночка', $buffer); $senya = self::ascii('сеня', $buffer);
$marinushka = self::ascii('маринушка', $buffer);
$marya = self::ascii('маря', $buffer);
// Конвертация слова // Конвертация слова
$_word = self::ascii(mb_strtolower($word), $buffer); $_word = self::ascii(mb_strtolower($word), $buffer);
if ( if (
levenshtein($_word, $marina, 2, 2, 1) < 3 ($mirzaev = $message->guild->members->get('id', '534633964737134623')) instanceof member
|| levenshtein($_word, $marishka, 2, 1, 2) < 4 && ($mirzaev->status === 'offline' || $mirzaev->status === null)
|| levenshtein($_word, $marinochka, 2, 1, 2) < 4 && rand(0, 100) < 26
|| levenshtein($_word, $marinushka, 2, 1, 2) < 4 and levenshtein($_word, $arsen, 2, 2, 1) < 3
|| (levenshtein($_word, $marya, 3, 3, 1) < 3 && $word !== 'мария') || levenshtein($_word, $arsenchik, 2, 1, 2) < 4
|| (levenshtein($_word, $senya, 2, 2, 1) < 2 && $word !== 'меня' && $word !== 'тебя')
) { ) {
$message->reply(_message::new()->setContent('ЗДАРОВА')); // Найдено обращение к Арсену, он не в сети и шанс 25%
// Отправка сообщения
$message->reply(_message::new()->setContent(match (rand(0, 5)) {
0 => 'батя спит',
1 => 'арсен проломил себе голову и находится в реанимации',
2 => '"МАРИНА ПЕРЕДАЙ ИМ ЧТО Я В БЕГАХ В ТАДЖИКИСТАНЕ"',
3 => 'ему раздавили яйца и он лежит в соседней комнате без сознания',
4 => 'папа меня бьёт за то, что я не удаляю такие сообщения :sob:',
5 => '<:smart:1105401468019822643>',
default => '<:smart:1105401468019822643>'
}));
} else {
// Не найдено обращение к Арсену
// Инициализация буфера символов для конвертации: UTF-8 -> ASCII+
$buffer = [];
// Конвертация проверяемых слов
$marina = self::ascii('марина', $buffer);
$marishka = self::ascii('маришка', $buffer);
$marinochka = self::ascii('мариночка', $buffer);
$marinushka = self::ascii('маринушка', $buffer);
$marya = self::ascii('маря', $buffer);
// Конвертация слова
$_word = self::ascii(mb_strtolower($word), $buffer);
if (
rand(0, 100) < 31
and
match ($word) {
'машинка', 'мария', 'малинка', 'машина', 'малина' => false,
default => true
}
&& (levenshtein($_word, $marina, 2, 2, 1) < 3)
|| levenshtein($_word, $marishka, 2, 1, 2) < 4
|| levenshtein($_word, $marinochka, 2, 1, 2) < 4
|| levenshtein($_word, $marinushka, 2, 1, 2) < 4
|| (levenshtein($_word, $marya, 3, 3, 1) < 3)
) {
// Найдено обращение к Марине и шанс 30%
// Отправка сообщения
$message->reply(_message::new()->setContent(rand(0, 100) < 10 ? '🥺' : 'ЗДАРОВА'));
}
// Деинициализация неактуальных переменных
unset($buffer, $marina, $marishka, $marinochka, $marya, $_word);
} }
// Деинициализация неактуальных переменных
unset($buffer, $arsen, $arsenchik, $senya, $_word);
} }
}); });
@ -228,13 +295,166 @@ final class index extends core
*/ */
}); });
foreach ($discord->guilds as $guild) {
// Перебор серверов
if (!($guild->guild_scheduled_events->get('name', 'Saturdaynik 🧹') instanceof schedule)) {
// Не найдено событие: "субботник"
// Инициализация даты субботника
$date = new datetime('next saturday', new datetimezone('UTC'));
if ($trash = $guild->channels->get('name', 'trash')) {
// Найден канал: "trash"
if ($saturdaynik = $trash->threads->get('name', 'Saturdaynik 🧹')) {
// Найден канал для субботников
$saturdaynik->sendMessage("Next saturdaynik starts on <t:{$date->format('U')}:D>")
->then(function ($message) use ($discord, $date, $guild, $saturdaynik) {
// Закрепление сообщения
$saturdaynik->pinMessage($message, 'Notification about the next saturdaynik')
->then(function ($message) use ($saturdaynik) {
$saturdaynik->getMessageHistory(['limit' => 1])->then(function ($messages) {
// Удаление сообщения о том, что Марина закрепила сообщение
$messages->first()->delete();
});
});
// Создание события
$guild->guild_scheduled_events->save(
new schedule($discord, [
'name' => 'Saturdaynik 🧹',
'description' => "Global saturday cleaning on our server - saturdaynik!\nYour keyboards will be shine! 😼✨",
'scheduled_start_time' => $date->format(datetime::ATOM),
'scheduled_end_time' => (clone $date)->modify('+1 day')->format(datetime::ATOM),
'image' => \Discord\imageToBase64('images/saturdaynik/cover.jpg'),
'entity_type' => 3,
'entity_metadata' => [
'location' => $message->getLinkAttribute()
],
'privacy_level' => 2
])
)->then(function ($event) use ($guild) {
if ($events = $guild->channels->get('name', 'events')) {
// Найден канал: "events
// Инициализация буфера идентификатора роли для оповещения о событиях
$id = '';
foreach ($guild->roles as $role) {
// Чтение ролей
if ($role->name === "Events") {
// Найдена роль для оповещения о событиях
// Запись идентификатора роли
$id = $role->id;
}
}
// Отправка сообщения с приглашением присоединиться к субботнику
$events->sendMessage((empty($id) ? '' : "<@&{$id}> ") . "https://discord.gg/pMZaxvH4?event={$event->id}");
}
});
});
} else {
// Не найден канал для субботников (подразумевается)
// Создание канала (ветки) для субботников
$trash->startThread([
'name' => 'Saturdaynik 🧹'
], 'Thread for saturdaynik')
->then(function ($thread) use ($discord, $date, $guild, $trash) {
// Отправка первого сообщения в ветке с полной версией обложки
$thread->sendMessage(
_message::new()
->addFile('images/saturdaynik/source.jpg')
)
->then(function ($message) use ($discord, $date, $guild, $trash) {
if ($saturdaynik = $trash->threads->get('name', 'Saturdaynik 🧹')) {
// Найден канал для субботников
$saturdaynik->sendMessage("Next saturdaynik starts on <t:{$date->format('U')}:D>")
->then(function ($message) use ($discord, $date, $guild, $saturdaynik) {
// Закрепление сообщения
$saturdaynik->pinMessage($message, 'Notification about the next saturdaynik')
->then(function ($message) use ($saturdaynik) {
$saturdaynik->getMessageHistory(['limit' => 1])->then(function ($messages) {
// Удаление сообщения о том, что Марина закрепила сообщение
$messages->first()->delete();
});
});
// Создание события
$guild->guild_scheduled_events->save(
new schedule($discord, [
'name' => 'Saturdaynik 🧹',
'description' => "Global saturday cleaning - saturdaynik!\nYour keyboards will be shine! 😼✨",
'scheduled_start_time' => $date->format(datetime::ATOM),
'scheduled_end_time' => (clone $date)->modify('+1 day')->format(datetime::ATOM),
'image' => \Discord\imageToBase64('images/saturdaynik/cover.jpg'),
'entity_type' => 3,
'entity_metadata' => [
'location' => $message->getLinkAttribute()
],
'privacy_level' => 2
])
)->then(function ($event) use ($guild) {
if ($events = $guild->channels->get('name', 'events')) {
// Найден канал: "events
// Инициализация буфера идентификатора роли для оповещения о событиях
$id = '';
foreach ($guild->roles as $role) {
// Чтение ролей
if ($role->name === "Events") {
// Найдена роль для оповещения о событиях
// Запись идентификатора роли
$id = $role->id;
}
}
// Отправка сообщения с приглашением присоединиться к субботнику
$events->sendMessage((empty($id) ? '' : "<@&{$id}> ") . "https://discord.gg/pMZaxvH4?event={$event->id}");
}
});
});
} else {
// Не найден канал для субботников (подразумевается)
}
});
});
}
}
}
}
$discord->on(event::GUILD_SCHEDULED_EVENT_CREATE, function (schedule $schedule, Discord $discord) {
/* var_dump($schedule); */
});
$discord->application->commands->save(new command($discord, [ $discord->application->commands->save(new command($discord, [
'name' => 'dreamers', 'name' => 'dreamers',
'description' => 'BEBRA DREAMERS', 'description' => 'BEBRA DREAMERS',
'options' => [(new option($discord)) 'options' => [
->setName('invite') (new option($discord))
->setDescription('Send an invitation link to "BEBRA DREAMERS"') ->setName('invite')
->setType(option::SUB_COMMAND)] ->setDescription('Link to "BEBRA DREAMERS"')
->setType(option::SUB_COMMAND),
(new option($discord))
->setName('rules')
->setDescription('Rules of "BEBRA DREAMERS"')
->setType(option::SUB_COMMAND)
]
])); ]));
$discord->listenCommand(['dreamers', 'invite'], function (interaction $interaction) { $discord->listenCommand(['dreamers', 'invite'], function (interaction $interaction) {
@ -244,6 +464,14 @@ final class index extends core
// Отправка ссылки с приглашением присоединиться на сервер BEBRA DREAMERS // Отправка ссылки с приглашением присоединиться на сервер BEBRA DREAMERS
if ($interaction->data->options->has('invite')) $interaction->respondWithMessage(_message::new()->setContent('https://discord.bebra.team')); if ($interaction->data->options->has('invite')) $interaction->respondWithMessage(_message::new()->setContent('https://discord.bebra.team'));
}); });
$discord->listenCommand(['dreamers', 'rules'], function (interaction $interaction) {
// Игнорирование чат-роботов
if ($interaction->user->bot) return;
// Отправка ссылки с приглашением присоединиться на сервер BEBRA DREAMERS
if ($interaction->data->options->has('rules')) $interaction->respondWithMessage(_message::new()->setContent('https://rules.bebra.team'));
});
}); });
$this->discord->run(); $this->discord->run();

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB