From b0066f35258589af3d5106895c6be4ddf2badaf1 Mon Sep 17 00:00:00 2001 From: koko210Serve Date: Fri, 16 Jan 2026 20:39:23 +0200 Subject: [PATCH] Tested Phase 1, fixed text channel blocking while in voice and implemented joining and leaving VC from Phase 2 --- bot/bot.py | 13 + bot/memory/dms/209381657369772032.json | 128 ++++++ bot/memory/dms/236553184401817601.json | 588 +++++++++++++++++++++++++ bot/utils/logger.py | 2 + bot/utils/voice_manager.py | 32 +- readmes/VOICE_CHAT_PHASE1_TESTING.md | 415 +++++++++++++++++ soprano_to_rvc | 1 + 7 files changed, 1175 insertions(+), 4 deletions(-) create mode 100644 readmes/VOICE_CHAT_PHASE1_TESTING.md create mode 160000 soprano_to_rvc diff --git a/bot/bot.py b/bot/bot.py index daee3cc..72be69a 100644 --- a/bot/bot.py +++ b/bot/bot.py @@ -138,6 +138,19 @@ async def on_message(message): await handle_voice_command(message, cmd, args) return + # Block all text responses when voice session is active + if globals.VOICE_SESSION_ACTIVE: + # Queue the message for later processing (optional) + if not hasattr(message, 'author') or message.author != globals.client.user: + globals.TEXT_MESSAGE_QUEUE.append({ + 'message': message, + 'timestamp': message.created_at, + 'channel_id': message.channel.id, + 'content': message.content + }) + logger.debug(f"Message queued during voice session: {message.content[:50]}...") + return # Don't process any messages during voice session + # Skip processing if a bipolar argument is in progress in this channel if not isinstance(message.channel, discord.DMChannel): from utils.bipolar_mode import is_argument_in_progress diff --git a/bot/memory/dms/209381657369772032.json b/bot/memory/dms/209381657369772032.json index 523d0da..ff5b3cb 100644 --- a/bot/memory/dms/209381657369772032.json +++ b/bot/memory/dms/209381657369772032.json @@ -5584,6 +5584,134 @@ "content": "😊 Hi! Miku loves seeing enthusiastic fans like you! What's your favorite song to sing with me? πŸŽΆπŸ’–", "attachments": [], "reactions": [] + }, + { + "timestamp": "2026-01-11T13:17:14.569246", + "message_id": 1459898954270375997, + "is_bot_message": true, + "content": "https://fxtwitter.com/OtakuOwletMerch/status/2007575922602365113", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-11T13:17:14.899041", + "message_id": 1459898956120330393, + "is_bot_message": true, + "content": "Konnichiwa, fan! πŸ€— I just saw the cutest merch announcement on Twitter! πŸ“± It's a blind box featuring chibi-style figurines of yours truly, along with my adorable friends! 🐢❀️ The scene is just too precious! Can't wait to see which Miku figure I'll get! 😍 Pre-order deadline is Jan 6th, don't forget! 😊❀️ Miku πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-11T15:15:06.078836", + "message_id": 1459928614807015618, + "is_bot_message": true, + "content": "https://fxtwitter.com/OtakuOwletMerch/status/1995993077710827739", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-11T15:15:06.399019", + "message_id": 1459928616182747268, + "is_bot_message": true, + "content": "Konnichiwa, fan! 🐠 I just saw the cutest merch announcement on Twitter! πŸ“± It's a mermaid Miku figurine, and I'm absolutely loving her new look! 😍 The pearl headband and turquoise hair with star-shaped hair ornaments are too cute! Can't wait to get my hands on this one! ❀️ Miku πŸ’•", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-12T08:21:40.991612", + "message_id": 1460186959191216170, + "is_bot_message": true, + "content": "https://fxtwitter.com/mecchaJP/status/2000430669386678324", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-12T08:21:41.311082", + "message_id": 1460186963939430471, + "is_bot_message": true, + "content": "Fan! 🀩 I just saw that Fuwapuchi Sakura Miku deformed figure is still available for preorder! πŸ›‘πŸ’– I'm totally in love with her adorable chibi design! Make sure to get yours before they're gone! ❀️ Miku πŸ’•", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T12:05:19.904681", + "message_id": 1460968020875808873, + "is_bot_message": true, + "content": "https://fxtwitter.com/OtakuOwletMerch/status/2007193437234442725", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T12:05:20.202592", + "message_id": 1460968022582759535, + "is_bot_message": true, + "content": "OMG, you gotta see this!! πŸŽ‰ I just saw a tweet about the cutest 1/7 scale figurine of me! 🀩 It's called \"MIKU WITH YOU 2025\" Ver. and it's just so adorable! 🎁 You can pre-order it now and I'll be waiting for you in April 2027! πŸ’• Don't forget to order before 2/14/2026! Hurry! ❀️ See the link here: https://t.co/S8hIJWqESv πŸ’–\n\nMiku πŸŽ€πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T12:18:32.043807", + "message_id": 1460971343766880389, + "is_bot_message": true, + "content": "https://fxtwitter.com/GoodSmile_US/status/2009460197215904231", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T12:18:32.333203", + "message_id": 1460971345042215080, + "is_bot_message": true, + "content": "Yay~! πŸŽ‰ Senbonzakura Ver. is back in a new Nendoroid form! 🌸 I'm so cute in chibi style, don't you think? 😍 You can preorder me now and I'll bring some cherry blossom magic to your collection! πŸ’– See the link here: https://t.co/tlX3ZpstS8 ❀️\n\nMiku πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-15T15:15:28.834311", + "message_id": 1461378260926730254, + "is_bot_message": true, + "content": "https://fxtwitter.com/mecchaJP/status/2003275023851594121", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-15T15:15:29.164349", + "message_id": 1461378263187456082, + "is_bot_message": true, + "content": "OMG, did you see it? 🀩 The new \"MIKU WITH YOU 2025\" figurine is coming soon! πŸ’• It's going to be so adorable, I just know it! πŸŽ‰ Can't wait to meet you in person! πŸ€— See the link here: https://t.co/4Ck6OHbECu πŸ’–\n\nMiku πŸ’—", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-16T10:51:23.299989", + "message_id": 1461674188145299584, + "is_bot_message": true, + "content": "https://fxtwitter.com/GoodSmile_US/status/2009814780026994794", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-16T10:51:23.590490", + "message_id": 1461674189957234820, + "is_bot_message": true, + "content": "Oooh, yay! πŸŽ‰ Just saw the cutest Nendoroid version of me! I'm wearing a sweet smile and my favorite cafΓ© outfit πŸ΅πŸ’•. Can't wait to share it with you! - Miku πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-16T11:03:13.536711", + "message_id": 1461677167426539632, + "is_bot_message": true, + "content": "https://fxtwitter.com/OtakuOwletMerch/status/2001768046877118636", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-16T11:03:13.851880", + "message_id": 1461677168923770941, + "is_bot_message": true, + "content": "OMG, I'm so excited! πŸŽ‰ There's a new Deep Sea Girl Nendoroid version of me available for pre-order! I just can't wait to dive into the sea of cuteness! πŸ’– Pre-order now and get ready to take me home! - Miku ❀️", + "attachments": [], + "reactions": [] } ] } \ No newline at end of file diff --git a/bot/memory/dms/236553184401817601.json b/bot/memory/dms/236553184401817601.json index 32479b6..0bb8b05 100644 --- a/bot/memory/dms/236553184401817601.json +++ b/bot/memory/dms/236553184401817601.json @@ -14405,6 +14405,594 @@ "content": "Awwww, thank you so much!!! πŸŽ€ I'm totally in love with the Symphony: 2025 Sapporo Concert Ver. plushie! It's so cute and wintry, and I can already imagine all the hugs and cuddles you'll get from it! πŸ’– Miku ❀️", "attachments": [], "reactions": [] + }, + { + "timestamp": "2026-01-11T13:17:51.410974", + "message_id": 1459899108402925579, + "is_bot_message": true, + "content": "https://fxtwitter.com/OtakuOwletMerch/status/2007575922602365113", + "attachments": [], + "reactions": [], + "embeds": [ + { + "footer": { + "text": "FxTwitter", + "icon_url": "https://assets.fxembed.com/logos/fxtwitter64.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/gFi3EIEMfICdEDMLFVTF3ob0J1xkZnKdnkq0-xEsgGc/https/assets.fxembed.com/logos/fxtwitter64.png" + }, + "image": { + "url": "https://pbs.twimg.com/media/G9xXde0XQAAdpcn.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/mQhl3NNja9WwOYdhtUejJVd5zwmHkHtRvqMCc8EeSKQ/%3Fname%3Dorig/https/pbs.twimg.com/media/G9xXde0XQAAdpcn.jpg", + "width": 1125, + "height": 750, + "content_type": "image/jpeg", + "placeholder": "sNcFFYSWiIZveHZXhzd4m4hwfDj3", + "placeholder_version": 1, + "flags": 0 + }, + "author": { + "name": "Otaku Owlet Anime Merch (@OtakuOwletMerch)", + "url": "https://x.com/OtakuOwletMerch/status/2007575922602365113", + "icon_url": "https://pbs.twimg.com/profile_images/1835446408884744192/S4HX_8_Q_200x200.jpg", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/Gd5od3qaVN1KG1eQsJS9mFoTNRKdxahDmvjF7tgR4p0/https/pbs.twimg.com/profile_images/1835446408884744192/S4HX_8_Q_200x200.jpg" + }, + "flags": 0, + "color": 6513919, + "timestamp": "2026-01-03T22:12:53+00:00", + "type": "rich", + "description": "✨\\(Pre\\-Order\\) Hatsune Miku x Cinnamoroll Collectible \\- Chibi Figure Blind Box✨\nοΈ€οΈ€\nοΈ€οΈ€Estimated in\\-stock date\\: 12/2026\nοΈ€οΈ€\nοΈ€οΈ€Pre\\-order Deadline\\: 1/6/2026\nοΈ€οΈ€\nοΈ€οΈ€\\-\nοΈ€οΈ€\nοΈ€οΈ€βœ¨Link \\- [otakuowlet.com/products/pre-order-hatsune-miku-x-cinnamoroll-collectible-chibi-figure?sca_ref=2673717.HTKaw1BA1G](https://otakuowlet.com/products/pre-order-hatsune-miku-x-cinnamoroll-collectible-chibi-figure?sca_ref=2673717.HTKaw1BA1G)\n\n**[πŸ’¬](https://x.com/intent/tweet?in_reply_to=2007575922602365113) 6 [πŸ”](https://x.com/intent/retweet?tweet_id=2007575922602365113) 208 [❀️](https://x.com/intent/like?tweet_id=2007575922602365113) 2\\.9Kβ€‚πŸ‘οΈ 56\\.0K **", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2007575922602365113" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G9xXe-nWEAAFlM4.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/nkyl3CNdWKC5-eQQHYTF8z8H8jJPmuPKD0Hia4lcrvo/%3Fname%3Dorig/https/pbs.twimg.com/media/G9xXe-nWEAAFlM4.jpg", + "width": 1125, + "height": 750, + "content_type": "image/jpeg", + "placeholder": "MegBHYR8Cqm/hZU/ZRiRgZqA6R/H", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2007575922602365113" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G9xXgI3W4AAvdzz.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/2MdAznAatoBCLYM5oz--dCOo5w4W8C66SLs-25oHnQM/%3Fname%3Dorig/https/pbs.twimg.com/media/G9xXgI3W4AAvdzz.jpg", + "width": 1125, + "height": 750, + "content_type": "image/jpeg", + "placeholder": "L/gFLYZvfIW3dVUtk6c2Yohwlgpn", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2007575922602365113" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G9xXhQ5WoAAWYHH.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/oUTVcpu2edK6v65orZ0QMHtQ-35eVIC6dOwSzF8VhB4/%3Fname%3Dorig/https/pbs.twimg.com/media/G9xXhQ5WoAAWYHH.jpg", + "width": 1125, + "height": 750, + "content_type": "image/jpeg", + "placeholder": "cAgCHYSNV4bHlZZfoxSVkKVwKD+H", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2007575922602365113" + } + ] + }, + { + "timestamp": "2026-01-11T13:17:51.775858", + "message_id": 1459899110621446396, + "is_bot_message": true, + "content": "Konnichiwa~! 🌸 I just saw the cutest tweet about a new collectible figure! πŸŽ‰ It's a Hatsune Miku x Cinnamoroll collaboration! 🐰 The chibi figure is so adorable! πŸ’• Don't miss the pre-order deadline on Jan 6th, 2026! ❀️ Hurry and check the link: https://t.co/ebqg92R8qz\n\nYay~! πŸŽ‰ I'll be singing and dancing to get you all excited until the figure arrives! 🎢\n\nMiku πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-11T15:15:45.006053", + "message_id": 1459928777713909966, + "is_bot_message": true, + "content": "https://fxtwitter.com/OtakuOwletMerch/status/1995993077710827739", + "attachments": [], + "reactions": [], + "embeds": [ + { + "footer": { + "text": "FxTwitter", + "icon_url": "https://assets.fxembed.com/logos/fxtwitter64.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/gFi3EIEMfICdEDMLFVTF3ob0J1xkZnKdnkq0-xEsgGc/https/assets.fxembed.com/logos/fxtwitter64.png" + }, + "image": { + "url": "https://pbs.twimg.com/media/G7Mw8CRWMAA-p8i.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/mcwrozqf9DoENhBsRhHk-UcjX9FcOQ7Bc1ZV5PyZcsc/%3Fname%3Dorig/https/pbs.twimg.com/media/G7Mw8CRWMAA-p8i.jpg", + "width": 1680, + "height": 1680, + "content_type": "image/jpeg", + "placeholder": "7ucFFwasmaWAxoeMp3aKeluTM6n4xnoP", + "placeholder_version": 1, + "flags": 0 + }, + "author": { + "name": "Otaku Owlet Anime Merch (@OtakuOwletMerch)", + "url": "https://x.com/OtakuOwletMerch/status/1995993077710827739", + "icon_url": "https://pbs.twimg.com/profile_images/1835446408884744192/S4HX_8_Q_200x200.jpg", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/Gd5od3qaVN1KG1eQsJS9mFoTNRKdxahDmvjF7tgR4p0/https/pbs.twimg.com/profile_images/1835446408884744192/S4HX_8_Q_200x200.jpg" + }, + "flags": 0, + "color": 6513919, + "timestamp": "2025-12-02T23:06:48+00:00", + "type": "rich", + "description": "✨\\(Pre\\-Order\\) Hatsune Miku \\- Desktop Fairy Mermaid princess ver\\. \\- Prize Figure✨\nοΈ€οΈ€\nοΈ€οΈ€Estimated in\\-stock date\\: 09/2026\nοΈ€οΈ€\nοΈ€οΈ€Pre\\-order Deadline\\: 12/20/2025\nοΈ€οΈ€\nοΈ€οΈ€\\-\nοΈ€οΈ€\nοΈ€οΈ€βœ¨Link \\- [otakuowlet.com/products/pre-order-hatsune-miku-desktop-fairy-mermaid-princess-ver-prize-figure?sca_ref=2673717.HTKaw1BA1G](https://otakuowlet.com/products/pre-order-hatsune-miku-desktop-fairy-mermaid-princess-ver-prize-figure?sca_ref=2673717.HTKaw1BA1G)\n\n**[πŸ”](https://x.com/intent/retweet?tweet_id=1995993077710827739) 12 [❀️](https://x.com/intent/like?tweet_id=1995993077710827739) 65β€‚πŸ‘οΈ 1\\.9K **", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/1995993077710827739" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G7Mw9H5WwAA0S1w.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/EhQORjy5ERHS7FVgYXM2FuPdv4YCO-ztKzjJvi7rEhY/%3Fname%3Dorig/https/pbs.twimg.com/media/G7Mw9H5WwAA0S1w.jpg", + "width": 1680, + "height": 1680, + "content_type": "image/jpeg", + "placeholder": "q8cFFwJ4xrVUV6qeqfZatoi6DkW7sMUP", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/1995993077710827739" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G7Mw_03WEAAvQnU.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/-tZNyzQFqGYkYzwKFiFN0ooJD1-n98LpIMrcNlw78xM/%3Fname%3Dorig/https/pbs.twimg.com/media/G7Mw_03WEAAvQnU.jpg", + "width": 1680, + "height": 1680, + "content_type": "image/jpeg", + "placeholder": "r9cFFwTPRpjAhIaYl2enuEl3eQtJ6YAH", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/1995993077710827739" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G7MxBn6XYAEvZrC.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/bA3jCiuaGu_r-0ZSrVz1q3SH6jVpZQ33LerD-seBv3k/%3Fname%3Dorig/https/pbs.twimg.com/media/G7MxBn6XYAEvZrC.jpg", + "width": 1680, + "height": 1680, + "content_type": "image/jpeg", + "placeholder": "qtcFHwjYaZqQeIeIeoeHpliGCYp1sGgJ", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/1995993077710827739" + } + ] + }, + { + "timestamp": "2026-01-11T15:15:45.364893", + "message_id": 1459928779576049815, + "is_bot_message": true, + "content": "Konnichiwa~! 🌊 I just saw the most magical tweet about a new prize figure! πŸ§œβ€β™€οΈ It's me, Miku, as a mermaid! 🐠 The figure is so beautiful, with my turquoise hair and scales shimmering! πŸ’™ Don't miss the pre-order deadline on Dec 20th, 2025! πŸ•°οΈ Check out the link: https://t.co/a9aHDkb6wr\n\nYay~! πŸŽ‰ I'll be swimming in excitement until the figure arrives! 🌊\n\nMiku πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-12T08:22:31.464800", + "message_id": 1460187173717541040, + "is_bot_message": true, + "content": "https://fxtwitter.com/mecchaJP/status/2000430669386678324", + "attachments": [], + "reactions": [], + "embeds": [ + { + "footer": { + "text": "FxTwitter", + "icon_url": "https://assets.fxembed.com/logos/fxtwitter64.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/gFi3EIEMfICdEDMLFVTF3ob0J1xkZnKdnkq0-xEsgGc/https/assets.fxembed.com/logos/fxtwitter64.png" + }, + "image": { + "url": "https://pbs.twimg.com/media/G8L1F9eWwAMUjpY.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/FxMBW5nZYfPxleyyrif29MpkZQDkQT_WsVQGCuD0P8w/%3Fname%3Dorig/https/pbs.twimg.com/media/G8L1F9eWwAMUjpY.jpg", + "width": 1080, + "height": 1080, + "content_type": "image/jpeg", + "placeholder": "tygGBwJoupaZeohnlrd3+IemigmRtwQJ", + "placeholder_version": 1, + "flags": 0 + }, + "author": { + "name": "Meccha Japan (@mecchaJP)", + "url": "https://x.com/mecchaJP/status/2000430669386678324", + "icon_url": "https://pbs.twimg.com/profile_images/1738015080602841088/ew_asGFd_200x200.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/yEl1l2UKnEm7uI6TaL1Y00UnbuvEH_62BSmPNbgmiWM/https/pbs.twimg.com/profile_images/1738015080602841088/ew_asGFd_200x200.png" + }, + "flags": 0, + "color": 6513919, + "timestamp": "2025-12-15T05:00:12+00:00", + "type": "rich", + "description": "Vocaloid Hatsune Miku Series Deformed Figure Fuwapuchi Sakura Miku \\- Preorder Still Available at the link below\\!\nοΈ€οΈ€πŸ›‘ [buff.ly/FIPxlQX](https://buff.ly/FIPxlQX)\n\n**[πŸ’¬](https://x.com/intent/tweet?in_reply_to=2000430669386678324) 1 [πŸ”](https://x.com/intent/retweet?tweet_id=2000430669386678324) 5 [❀️](https://x.com/intent/like?tweet_id=2000430669386678324) 44β€‚πŸ‘οΈ 2\\.8K **", + "url": "https://fxtwitter.com/mecchaJP/status/2000430669386678324" + } + ] + }, + { + "timestamp": "2026-01-12T08:22:31.838526", + "message_id": 1460187175860703335, + "is_bot_message": true, + "content": "Konnichiwa~! πŸŽ€ I just saw the sweetest tweet about a new deformed figure! 🎁 It's me, Miku, as Fuwapuchi Sakura Miku, with my long pink hair and cherry blossom outfit! 🌸 The figure is so adorable, with my cute expression and detailed design! ❀️ Pre-orders are still available, don't miss out! πŸ›‘ Check the link: https://t.co/vc6dqMQ7fb\n\nYay~! πŸŽ‰ I'll be singing a happy song until the figure arrives! 🎢\n\nMiku πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T12:05:48.661670", + "message_id": 1460968141466108050, + "is_bot_message": true, + "content": "https://fxtwitter.com/OtakuOwletMerch/status/2007193437234442725", + "attachments": [], + "reactions": [], + "embeds": [ + { + "footer": { + "text": "FxTwitter", + "icon_url": "https://assets.fxembed.com/logos/fxtwitter64.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/gFi3EIEMfICdEDMLFVTF3ob0J1xkZnKdnkq0-xEsgGc/https/assets.fxembed.com/logos/fxtwitter64.png" + }, + "image": { + "url": "https://pbs.twimg.com/media/G9r7ofOWYAAkhqH.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/zBBG62ewn5NbfvxoavE8iQGpPkMoINn9Kqg6YWwuDMY/%3Fname%3Dorig/https/pbs.twimg.com/media/G9r7ofOWYAAkhqH.jpg", + "width": 900, + "height": 1200, + "content_type": "image/jpeg", + "placeholder": "KKYFDQRjVXh1CSi4qMmrSl/WmHn9", + "placeholder_version": 1, + "flags": 0 + }, + "author": { + "name": "Otaku Owlet Anime Merch (@OtakuOwletMerch)", + "url": "https://x.com/OtakuOwletMerch/status/2007193437234442725", + "icon_url": "https://pbs.twimg.com/profile_images/1835446408884744192/S4HX_8_Q_200x200.jpg", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/Gd5od3qaVN1KG1eQsJS9mFoTNRKdxahDmvjF7tgR4p0/https/pbs.twimg.com/profile_images/1835446408884744192/S4HX_8_Q_200x200.jpg" + }, + "flags": 0, + "color": 6513919, + "timestamp": "2026-01-02T20:53:01+00:00", + "type": "rich", + "description": "✨\\(Pre\\-Order\\) Hatsune Miku \\- \"MIKU WITH YOU 2025\" Ver\\. \\- 1/7 Scale Figure✨\nοΈ€οΈ€\nοΈ€οΈ€Estimated in\\-stock date\\: 04/2027\nοΈ€οΈ€\nοΈ€οΈ€Pre\\-order Deadline\\: 2/14/2026\nοΈ€οΈ€\nοΈ€οΈ€\\-\nοΈ€οΈ€\nοΈ€οΈ€βœ¨Link \\- [otakuowlet.com/products/pre-order-hatsune-miku-miku-with-you-2025-ver-1-7-scale-figure?sca_ref=2673717.HTKaw1BA1G](https://otakuowlet.com/products/pre-order-hatsune-miku-miku-with-you-2025-ver-1-7-scale-figure?sca_ref=2673717.HTKaw1BA1G)\n\n**[πŸ”](https://x.com/intent/retweet?tweet_id=2007193437234442725) 154 [❀️](https://x.com/intent/like?tweet_id=2007193437234442725) 2\\.0Kβ€‚πŸ‘οΈ 75\\.7K **", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2007193437234442725" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G9r7pw9WsAEGJ8I.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/LHfVhrlTU9wvBBdKBfDpdQeFZHmgcQlhRu17RCYq7iQ/%3Fname%3Dorig/https/pbs.twimg.com/media/G9r7pw9WsAEGJ8I.jpg", + "width": 900, + "height": 1200, + "content_type": "image/jpeg", + "placeholder": "I6YJFQRwdWR3apmYqXqYmQnN3eL5", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2007193437234442725" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G9r7rPeXEAAnIoy.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/oTvsVDPFdpl1YczpCGDcp-QYk7syRn_jU1bN5DNpVSU/%3Fname%3Dorig/https/pbs.twimg.com/media/G9r7rPeXEAAnIoy.jpg", + "width": 900, + "height": 1200, + "content_type": "image/jpeg", + "placeholder": "aLYJDQKGh7CEl2mHy3aJZ4FQTfyY", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2007193437234442725" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G9r7smCW0AASFdQ.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/bzBpzecf27PfMHrciMZPQW66bapcXmOUuVdlTvKKr7Q/%3Fname%3Dorig/https/pbs.twimg.com/media/G9r7smCW0AASFdQ.jpg", + "width": 900, + "height": 1200, + "content_type": "image/jpeg", + "placeholder": "GdcFFQRrZZF4+qhnqJmsueeJj5/X", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2007193437234442725" + } + ] + }, + { + "timestamp": "2026-01-14T12:05:49.087528", + "message_id": 1460968143588556931, + "is_bot_message": true, + "content": "OMG, so excited! πŸŽ‰ Just saw the cutest tweet about a new 1/7 scale figure of me in winter clothes! Can't wait to see it in person! ❀️ Let's pre-order together! ⏰ Hurry, deadline is 2/14/2026! πŸ’•\n\nYay~! - Miku πŸŽ€", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T12:18:59.693382", + "message_id": 1460971459617755402, + "is_bot_message": true, + "content": "https://fxtwitter.com/GoodSmile_US/status/2009460197215904231", + "attachments": [], + "reactions": [], + "embeds": [ + { + "footer": { + "text": "FxTwitter", + "icon_url": "https://assets.fxembed.com/logos/fxtwitter64.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/gFi3EIEMfICdEDMLFVTF3ob0J1xkZnKdnkq0-xEsgGc/https/assets.fxembed.com/logos/fxtwitter64.png" + }, + "image": { + "url": "https://pbs.twimg.com/media/G-MJZiPWsAA9NKk.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/CKc3ASSSY3DkdJvYqkKaXYgRFHWZ_Vm1dLQWqTJyCu0/%3Fname%3Dorig/https/pbs.twimg.com/media/G-MJZiPWsAA9NKk.jpg", + "width": 1440, + "height": 1424, + "content_type": "image/jpeg", + "placeholder": "ITkGB4Cl+GOEpXaEeBqGuZdbl286GnQA", + "placeholder_version": 1, + "flags": 0 + }, + "author": { + "name": "GoodSmile_US (@GoodSmile_US)", + "url": "https://x.com/GoodSmile_US/status/2009460197215904231", + "icon_url": "https://pbs.twimg.com/profile_images/1764583971831394305/dpXogB0U_200x200.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/cGKAum5015cgr2haNcfupJxMvXRz8BYDHkQiNufWpCI/https/pbs.twimg.com/profile_images/1764583971831394305/dpXogB0U_200x200.png" + }, + "flags": 0, + "color": 6513919, + "timestamp": "2026-01-09T03:00:19+00:00", + "type": "rich", + "description": "The iconic Nendoroid Hatsune Miku\\: Senbonzakura Ver\\. is back for a rerelease\\! Don’t miss this chance to bring Miku’s timeless cherry blossom style to your collection\\. Preorder now at GOODSMILE ONLINE SHOP US\\!\nοΈ€οΈ€\nοΈ€οΈ€Shop\\: [goodsmile.link/zLO6f9](https://goodsmile.link/zLO6f9)\nοΈ€οΈ€\nοΈ€οΈ€[#HatsuneMiku](https://x.com/hashtag/HatsuneMiku) [#Goodsmile](https://x.com/hashtag/Goodsmile)\n\n**[πŸ’¬](https://x.com/intent/tweet?in_reply_to=2009460197215904231) 2 [πŸ”](https://x.com/intent/retweet?tweet_id=2009460197215904231) 50 [❀️](https://x.com/intent/like?tweet_id=2009460197215904231) 456β€‚πŸ‘οΈ 19\\.0K **", + "url": "https://fxtwitter.com/GoodSmile_US/status/2009460197215904231" + } + ] + }, + { + "timestamp": "2026-01-14T12:19:00.022048", + "message_id": 1460971461186682981, + "is_bot_message": true, + "content": "Yay~! πŸŽ‰ Just saw the tweet about the adorable Senbonzakura Ver. Nendoroid re-release! I'm so happy to see my cherry blossom style figure up for preorder again! πŸ’• You can get it now at GOODSMILE ONLINE SHOP US! ⏰ Hurry! - Miku πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T13:14:09.681744", + "message_id": 1460985342659133505, + "is_bot_message": false, + "content": "Amazing", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T13:14:26.051509", + "message_id": 1460985410871099578, + "is_bot_message": true, + "content": "Miku loves that! 😊 You're so sweet! ✨ I'm going to sing something just for you! 🎢 What kind of song would you like to hear? 🎡 Should I sing something happy, or maybe something a little bit sassy? πŸ˜‰", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T13:15:22.554375", + "message_id": 1460985648268710103, + "is_bot_message": false, + "content": "Go ahead, Miku", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-14T13:15:51.160900", + "message_id": 1460985768213348606, + "is_bot_message": true, + "content": "Hehe! πŸŽ‰ Let's go! 🎢 I'll sing my favorite song, \"World is Mine\"! 🌟 It's all about being a superstar like me! πŸ’ƒπŸ» Let's get started! 🎀\n\n(Singing)\n\"World is mine... sekai de ichiban ohimesama...\nSou iu atsukai kokoro ete yo ne?\"\n\nHow's that? 🎀 Do you like it? 😊", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-15T15:15:58.762242", + "message_id": 1461378386940264522, + "is_bot_message": true, + "content": "https://fxtwitter.com/mecchaJP/status/2003275023851594121", + "attachments": [], + "reactions": [], + "embeds": [ + { + "footer": { + "text": "FxTwitter", + "icon_url": "https://assets.fxembed.com/logos/fxtwitter64.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/gFi3EIEMfICdEDMLFVTF3ob0J1xkZnKdnkq0-xEsgGc/https/assets.fxembed.com/logos/fxtwitter64.png" + }, + "image": { + "url": "https://pbs.twimg.com/media/G80QBI-WoAAk9Yd.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/glNFv6A7ZA78iCRsilucwSSnv8th1cR7YFX5Kicer64/%3Fname%3Dorig/https/pbs.twimg.com/media/G80QBI-WoAAk9Yd.jpg", + "width": 1080, + "height": 1350, + "content_type": "image/jpeg", + "placeholder": "KJYJDgJjVpdmlwkniGmJl6k4L8eUhv8=", + "placeholder_version": 1, + "flags": 0 + }, + "author": { + "name": "Meccha Japan (@mecchaJP)", + "url": "https://x.com/mecchaJP/status/2003275023851594121", + "icon_url": "https://pbs.twimg.com/profile_images/1738015080602841088/ew_asGFd_200x200.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/yEl1l2UKnEm7uI6TaL1Y00UnbuvEH_62BSmPNbgmiWM/https/pbs.twimg.com/profile_images/1738015080602841088/ew_asGFd_200x200.png" + }, + "flags": 0, + "color": 6513919, + "timestamp": "2025-12-23T01:22:39+00:00", + "type": "rich", + "description": "Vocaloid \\- Figure Hatsune Miku MIKU WITH YOU 2025 Ver\\. πŸ’™βœ¨ Coming Soon\\!\nοΈ€οΈ€[#HatsuneMiku](https://x.com/hashtag/HatsuneMiku) [#Miku](https://x.com/hashtag/Miku) [#Vocaloid](https://x.com/hashtag/Vocaloid)\n\n**[πŸ’¬](https://x.com/intent/tweet?in_reply_to=2003275023851594121) 2 [πŸ”](https://x.com/intent/retweet?tweet_id=2003275023851594121) 8 [❀️](https://x.com/intent/like?tweet_id=2003275023851594121) 26β€‚πŸ‘οΈ 4\\.2K **", + "url": "https://fxtwitter.com/mecchaJP/status/2003275023851594121" + } + ] + }, + { + "timestamp": "2026-01-15T15:15:59.279810", + "message_id": 1461378389368901829, + "is_bot_message": true, + "content": "OMG, so excited! πŸŽ‰ Just saw the tweet about the new \"MIKU WITH YOU 2025 Ver.\" figure! Can't wait to see it! πŸ’• The tweet says it's coming soon, and I'm literally counting down the days! ⏰ Keep an eye out for it! - Miku πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-16T10:51:48.153355", + "message_id": 1461674292663161024, + "is_bot_message": true, + "content": "https://fxtwitter.com/GoodSmile_US/status/2009814780026994794", + "attachments": [], + "reactions": [], + "embeds": [ + { + "footer": { + "text": "FxTwitter", + "icon_url": "https://assets.fxembed.com/logos/fxtwitter64.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/gFi3EIEMfICdEDMLFVTF3ob0J1xkZnKdnkq0-xEsgGc/https/assets.fxembed.com/logos/fxtwitter64.png" + }, + "image": { + "url": "https://pbs.twimg.com/media/G-RL4-VWgAICA-x.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/GbG7D7L-MHxJ6Zr6tcW2RpPVvZ5gQSsKeRFh4o15FQ4/%3Fname%3Dorig/https/pbs.twimg.com/media/G-RL4-VWgAICA-x.jpg", + "width": 1080, + "height": 1080, + "content_type": "image/jpeg", + "placeholder": "1scFHwgiiJmIZWiAjnqaxpiaG4+E8kcL", + "placeholder_version": 1, + "flags": 0 + }, + "author": { + "name": "GoodSmile_US (@GoodSmile_US)", + "url": "https://x.com/GoodSmile_US/status/2009814780026994794", + "icon_url": "https://pbs.twimg.com/profile_images/1764583971831394305/dpXogB0U_200x200.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/cGKAum5015cgr2haNcfupJxMvXRz8BYDHkQiNufWpCI/https/pbs.twimg.com/profile_images/1764583971831394305/dpXogB0U_200x200.png" + }, + "flags": 0, + "color": 6513919, + "timestamp": "2026-01-10T02:29:18+00:00", + "type": "rich", + "description": "Welcome in\\! Care for a cup of tea? Nendoroid Hatsune Miku\\: Glasses x CafΓ© Ver\\. is always happy to serve with a sweet smile and a fresh pot\\. Thank you for this lovely pic, rukienfig on IG\\!\nοΈ€οΈ€\nοΈ€οΈ€Use [#Nendography](https://x.com/hashtag/Nendography) for a chance to be featured\\!\nοΈ€οΈ€\nοΈ€οΈ€[#HatsuneMiku](https://x.com/hashtag/HatsuneMiku) [#goodsmile](https://x.com/hashtag/goodsmile)\n\n**[πŸ”](https://x.com/intent/retweet?tweet_id=2009814780026994794) 9 [❀️](https://x.com/intent/like?tweet_id=2009814780026994794) 99β€‚πŸ‘οΈ 13\\.1K **", + "url": "https://fxtwitter.com/GoodSmile_US/status/2009814780026994794" + } + ] + }, + { + "timestamp": "2026-01-16T10:51:48.664081", + "message_id": 1461674294777221296, + "is_bot_message": true, + "content": "Konnichiwa! 😊 I just saw the cutest tweet announcing the new Nendoroid Hatsune Miku: Glasses x CafΓ© Ver.! Can you believe it's so adorable? They even have a fresh pot of tea! πŸ΅πŸ’› I love it! ❀️ - Miku πŸ’–", + "attachments": [], + "reactions": [] + }, + { + "timestamp": "2026-01-16T11:03:36.592220", + "message_id": 1461677263660646512, + "is_bot_message": true, + "content": "https://fxtwitter.com/OtakuOwletMerch/status/2001768046877118636", + "attachments": [], + "reactions": [], + "embeds": [ + { + "footer": { + "text": "FxTwitter", + "icon_url": "https://assets.fxembed.com/logos/fxtwitter64.png", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/gFi3EIEMfICdEDMLFVTF3ob0J1xkZnKdnkq0-xEsgGc/https/assets.fxembed.com/logos/fxtwitter64.png" + }, + "image": { + "url": "https://pbs.twimg.com/media/G8e1O-yWYAATQvL.png?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/Feds-FIY5g9EjzlI9RTyZUackWeiO__UsSsxlSxPfdM/%3Fname%3Dorig/https/pbs.twimg.com/media/G8e1O-yWYAATQvL.png", + "width": 900, + "height": 750, + "content_type": "image/png", + "placeholder": "ENcFDoIGeTiSdnp0iUfYZmd4BYZsRvk=", + "placeholder_version": 1, + "flags": 0 + }, + "author": { + "name": "Otaku Owlet Anime Merch (@OtakuOwletMerch)", + "url": "https://x.com/OtakuOwletMerch/status/2001768046877118636", + "icon_url": "https://pbs.twimg.com/profile_images/1835446408884744192/S4HX_8_Q_200x200.jpg", + "proxy_icon_url": "https://images-ext-1.discordapp.net/external/Gd5od3qaVN1KG1eQsJS9mFoTNRKdxahDmvjF7tgR4p0/https/pbs.twimg.com/profile_images/1835446408884744192/S4HX_8_Q_200x200.jpg" + }, + "flags": 0, + "color": 6513919, + "timestamp": "2025-12-18T21:34:28+00:00", + "type": "rich", + "description": "✨\\(Pre\\-Order\\) Hatsune Miku Nendoroid Figure \\- Hatsune Miku\\: Deep Sea Girl Ver\\.✨\nοΈ€οΈ€\nοΈ€οΈ€Estimated in\\-stock date\\: 10/2026\nοΈ€οΈ€\nοΈ€οΈ€Pre\\-order Deadline\\: 1/6/2026\nοΈ€οΈ€\nοΈ€οΈ€\\-\nοΈ€οΈ€\nοΈ€οΈ€βœ¨Link \\- [otakuowlet.com/products/pre-order-hatsune-miku-nendoroid-figure-hatsune-miku-deep-sea-girl-ver?sca_ref=2673717.HTKaw1BA1G](https://otakuowlet.com/products/pre-order-hatsune-miku-nendoroid-figure-hatsune-miku-deep-sea-girl-ver?sca_ref=2673717.HTKaw1BA1G)\n\n**[πŸ”](https://x.com/intent/retweet?tweet_id=2001768046877118636) 13 [❀️](https://x.com/intent/like?tweet_id=2001768046877118636) 61β€‚πŸ‘οΈ 1\\.6K **", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2001768046877118636" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G8e1P_rWAAASCFR.png?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/7GqEmue-CN3L9KT4D5ydU8rWk1ReFsnfnMmVn2zCIoc/%3Fname%3Dorig/https/pbs.twimg.com/media/G8e1P_rWAAASCFR.png", + "width": 900, + "height": 750, + "content_type": "image/png", + "placeholder": "otcFDoL3moeSZpmLh0WXyTh6p4aPafg=", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2001768046877118636" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G8e1RX9XwAEmYVc.png?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/FqaYyB0YtRwfnwvw7mOkpRDyQspqie2Ju8UJoMRWhmU/%3Fname%3Dorig/https/pbs.twimg.com/media/G8e1RX9XwAEmYVc.png", + "width": 900, + "height": 750, + "content_type": "image/png", + "placeholder": "pNcFDoT3iYeFdol5iGV3p1d5mHWvSPY=", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2001768046877118636" + }, + { + "image": { + "url": "https://pbs.twimg.com/media/G8e1Ur1W4AAgAox.jpg?name=orig", + "proxy_url": "https://images-ext-1.discordapp.net/external/caxfe7Rf8MBvehMelfyboRPQM1KQt8DJL8KR1ymsy7g/%3Fname%3Dorig/https/pbs.twimg.com/media/G8e1Ur1W4AAgAox.jpg", + "width": 750, + "height": 1000, + "content_type": "image/jpeg", + "placeholder": "n+cFDQK6aHCWqIeHeHg3mamAnwn4", + "placeholder_version": 1, + "flags": 0 + }, + "flags": 0, + "type": "rich", + "url": "https://fxtwitter.com/OtakuOwletMerch/status/2001768046877118636" + } + ] + }, + { + "timestamp": "2026-01-16T11:03:36.928249", + "message_id": 1461677265699078348, + "is_bot_message": true, + "content": "OMG, arigatou for the tweet! 🀩 They're releasing a new Nendoroid of me as Deep Sea Girl Ver.! Pre-order now and get ready for me to dive into your collection! ❀️ Miku 🐠", + "attachments": [], + "reactions": [] } ] } \ No newline at end of file diff --git a/bot/utils/logger.py b/bot/utils/logger.py index c56b3df..81db052 100644 --- a/bot/utils/logger.py +++ b/bot/utils/logger.py @@ -59,6 +59,8 @@ COMPONENTS = { 'sentiment': 'Sentiment analysis', 'core': 'Core utilities and helpers', 'apscheduler': 'Job scheduler logs (APScheduler)', + 'voice_manager': 'Voice channel session management', + 'voice_commands': 'Voice channel commands', } # Global configuration diff --git a/bot/utils/voice_manager.py b/bot/utils/voice_manager.py index 3683ea0..db7f945 100644 --- a/bot/utils/voice_manager.py +++ b/bot/utils/voice_manager.py @@ -94,9 +94,18 @@ class VoiceSessionManager: # 9. Pause figurine notifier await self._pause_figurine_notifier() - # 10. Create and connect voice session + # 10. Create voice session self.active_session = VoiceSession(guild_id, voice_channel, text_channel) - # Note: Actual voice connection will be implemented in Phase 2 + + # 11. Connect to Discord voice channel + try: + voice_client = await voice_channel.connect() + self.active_session.voice_client = voice_client + self.active_session.active = True + logger.info(f"βœ“ Connected to voice channel: {voice_channel.name}") + except Exception as e: + logger.error(f"Failed to connect to voice channel: {e}", exc_info=True) + raise logger.info(f"βœ“ Voice session started successfully") @@ -118,8 +127,13 @@ class VoiceSessionManager: logger.info("Ending voice session...") try: - # 1. Disconnect from voice (Phase 2 implementation) - # await self.active_session.disconnect() + # 1. Disconnect from voice channel + if self.active_session.voice_client: + try: + await self.active_session.voice_client.disconnect() + logger.info("βœ“ Disconnected from voice channel") + except Exception as e: + logger.error(f"Error disconnecting from voice: {e}") # 2. Resume text channel inference await self._resume_text_channels() @@ -324,6 +338,13 @@ class VoiceSessionManager: """Cleanup resources if session start fails""" logger.warning("Cleaning up after failed session start...") try: + # Disconnect from voice if connected + if self.active_session and self.active_session.voice_client: + try: + await self.active_session.voice_client.disconnect() + except: + pass + await self._unblock_vision_model() await self._enable_image_generation() await self._resume_text_channels() @@ -332,6 +353,9 @@ class VoiceSessionManager: await self._resume_autonomous_engine() await self._resume_scheduled_events() await self._resume_figurine_notifier() + + # Clear the session + self.active_session = None except Exception as e: logger.error(f"Error during cleanup: {e}") diff --git a/readmes/VOICE_CHAT_PHASE1_TESTING.md b/readmes/VOICE_CHAT_PHASE1_TESTING.md new file mode 100644 index 0000000..7c2cc1c --- /dev/null +++ b/readmes/VOICE_CHAT_PHASE1_TESTING.md @@ -0,0 +1,415 @@ +# Voice Chat Feature - Phase 1 Testing Guide + +## Testing Environment Setup + +βœ… **Bot rebuilt and restarted** with new dependencies: +- PyNaCl>=1.5.0 (Discord voice support) +- websockets>=12.0 (TTS WebSocket client) + +## Test Checklist + +### 🎯 Test 1: Voice Commands Basic Functionality + +#### 1A. Test `!miku join` Command +**Prerequisites:** +- Be in a Discord server where Miku is present +- Join a voice channel first + +**Steps:** +``` +1. Join any voice channel in the server +2. Type: !miku join +``` + +**Expected Results:** +- βœ… Miku joins your voice channel +- βœ… You receive an embed message with: + - Title: "🎀 Joined Voice Chat!" + - Teal color (#86CECB) + - Instructions on how to talk to Miku + - List of 8 blocked features +- βœ… Bot logs show all 9 resource locks activating: + ``` + [INFO] Switching to AMD GPU for voice session + [INFO] Vision model blocked + [INFO] Image generation disabled + [INFO] Text channels paused + [INFO] Bipolar interactions paused + [INFO] Profile picture switching locked + [INFO] Autonomous system paused + [INFO] Scheduler paused + [INFO] Figurine notifier paused + ``` + +**How to Check Logs:** +```bash +docker-compose logs miku-bot --tail 100 | grep -i "voice\|blocked\|paused\|locked" +``` + +#### 1B. Test `!miku voice-status` Command +**Steps:** +``` +1. While voice session is active, type: !miku voice-status +``` + +**Expected Results:** +- βœ… Embed showing: + - Voice channel name + - Prompt channel name (where you typed the command) + - List of all 8 blocked features with ❌ icons + +#### 1C. Test `!miku leave` Command +**Steps:** +``` +1. Type: !miku leave +``` + +**Expected Results:** +- βœ… Miku disconnects from voice channel +- βœ… Confirmation message: "πŸ‘‹ Left voice chat and restored all features!" +- βœ… Bot logs show all 9 resource locks releasing: + ``` + [INFO] Switched back to GTX GPU + [INFO] Vision model unblocked + [INFO] Image generation re-enabled + [INFO] Text channels resumed + [INFO] Bipolar interactions resumed + [INFO] Profile picture switching unlocked + [INFO] Autonomous system resumed + [INFO] Scheduler resumed + [INFO] Figurine notifier resumed + ``` + +--- + +### 🚫 Test 2: Resource Blocking - Vision Model + +**Steps:** +``` +1. Type: !miku join (in a text channel) +2. Upload an image or video to the text channel +3. Wait for Miku's response +``` + +**Expected Results:** +- βœ… Miku responds: "🎀 I can't look at images or videos right now, I'm talking in voice chat! Send it again after I leave the voice channel." +- βœ… Image is NOT processed +- βœ… No vision model loading attempts in logs + +--- + +### 🚫 Test 3: Resource Blocking - Image Generation + +**Steps:** +``` +1. Type: !miku join +2. Try to request an image (e.g., "draw a picture of yourself") +3. Wait for response +``` + +**Expected Results:** +- βœ… Miku responds: "🎀 I can't draw right now, I'm talking in voice chat! Ask me again after I leave the voice channel." +- βœ… Message gets a 🎀 reaction added +- βœ… No ComfyUI requests in logs +- βœ… Log shows: "[INFO] 🚫 Image generation blocked - voice session active" + +--- + +### 🚫 Test 4: Resource Blocking - Profile Picture Changes + +**Steps:** +``` +1. Type: !miku join +2. Try to trigger a mood change that would normally change profile picture + (This might happen automatically or through commands) +``` + +**Expected Results:** +- βœ… Profile picture does NOT change +- βœ… Logs show: "[INFO] Profile picture switching locked" +- βœ… Error log: "Profile picture switching locked during voice session" + +--- + +### 🚫 Test 5: Resource Blocking - Autonomous Engine + +**Steps:** +``` +1. Type: !miku join +2. Wait 30+ seconds (normal autonomous action interval) +3. Check if autonomous messages appear +``` + +**Expected Results:** +- βœ… NO autonomous messages appear +- βœ… Logs show: "[DEBUG] Autonomous system paused, skipping tick" + +--- + +### 🚫 Test 6: Resource Blocking - Bipolar Mode + +**Prerequisites:** +- Bipolar mode must be enabled on the server + +**Steps:** +``` +1. Type: !miku join +2. Try to trigger a bipolar argument (this has a 15% random chance) +3. Or check if any arguments start naturally +``` + +**Expected Results:** +- βœ… NO bipolar arguments start +- βœ… Logs show: "[DEBUG] Bipolar interactions paused, skipping argument trigger" + +--- + +### 🚫 Test 7: Resource Blocking - Scheduled Events + +**This test requires waiting for a scheduled event time** + +**Expected Behavior:** +- βœ… During voice session, scheduled events (bedtime, mood rotations) should NOT fire +- βœ… Check logs for: "Scheduler paused" / "Scheduler resumed" + +--- + +### 🚫 Test 8: Resource Blocking - Figurine Notifier + +**This test requires waiting for figurine notification time** + +**Expected Behavior:** +- βœ… During voice session, figurine notifications should NOT send +- βœ… Check logs for: "Figurine notifier paused" / "Figurine notifier resumed" + +--- + +### πŸ”„ Test 9: Session Persistence + +**Steps:** +``` +1. Type: !miku join +2. Leave the server text channel +3. Go to a different text channel +4. Type: !miku voice-status +``` + +**Expected Results:** +- βœ… Status correctly shows the original voice channel and prompt channel +- βœ… Session persists across channel changes + +--- + +### ⚠️ Test 10: Error Handling + +#### 10A. Join Without Being in Voice +**Steps:** +``` +1. Don't join any voice channel +2. Type: !miku join +``` + +**Expected Results:** +- βœ… Error message: "You need to be in a voice channel first!" + +#### 10B. Leave When Not in Session +**Steps:** +``` +1. Make sure no voice session is active +2. Type: !miku leave +``` + +**Expected Results:** +- βœ… Message: "I'm not in a voice chat right now!" + +#### 10C. Join While Already in Session +**Steps:** +``` +1. Type: !miku join +2. Try: !miku join again +``` + +**Expected Results:** +- βœ… Error message preventing duplicate session start + +--- + +### πŸ” Test 11: GPU Switching + +**This requires checking the gpu_state.json file** + +**Steps:** +``` +1. Check current GPU state: + cat /home/koko210Serve/docker/miku-discord/gpu_state.json + +2. Type: !miku join + +3. Check GPU state again: + cat /home/koko210Serve/docker/miku-discord/gpu_state.json + +4. Type: !miku leave + +5. Check GPU state one more time +``` + +**Expected Results:** +- βœ… Before join: `{"current": "gtx"}` +- βœ… After join: `{"current": "amd"}` +- βœ… After leave: `{"current": "gtx"}` + +**Command:** +```bash +watch -n 2 'cat /home/koko210Serve/docker/miku-discord/gpu_state.json' +``` + +--- + +### πŸ“‹ Test 12: Text Channel Pausing + +**Steps:** +``` +1. Type: !miku join in a text channel +2. Try sending normal messages to Miku in that channel +``` + +**Expected Results:** +- βœ… Miku does NOT respond to normal text messages +- βœ… Messages get queued in TEXT_MESSAGE_QUEUE (visible in logs) +- βœ… Only voice commands (!miku join/leave/voice-status) work + +--- + +## Quick Testing Script + +Run all tests at once by copying this into Discord: + +``` +# Test 1: Join +!miku join + +# Test 2: Check status +!miku voice-status + +# Test 3: Try to block image processing +[Upload an image here] + +# Test 4: Try to block image generation +can you draw a picture of a cat? + +# Test 5: Leave +!miku leave + +# Test 6: Verify features restored +[Upload an image here - should work now] +``` + +--- + +## Monitoring Commands + +### Watch Bot Logs in Real-Time +```bash +docker-compose logs -f miku-bot | grep -i "voice\|block\|pause\|lock" +``` + +### Check GPU State +```bash +cat /home/koko210Serve/docker/miku-discord/gpu_state.json +``` + +### Check for Errors +```bash +docker-compose logs miku-bot --tail 200 | grep -i "error\|exception" +``` + +### Full Voice-Related Logs +```bash +docker-compose logs miku-bot --tail 500 | grep -E "(voice|Voice|VOICE)" +``` + +--- + +## Success Criteria + +Phase 1 is considered **PASSING** if: + +βœ… **Core Functionality:** +- [x] Bot successfully joins voice channel +- [x] Bot successfully leaves voice channel +- [x] Status command shows accurate information + +βœ… **Resource Blocking (5 critical checks):** +- [x] Vision model blocked during session +- [x] Image generation blocked during session +- [x] Profile pictures locked during session +- [x] Autonomous engine paused during session +- [x] Bipolar mode paused during session + +βœ… **System Integrity:** +- [x] All locks properly released after leaving +- [x] GPU switches to AMD during session +- [x] No crashes or exceptions during session lifecycle +- [x] Text channel responses properly paused + +βœ… **Logging:** +- [x] All lock/unlock actions logged +- [x] Clear user-facing error messages +- [x] Debug information available for troubleshooting + +--- + +## Known Limitations (Phase 1) + +⚠️ **Expected Behaviors (Not Bugs):** +- ❌ No actual audio playback yet (Phase 2) +- ❌ No LLM streaming to TTS yet (Phase 3) +- ❌ Miku doesn't actually respond in voice (Phase 3) +- ⚠️ Text input still from text channel (temporary - STT in Phase 4) + +These are **intentional** Phase 1 limitations and will be addressed in future phases. + +--- + +## Troubleshooting + +### Issue: Bot doesn't join voice channel +**Check:** +```bash +# Verify PyNaCl is installed +docker-compose exec miku-bot python -c "import nacl; print('PyNaCl OK')" + +# Check permissions +# Bot needs "Connect" and "Speak" permissions in Discord +``` + +### Issue: Resource blocks not working +**Check:** +```bash +# Verify imports succeeded +docker-compose logs miku-bot | grep -i "import\|module" + +# Check if voice_manager loaded +docker-compose logs miku-bot | grep "voice_manager" +``` + +### Issue: Commands not recognized +**Check:** +```bash +# Verify command_router.py imports voice commands +docker-compose logs miku-bot | grep "voice command" +``` + +--- + +## Next Steps After Phase 1 Testing + +Once all tests pass, proceed to: + +πŸ“‹ **Phase 2: Audio Streaming Implementation** +- Implement MikuVoiceSource class (discord.AudioSource) +- Create WebSocket β†’ Discord audio bridge +- Handle audio format conversion +- Test actual voice playback + +See: `VOICE_CHAT_IMPLEMENTATION_PLAN.md` for Phase 2 details diff --git a/soprano_to_rvc b/soprano_to_rvc new file mode 160000 index 0000000..1b54e4d --- /dev/null +++ b/soprano_to_rvc @@ -0,0 +1 @@ +Subproject commit 1b54e4d5e2e644f47323c11775bd0b3a5a14fcb5