diff --git a/assets/pasted-20260215-010356-27394307.jpg b/assets/pasted-20260215-010356-27394307.jpg new file mode 100644 index 0000000..4e8e666 Binary files /dev/null and b/assets/pasted-20260215-010356-27394307.jpg differ diff --git a/bot.php b/bot.php index af92915..bdd9e05 100644 --- a/bot.php +++ b/bot.php @@ -2,6 +2,8 @@ declare(strict_types=1); +putenv('PATH=' . getenv('PATH') . ':/usr/bin:/usr/local/bin'); + require_once __DIR__ . '/vendor/autoload.php'; require_once __DIR__ . '/db/config.php'; @@ -51,13 +53,130 @@ $voiceClient = null; $joiningGuilds = []; $ffmpegPath = trim((string)shell_exec("command -v ffmpeg")); +/** + * Safely join a voice channel by ensuring any existing connection is closed first. + */ +function safeJoin(Discord $discord, $channel, $interaction = null, $onSuccess = null) { + global $joiningGuilds; + $guildId = $channel->guild_id; + + // Check if we are already in the correct channel + $vc = $discord->getVoiceClient($guildId); + if ($vc) { + if ((string)$vc->channel->id === (string)$channel->id) { + $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); + if ($isReady) { + logToDb("Already in channel {$channel->name} and ready."); + unset($joiningGuilds[$guildId]); + if ($onSuccess) $onSuccess($vc); + return; + } else { + logToDb("Already in channel {$channel->name} but not ready yet. Waiting..."); + // Don't start a new join, just wait or if stuck, clear and try again + if (!isset($joiningGuilds[$guildId])) { + $joiningGuilds[$guildId] = true; + } + $vc->once('ready', function() use ($onSuccess, $vc, $guildId) { + global $joiningGuilds; + unset($joiningGuilds[$guildId]); + if ($onSuccess) $onSuccess($vc); + }); + return; + } + } else { + logToDb("In different channel ({$vc->channel->name}), closing old connection first."); + $vc->close(); + // Fall through to the timer logic below if needed, or just let it proceed + } + } + + if (isset($joiningGuilds[$guildId]) && $joiningGuilds[$guildId] === true) { + logToDb("Join already in progress for guild $guildId"); + if ($interaction) { + try { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("⏳ A join request is already in progress...")); + } catch (\Throwable $e) {} + } + return; + } + + $joiningGuilds[$guildId] = true; + + // Safety timeout: clear joining state after 45 seconds + $discord->getLoop()->addTimer(45.0, function() use ($guildId) { + global $joiningGuilds; + if (isset($joiningGuilds[$guildId]) && $joiningGuilds[$guildId] === true) { + logToDb("Safety timeout: Clearing stuck join state for guild $guildId"); + unset($joiningGuilds[$guildId]); + } + }); + + $doJoin = function() use ($discord, $channel, $interaction, $onSuccess, $guildId) { + global $joiningGuilds; + + logToDb("Executing joinVoiceChannel for guild $guildId, channel " . $channel->name); + $discord->joinVoiceChannel($channel, false, false)->then(function (VoiceClient $vc) use ($onSuccess, $guildId, $discord) { + global $joiningGuilds; + $joiningGuilds[$guildId] = 'connected'; // Mark as connected but maybe not ready + logToDb("Successfully joined " . $vc->channel->name); + + $vc->on('error', function ($e) use ($guildId) { + logToDb("VoiceClient Error in guild $guildId: " . $e->getMessage(), 'error'); + }); + + $vc->on('close', function () use ($guildId) { + global $joiningGuilds; + unset($joiningGuilds[$guildId]); + logToDb("VoiceClient Closed in guild $guildId"); + }); + + $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); + if ($isReady) { + unset($joiningGuilds[$guildId]); + if ($onSuccess) $onSuccess($vc); + } else { + $vc->once('ready', function() use ($onSuccess, $vc, $guildId) { + global $joiningGuilds; + unset($joiningGuilds[$guildId]); + if ($onSuccess) $onSuccess($vc); + }); + } + }, function ($e) use ($interaction, $guildId, $discord) { + global $joiningGuilds; + unset($joiningGuilds[$guildId]); + logToDb("Error joining VC in guild $guildId: " . $e->getMessage(), 'error'); + + if ($interaction) { + try { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Error joining voice channel: " . $e->getMessage())); + } catch (\Throwable $err) {} + } + }); + }; + + // If we just closed a VC, wait a bit for Discord to catch up + if ($vc) { + $discord->getLoop()->addTimer(1.5, $doJoin); + } else { + $doJoin(); + } +} + function logToDb($message, $level = 'info') { + // Basic safety check for DB connection + static $db_working = true; + if (!$db_working && $level !== 'error') return; + + // Echo to console anyway + echo "[" . date('Y-m-d H:i:s') . "] [$level] $message\n"; + try { $db = db(); $stmt = $db->prepare("INSERT INTO bot_logs (message, log_level) VALUES (?, ?)"); $stmt->execute([$message, $level]); - } catch (Exception $e) { - echo "Log failed: " . $e->getMessage() . "\n"; + } catch (\Throwable $e) { + $db_working = false; + // Don't echo again to avoid loops if echo itself fails (unlikely) } } @@ -71,8 +190,25 @@ $discord->on('ready', function (Discord $discord) { // Listen for voice state updates to debug disconnecting issues $discord->on(Event::VOICE_STATE_UPDATE, function ($state, Discord $discord) { if ($state->user_id == $discord->id) { - echo "Bot voice state updated: Channel=" . ($state->channel_id ?? 'None') . " Session=" . ($state->session_id ?? 'None') . "\n"; - logToDb("Bot voice state updated: Channel=" . ($state->channel_id ?? 'None')); + $channelName = 'None'; + if ($state->channel_id) { + $channel = $discord->getChannel($state->channel_id); + $channelName = $channel ? $channel->name : $state->channel_id; + } + logToDb("Bot voice state updated: Channel=" . $channelName); + + // If the bot was disconnected or moved + if ($state->channel_id === null) { + logToDb("Bot was disconnected from voice channel. Cleaning up..."); + global $joiningGuilds; + unset($joiningGuilds[$state->guild_id]); + + // Ensure VoiceClient is closed if it still exists + $vc = $discord->getVoiceClient($state->guild_id); + if ($vc) { + try { $vc->close(); } catch (\Throwable $e) {} + } + } } }); @@ -95,20 +231,36 @@ $discord->on('ready', function (Discord $discord) { $stmt->execute([$now . '%']); $alarms = $stmt->fetchAll(PDO::FETCH_ASSOC); + $alarmCount = 0; foreach ($alarms as $alarm) { - echo "Alarm triggered for user {$alarm['user_id']} at {$alarm['alarm_time']}\n"; - logToDb("Alarm triggered for user {$alarm['user_id']}"); - playAlarm($discord, $alarm); + $alarmCount++; + $discord->getLoop()->addTimer($alarmCount * 2.0, function() use ($discord, $alarm) { + echo "Alarm triggered for user {$alarm['user_id']} at {$alarm['alarm_time']}\n"; + logToDb("Alarm triggered for user {$alarm['user_id']}"); + playAlarm($discord, $alarm); + }); } }); - // Register Commands + // Register Commands (Uncomment if you need to update commands) registerCommands($discord); + echo "Commands registration updated.\n"; }); +function getOptionValue($options, $name) { + if (!$options) return null; + foreach ($options as $option) { + if ($option->name === $name) { + return $option->value; + } + } + return null; +} + function registerCommands(Discord $discord) { $commands = [ CommandBuilder::new()->setName('join')->setDescription('Join your current voice channel'), + CommandBuilder::new()->setName('rejoin')->setDescription('Force rejoin the voice channel'), CommandBuilder::new()->setName('out')->setDescription('Leave the voice channel'), CommandBuilder::new()->setName('status')->setDescription('Check bot status'), CommandBuilder::new()->setName('play')->setDescription('Play music from URL') @@ -120,6 +272,7 @@ function registerCommands(Discord $discord) { ->addOption((new Option($discord))->setName('link')->setDescription('Audio URL for the alarm')->setType(Option::STRING)->setRequired(true)), CommandBuilder::new()->setName('help')->setDescription('Show help information'), CommandBuilder::new()->setName('ping')->setDescription('Check if bot is responsive'), + CommandBuilder::new()->setName('where')->setDescription('Show which voice channel the bot is in'), ]; foreach ($commands as $command) { @@ -134,8 +287,21 @@ function streamAudio(VoiceClient $vc, string $url, $interaction = null) { $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("🎶 Loading audio info from link...")); } + $userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"; $safeUrl = escapeshellarg($url); - $process = new Process("yt-dlp --no-warnings --no-check-certificates --print \"%(title)s\" --print \"%(url)s\" -f \"ba/b\" --no-playlist --js-runtimes node $safeUrl"); + + // Handle Spotify differently by searching on YouTube + if (strpos($url, 'spotify.com') !== false) { + logToDb("Spotify link detected, searching on YouTube..."); + if ($interaction) { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("🎶 Spotify link detected, searching for audio on YouTube...")); + } + $cmd = "yt-dlp --no-warnings --no-check-certificates --print \"%(title)s\" --print \"%(url)s\" -f \"bestaudio[ext=m4a]/bestaudio/best\" --no-playlist --user-agent \"$userAgent\" \"ytsearch1:" . $url . "\""; + } else { + $cmd = "yt-dlp --no-warnings --no-check-certificates --print \"%(title)s\" --print \"%(url)s\" -f \"bestaudio[ext=m4a]/bestaudio/best\" --no-playlist --user-agent \"$userAgent\" $safeUrl"; + } + + $process = new Process($cmd); try { $process->start($discord->getLoop()); @@ -204,7 +370,7 @@ function streamAudio(VoiceClient $vc, string $url, $interaction = null) { $playAttempted = false; $isClosed = false; $retryCount = 0; - $maxRetries = 20; + $maxRetries = 25; $playFunc = function ($isFallback = false) use (&$playFunc, &$playAttempted, &$isClosed, &$retryCount, $maxRetries, $vc, $streamUrl, $title, $interaction) { if ($isClosed) return; @@ -214,7 +380,6 @@ function streamAudio(VoiceClient $vc, string $url, $interaction = null) { if (!$isReady) { if ($retryCount < $maxRetries) { $retryCount++; - echo "Voice client not ready yet for $title, waiting 2s (attempt $retryCount/$maxRetries)...\n"; $vc->discord->getLoop()->addTimer(2.0, function() use (&$playFunc) { $playFunc(); }); @@ -240,7 +405,7 @@ function streamAudio(VoiceClient $vc, string $url, $interaction = null) { if ($retryCount < $maxRetries && (strpos($e->getMessage(), 'ready') !== false || strpos($e->getMessage(), 'connected') !== false || strpos($e->getMessage(), 'Voice Client') !== false)) { $retryCount++; $playAttempted = false; - echo "Retrying $title (attempt $retryCount/$maxRetries) in 3 seconds due to error: " . $e->getMessage() . "\n"; + echo "Retrying $title (attempt $retryCount/$maxRetries) in 3 seconds...\n"; $vc->discord->getLoop()->addTimer(3.0, function() use (&$playFunc) { $playFunc(); }); @@ -267,24 +432,19 @@ function streamAudio(VoiceClient $vc, string $url, $interaction = null) { } }); - $safetyTimer = $vc->discord->getLoop()->addTimer(45.0, function () use ($vc, $interaction, $title, $fallbackTimer, &$isClosed) { + $safetyTimer = $vc->discord->getLoop()->addTimer(60.0, function () use ($vc, $interaction, $title, $fallbackTimer, &$isClosed) { if ($isClosed) return; try { $vc->discord->getLoop()->cancelTimer($fallbackTimer); $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); if (!$isReady) { - echo "Timed out waiting for voice client to be ready for $title after 45s\n"; - logToDb("Voice client timeout for $title after 45s", 'warning'); - + echo "Timed out waiting for voice client to be ready for $title after 60s\n"; if ($interaction) { - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("⚠️ Voice client timed out waiting to be ready. Please try using `/out` then `/join` again.")); - try { $vc->close(); } catch (\Exception $e) {} + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("⚠️ Voice client timed out. Use `/out` and try again.")); } } - } catch (\Exception $e) { - echo "Error in safety timer: " . $e->getMessage() . "\n"; - } + } catch (\Exception $e) {} }); $vc->once('ready', function() use ($vc, &$playFunc, $fallbackTimer, $safetyTimer, &$isClosed) { @@ -298,21 +458,19 @@ function streamAudio(VoiceClient $vc, string $url, $interaction = null) { $isClosed = true; $vc->discord->getLoop()->cancelTimer($fallbackTimer); $vc->discord->getLoop()->cancelTimer($safetyTimer); - echo "Voice client closed for $title while waiting for ready.\n"; if ($interaction) { - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("⚠️ Voice connection closed before it was ready.")); + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("⚠️ Voice connection closed.")); } }); - - $vc->once('error', function ($e) use ($title) { - echo "Voice client encountered error while waiting for ready for $title: " . $e->getMessage() . "\n"; - logToDb("Voice client error for $title: " . $e->getMessage(), 'error'); - }); } } else { echo "Failed to fetch stream URL for $url. Code: $code\nError Output: $errorOutput\n"; + $errorMessage = "❌ Failed to fetch audio. Link may be invalid or blocked."; + if (strpos($errorOutput, 'blocked') !== false || strpos($errorOutput, '403') !== false) { + $errorMessage = "❌ This platform is blocking the bot's IP. Try a YouTube link instead."; + } if ($interaction) { - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Failed to fetch audio. Make sure the link is valid. (Code $code)")); + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent($errorMessage)); } } }); @@ -322,51 +480,28 @@ function playSahur(Discord $discord, $vcId) { $channel = $discord->getChannel($vcId); if (!$channel) return; - $vc = $discord->getVoiceClient($channel->guild_id); - if ($vc && (string)$vc->channel->id === (string)$channel->id) { - echo "Sahur: Already in channel, playing directly.\n"; + safeJoin($discord, $channel, null, function($vc) { $db = db(); $source = $db->query("SELECT setting_value FROM bot_settings WHERE setting_key = 'sahur_source'")->fetchColumn() ?: 'sahur.mp3'; - if (filter_var($source, FILTER_VALIDATE_URL)) { - streamAudio($vc, $source); - } else if (file_exists($source)) { - $vc->playFile($source); - } - return; - } - - if ($vc) { - try { $vc->close(); } catch (\Throwable $e) {} - } - - $delay = $vc ? 3.0 : 0; - $discord->getLoop()->addTimer($delay, function() use ($discord, $channel) { - if ($discord->getVoiceClient($channel->guild_id)) return; - $discord->joinVoiceChannel($channel, false, false)->then(function (VoiceClient $vc) { - $db = db(); - $source = $db->query("SELECT setting_value FROM bot_settings WHERE setting_key = 'sahur_source'")->fetchColumn() ?: 'sahur.mp3'; - - $playAction = function() use ($vc, $source) { - if (filter_var($source, FILTER_VALIDATE_URL)) { - streamAudio($vc, $source); - } else if (file_exists($source)) { - $vc->playFile($source); - } - }; - - $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); - if ($isReady) { - $playAction(); - } else { - $vc->once('ready', $playAction); - $discord = $vc->discord; - $discord->getLoop()->addTimer(10.0, function() use ($vc, $playAction) { - $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); - if (!$isReady) $playAction(); - }); + $playAction = function() use ($vc, $source) { + if (filter_var($source, FILTER_VALIDATE_URL)) { + streamAudio($vc, $source); + } else if (file_exists($source)) { + $vc->playFile($source); } - }); + }; + + $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); + if ($isReady) { + $playAction(); + } else { + $vc->once('ready', $playAction); + $vc->discord->getLoop()->addTimer(10.0, function() use ($vc, $playAction) { + $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); + if (!$isReady) $playAction(); + }); + } }); } @@ -374,308 +509,231 @@ function playAlarm(Discord $discord, $alarm) { $channel = $discord->getChannel($alarm['channel_id']); if (!$channel) return; - $vc = $discord->getVoiceClient($channel->guild_id); - if ($vc && (string)$vc->channel->id === (string)$channel->id) { - echo "Alarm: Already in channel, playing directly.\n"; - streamAudio($vc, $alarm['audio_url']); - return; - } - - if ($vc) { - try { $vc->close(); } catch (\Throwable $e) {} - } - - $delay = $vc ? 3.0 : 0; - $discord->getLoop()->addTimer($delay, function() use ($discord, $channel, $alarm) { - if ($discord->getVoiceClient($channel->guild_id)) { - $vc = $discord->getVoiceClient($channel->guild_id); - if ((string)$vc->channel->id === (string)$channel->id) streamAudio($vc, $alarm['audio_url']); - return; - } - $discord->joinVoiceChannel($channel, false, false)->then(function (VoiceClient $vc) use ($alarm) { - $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); - if ($isReady) { + safeJoin($discord, $channel, null, function($vc) use ($alarm) { + $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); + if ($isReady) { + streamAudio($vc, $alarm['audio_url']); + } else { + $vc->once('ready', function() use ($vc, $alarm) { streamAudio($vc, $alarm['audio_url']); - } else { - $vc->once('ready', function() use ($vc, $alarm) { - streamAudio($vc, $alarm['audio_url']); - }); - $discord = $vc->discord; - $discord->getLoop()->addTimer(10.0, function() use ($vc, $alarm) { - $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); - if (!$isReady) streamAudio($vc, $alarm['audio_url']); - }); - } - }); + }); + $vc->discord->getLoop()->addTimer(10.0, function() use ($vc, $alarm) { + $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); + if (!$isReady) streamAudio($vc, $alarm['audio_url']); + }); + } }); } -$discord->on(Event::INTERACTION_CREATE, function (Interaction $interaction, Discord $discord) use (&$voiceClient) { +$discord->on(Event::INTERACTION_CREATE, function (Interaction $interaction, Discord $discord) use ($ffmpegPath) { if ($interaction->type !== 2) return; + // 1. Acknowledge IMMEDIATELY to win the 3-second race with Discord + $interaction->acknowledge(); + $command = $interaction->data->name; - logToDb("Received interaction: $command from " . $interaction->member->user->username); + logToDb("Received interaction: $command from " . ($interaction->member->user->username ?? "Unknown")); - switch ($command) { - case 'ping': - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Pong! 🏓")); - break; + try { + switch ($command) { + case 'ping': + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("Pong! 🏓")); + break; - case 'help': - $interaction->respondWithMessage(MessageBuilder::new()->setContent( - "**AsepSahur Bot Commands:**\n" . - "`/join` - Join your voice channel\n" . - "`/play [url]` - Play music from URL\n" . - "`/stop` - Stop current playback\n" . - "`/settime [HH:MM]` - Set your alarm time\n" . - "`/setalarm [url]` - Set your alarm audio\n" . - "`/status` - Check bot status\n" . - "`/ping` - Test bot responsiveness\n" . - "`/out` - Make bot leave voice channel" - )); - break; + case 'help': + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent( + "**AsepSahur Bot Commands:**\n" . + "`/join` - Join your voice channel\n" . + "`/play [url]` - Play music from URL\n" . + "`/stop` - Stop current playback\n" . + "`/settime [HH:MM]` - Set your alarm time\n" . + "`/setalarm [url]` - Set your alarm audio\n" . + "`/status` - Check bot status\n" . + "`/ping` - Test bot responsiveness\n" . + "`/out` - Make bot leave voice channel\n" . + "`/reset` - Hard reset voice state" + )); + break; - case 'status': - $vc = $discord->getVoiceClient($interaction->guild_id); - $isReady = $vc ? (method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false)) : false; - $status = "Bot is online. " . ($vc ? "Connected to " . $vc->channel->name . ($isReady ? " (Ready)" : " (Connecting...)") : "Not in voice channel."); - $interaction->respondWithMessage(MessageBuilder::new()->setContent($status)); - break; - - case 'join': - $userChannel = $interaction->member->getVoiceChannel(); - if (!$userChannel) { - $interaction->respondWithMessage(MessageBuilder::new()->setContent("You must be in a voice channel!")); - return; - } - $interaction->acknowledge(); - - try { - $vc = $discord->getVoiceClient($interaction->guild_id); - $isReady = $vc ? (method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false)) : false; - - if ($vc && $isReady && (string)$vc->channel->id === (string)$userChannel->id) { - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("Already in " . $vc->channel->name)); - return; - } - - global $joiningGuilds; - if (isset($joiningGuilds[$interaction->guild_id])) { - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ A join request is already in progress. Please wait.")); - return; - } - $joiningGuilds[$interaction->guild_id] = true; - - $hadVc = $vc !== null; - if ($vc) { - echo "Closing existing VC for guild " . $interaction->guild_id . " before joining new channel.\n"; - try { - $vc->close(); - } catch (\Throwable $e) {} - } - - $delay = $hadVc ? 7.0 : 0; - echo "Joining channel: " . $userChannel->name . " (Join command, delay: $delay)\n"; - $discord->getLoop()->addTimer($delay, function() use ($discord, $userChannel, $interaction, &$joiningGuilds) { - $vc = $discord->getVoiceClient($interaction->guild_id); - if ($vc && (string)$vc->channel->id === (string)$userChannel->id) { - unset($joiningGuilds[$interaction->guild_id]); - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("Joined " . $vc->channel->name)); - return; - } - - $responded = false; - $joinTimeout = $discord->getLoop()->addTimer(25.0, function() use ($interaction, $discord, &$responded, &$joiningGuilds) { - unset($joiningGuilds[$interaction->guild_id]); - if (!$responded) { - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Joining voice channel timed out (25s).")); - $responded = true; - } - }); - - $discord->joinVoiceChannel($userChannel, false, false)->then(function (VoiceClient $vc) use ($interaction, $discord, $joinTimeout, &$responded, &$joiningGuilds, $userChannel) { - unset($joiningGuilds[$interaction->guild_id]); - if ($responded) return; - $discord->getLoop()->cancelTimer($joinTimeout); - $responded = true; - - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("Joined " . $vc->channel->name)); - $vc->on('close', function() use ($userChannel) { - echo "Voice client closed for channel " . $userChannel->name . "\n"; - }); - }, function ($e) use ($interaction, $discord, $joinTimeout, &$responded, &$joiningGuilds) { - unset($joiningGuilds[$interaction->guild_id]); - if ($responded) return; - $discord->getLoop()->cancelTimer($joinTimeout); - $responded = true; - echo "Error joining VC: " . $e->getMessage() . "\n"; - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Error joining voice channel: " . $e->getMessage())); - }); - }); - } catch (\Throwable $e) { - global $joiningGuilds; - unset($joiningGuilds[$interaction->guild_id]); - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Error: " . $e->getMessage())); - } - break; - - case 'play': - $url = $interaction->data->options['url']->value; - $userChannel = $interaction->member->getVoiceChannel(); - if (!$userChannel) { - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Join a VC first!")); - return; - } - - $interaction->acknowledge(); - - try { + case 'status': $vc = $discord->getVoiceClient($interaction->guild_id); $isReady = $vc ? (method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false)) : false; - if ($vc && $isReady && (string)$vc->channel->id === (string)$userChannel->id) { - echo "Already in correct channel and ready. Streaming...\n"; - streamAudio($vc, $url, $interaction); + $db = db(); + $sahurTime = $db->query("SELECT setting_value FROM bot_settings WHERE setting_key = 'sahur_time'")->fetchColumn() ?: '03:00'; + + $status = "🤖 **Bot Status:** Online\n"; + $status .= "🔊 **Voice:** " . ($vc ? "Connected to **" . $vc->channel->name . "**" . ($isReady ? " ✅" : " ⏳") : "Disconnected ❌") . "\n"; + $status .= "⏰ **Sahur Time:** " . $sahurTime . "\n"; + $status .= "🛠 **FFmpeg:** " . ($ffmpegPath ? "✅" : "❌") . "\n"; + + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent($status)); + break; + + case 'where': + $guild = $discord->guilds->get('id', $interaction->guild_id); + $voiceState = $guild ? $guild->voice_states->get('user_id', $discord->id) : null; + $vc = $discord->getVoiceClient($interaction->guild_id); + + $msg = ""; + if ($voiceState && $voiceState->channel_id) { + $channel = $discord->getChannel($voiceState->channel_id); + $msg .= "📍 **Discord thinks I am in:** " . ($channel ? $channel->name : $voiceState->channel_id) . "\n"; } else { - global $joiningGuilds; - if (isset($joiningGuilds[$interaction->guild_id])) { - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ A join request is already in progress. Please wait.")); - return; - } - $joiningGuilds[$interaction->guild_id] = true; - - $hadVc = $vc !== null; - if ($vc) { - echo "Voice client in bad state (ready=" . ($isReady ? 'yes' : 'no') . ") or wrong channel, closing and rejoining...\n"; - try { - $vc->close(); - } catch (\Throwable $e) { - echo "Error closing VC: " . $e->getMessage() . "\n"; - } - } - - $delay = $hadVc ? 7.0 : 0; // Increased delay to 7s for cleaner state - echo "Joining channel: " . $userChannel->name . " (Play command, delay: $delay)\n"; - $discord->getLoop()->addTimer($delay, function() use ($discord, $userChannel, $interaction, $url, &$joiningGuilds) { - // Double check if we already joined via another command during the delay - $vc = $discord->getVoiceClient($interaction->guild_id); - if ($vc && (string)$vc->channel->id === (string)$userChannel->id) { - $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); - if ($isReady) { - unset($joiningGuilds[$interaction->guild_id]); - echo "Already in channel after delay and ready, streaming...\n"; - streamAudio($vc, $url, $interaction); - return; - } - } - - // If we have a stale VC that didn't close, try one last time - if ($vc && (string)$vc->channel->id !== (string)$userChannel->id) { - try { $vc->close(); } catch (\Throwable $e) {} - } - - $responded = false; - $joinTimeout = $discord->getLoop()->addTimer(25.0, function() use ($interaction, $discord, &$responded, &$joiningGuilds) { - unset($joiningGuilds[$interaction->guild_id]); - if (!$responded) { - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Joining voice channel timed out (25s). Try again.")); - $responded = true; - } - }); - - $discord->joinVoiceChannel($userChannel, false, false)->then(function (VoiceClient $vc) use ($interaction, $discord, $url, $joinTimeout, &$responded, &$joiningGuilds) { - unset($joiningGuilds[$interaction->guild_id]); - if ($responded) return; - $discord->getLoop()->cancelTimer($joinTimeout); - $responded = true; - - echo "Joined voice channel, waiting 2s for state to settle...\n"; - $discord->getLoop()->addTimer(2.0, function() use ($vc, $url, $interaction) { - streamAudio($vc, $url, $interaction); - }); - }, function ($e) use ($interaction, $discord, $joinTimeout, &$responded, &$joiningGuilds) { - unset($joiningGuilds[$interaction->guild_id]); - if ($responded) return; - $discord->getLoop()->cancelTimer($joinTimeout); - $responded = true; - echo "Error joining VC: " . $e->getMessage() . "\n"; - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Error joining voice channel: " . $e->getMessage())); - }); - }); + $msg .= "📍 **Discord thinks I am:** Not in a channel\n"; } - } catch (\Throwable $e) { + + if ($vc) { + $isReady = method_exists($vc, 'isReady') ? $vc->isReady() : ($vc->ready ?? false); + $msg .= "🔊 **VoiceClient state:** Connected to **" . $vc->channel->name . "** (" . ($isReady ? "Ready ✅" : "Connecting ⏳") . ")"; + } else { + $msg .= "🔊 **VoiceClient state:** No active connection ❌"; + } + + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent($msg)); + break; + + case 'reset': + global $joiningGuilds; + $joiningGuilds = []; + $vc = $discord->getVoiceClient($interaction->guild_id); + if ($vc) { + try { $vc->close(); } catch (\Throwable $e) {} + } + $discord->getLoop()->addTimer(0.5, function() use ($discord, $interaction) { + $discord->selectVoiceChannel(null); + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("🔄 **Hard Reset complete.** Voice states cleared. Try `/join` again.")); + }); + break; + + case 'rejoin': + case 'join': + $userChannel = $interaction->member->getVoiceChannel(); + if (!$userChannel) { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ You must be in a voice channel!")); + return; + } + + // Clear state for this guild if it's a rejoin + if ($command === 'rejoin') { + global $joiningGuilds; + unset($joiningGuilds[$interaction->guild_id]); + } + + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("⏳ Joining " . $userChannel->name . "...")); + + safeJoin($discord, $userChannel, $interaction, function($vc) use ($interaction) { + try { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("✅ Joined " . $vc->channel->name)); + } catch (\Throwable $e) {} + }); + break; + + case 'play': + $opts = $interaction->data->options; + $url = getOptionValue($opts, 'url'); + if (!$url) { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ URL is missing!")); + return; + } + $userChannel = $interaction->member->getVoiceChannel(); + if (!$userChannel) { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Join a VC first!")); + return; + } + + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("⏳ Joining and preparing audio...")); + + safeJoin($discord, $userChannel, $interaction, function($vc) use ($url, $interaction) { + $vc->discord->getLoop()->addTimer(1.0, function() use ($vc, $url, $interaction) { + streamAudio($vc, $url, $interaction); + }); + }); + break; + + case 'stop': + $vc = $discord->getVoiceClient($interaction->guild_id); + if ($vc) { + $vc->stop(); + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("Stopped playback.")); + } else { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("Nothing is playing.")); + } + break; + + case 'out': global $joiningGuilds; unset($joiningGuilds[$interaction->guild_id]); - echo "Fatal error in play command: " . $e->getMessage() . "\n"; - $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Fatal error: " . $e->getMessage())); - } - break; - - case 'stop': - $vc = $discord->getVoiceClient($interaction->guild_id); - if ($vc) { - $vc->stop(); - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Stopped playback.")); - } else { - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Nothing is playing.")); - } - break; - - case 'out': - $vc = $discord->getVoiceClient($interaction->guild_id); - if ($vc) { - try { - $vc->close(); - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Left voice channel and cleaned up connection.")); - } catch (\Throwable $e) { - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Left voice channel.")); + + $vc = $discord->getVoiceClient($interaction->guild_id); + if ($vc) { + try { + $vc->close(); + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("✅ Left voice channel.")); + } catch (\Throwable $e) { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("✅ Left with error: " . $e->getMessage())); + } + } else { + $discord->selectVoiceChannel(null); + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("💨 Requested to leave voice channel.")); } - } else { - $interaction->respondWithMessage(MessageBuilder::new()->setContent("I'm not in a voice channel.")); - } - break; + break; - case 'settime': - $time = $interaction->data->options['time']->value; - if (!preg_match('/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/', $time)) { - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Invalid format. Use HH:MM (e.g. 03:00)")); - return; - } - $userId = (string)$interaction->member->id; - $guildId = (string)$interaction->guild_id; - $channelId = (string)($interaction->member->getVoiceChannel()->id ?? ''); - - if (empty($channelId)) { - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Please join a voice channel first so I know where to wake you up!")); - return; - } + case 'settime': + $opts = $interaction->data->options; + $time = getOptionValue($opts, 'time'); + if (!$time || !preg_match('/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/', $time)) { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Invalid format. Use HH:MM (e.g. 03:00)")); + return; + } + $userId = (string)$interaction->member->id; + $guildId = (string)$interaction->guild_id; + $channel = $interaction->member->getVoiceChannel(); + $channelId = (string)($channel->id ?? ''); + + if (empty($channelId)) { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Join a voice channel first!")); + return; + } - $db = db(); - $stmt = $db->prepare("INSERT INTO bot_alarms (user_id, guild_id, channel_id, alarm_time, audio_url) - VALUES (?, ?, ?, ?, 'sahur.mp3') - ON DUPLICATE KEY UPDATE alarm_time = ?, guild_id = ?, channel_id = ?"); - $stmt->execute([$userId, $guildId, $channelId, $time, $time, $guildId, $channelId]); - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Alarm time set to $time. I will join " . $interaction->member->getVoiceChannel()->name . " at that time.")); - break; + $db = db(); + $stmt = $db->prepare("INSERT INTO bot_alarms (user_id, guild_id, channel_id, alarm_time, audio_url) + VALUES (?, ?, ?, ?, 'sahur.mp3') + ON DUPLICATE KEY UPDATE alarm_time = ?, guild_id = ?, channel_id = ?"); + $stmt->execute([$userId, $guildId, $channelId, $time, $time, $guildId, $channelId]); + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("✅ Alarm set to $time in " . $channel->name)); + break; - case 'setalarm': - $link = $interaction->data->options['link']->value; - $userId = (string)$interaction->member->id; - $guildId = (string)$interaction->guild_id; - $channelId = (string)($interaction->member->getVoiceChannel()->id ?? ''); + case 'setalarm': + $opts = $interaction->data->options; + $link = getOptionValue($opts, 'link'); + if (!$link) { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Link is missing!")); + return; + } + $userId = (string)$interaction->member->id; + $guildId = (string)$interaction->guild_id; + $channel = $interaction->member->getVoiceChannel(); + $channelId = (string)($channel->id ?? ''); - if (empty($channelId)) { - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Please join a voice channel first!")); - return; - } + if (empty($channelId)) { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ Join a voice channel first!")); + return; + } - $db = db(); - $stmt = $db->prepare("INSERT INTO bot_alarms (user_id, guild_id, channel_id, alarm_time, audio_url) - VALUES (?, ?, ?, '03:00', ?) - ON DUPLICATE KEY UPDATE audio_url = ?, guild_id = ?, channel_id = ?"); - $stmt->execute([$userId, $guildId, $channelId, $link, $link, $guildId, $channelId]); - $interaction->respondWithMessage(MessageBuilder::new()->setContent("Alarm audio set.")); - break; + $db = db(); + $stmt = $db->prepare("INSERT INTO bot_alarms (user_id, guild_id, channel_id, alarm_time, audio_url) + VALUES (?, ?, ?, '03:00', ?) + ON DUPLICATE KEY UPDATE audio_url = ?, guild_id = ?, channel_id = ?"); + $stmt->execute([$userId, $guildId, $channelId, $link, $link, $guildId, $channelId]); + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("✅ Alarm audio updated.")); + break; + } + } catch (\Throwable $e) { + logToDb("Command Error ($command): " . $e->getMessage(), 'error'); + try { + $interaction->updateOriginalResponse(MessageBuilder::new()->setContent("❌ An unexpected error occurred: " . $e->getMessage())); + } catch (\Throwable $e2) {} } }); diff --git a/bot.pid b/bot.pid index 5dff6dd..ed6e0d1 100644 --- a/bot.pid +++ b/bot.pid @@ -1 +1 @@ -62488 \ No newline at end of file +65594 \ No newline at end of file diff --git a/bot_output.log b/bot_output.log index f55a021..938ce19 100644 --- a/bot_output.log +++ b/bot_output.log @@ -1,231 +1,273 @@ -[2026-02-15T00:26:25.026728+00:00] DiscordPHP.DEBUG: Initializing DiscordPHP v10.46.0 (DiscordPHP-Http: v10.8.0 & Gateway: v10) on PHP 8.2.29 -[2026-02-15T00:26:25.536811+00:00] DiscordPHP.DEBUG: BUCKET getapplications/@me queued REQ GET applications/@me -[2026-02-15T00:26:25.536989+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:25.776384+00:00] DiscordPHP.DEBUG: BUCKET getgateway/bot queued REQ GET gateway/bot -[2026-02-15T00:26:25.776521+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":1,"empty":true} -[2026-02-15T00:26:28.509411+00:00] DiscordPHP.DEBUG: REQ GET applications/@me successful -[2026-02-15T00:26:28.509536+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":1,"empty":true} -[2026-02-15T00:26:28.753689+00:00] DiscordPHP.DEBUG: REQ GET gateway/bot successful -[2026-02-15T00:26:28.753849+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:26:28.756324+00:00] DiscordPHP.INFO: gateway retrieved and set {"gateway":"wss://gateway.discord.gg/?v=10&encoding=json&compress=zlib-stream","session":{"total":1000,"remaining":951,"reset_after":61318182,"max_concurrency":1}} -[2026-02-15T00:26:28.756439+00:00] DiscordPHP.DEBUG: session data received {"session":{"total":1000,"remaining":951,"reset_after":61318182,"max_concurrency":1}} -[2026-02-15T00:26:28.756728+00:00] DiscordPHP.INFO: starting connection to websocket {"gateway":"wss://gateway.discord.gg/?v=10&encoding=json&compress=zlib-stream"} -[2026-02-15T00:26:31.264852+00:00] DiscordPHP.INFO: websocket connection has been created -[2026-02-15T00:26:31.273514+00:00] DiscordPHP.INFO: received hello -[2026-02-15T00:26:31.273642+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":null} -[2026-02-15T00:26:31.273795+00:00] DiscordPHP.INFO: heartbeat timer initialized {"interval":41250.0} -[2026-02-15T00:26:31.273881+00:00] DiscordPHP.INFO: identifying {"payload":{"op":2,"d":{"token":"*****","properties":{"os":"Linux","browser":"DiscordBot (https://github.com/discord-php/DiscordPHP-HTTP, v10.8.0)","device":"DiscordBot (https://github.com/discord-php/DiscordPHP-HTTP, v10.8.0)","referrer":"https://github.com/discord-php/DiscordPHP","referring_domain":"https://github.com/discord-php/DiscordPHP"},"compress":true,"intents":53608189}}} -[2026-02-15T00:26:31.504029+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":230.22198677062988} -[2026-02-15T00:26:31.504342+00:00] DiscordPHP.DEBUG: ready packet received -[2026-02-15T00:26:31.504392+00:00] DiscordPHP.DEBUG: resume_gateway_url received {"url":"wss://gateway-us-east1-d.discord.gg"} -[2026-02-15T00:26:31.504426+00:00] DiscordPHP.DEBUG: discord trace received {"trace":["[\"gateway-prd-arm-us-east1-d-nskz\",{\"micros\":125634,\"calls\":[\"id_created\",{\"micros\":651,\"calls\":[]},\"session_lookup_time\",{\"micros\":240,\"calls\":[]},\"session_lookup_finished\",{\"micros\":11,\"calls\":[]},\"discord-sessions-prd-2-6\",{\"micros\":124460,\"calls\":[\"start_session\",{\"micros\":108591,\"calls\":[\"discord-api-rpc-66c79f4bd4-lwjf2\",{\"micros\":46696,\"calls\":[\"get_user\",{\"micros\":6587},\"get_guilds\",{\"micros\":5897},\"send_scheduled_deletion_message\",{\"micros\":13},\"guild_join_requests\",{\"micros\":2},\"authorized_ip_coro\",{\"micros\":8},\"pending_payments\",{\"micros\":1196},\"apex_experiments\",{\"micros\":50683},\"sessions_experiments\",{\"micros\":5},\"user_activities\",{\"micros\":3},\"played_application_ids\",{\"micros\":2},\"linked_users\",{\"micros\":2},\"ad_personalization_toggles_disabled\",{\"micros\":2},\"regional_feature_config\",{\"micros\":2}]}]},\"starting_guild_connect\",{\"micros\":33,\"calls\":[]},\"presence_started\",{\"micros\":5346,\"calls\":[]},\"guilds_started\",{\"micros\":69,\"calls\":[]},\"lobbies_started\",{\"micros\":2,\"calls\":[]},\"guilds_connect\",{\"micros\":1,\"calls\":[]},\"presence_connect\",{\"micros\":10391,\"calls\":[]},\"connect_finished\",{\"micros\":10404,\"calls\":[]},\"build_ready\",{\"micros\":13,\"calls\":[]},\"clean_ready\",{\"micros\":0,\"calls\":[]},\"optimize_ready\",{\"micros\":1,\"calls\":[]},\"split_ready\",{\"micros\":0,\"calls\":[]}]}]}]"]} -[2026-02-15T00:26:31.507222+00:00] DiscordPHP.DEBUG: client created and session id stored {"session_id":"b7d96fb916cfae600b6d76157941da16","user":{"id":"1471909193886859294","username":"AsepSahur","discriminator":"6954","global_name":null,"avatar":"https://cdn.discordapp.com/avatars/1471909193886859294/8a88b0710fa41f7eef469c3dedc30e27.webp?size=1024","bot":true,"system":null,"mfa_enabled":false,"banner":null,"accent_color":null,"locale":null,"verified":true,"email":null,"flags":0,"premium_type":null,"public_flags":null,"avatar_decoration_data":null,"collectibles":null,"primary_guild":null}} -[2026-02-15T00:26:31.511969+00:00] DiscordPHP.INFO: stored guilds {"count":0,"unavailable":1} -[2026-02-15T00:26:31.752666+00:00] DiscordPHP.DEBUG: guild available {"guild":"1428530728706117632","unavailable":1} -[2026-02-15T00:26:31.752807+00:00] DiscordPHP.INFO: all guilds are now available {"count":1} -[2026-02-15T00:26:31.752862+00:00] DiscordPHP.INFO: loadAllMembers option is disabled, not setting chunking up -[2026-02-15T00:26:31.754394+00:00] DiscordPHP.INFO: voice class initialized -[2026-02-15T00:26:31.754483+00:00] DiscordPHP.INFO: client is ready -[2026-02-15T00:26:31.754521+00:00] DiscordPHP.INFO: The 'ready' event is deprecated and will be removed in a future version of DiscordPHP. Please use 'init' instead. +[2026-02-15T01:21:24.179066+00:00] DiscordPHP.DEBUG: Initializing DiscordPHP v10.46.0 (DiscordPHP-Http: v10.8.0 & Gateway: v10) on PHP 8.2.29 +[2026-02-15T01:21:24.416639+00:00] DiscordPHP.DEBUG: BUCKET getapplications/@me queued REQ GET applications/@me +[2026-02-15T01:21:24.416803+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:24.421972+00:00] DiscordPHP.DEBUG: BUCKET getgateway/bot queued REQ GET gateway/bot +[2026-02-15T01:21:24.422081+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":1,"empty":true} +[2026-02-15T01:21:25.545013+00:00] DiscordPHP.DEBUG: REQ GET gateway/bot successful +[2026-02-15T01:21:25.545142+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":1,"empty":true} +[2026-02-15T01:21:25.545833+00:00] DiscordPHP.INFO: gateway retrieved and set {"gateway":"wss://gateway.discord.gg/?v=10&encoding=json&compress=zlib-stream","session":{"total":1000,"remaining":943,"reset_after":58021228,"max_concurrency":1}} +[2026-02-15T01:21:25.545933+00:00] DiscordPHP.DEBUG: session data received {"session":{"total":1000,"remaining":943,"reset_after":58021228,"max_concurrency":1}} +[2026-02-15T01:21:25.546025+00:00] DiscordPHP.INFO: starting connection to websocket {"gateway":"wss://gateway.discord.gg/?v=10&encoding=json&compress=zlib-stream"} +[2026-02-15T01:21:25.914364+00:00] DiscordPHP.DEBUG: REQ GET applications/@me successful +[2026-02-15T01:21:25.914501+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:26.155535+00:00] DiscordPHP.INFO: websocket connection has been created +[2026-02-15T01:21:26.156718+00:00] DiscordPHP.INFO: received hello +[2026-02-15T01:21:26.156820+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":null} +[2026-02-15T01:21:26.156975+00:00] DiscordPHP.INFO: heartbeat timer initialized {"interval":41250.0} +[2026-02-15T01:21:26.157049+00:00] DiscordPHP.INFO: identifying {"payload":{"op":2,"d":{"token":"*****","properties":{"os":"Linux","browser":"DiscordBot (https://github.com/discord-php/DiscordPHP-HTTP, v10.8.0)","device":"DiscordBot (https://github.com/discord-php/DiscordPHP-HTTP, v10.8.0)","referrer":"https://github.com/discord-php/DiscordPHP","referring_domain":"https://github.com/discord-php/DiscordPHP"},"compress":true,"intents":53608189}}} +[2026-02-15T01:21:26.196047+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":39.06393051147461} +[2026-02-15T01:21:26.401984+00:00] DiscordPHP.DEBUG: ready packet received +[2026-02-15T01:21:26.402133+00:00] DiscordPHP.DEBUG: resume_gateway_url received {"url":"wss://gateway-us-east1-d.discord.gg"} +[2026-02-15T01:21:26.402180+00:00] DiscordPHP.DEBUG: discord trace received {"trace":["[\"gateway-prd-arm-us-east1-d-wz3x\",{\"micros\":179694,\"calls\":[\"id_created\",{\"micros\":575,\"calls\":[]},\"session_lookup_time\",{\"micros\":2741,\"calls\":[]},\"session_lookup_finished\",{\"micros\":13,\"calls\":[]},\"discord-sessions-prd-2-39\",{\"micros\":176050,\"calls\":[\"start_session\",{\"micros\":138073,\"calls\":[\"discord-api-rpc-66c79f4bd4-84d54\",{\"micros\":41070,\"calls\":[\"get_user\",{\"micros\":19595},\"get_guilds\",{\"micros\":6268},\"send_scheduled_deletion_message\",{\"micros\":13},\"guild_join_requests\",{\"micros\":3},\"authorized_ip_coro\",{\"micros\":9},\"pending_payments\",{\"micros\":1330},\"apex_experiments\",{\"micros\":60186},\"sessions_experiments\",{\"micros\":4},\"user_activities\",{\"micros\":2},\"played_application_ids\",{\"micros\":2},\"linked_users\",{\"micros\":2},\"ad_personalization_toggles_disabled\",{\"micros\":2},\"regional_feature_config\",{\"micros\":1}]}]},\"starting_guild_connect\",{\"micros\":78,\"calls\":[]},\"presence_started\",{\"micros\":14072,\"calls\":[]},\"guilds_started\",{\"micros\":50,\"calls\":[]},\"lobbies_started\",{\"micros\":1,\"calls\":[]},\"guilds_connect\",{\"micros\":1,\"calls\":[]},\"presence_connect\",{\"micros\":23740,\"calls\":[]},\"connect_finished\",{\"micros\":23760,\"calls\":[]},\"build_ready\",{\"micros\":13,\"calls\":[]},\"clean_ready\",{\"micros\":0,\"calls\":[]},\"optimize_ready\",{\"micros\":1,\"calls\":[]},\"split_ready\",{\"micros\":0,\"calls\":[]}]}]}]"]} +[2026-02-15T01:21:26.405825+00:00] DiscordPHP.DEBUG: client created and session id stored {"session_id":"fa9d1c394b938f0f95a8233d9e6e27db","user":{"id":"1471909193886859294","username":"AsepSahur","discriminator":"6954","global_name":null,"avatar":"https://cdn.discordapp.com/avatars/1471909193886859294/8a88b0710fa41f7eef469c3dedc30e27.webp?size=1024","bot":true,"system":null,"mfa_enabled":false,"banner":null,"accent_color":null,"locale":null,"verified":true,"email":null,"flags":0,"premium_type":null,"public_flags":null,"avatar_decoration_data":null,"collectibles":null,"primary_guild":null}} +[2026-02-15T01:21:26.411487+00:00] DiscordPHP.INFO: stored guilds {"count":0,"unavailable":1} +[2026-02-15T01:21:26.657465+00:00] DiscordPHP.DEBUG: guild available {"guild":"1428530728706117632","unavailable":1} +[2026-02-15T01:21:26.657649+00:00] DiscordPHP.INFO: all guilds are now available {"count":1} +[2026-02-15T01:21:26.657701+00:00] DiscordPHP.INFO: loadAllMembers option is disabled, not setting chunking up +[2026-02-15T01:21:26.659699+00:00] DiscordPHP.INFO: voice class initialized +[2026-02-15T01:21:26.659852+00:00] DiscordPHP.INFO: client is ready +[2026-02-15T01:21:26.659942+00:00] DiscordPHP.INFO: The 'ready' event is deprecated and will be removed in a future version of DiscordPHP. Please use 'init' instead. Bot is ready as AsepSahur#6954 -[2026-02-15T00:26:31.769977+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands -[2026-02-15T00:26:31.770093+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:31.770762+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands -[2026-02-15T00:26:31.770926+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands -[2026-02-15T00:26:31.771139+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands -[2026-02-15T00:26:31.771253+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands -[2026-02-15T00:26:31.771424+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands -[2026-02-15T00:26:31.771564+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands -[2026-02-15T00:26:31.771657+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands -[2026-02-15T00:26:31.771771+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands -[2026-02-15T00:26:32.640173+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful -[2026-02-15T00:26:32.640347+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:26:32.640452+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:32.775724+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful -[2026-02-15T00:26:32.775858+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:26:32.775962+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:32.885739+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful -[2026-02-15T00:26:32.885870+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:26:32.885966+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:33.013718+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful -[2026-02-15T00:26:33.013855+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:26:33.014012+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:33.251221+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful -[2026-02-15T00:26:33.251337+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:26:33.251414+00:00] DiscordPHP.INFO: BUCKET postapplications/:application_id/commands expecting rate limit, timer interval 19501 ms -Bot voice state updated: Channel=None Session=32b92a1765281c33083bc516222c87da -[2026-02-15T00:26:52.754708+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:53.460847+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful -[2026-02-15T00:26:53.461014+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:26:53.461221+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:53.565085+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful -[2026-02-15T00:26:53.565279+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:26:53.565395+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:53.671534+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful -[2026-02-15T00:26:53.671667+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:26:53.671761+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:26:53.779108+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful -[2026-02-15T00:26:53.779284+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:27:12.526978+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":3} -[2026-02-15T00:27:12.582944+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":55.60588836669922} -[2026-02-15T00:27:28.200809+00:00] DiscordPHP.DEBUG: BUCKET postinteractions/:interaction_id/:interaction_token/callback queued REQ POST interactions/1472388810703634613/aW50ZXJhY3Rpb246MTQ3MjM4ODgxMDcwMzYzNDYxMzozdndXS2x3R1lZNmVENkE2WVZ5OGpyeUNVdEpQbW9EWUxreVNlN013Z1lGVUhhSE05dWFxd1hMbWtOZUxBNHhLY3FsangyeFBRMmxWWGExY1VJQXFOakYwenhKVzFxWGcwQVYxTmc3UWV6Tmh5Nml5QXJCaG93a2d1VGk3U3BTSw/callback -[2026-02-15T00:27:28.200970+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -Joining channel: Staff voice (Join command, delay: 0) -Bot voice state updated: Channel=1457687430189682781 Session=b7d96fb916cfae600b6d76157941da16 -[2026-02-15T00:27:28.336182+00:00] DiscordPHP.INFO: received session id for voice session {"guild":"1428530728706117632","session_id":"b7d96fb916cfae600b6d76157941da16"} -[2026-02-15T00:27:28.460582+00:00] DiscordPHP.INFO: received token and endpoint for voice session {"guild":"1428530728706117632","token":"*****","endpoint":"c-fra20-5f509e9b.discord.media:2083"} -[2026-02-15T00:27:28.468217+00:00] DiscordPHP.DEBUG: Creating new voice websocket {"endpoint":"c-fra20-5f509e9b.discord.media:2083"} -[2026-02-15T00:27:28.741969+00:00] DiscordPHP.DEBUG: REQ POST interactions/1472388810703634613/aW50ZXJhY3Rpb246MTQ3MjM4ODgxMDcwMzYzNDYxMzozdndXS2x3R1lZNmVENkE2WVZ5OGpyeUNVdEpQbW9EWUxreVNlN013Z1lGVUhhSE05dWFxd1hMbWtOZUxBNHhLY3FsangyeFBRMmxWWGExY1VJQXFOakYwenhKVzFxWGcwQVYxTmc3UWV6Tmh5Nml5QXJCaG93a2d1VGk3U3BTSw/callback successful -[2026-02-15T00:27:28.742131+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:27:29.060447+00:00] DiscordPHP.DEBUG: connected to voice websocket -[2026-02-15T00:27:29.063655+00:00] DiscordPHP.DEBUG: sending identify {"packet":{"op":0,"d":{"server_id":"1428530728706117632","user_id":"1471909193886859294","token":"*****","max_dave_protocol_version":0,"session_id":"b7d96fb916cfae600b6d76157941da16"}}} -[2026-02-15T00:27:29.065286+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:27:29.183929+00:00] DiscordPHP.DEBUG: received voice ready packet {"data":{"streams":[{"type":"video","ssrc":4205,"rtx_ssrc":4206,"rid":"","quality":0,"active":false}],"ssrc":4204,"port":19314,"modes":["aead_aes256_gcm_rtpsize","aead_xchacha20_poly1305_rtpsize"],"ip":"104.29.147.190","experiments":["fixed_keyframe_interval"]}} -[2026-02-15T00:27:29.193458+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":193.4359073638916} -[2026-02-15T00:27:29.193668+00:00] DiscordPHP.DEBUG: received client connect packet {"data":{"Discord\\WebSockets\\Payload":{"op":11,"d":{"user_ids":["235088799074484224","830530156048285716","906246223504240641","923944350612848700","1414108278354608278"]}}}} -[2026-02-15T00:27:29.195278+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"235088799074484224","ssrc":228,"speaking":1}} -[2026-02-15T00:27:29.195556+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"830530156048285716","ssrc":243,"speaking":1}} -[2026-02-15T00:27:29.196722+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"235088799074484224","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:29.196893+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"830530156048285716","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:29.196985+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"906246223504240641","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:29.197149+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"923944350612848700","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:29.197248+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"1414108278354608278","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:29.198158+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"235088799074484224","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:29.285629+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"830530156048285716","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:29.285959+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"906246223504240641","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:29.286081+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"923944350612848700","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:29.286175+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"1414108278354608278","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:29.408338+00:00] DiscordPHP.DEBUG: received our IP and port {"ip":"34.16.53.23","port":2944} -[2026-02-15T00:27:29.525706+00:00] DiscordPHP.DEBUG: received description packet, vc ready {"data":{"video_codec":"H264","secure_frames_version":0,"secret_key":"*****","mode":"aead_aes256_gcm_rtpsize","media_session_id":"208aefde4d8f4e84527d8d3adce568cc","dave_protocol_version":0,"audio_codec":"opus"}} -[2026-02-15T00:27:29.525947+00:00] DiscordPHP.INFO: voice manager is ready -[2026-02-15T00:27:29.530929+00:00] DiscordPHP.DEBUG: BUCKET patchwebhooks/:application_id/:interaction_token/messages/@original queued REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjM4ODgxMDcwMzYzNDYxMzozdndXS2x3R1lZNmVENkE2WVZ5OGpyeUNVdEpQbW9EWUxreVNlN013Z1lGVUhhSE05dWFxd1hMbWtOZUxBNHhLY3FsangyeFBRMmxWWGExY1VJQXFOakYwenhKVzFxWGcwQVYxTmc3UWV6Tmh5Nml5QXJCaG93a2d1VGk3U3BTSw/messages/@original -[2026-02-15T00:27:29.531117+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:27:29.532198+00:00] DiscordPHP.INFO: voice client is ready -[2026-02-15T00:27:29.532507+00:00] DiscordPHP.INFO: set voice client bitrate {"bitrate":64000} -[2026-02-15T00:27:29.533860+00:00] DiscordPHP.DEBUG: received any packet {"data":{"attributes":{"any":0},"created":true,"class":"Discord\\Voice\\Any"}} -Bot voice state updated: Channel=None Session=b7d96fb916cfae600b6d76157941da16 -[2026-02-15T00:27:29.584704+00:00] DiscordPHP.INFO: received session id for voice session {"guild":"1428530728706117632","session_id":"b7d96fb916cfae600b6d76157941da16"} -[2026-02-15T00:27:29.682457+00:00] DiscordPHP.WARNING: voice websocket closed {"op":4014,"reason":"Disconnected."} -[2026-02-15T00:27:29.682628+00:00] DiscordPHP.WARNING: closing UDP client -[2026-02-15T00:27:29.682902+00:00] DiscordPHP.WARNING: received critical opcode - not reconnecting {"op":4014,"reason":"Disconnected."} -Voice client closed for channel Staff voice -[2026-02-15T00:27:29.683082+00:00] DiscordPHP.WARNING: voice manager closed -[2026-02-15T00:27:29.683365+00:00] DiscordPHP.WARNING: voice client closed -[2026-02-15T00:27:30.861353+00:00] DiscordPHP.DEBUG: REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjM4ODgxMDcwMzYzNDYxMzozdndXS2x3R1lZNmVENkE2WVZ5OGpyeUNVdEpQbW9EWUxreVNlN013Z1lGVUhhSE05dWFxd1hMbWtOZUxBNHhLY3FsangyeFBRMmxWWGExY1VJQXFOakYwenhKVzFxWGcwQVYxTmc3UWV6Tmh5Nml5QXJCaG93a2d1VGk3U3BTSw/messages/@original successful -[2026-02-15T00:27:30.861522+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:27:31.270157+00:00] DiscordPHP.DEBUG: resetting payload count {"count":6} -[2026-02-15T00:27:36.367000+00:00] DiscordPHP.DEBUG: BUCKET postinteractions/:interaction_id/:interaction_token/callback queued REQ POST interactions/1472388845000720548/aW50ZXJhY3Rpb246MTQ3MjM4ODg0NTAwMDcyMDU0ODo3Z1pWV3BPQXN4b2NBZjZwaGFKRGNPcXRsQmFQbU93em5QdUcyamhITTNJb1V5amEza1l5QkxMNkZWanJBVWEyVU56VkdrMXhSMW9NMnlIYmQ4dGZWcnM0d0JVN3VGUFlIYUFEbEgwZG5ESzRpTmRDNDVNN1d6clFyMzk3eU5Nbg/callback -[2026-02-15T00:27:36.367168+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -Joining channel: Staff voice (Join command, delay: 0) -Bot voice state updated: Channel=1457687430189682781 Session=b7d96fb916cfae600b6d76157941da16 -[2026-02-15T00:27:36.423793+00:00] DiscordPHP.INFO: received session id for voice session {"guild":"1428530728706117632","session_id":"b7d96fb916cfae600b6d76157941da16"} -[2026-02-15T00:27:36.423969+00:00] DiscordPHP.INFO: received session id for voice session {"guild":"1428530728706117632","session_id":"b7d96fb916cfae600b6d76157941da16"} -[2026-02-15T00:27:36.532734+00:00] DiscordPHP.INFO: received token and endpoint for voice session {"guild":"1428530728706117632","token":"*****","endpoint":"c-fra20-5f509e9b.discord.media:2083"} -[2026-02-15T00:27:36.535514+00:00] DiscordPHP.DEBUG: Creating new voice websocket {"endpoint":"c-fra20-5f509e9b.discord.media:2083"} -[2026-02-15T00:27:36.536892+00:00] DiscordPHP.INFO: received token and endpoint for voice session {"guild":"1428530728706117632","token":"*****","endpoint":"c-fra20-5f509e9b.discord.media:2083"} -[2026-02-15T00:27:36.538998+00:00] DiscordPHP.DEBUG: Creating new voice websocket {"endpoint":"c-fra20-5f509e9b.discord.media:2083"} -[2026-02-15T00:27:36.906803+00:00] DiscordPHP.DEBUG: REQ POST interactions/1472388845000720548/aW50ZXJhY3Rpb246MTQ3MjM4ODg0NTAwMDcyMDU0ODo3Z1pWV3BPQXN4b2NBZjZwaGFKRGNPcXRsQmFQbU93em5QdUcyamhITTNJb1V5amEza1l5QkxMNkZWanJBVWEyVU56VkdrMXhSMW9NMnlIYmQ4dGZWcnM0d0JVN3VGUFlIYUFEbEgwZG5ESzRpTmRDNDVNN1d6clFyMzk3eU5Nbg/callback successful -[2026-02-15T00:27:36.906965+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:27:37.133270+00:00] DiscordPHP.DEBUG: connected to voice websocket -[2026-02-15T00:27:37.133643+00:00] DiscordPHP.DEBUG: sending identify {"packet":{"op":0,"d":{"server_id":"1428530728706117632","user_id":"1471909193886859294","token":"*****","max_dave_protocol_version":0,"session_id":"b7d96fb916cfae600b6d76157941da16"}}} -[2026-02-15T00:27:37.134428+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:27:37.163057+00:00] DiscordPHP.DEBUG: connected to voice websocket -[2026-02-15T00:27:37.163423+00:00] DiscordPHP.DEBUG: sending identify {"packet":{"op":0,"d":{"server_id":"1428530728706117632","user_id":"1471909193886859294","token":"*****","max_dave_protocol_version":0,"session_id":"b7d96fb916cfae600b6d76157941da16"}}} -[2026-02-15T00:27:37.164044+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:27:37.258172+00:00] DiscordPHP.DEBUG: received voice ready packet {"data":{"streams":[{"type":"video","ssrc":4208,"rtx_ssrc":4209,"rid":"","quality":0,"active":false}],"ssrc":4207,"port":19314,"modes":["aead_aes256_gcm_rtpsize","aead_xchacha20_poly1305_rtpsize"],"ip":"104.29.147.190","experiments":["fixed_keyframe_interval"]}} -[2026-02-15T00:27:37.258696+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":258.6820125579834} -[2026-02-15T00:27:37.259037+00:00] DiscordPHP.DEBUG: received client connect packet {"data":{"Discord\\WebSockets\\Payload":{"op":11,"d":{"user_ids":["235088799074484224","830530156048285716","906246223504240641","923944350612848700","1414108278354608278"]}}}} -[2026-02-15T00:27:37.259281+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"235088799074484224","ssrc":228,"speaking":1}} -[2026-02-15T00:27:37.259655+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"830530156048285716","ssrc":243,"speaking":1}} -[2026-02-15T00:27:37.259846+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"235088799074484224","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.259984+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"830530156048285716","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.260061+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"906246223504240641","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.260132+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"923944350612848700","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.260193+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"1414108278354608278","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.300968+00:00] DiscordPHP.DEBUG: received voice ready packet {"data":{"streams":[{"type":"video","ssrc":4211,"rtx_ssrc":4212,"rid":"","quality":0,"active":false}],"ssrc":4210,"port":19314,"modes":["aead_aes256_gcm_rtpsize","aead_xchacha20_poly1305_rtpsize"],"ip":"104.29.147.190","experiments":["fixed_keyframe_interval"]}} -[2026-02-15T00:27:37.301462+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":301.44810676574707} -[2026-02-15T00:27:37.301852+00:00] DiscordPHP.DEBUG: received client connect packet {"data":{"Discord\\WebSockets\\Payload":{"op":11,"d":{"user_ids":["235088799074484224","830530156048285716","906246223504240641","923944350612848700","1414108278354608278"]}}}} -[2026-02-15T00:27:37.302176+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"235088799074484224","ssrc":228,"speaking":1}} -[2026-02-15T00:27:37.302458+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"830530156048285716","ssrc":243,"speaking":1}} -[2026-02-15T00:27:37.302618+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"235088799074484224","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.302698+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"830530156048285716","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.302779+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"906246223504240641","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.302871+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"923944350612848700","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.303253+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"1414108278354608278","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} -[2026-02-15T00:27:37.303378+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"235088799074484224","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.353067+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"235088799074484224","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.353312+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"830530156048285716","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.353394+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"906246223504240641","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.353456+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"923944350612848700","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.353514+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"1414108278354608278","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.353575+00:00] DiscordPHP.WARNING: voice websocket closed {"op":4006,"reason":"Session is no longer valid."} -[2026-02-15T00:27:37.353872+00:00] DiscordPHP.WARNING: closing UDP client -[2026-02-15T00:27:37.354136+00:00] DiscordPHP.WARNING: received critical opcode - not reconnecting {"op":4006,"reason":"Session is no longer valid."} -[2026-02-15T00:27:37.354262+00:00] DiscordPHP.DEBUG: sessions {"voice_sessions":{"1428530728706117632":null}} -[2026-02-15T00:27:37.417071+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"830530156048285716","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.417299+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"906246223504240641","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.417380+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"923944350612848700","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.417440+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"1414108278354608278","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} -[2026-02-15T00:27:37.471810+00:00] DiscordPHP.DEBUG: received our IP and port {"ip":"34.16.53.23","port":2945} -[2026-02-15T00:27:42.819165+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:27:50.889114+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:27:50.914717+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:27:51.008974+00:00] DiscordPHP.DEBUG: sent UDP heartbeat -[2026-02-15T00:27:51.040682+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":1040.6620502471924} -[2026-02-15T00:27:53.778996+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":13} -[2026-02-15T00:27:53.817862+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":38.62905502319336} -[2026-02-15T00:27:56.569609+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:01.368923+00:00] DiscordPHP.DEBUG: BUCKET patchwebhooks/:application_id/:interaction_token/messages/@original queued REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjM4ODg0NTAwMDcyMDU0ODo3Z1pWV3BPQXN4b2NBZjZwaGFKRGNPcXRsQmFQbU93em5QdUcyamhITTNJb1V5amEza1l5QkxMNkZWanJBVWEyVU56VkdrMXhSMW9NMnlIYmQ4dGZWcnM0d0JVN3VGUFlIYUFEbEgwZG5ESzRpTmRDNDVNN1d6clFyMzk3eU5Nbg/messages/@original -[2026-02-15T00:28:01.369198+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:28:01.430640+00:00] DiscordPHP.DEBUG: BUCKET postinteractions/:interaction_id/:interaction_token/callback queued REQ POST interactions/1472388950009188362/aW50ZXJhY3Rpb246MTQ3MjM4ODk1MDAwOTE4ODM2MjpXM2prZllRMjdCQjBFSVAxbW1nNkUzanZIQ1h3ZEdiU3ltZDh1WURnZTVNZ3lUcDNPSjdaN1hKTTl4QW5NMTNvNnhtT0lzZXZGWllMblhBZXJDMlh3YVZKT3BpREVLSjJzaFJDSjNRN0tuM0szZFJEUEhUY2JoOUxkcUd3NnB1cw/callback -[2026-02-15T00:28:01.430814+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":1,"empty":true} -[2026-02-15T00:28:01.744405+00:00] DiscordPHP.DEBUG: REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjM4ODg0NTAwMDcyMDU0ODo3Z1pWV3BPQXN4b2NBZjZwaGFKRGNPcXRsQmFQbU93em5QdUcyamhITTNJb1V5amEza1l5QkxMNkZWanJBVWEyVU56VkdrMXhSMW9NMnlIYmQ4dGZWcnM0d0JVN3VGUFlIYUFEbEgwZG5ESzRpTmRDNDVNN1d6clFyMzk3eU5Nbg/messages/@original successful -[2026-02-15T00:28:01.744552+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":1,"empty":true} -[2026-02-15T00:28:01.931121+00:00] DiscordPHP.DEBUG: REQ POST interactions/1472388950009188362/aW50ZXJhY3Rpb246MTQ3MjM4ODk1MDAwOTE4ODM2MjpXM2prZllRMjdCQjBFSVAxbW1nNkUzanZIQ1h3ZEdiU3ltZDh1WURnZTVNZ3lUcDNPSjdaN1hKTTl4QW5NMTNvNnhtT0lzZXZGWllMblhBZXJDMlh3YVZKT3BpREVLSjJzaFJDSjNRN0tuM0szZFJEUEhUY2JoOUxkcUd3NnB1cw/callback successful -[2026-02-15T00:28:01.931278+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:28:04.641929+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:04.665312+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:04.759086+00:00] DiscordPHP.DEBUG: sent UDP heartbeat -[2026-02-15T00:28:04.791840+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":791.8200492858887} -[2026-02-15T00:28:10.325171+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:13.260220+00:00] DiscordPHP.DEBUG: BUCKET postinteractions/:interaction_id/:interaction_token/callback queued REQ POST interactions/1472388999791378573/aW50ZXJhY3Rpb246MTQ3MjM4ODk5OTc5MTM3ODU3MzpYdmVYdDk1QWhUSUxuSkdiVHFZWVFZT1dOeE5zdWhQSVBqaVZ6emJtOTlENklGcnNzaURmdnhiRlV0a01qUkM0aFJLSGJic21zbzNZd09xdktWeDVRem00Y1ljM1NQOHFnb3hhUTMxMGo5ODlZeXdWTnFaQXF3Y2c1OGkxQ25DWQ/callback -[2026-02-15T00:28:13.260445+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -Voice client in bad state (ready=no) or wrong channel, closing and rejoining... -Error closing VC: Voice Client is not connected. -Joining channel: Staff voice (Play command, delay: 7) -[2026-02-15T00:28:13.761212+00:00] DiscordPHP.DEBUG: REQ POST interactions/1472388999791378573/aW50ZXJhY3Rpb246MTQ3MjM4ODk5OTc5MTM3ODU3MzpYdmVYdDk1QWhUSUxuSkdiVHFZWVFZT1dOeE5zdWhQSVBqaVZ6emJtOTlENklGcnNzaURmdnhiRlV0a01qUkM0aFJLSGJic21zbzNZd09xdktWeDVRem00Y1ljM1NQOHFnb3hhUTMxMGo5ODlZeXdWTnFaQXF3Y2c1OGkxQ25DWQ/callback successful -[2026-02-15T00:28:13.761349+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:28:18.395936+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:18.415770+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:18.509383+00:00] DiscordPHP.DEBUG: sent UDP heartbeat -[2026-02-15T00:28:18.542777+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":542.7589416503906} -Error joining VC: You cannot join more than one voice channel per guild/server. -[2026-02-15T00:28:20.266371+00:00] DiscordPHP.DEBUG: BUCKET patchwebhooks/:application_id/:interaction_token/messages/@original queued REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjM4ODk5OTc5MTM3ODU3MzpYdmVYdDk1QWhUSUxuSkdiVHFZWVFZT1dOeE5zdWhQSVBqaVZ6emJtOTlENklGcnNzaURmdnhiRlV0a01qUkM0aFJLSGJic21zbzNZd09xdktWeDVRem00Y1ljM1NQOHFnb3hhUTMxMGo5ODlZeXdWTnFaQXF3Y2c1OGkxQ25DWQ/messages/@original -[2026-02-15T00:28:20.266507+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} -[2026-02-15T00:28:20.744427+00:00] DiscordPHP.DEBUG: REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjM4ODk5OTc5MTM3ODU3MzpYdmVYdDk1QWhUSUxuSkdiVHFZWVFZT1dOeE5zdWhQSVBqaVZ6emJtOTlENklGcnNzaURmdnhiRlV0a01qUkM0aFJLSGJic21zbzNZd09xdktWeDVRem00Y1ljM1NQOHFnb3hhUTMxMGo5ODlZeXdWTnFaQXF3Y2c1OGkxQ25DWQ/messages/@original successful -[2026-02-15T00:28:20.744597+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} -[2026-02-15T00:28:24.076110+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:31.276819+00:00] DiscordPHP.DEBUG: resetting payload count {"count":2} -[2026-02-15T00:28:32.147563+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:32.166290+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:32.259649+00:00] DiscordPHP.DEBUG: sent UDP heartbeat -[2026-02-15T00:28:32.293142+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":293.1220531463623} -[2026-02-15T00:28:35.031902+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":22} -[2026-02-15T00:28:35.088545+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":56.31303787231445} -[2026-02-15T00:28:37.829079+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:45.905219+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:45.916768+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:46.009910+00:00] DiscordPHP.DEBUG: sent UDP heartbeat -[2026-02-15T00:28:46.048413+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":1048.3899116516113} -[2026-02-15T00:28:51.580409+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:59.662562+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:59.667247+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:28:59.760123+00:00] DiscordPHP.DEBUG: sent UDP heartbeat -[2026-02-15T00:28:59.794857+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":794.8310375213623} -[2026-02-15T00:29:05.335608+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:29:13.419662+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:29:13.419900+00:00] DiscordPHP.DEBUG: sending heartbeat -[2026-02-15T00:29:13.510283+00:00] DiscordPHP.DEBUG: sent UDP heartbeat -[2026-02-15T00:29:13.547033+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":547.0149517059326} -[2026-02-15T00:29:16.284832+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":22} -[2026-02-15T00:29:16.338273+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":53.08389663696289} +[2026-02-15 01:21:26] [info] Bot is online and ready: AsepSahur +[2026-02-15T01:21:26.676686+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.676828+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:26.678091+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.678370+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.678593+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.678947+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.679127+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.679272+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.681477+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.681829+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.682039+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +[2026-02-15T01:21:26.901444+00:00] DiscordPHP.DEBUG: BUCKET postapplications/:application_id/commands queued REQ POST applications/1471909193886859294/commands +Commands registration updated. +[2026-02-15T01:21:28.152116+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:28.152304+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:28.152439+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:28.401785+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:28.401922+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:28.402024+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:28.656857+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:28.657005+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:28.657101+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:28.902056+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:28.902187+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:28.902284+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:29.153934+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:29.154048+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:29.154155+00:00] DiscordPHP.INFO: BUCKET postapplications/:application_id/commands expecting rate limit, timer interval 19012 ms +[2026-02-15T01:21:48.180409+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.401025+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:48.401163+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.401271+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.547767+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:48.547886+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.548001+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.644015+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:48.644148+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.644244+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.792306+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:48.792454+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.792569+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.892540+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:21:48.892682+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:21:48.892774+00:00] DiscordPHP.INFO: BUCKET postapplications/:application_id/commands expecting rate limit, timer interval 19512 ms +[2026-02-15 01:21:55] [info] Bot voice state updated: Channel=None +[2026-02-15 01:21:55] [info] Bot was disconnected from voice channel. Cleaning up... +[2026-02-15T01:22:07.418777+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":6} +[2026-02-15T01:22:07.465045+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":46.00691795349121} +[2026-02-15T01:22:08.405953+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:22:08.635648+00:00] DiscordPHP.DEBUG: REQ POST applications/1471909193886859294/commands successful +[2026-02-15T01:22:08.635796+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:22:26.169189+00:00] DiscordPHP.DEBUG: resetting payload count {"count":3} +[2026-02-15T01:22:48.689175+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":6} +[2026-02-15T01:22:48.738158+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":48.729896545410156} +[2026-02-15T01:23:26.196475+00:00] DiscordPHP.DEBUG: resetting payload count {"count":1} +[2026-02-15T01:23:29.943601+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":6} +[2026-02-15T01:23:29.982412+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":38.51890563964844} +[2026-02-15T01:24:11.200025+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":9} +[2026-02-15T01:24:11.251399+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":50.86684226989746} +[2026-02-15T01:24:26.208817+00:00] DiscordPHP.DEBUG: resetting payload count {"count":2} +[2026-02-15T01:24:52.468642+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":9} +[2026-02-15T01:24:52.515780+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":46.85688018798828} +[2026-02-15T01:25:26.240431+00:00] DiscordPHP.DEBUG: resetting payload count {"count":1} +[2026-02-15T01:25:33.726799+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":9} +[2026-02-15T01:25:33.773440+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":46.36383056640625} +[2026-02-15T01:26:14.989784+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":12} +[2026-02-15T01:26:15.069764+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":79.68711853027344} +[2026-02-15T01:26:26.245350+00:00] DiscordPHP.DEBUG: resetting payload count {"count":2} +[2026-02-15T01:26:56.269276+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":12} +[2026-02-15T01:26:56.312419+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":42.819976806640625} +[2026-02-15T01:27:15.195702+00:00] DiscordPHP.DEBUG: BUCKET postinteractions/:interaction_id/:interaction_token/callback queued REQ POST interactions/1472403849338814544/aW50ZXJhY3Rpb246MTQ3MjQwMzg0OTMzODgxNDU0NDpaNUl1TzJ3b0pkZ2VlZFlncHVZcmJZSmkzQk5mSVBEMU94SG1DSXdYbFp6MWRTYVNvNFRHV0gwdGRDR3lUNWJmbEk5WkJvcmZzTWFQcUt4T3ZieDV3VnF0d3pybGk5UTk3Ym5sdlpyMno1Qmd1MFZvQml1OUtzZ1dhVjNqbVpTTw/callback +[2026-02-15T01:27:15.195887+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15 01:27:15] [info] Received interaction: join from rio.xmc +[2026-02-15T01:27:15.204401+00:00] DiscordPHP.DEBUG: BUCKET patchwebhooks/:application_id/:interaction_token/messages/@original queued REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjQwMzg0OTMzODgxNDU0NDpaNUl1TzJ3b0pkZ2VlZFlncHVZcmJZSmkzQk5mSVBEMU94SG1DSXdYbFp6MWRTYVNvNFRHV0gwdGRDR3lUNWJmbEk5WkJvcmZzTWFQcUt4T3ZieDV3VnF0d3pybGk5UTk3Ym5sdlpyMno1Qmd1MFZvQml1OUtzZ1dhVjNqbVpTTw/messages/@original +[2026-02-15T01:27:15.204563+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":1,"empty":true} +[2026-02-15 01:27:15] [info] Executing joinVoiceChannel for guild 1428530728706117632, channel Staff voice +[2026-02-15 01:27:15] [info] Bot voice state updated: Channel=Staff voice +[2026-02-15T01:27:15.277299+00:00] DiscordPHP.INFO: received session id for voice session {"guild":"1428530728706117632","session_id":"fa9d1c394b938f0f95a8233d9e6e27db"} +[2026-02-15T01:27:15.626325+00:00] DiscordPHP.DEBUG: REQ POST interactions/1472403849338814544/aW50ZXJhY3Rpb246MTQ3MjQwMzg0OTMzODgxNDU0NDpaNUl1TzJ3b0pkZ2VlZFlncHVZcmJZSmkzQk5mSVBEMU94SG1DSXdYbFp6MWRTYVNvNFRHV0gwdGRDR3lUNWJmbEk5WkJvcmZzTWFQcUt4T3ZieDV3VnF0d3pybGk5UTk3Ym5sdlpyMno1Qmd1MFZvQml1OUtzZ1dhVjNqbVpTTw/callback successful +[2026-02-15T01:27:15.626485+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":1,"empty":true} +[2026-02-15T01:27:15.657400+00:00] DiscordPHP.INFO: received token and endpoint for voice session {"guild":"1428530728706117632","token":"*****","endpoint":"c-fra20-5f509e9b.discord.media:2083"} +[2026-02-15T01:27:15.663762+00:00] DiscordPHP.DEBUG: Creating new voice websocket {"endpoint":"c-fra20-5f509e9b.discord.media:2083"} +[2026-02-15T01:27:16.050173+00:00] DiscordPHP.DEBUG: REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjQwMzg0OTMzODgxNDU0NDpaNUl1TzJ3b0pkZ2VlZFlncHVZcmJZSmkzQk5mSVBEMU94SG1DSXdYbFp6MWRTYVNvNFRHV0gwdGRDR3lUNWJmbEk5WkJvcmZzTWFQcUt4T3ZieDV3VnF0d3pybGk5UTk3Ym5sdlpyMno1Qmd1MFZvQml1OUtzZ1dhVjNqbVpTTw/messages/@original successful +[2026-02-15T01:27:16.050321+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:27:16.241494+00:00] DiscordPHP.DEBUG: connected to voice websocket +[2026-02-15T01:27:16.244873+00:00] DiscordPHP.DEBUG: sending identify {"packet":{"op":0,"d":{"server_id":"1428530728706117632","user_id":"1471909193886859294","token":"*****","max_dave_protocol_version":0,"session_id":"fa9d1c394b938f0f95a8233d9e6e27db"}}} +[2026-02-15T01:27:16.246426+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:27:16.364752+00:00] DiscordPHP.DEBUG: received voice ready packet {"data":{"streams":[{"type":"video","ssrc":4376,"rtx_ssrc":4377,"rid":"","quality":0,"active":false}],"ssrc":4375,"port":19314,"modes":["aead_aes256_gcm_rtpsize","aead_xchacha20_poly1305_rtpsize"],"ip":"104.29.147.190","experiments":["fixed_keyframe_interval"]}} +[2026-02-15T01:27:16.374499+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":374.4819164276123} +[2026-02-15T01:27:16.374898+00:00] DiscordPHP.DEBUG: received client connect packet {"data":{"Discord\\WebSockets\\Payload":{"op":11,"d":{"user_ids":["235088799074484224","830530156048285716","906246223504240641","923944350612848700","1414108278354608278"]}}}} +[2026-02-15T01:27:16.377260+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"235088799074484224","ssrc":228,"speaking":1}} +[2026-02-15T01:27:16.377594+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"830530156048285716","ssrc":243,"speaking":1}} +[2026-02-15T01:27:16.378672+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"235088799074484224","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:16.378879+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"830530156048285716","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:16.378991+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"906246223504240641","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:16.379076+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"923944350612848700","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:16.379339+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"1414108278354608278","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:16.380386+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"235088799074484224","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:16.380566+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"830530156048285716","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:16.380696+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"906246223504240641","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:16.380786+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"923944350612848700","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:16.380956+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"1414108278354608278","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:16.590597+00:00] DiscordPHP.DEBUG: received our IP and port {"ip":"34.16.53.23","port":2944} +[2026-02-15T01:27:16.707813+00:00] DiscordPHP.DEBUG: received description packet, vc ready {"data":{"video_codec":"H264","secure_frames_version":0,"secret_key":"*****","mode":"aead_aes256_gcm_rtpsize","media_session_id":"208aefde4d8f4e84527d8d3adce568cc","dave_protocol_version":0,"audio_codec":"opus"}} +[2026-02-15T01:27:16.707969+00:00] DiscordPHP.INFO: voice manager is ready +[2026-02-15 01:27:16] [info] Successfully joined Staff voice +[2026-02-15T01:27:16.709626+00:00] DiscordPHP.DEBUG: BUCKET patchwebhooks/:application_id/:interaction_token/messages/@original queued REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjQwMzg0OTMzODgxNDU0NDpaNUl1TzJ3b0pkZ2VlZFlncHVZcmJZSmkzQk5mSVBEMU94SG1DSXdYbFp6MWRTYVNvNFRHV0gwdGRDR3lUNWJmbEk5WkJvcmZzTWFQcUt4T3ZieDV3VnF0d3pybGk5UTk3Ym5sdlpyMno1Qmd1MFZvQml1OUtzZ1dhVjNqbVpTTw/messages/@original +[2026-02-15T01:27:16.709720+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15T01:27:16.710234+00:00] DiscordPHP.INFO: voice client is ready +[2026-02-15T01:27:16.710380+00:00] DiscordPHP.INFO: set voice client bitrate {"bitrate":64000} +[2026-02-15T01:27:16.711374+00:00] DiscordPHP.DEBUG: received any packet {"data":{"attributes":{"any":0},"created":true,"class":"Discord\\Voice\\Any"}} +[2026-02-15 01:27:16] [info] Bot voice state updated: Channel=None +[2026-02-15 01:27:16] [info] Bot was disconnected from voice channel. Cleaning up... +[2026-02-15T01:27:16.765116+00:00] DiscordPHP.WARNING: voice websocket closed {"op":1000,"reason":""} +[2026-02-15T01:27:16.765247+00:00] DiscordPHP.WARNING: closing UDP client +[2026-02-15T01:27:16.765482+00:00] DiscordPHP.WARNING: received critical opcode - not reconnecting {"op":1000,"reason":""} +[2026-02-15 01:27:16] [info] VoiceClient Closed in guild 1428530728706117632 +[2026-02-15T01:27:16.767510+00:00] DiscordPHP.WARNING: voice manager closed +[2026-02-15T01:27:16.767871+00:00] DiscordPHP.WARNING: voice client closed +[2026-02-15T01:27:17.092443+00:00] DiscordPHP.DEBUG: REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjQwMzg0OTMzODgxNDU0NDpaNUl1TzJ3b0pkZ2VlZFlncHVZcmJZSmkzQk5mSVBEMU94SG1DSXdYbFp6MWRTYVNvNFRHV0gwdGRDR3lUNWJmbEk5WkJvcmZzTWFQcUt4T3ZieDV3VnF0d3pybGk5UTk3Ym5sdlpyMno1Qmd1MFZvQml1OUtzZ1dhVjNqbVpTTw/messages/@original successful +[2026-02-15T01:27:17.092571+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:27:19.833704+00:00] DiscordPHP.DEBUG: BUCKET postinteractions/:interaction_id/:interaction_token/callback queued REQ POST interactions/1472403875192639538/aW50ZXJhY3Rpb246MTQ3MjQwMzg3NTE5MjYzOTUzODoyRUFXMVVwWUdRT0NzQzNNaG1UUUhZVGFtMjV5dFFndUVNNmtGR3RRSWhLSlhiclFtSFZrV1Z1eVRKd0lBWVJqTURzRVpQcFU4dm5FWGtWVHRYQ0Z2cGtnTDdqYzJIaWlrWGhzMkl0Umt6WTdjMk9rNGg3eDZPM2FYZERzZ3VZZg/callback +[2026-02-15T01:27:19.833863+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":0,"empty":true} +[2026-02-15 01:27:19] [info] Received interaction: play from rio.xmc +[2026-02-15T01:27:19.838351+00:00] DiscordPHP.DEBUG: BUCKET patchwebhooks/:application_id/:interaction_token/messages/@original queued REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjQwMzg3NTE5MjYzOTUzODoyRUFXMVVwWUdRT0NzQzNNaG1UUUhZVGFtMjV5dFFndUVNNmtGR3RRSWhLSlhiclFtSFZrV1Z1eVRKd0lBWVJqTURzRVpQcFU4dm5FWGtWVHRYQ0Z2cGtnTDdqYzJIaWlrWGhzMkl0Umt6WTdjMk9rNGg3eDZPM2FYZERzZ3VZZg/messages/@original +[2026-02-15T01:27:19.838473+00:00] DiscordPHP.DEBUG: http not checking interaction queue {"waiting":1,"empty":true} +[2026-02-15 01:27:19] [info] Executing joinVoiceChannel for guild 1428530728706117632, channel Staff voice +[2026-02-15 01:27:19] [info] Bot voice state updated: Channel=Staff voice +[2026-02-15T01:27:19.938261+00:00] DiscordPHP.INFO: received session id for voice session {"guild":"1428530728706117632","session_id":"fa9d1c394b938f0f95a8233d9e6e27db"} +[2026-02-15T01:27:19.938407+00:00] DiscordPHP.INFO: received session id for voice session {"guild":"1428530728706117632","session_id":"fa9d1c394b938f0f95a8233d9e6e27db"} +[2026-02-15T01:27:20.036581+00:00] DiscordPHP.INFO: received token and endpoint for voice session {"guild":"1428530728706117632","token":"*****","endpoint":"c-fra20-5f509e9b.discord.media:2083"} +[2026-02-15T01:27:20.038687+00:00] DiscordPHP.DEBUG: Creating new voice websocket {"endpoint":"c-fra20-5f509e9b.discord.media:2083"} +[2026-02-15T01:27:20.039751+00:00] DiscordPHP.INFO: received token and endpoint for voice session {"guild":"1428530728706117632","token":"*****","endpoint":"c-fra20-5f509e9b.discord.media:2083"} +[2026-02-15T01:27:20.041646+00:00] DiscordPHP.DEBUG: Creating new voice websocket {"endpoint":"c-fra20-5f509e9b.discord.media:2083"} +[2026-02-15T01:27:20.551487+00:00] DiscordPHP.DEBUG: REQ POST interactions/1472403875192639538/aW50ZXJhY3Rpb246MTQ3MjQwMzg3NTE5MjYzOTUzODoyRUFXMVVwWUdRT0NzQzNNaG1UUUhZVGFtMjV5dFFndUVNNmtGR3RRSWhLSlhiclFtSFZrV1Z1eVRKd0lBWVJqTURzRVpQcFU4dm5FWGtWVHRYQ0Z2cGtnTDdqYzJIaWlrWGhzMkl0Umt6WTdjMk9rNGg3eDZPM2FYZERzZ3VZZg/callback successful +[2026-02-15T01:27:20.551737+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":1,"empty":true} +[2026-02-15T01:27:20.634962+00:00] DiscordPHP.DEBUG: connected to voice websocket +[2026-02-15T01:27:20.635456+00:00] DiscordPHP.DEBUG: sending identify {"packet":{"op":0,"d":{"server_id":"1428530728706117632","user_id":"1471909193886859294","token":"*****","max_dave_protocol_version":0,"session_id":"fa9d1c394b938f0f95a8233d9e6e27db"}}} +[2026-02-15T01:27:20.636377+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:27:20.637344+00:00] DiscordPHP.DEBUG: connected to voice websocket +[2026-02-15T01:27:20.637749+00:00] DiscordPHP.DEBUG: sending identify {"packet":{"op":0,"d":{"server_id":"1428530728706117632","user_id":"1471909193886859294","token":"*****","max_dave_protocol_version":0,"session_id":"fa9d1c394b938f0f95a8233d9e6e27db"}}} +[2026-02-15T01:27:20.638242+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:27:20.663535+00:00] DiscordPHP.DEBUG: REQ PATCH webhooks/1471909193886859294/aW50ZXJhY3Rpb246MTQ3MjQwMzg3NTE5MjYzOTUzODoyRUFXMVVwWUdRT0NzQzNNaG1UUUhZVGFtMjV5dFFndUVNNmtGR3RRSWhLSlhiclFtSFZrV1Z1eVRKd0lBWVJqTURzRVpQcFU4dm5FWGtWVHRYQ0Z2cGtnTDdqYzJIaWlrWGhzMkl0Umt6WTdjMk9rNGg3eDZPM2FYZERzZ3VZZg/messages/@original successful +[2026-02-15T01:27:20.663704+00:00] DiscordPHP.DEBUG: http not checking queue {"waiting":0,"empty":true} +[2026-02-15T01:27:20.753433+00:00] DiscordPHP.DEBUG: received voice ready packet {"data":{"streams":[{"type":"video","ssrc":4379,"rtx_ssrc":4380,"rid":"","quality":0,"active":false}],"ssrc":4378,"port":19314,"modes":["aead_aes256_gcm_rtpsize","aead_xchacha20_poly1305_rtpsize"],"ip":"104.29.147.190","experiments":["fixed_keyframe_interval"]}} +[2026-02-15T01:27:20.753941+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":753.9238929748535} +[2026-02-15T01:27:20.754275+00:00] DiscordPHP.DEBUG: received client connect packet {"data":{"Discord\\WebSockets\\Payload":{"op":11,"d":{"user_ids":["235088799074484224","830530156048285716","906246223504240641","923944350612848700","1414108278354608278"]}}}} +[2026-02-15T01:27:20.754561+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"235088799074484224","ssrc":228,"speaking":1}} +[2026-02-15T01:27:20.755120+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"830530156048285716","ssrc":243,"speaking":1}} +[2026-02-15T01:27:20.755247+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"235088799074484224","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.755323+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"830530156048285716","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.755391+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"906246223504240641","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.755459+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"923944350612848700","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.755523+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"1414108278354608278","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.755781+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"235088799074484224","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.755867+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"830530156048285716","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.756534+00:00] DiscordPHP.DEBUG: received voice ready packet {"data":{"streams":[{"type":"video","ssrc":4382,"rtx_ssrc":4383,"rid":"","quality":0,"active":false}],"ssrc":4381,"port":19314,"modes":["aead_aes256_gcm_rtpsize","aead_xchacha20_poly1305_rtpsize"],"ip":"104.29.147.190","experiments":["fixed_keyframe_interval"]}} +[2026-02-15T01:27:20.757371+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":757.3609352111816} +[2026-02-15T01:27:20.757491+00:00] DiscordPHP.DEBUG: received client connect packet {"data":{"Discord\\WebSockets\\Payload":{"op":11,"d":{"user_ids":["235088799074484224","830530156048285716","906246223504240641","923944350612848700","1414108278354608278"]}}}} +[2026-02-15T01:27:20.757657+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"235088799074484224","ssrc":228,"speaking":1}} +[2026-02-15T01:27:20.757839+00:00] DiscordPHP.DEBUG: received speaking packet {"data":{"user_id":"830530156048285716","ssrc":243,"speaking":1}} +[2026-02-15T01:27:20.757964+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"235088799074484224","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.758048+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"830530156048285716","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.758118+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"906246223504240641","flags":null},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.758359+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"923944350612848700","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.758439+00:00] DiscordPHP.DEBUG: received flags packet {"data":{"attributes":{"user_id":"1414108278354608278","flags":2},"created":true,"class":"Discord\\Voice\\Flags"}} +[2026-02-15T01:27:20.854022+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"906246223504240641","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.854253+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"923944350612848700","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.854336+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"1414108278354608278","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.854420+00:00] DiscordPHP.WARNING: voice websocket closed {"op":4006,"reason":"Session is no longer valid."} +[2026-02-15T01:27:20.854459+00:00] DiscordPHP.WARNING: closing UDP client +[2026-02-15T01:27:20.854907+00:00] DiscordPHP.WARNING: received critical opcode - not reconnecting {"op":4006,"reason":"Session is no longer valid."} +[2026-02-15T01:27:20.855002+00:00] DiscordPHP.DEBUG: sessions {"voice_sessions":{"1428530728706117632":null}} +[2026-02-15T01:27:20.859310+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"235088799074484224","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.859505+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"830530156048285716","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.859626+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"906246223504240641","platform":null},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.859859+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"923944350612848700","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.860036+00:00] DiscordPHP.DEBUG: received platform packet {"data":{"attributes":{"user_id":"1414108278354608278","platform":1},"created":true,"class":"Discord\\Voice\\Platform"}} +[2026-02-15T01:27:20.974000+00:00] DiscordPHP.DEBUG: received our IP and port {"ip":"34.16.53.23","port":2945} +[2026-02-15T01:27:26.250142+00:00] DiscordPHP.DEBUG: resetting payload count {"count":6} +[2026-02-15T01:27:30.000035+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:27:34.389449+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:27:34.389675+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:27:34.504197+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:27:34.507407+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":507.3850154876709} +[2026-02-15T01:27:37.520005+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":24} +[2026-02-15T01:27:37.559450+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":39.063215255737305} +[2026-02-15T01:27:43.755627+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:27:48.140373+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:27:48.140587+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:27:48.254396+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:27:48.257041+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":257.0199966430664} +[2026-02-15T01:27:57.512536+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15 01:28:00] [info] Safety timeout: Clearing stuck join state for guild 1428530728706117632 +[2026-02-15T01:28:01.894513+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:01.894732+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:02.004663+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:28:02.031734+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":1031.7111015319824} +[2026-02-15T01:28:11.269155+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:15.648645+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:15.648867+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:15.754950+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:28:15.764674+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":764.6501064300537} +[2026-02-15T01:28:18.770279+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":24} +[2026-02-15T01:28:18.892438+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":121.88196182250977} +[2026-02-15T01:28:25.025388+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:26.251793+00:00] DiscordPHP.DEBUG: resetting payload count {"count":2} +[2026-02-15T01:28:29.402500+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:29.402708+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:29.505180+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:28:29.519811+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":519.7858810424805} +[2026-02-15T01:28:38.776733+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:43.156497+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:43.156662+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:43.255509+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:28:43.276555+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":276.5359878540039} +[2026-02-15T01:28:52.529920+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:56.911395+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:56.911599+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:28:57.005701+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:28:57.027547+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":1027.5259017944336} +[2026-02-15T01:29:00.023397+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":24} +[2026-02-15T01:29:00.289588+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":265.9111022949219} +[2026-02-15T01:29:06.280089+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:29:10.666163+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:29:10.666437+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:29:10.755907+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:29:10.785987+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":785.9680652618408} +[2026-02-15T01:29:20.039552+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:29:24.420426+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:29:24.420603+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:29:24.506234+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:29:24.536583+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":536.5610122680664} +[2026-02-15T01:29:26.253682+00:00] DiscordPHP.DEBUG: resetting payload count {"count":1} +[2026-02-15T01:29:33.796537+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:29:38.175306+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:29:38.175513+00:00] DiscordPHP.DEBUG: sending heartbeat +[2026-02-15T01:29:38.256510+00:00] DiscordPHP.DEBUG: sent UDP heartbeat +[2026-02-15T01:29:38.291502+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":291.47791862487793} +[2026-02-15T01:29:41.276525+00:00] DiscordPHP.DEBUG: sending heartbeat {"seq":27} +[2026-02-15T01:29:41.328106+00:00] DiscordPHP.DEBUG: received heartbeat ack {"response_time":51.280975341796875} +[2026-02-15T01:29:47.549486+00:00] DiscordPHP.DEBUG: sending heartbeat