6 Commits
0.1.0 ... 0.6.1

3 changed files with 147 additions and 10 deletions

View File

@@ -5,15 +5,21 @@ declare(strict_types=1);
namespace mirzaev\marina\controllers;
// Файлы проекта
use mirzaev\marina\controllers\core;
use mirzaev\marina\controllers\core,
mirzaev\marina\controllers\traits\converters;
// Discord framework
use Discord\Discord as discord,
Discord\Parts\Channel\Message as message,
Discord\Parts\Guild\Role as role,
Discord\Parts\Guild\CommandPermissions as permissions,
Discord\Parts\User\Member as member,
Discord\Parts\Interactions\Interaction as interaction,
Discord\WebSockets\Event as event,
Discord\Builders\MessageBuilder as _message;
Discord\Parts\Interactions\Command\Command as command,
Discord\Builders\MessageBuilder as _message,
Discord\Builders\CommandBuilder as _command,
Discord\Parts\Interactions\Command\Option as option;
// Встроенные библиотеки
use exception;
@@ -26,6 +32,10 @@ use exception;
*/
final class index extends core
{
use converters {
utf8_to_extended_ascii as protected ascii;
}
/**
* Главная страница
*
@@ -39,22 +49,102 @@ final class index extends core
// Запись в буфер вывода (терминал)
echo "Marina is ready!", PHP_EOL;
// Сообщение: "марина"
// Сообщение: создано
$discord->on(event::MESSAGE_CREATE, function (message $message, discord $discord) {
if ($message->author->bot) {
// Do nothing
return;
}
// Игнорирование чат-роботов
if ($message->author->bot) return;
// Запись в буфер вывода (терминал)
echo "{$message->author->username}: {$message->content}", PHP_EOL;
if (mb_stristr($message->content, арина') !== false) {
$message->reply(_message::new()->setContent('ЗДАРОВА'));
if ($message->author->id === '490821645028687873' || mb_stristr($message->content, имк') !== false) {
// Сообщение от Дмитрия Демина (мимк) (vladimirbaryshkin) или содержит его псевдоним
// Добавление реакции на его сообщение
$message->react('😬');
}
if ($message->author->id === '380876873468608522' && rand(0, 100) < 6) {
// Сообщение от Даниила Богданова (godandem) и шанс 5%
// Отправка изображения: "надругался над даниилом богдановым"
$message->channel->sendMessage(_message::new()->addFile('images/daniil.png'));
}
foreach (explode(' ', $message->content) as $word) {
// Перебор слов из текста сообщения
// Инициализация буфера символов для конвертации: UTF-8 -> ASCII+
$buffer = [];
// Конвертация проверяемых слов
$arsen = self::ascii('арсен', $buffer);
$arsenchik = self::ascii('арсенчик', $buffer);
$senya = self::ascii('сеня', $buffer);
// Конвертация слова
$_word = self::ascii(mb_strtolower($word), $buffer);
if (
($mirzaev = $message->guild->members->get('id', '534633964737134623')) instanceof member
&& ($mirzaev->status === 'offline' || $mirzaev->status === null)
&& rand(0, 100) < 16
and levenshtein($_word, $arsen, 2, 2, 1) < 3
|| levenshtein($_word, $arsenchik, 2, 1, 2) < 4
|| levenshtein($_word, $senya, 2, 2, 1) < 3
) {
// Найдено обращение к Арсену, он не в сети и шанс 15%
// Отправка сообщения
$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 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 && $word !== 'мария')
) {
// Найдено обращение к Марине и шанс 30%
// Отправка сообщения
$message->reply(_message::new()->setContent('ЗДАРОВА'));
}
// Деинициализация неактуальных переменных
unset($buffer, $marina, $marishka, $marinochka, $marya, $_word);
}
// Деинициализация неактуальных переменных
unset($buffer, $arsen, $arsenchik, $senya, $_word);
}
});
// Пользователь: обновление роли
// Пользователь: обновление
$discord->on(event::GUILD_MEMBER_UPDATE, function (member $new, discord $discord, ?member $old = null) {
// Запись в буфер вывода (терминал)
@@ -196,6 +286,23 @@ final class index extends core
*
*/
});
$discord->application->commands->save(new command($discord, [
'name' => 'dreamers',
'description' => 'BEBRA DREAMERS',
'options' => [(new option($discord))
->setName('invite')
->setDescription('Send an invitation link to "BEBRA DREAMERS"')
->setType(option::SUB_COMMAND)]
]));
$discord->listenCommand(['dreamers', 'invite'], function (interaction $interaction) {
// Игнорирование чат-роботов
if ($interaction->user->bot) return;
// Отправка ссылки с приглашением присоединиться на сервер BEBRA DREAMERS
if ($interaction->data->options->has('invite')) $interaction->respondWithMessage(_message::new()->setContent('https://discord.bebra.team'));
});
});
$this->discord->run();

View File

@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
namespace mirzaev\marina\controllers\traits;
/**
* Заготовки для конвертации строк
*
* @package mirzaev\marina\controllers\traits
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
trait converters
{
private static function utf8_to_extended_ascii(string $target, &$map)
{
// find all multibyte characters (cf. utf-8 encoding specs)
$matches = array();
if (!preg_match_all('/[\xC0-\xF7][\x80-\xBF]+/', $target, $matches))
return $target; // plain ascii string
// update the encoding map with the characters not already met
foreach ($matches[0] as $mbc)
if (!isset($map[$mbc]))
$map[$mbc] = chr(128 + count($map));
// finally remap non-ascii characters
return strtr($target, $map);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB