levenshtein marina
This commit is contained in:
		@@ -5,7 +5,8 @@ declare(strict_types=1);
 | 
				
			|||||||
namespace mirzaev\marina\controllers;
 | 
					namespace mirzaev\marina\controllers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Файлы проекта
 | 
					// Файлы проекта
 | 
				
			||||||
use mirzaev\marina\controllers\core;
 | 
					use mirzaev\marina\controllers\core,
 | 
				
			||||||
 | 
						mirzaev\marina\controllers\traits\converters;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Discord framework
 | 
					// Discord framework
 | 
				
			||||||
use Discord\Discord as discord,
 | 
					use Discord\Discord as discord,
 | 
				
			||||||
@@ -31,6 +32,10 @@ use exception;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
final class index extends core
 | 
					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;
 | 
								echo "Marina is ready!", PHP_EOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Сообщение: "марина"
 | 
								// Сообщение: создано
 | 
				
			||||||
			$discord->on(event::MESSAGE_CREATE, function (message $message, discord $discord) {
 | 
								$discord->on(event::MESSAGE_CREATE, function (message $message, discord $discord) {
 | 
				
			||||||
				// Игнорирование чат-роботов
 | 
									// Игнорирование чат-роботов
 | 
				
			||||||
				if ($message->author->bot) return;
 | 
									if ($message->author->bot) return;
 | 
				
			||||||
@@ -52,12 +57,35 @@ final class index extends core
 | 
				
			|||||||
				// Запись в буфер вывода (терминал)
 | 
									// Запись в буфер вывода (терминал)
 | 
				
			||||||
				echo "{$message->author->username}: {$message->content}", PHP_EOL;
 | 
									echo "{$message->author->username}: {$message->content}", PHP_EOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (mb_stristr($message->content, 'марина') !== false) {
 | 
									foreach (explode(' ', $message->content) as $word) {
 | 
				
			||||||
					$message->reply(_message::new()->setContent('ЗДАРОВА'));
 | 
										// Перебор слов из текста сообщения
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										// Инициализация буфера символов для конвертации: 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) {
 | 
								$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