levenshtein marina
This commit is contained in:
		@@ -5,7 +5,8 @@ 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,
 | 
			
		||||
@@ -31,6 +32,10 @@ use exception;
 | 
			
		||||
 */
 | 
			
		||||
final class index extends core
 | 
			
		||||
{
 | 
			
		||||
	use converters {
 | 
			
		||||
		utf8_to_extended_ascii as protected ascii;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Главная страница
 | 
			
		||||
	 *
 | 
			
		||||
@@ -44,7 +49,7 @@ 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) return;
 | 
			
		||||
@@ -52,12 +57,35 @@ final class index extends core
 | 
			
		||||
				// Запись в буфер вывода (терминал)
 | 
			
		||||
				echo "{$message->author->username}: {$message->content}", PHP_EOL;
 | 
			
		||||
 | 
			
		||||
				if (mb_stristr($message->content, 'марина') !== false) {
 | 
			
		||||
				foreach (explode(' ', $message->content) as $word) {
 | 
			
		||||
					// Перебор слов из текста сообщения
 | 
			
		||||
 | 
			
		||||
					// Инициализация буфера символов для конвертации: 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 (
 | 
			
		||||
						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 !== 'мария')
 | 
			
		||||
					) {
 | 
			
		||||
						$message->reply(_message::new()->setContent('ЗДАРОВА'));
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			// Пользователь: обновление роли
 | 
			
		||||
			// Пользователь: обновление
 | 
			
		||||
			$discord->on(event::GUILD_MEMBER_UPDATE, function (member $new, discord $discord, ?member $old = null) {
 | 
			
		||||
				// Запись в буфер вывода (терминал)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										30
									
								
								mirzaev/marina/system/controllers/traits/converters.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								mirzaev/marina/system/controllers/traits/converters.php
									
									
									
									
									
										Normal 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);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user