diff --git a/src/bot/handlers/fun/magic_ball.rs b/src/bot/handlers/fun/magic_ball.rs
new file mode 100644
index 0000000000000000000000000000000000000000..c696d41c422ff0bd41badebd11979263d85b7e9e
--- /dev/null
+++ b/src/bot/handlers/fun/magic_ball.rs
@@ -0,0 +1,55 @@
+use grammers_client::{Client, InputMessage, Update};
+use rand::seq::SliceRandom;
+
+use crate::{bot::handlers::Handler, utils::messages::get_message};
+
+lazy_static::lazy_static! {
+    static ref ANSWERS: &'static [&'static str] = &[
+        // Negatives
+        "Сегодня явно не твой день, хуилка.",
+        "Попробуй позднее, дядь. Сегодня явно не стоит.",
+        "Нет, точно нет.",
+        "Как бы подумали твои родители об этом?",
+        "А лучше идей не было?",
+        "И как тебе после таких вопросов? Конечно такое не сбудется.",
+        // Positives
+        "Да, сто проц.",
+        "Говно вопрос. Всё по кайфу будет, ежжи.",
+        "Киркоров как-то говорил: \"Если хочешь идти - иди\"",
+        "Астрологи обявили неделю, которая благоволит тебе. Всё будет как ты хочешь.",
+        "Татарская народная мудрость гласит: Есть душа — есть и надежда.",
+        "Сегодня ты явно в ударе. Однозначно повезёт.",
+        "Магистр йода считает что тебе повезёт.",
+        // Questionalbles
+        "Настолько мутный движ, что я даже не знаю повезёт ли.",
+        "Такие вещи ты должен решать сам, дядь. Или попробуй ещё раз.",
+    ];
+}
+
+#[derive(Clone)]
+pub struct MagicBall;
+
+#[async_trait::async_trait]
+impl Handler for MagicBall {
+    async fn react(&self, _: &Client, update: &Update) -> anyhow::Result<()> {
+        let Some(message) = get_message(update) else {
+            return Ok(());
+        };
+        // If empty message passed.
+        if message.text().strip_prefix(".mb").map_or("", str::trim) == "" {
+            message
+                .reply(InputMessage::text(
+                    "Нужно спросить вопрос. Пустые строки не канают.",
+                ))
+                .await?;
+            return Ok(());
+        }
+        message
+            .reply(
+                InputMessage::text(ANSWERS.choose(&mut rand::rngs::OsRng).copied().unwrap())
+                    .silent(true),
+            )
+            .await?;
+        Ok(())
+    }
+}
diff --git a/src/bot/handlers/fun/mod.rs b/src/bot/handlers/fun/mod.rs
index 46355f68b71815a1ff211e692068119d1a7840a0..c25fcd8a66d56df91b31c24c16c89b2bb6422ef6 100644
--- a/src/bot/handlers/fun/mod.rs
+++ b/src/bot/handlers/fun/mod.rs
@@ -1,4 +1,5 @@
 pub mod blyaficator;
 pub mod greeter;
+pub mod magic_ball;
 pub mod repeator;
 pub mod rotator;
diff --git a/src/bot/main.rs b/src/bot/main.rs
index 1ea86239aa35e8ed016a6744d2c2ab22b58c8ef1..e989f12c86302c33bcf3bd4081844d7717575021 100644
--- a/src/bot/main.rs
+++ b/src/bot/main.rs
@@ -22,7 +22,10 @@ use super::{
             help::Help,
             weather_forecaster::WeatherForecaster,
         },
-        fun::{blyaficator::Blyaficator, greeter::Greeter, repeator::Repeator, rotator::Rotator},
+        fun::{
+            blyaficator::Blyaficator, greeter::Greeter, magic_ball::MagicBall, repeator::Repeator,
+            rotator::Rotator,
+        },
         Handler,
     },
     middlewares::members_count::MembersCount,
@@ -139,6 +142,11 @@ async fn run(args: BotConfig, client: Client) -> anyhow::Result<()> {
             .add_filter(ExcludedChatsFilter(vec![me.id()]))
             .add_filter(RegexFilter(Regex::new("^[)0]+$")?))
             .add_middleware::<MembersCount<100>>(),
+        // The magic balls.
+        FilteredHandler::new(MagicBall)
+            .add_filter(UpdateTypeFilter(&[UpdateType::New]))
+            .add_filter(SilentFilter)
+            .add_filter(TextFilter(&[".mb"], TextMatchMethod::IStartsWith)),
     ];
 
     let mut errors_count = 0;