110 lines
2.7 KiB
Elixir
110 lines
2.7 KiB
Elixir
defmodule Ai.Console do
|
||
def child_spec(_) do
|
||
%{
|
||
id: __MODULE__,
|
||
start:
|
||
{Task, :start_link,
|
||
[
|
||
fn ->
|
||
handle_command("help")
|
||
loop()
|
||
end
|
||
]},
|
||
restart: :permanent,
|
||
shutdown: 5000,
|
||
type: :worker
|
||
}
|
||
end
|
||
|
||
def loop() do
|
||
case IO.gets("> ") do
|
||
:eof ->
|
||
:ok
|
||
|
||
{:error, _} ->
|
||
:ok
|
||
|
||
lines ->
|
||
lines
|
||
|> String.trim()
|
||
|> handle_command()
|
||
|
||
loop()
|
||
end
|
||
end
|
||
|
||
defp handle_command("") do
|
||
# Do nothing
|
||
end
|
||
|
||
defp handle_command("start") do
|
||
case IO.gets(
|
||
"Опишите свой характер, например, \"Я довольно спокойный человек и стараюсь не поддаваться эмоциям в сложных ситуациях.\"\n?> "
|
||
) do
|
||
:eof ->
|
||
:ok
|
||
|
||
{:error, _} ->
|
||
:ok
|
||
|
||
lines ->
|
||
film =
|
||
lines
|
||
|> normalize()
|
||
|> filterWords()
|
||
|> getFilm()
|
||
|
||
if String.length(film) > 0 do
|
||
IO.puts("Рекомендации от меня - #{film}")
|
||
else
|
||
IO.puts(
|
||
"К сожалению, я не смог найти фильм для Вас. Попробуйте описать себя, используя прилагательные"
|
||
)
|
||
end
|
||
end
|
||
end
|
||
|
||
defp handle_command("exit") do
|
||
IO.puts("Пока-пока!")
|
||
System.halt()
|
||
end
|
||
|
||
defp handle_command("help") do
|
||
intellectualniy = IO.ANSI.italic() <> "интеллектуальный" <> IO.ANSI.reset()
|
||
start = IO.ANSI.bright() <> "start" <> IO.ANSI.reset()
|
||
|
||
IO.puts("""
|
||
Я робот Макс™ - #{intellectualniy} помощник.
|
||
Я могу посоветовать Вам фильм, на основе вашего психологического портрета.
|
||
Для начала работы напишите команду #{start}.
|
||
|
||
Также доступны следующие команды:
|
||
- help - вывести данное сообщение
|
||
- exit - выйти из программы :(
|
||
""")
|
||
end
|
||
|
||
defp handle_command(command) do
|
||
IO.puts("Я не знаю команду #{command}. Для просмотра доступных команд введите help.")
|
||
end
|
||
|
||
defp normalize(text) do
|
||
text
|
||
|> String.trim()
|
||
|> String.normalize(:nfkd)
|
||
|> Ai.Morphy.normalize()
|
||
end
|
||
|
||
defp filterWords(words) do
|
||
words
|
||
|> Stream.map(&String.downcase/1)
|
||
|> Stream.dedup()
|
||
|> Enum.filter(&Enum.member?(Ai.Words.words(), &1))
|
||
end
|
||
|
||
defp getFilm(wordsList) do
|
||
wordsList
|
||
|> Ai.Prolog.query()
|
||
end
|
||
end
|