Tested Phase 1, fixed text channel blocking while in voice and implemented joining and leaving VC from Phase 2
This commit is contained in:
13
bot/bot.py
13
bot/bot.py
@@ -138,6 +138,19 @@ async def on_message(message):
|
|||||||
await handle_voice_command(message, cmd, args)
|
await handle_voice_command(message, cmd, args)
|
||||||
return
|
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
|
# Skip processing if a bipolar argument is in progress in this channel
|
||||||
if not isinstance(message.channel, discord.DMChannel):
|
if not isinstance(message.channel, discord.DMChannel):
|
||||||
from utils.bipolar_mode import is_argument_in_progress
|
from utils.bipolar_mode import is_argument_in_progress
|
||||||
|
|||||||
@@ -5584,6 +5584,134 @@
|
|||||||
"content": "😊 Hi! Miku loves seeing enthusiastic fans like you! What's your favorite song to sing with me? 🎶💖",
|
"content": "😊 Hi! Miku loves seeing enthusiastic fans like you! What's your favorite song to sing with me? 🎶💖",
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"reactions": []
|
"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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -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 ❤️",
|
"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": [],
|
"attachments": [],
|
||||||
"reactions": []
|
"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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -59,6 +59,8 @@ COMPONENTS = {
|
|||||||
'sentiment': 'Sentiment analysis',
|
'sentiment': 'Sentiment analysis',
|
||||||
'core': 'Core utilities and helpers',
|
'core': 'Core utilities and helpers',
|
||||||
'apscheduler': 'Job scheduler logs (APScheduler)',
|
'apscheduler': 'Job scheduler logs (APScheduler)',
|
||||||
|
'voice_manager': 'Voice channel session management',
|
||||||
|
'voice_commands': 'Voice channel commands',
|
||||||
}
|
}
|
||||||
|
|
||||||
# Global configuration
|
# Global configuration
|
||||||
|
|||||||
@@ -94,9 +94,18 @@ class VoiceSessionManager:
|
|||||||
# 9. Pause figurine notifier
|
# 9. Pause figurine notifier
|
||||||
await self._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)
|
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")
|
logger.info(f"✓ Voice session started successfully")
|
||||||
|
|
||||||
@@ -118,8 +127,13 @@ class VoiceSessionManager:
|
|||||||
logger.info("Ending voice session...")
|
logger.info("Ending voice session...")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 1. Disconnect from voice (Phase 2 implementation)
|
# 1. Disconnect from voice channel
|
||||||
# await self.active_session.disconnect()
|
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
|
# 2. Resume text channel inference
|
||||||
await self._resume_text_channels()
|
await self._resume_text_channels()
|
||||||
@@ -324,6 +338,13 @@ class VoiceSessionManager:
|
|||||||
"""Cleanup resources if session start fails"""
|
"""Cleanup resources if session start fails"""
|
||||||
logger.warning("Cleaning up after failed session start...")
|
logger.warning("Cleaning up after failed session start...")
|
||||||
try:
|
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._unblock_vision_model()
|
||||||
await self._enable_image_generation()
|
await self._enable_image_generation()
|
||||||
await self._resume_text_channels()
|
await self._resume_text_channels()
|
||||||
@@ -332,6 +353,9 @@ class VoiceSessionManager:
|
|||||||
await self._resume_autonomous_engine()
|
await self._resume_autonomous_engine()
|
||||||
await self._resume_scheduled_events()
|
await self._resume_scheduled_events()
|
||||||
await self._resume_figurine_notifier()
|
await self._resume_figurine_notifier()
|
||||||
|
|
||||||
|
# Clear the session
|
||||||
|
self.active_session = None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error during cleanup: {e}")
|
logger.error(f"Error during cleanup: {e}")
|
||||||
|
|
||||||
|
|||||||
415
readmes/VOICE_CHAT_PHASE1_TESTING.md
Normal file
415
readmes/VOICE_CHAT_PHASE1_TESTING.md
Normal file
@@ -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
|
||||||
1
soprano_to_rvc
Submodule
1
soprano_to_rvc
Submodule
Submodule soprano_to_rvc added at 1b54e4d5e2
Reference in New Issue
Block a user