null, ]; private const STATE_ACTIVE = 'active'; private const STATE_MUTE = 'muted'; private const STATE_SELF_MUTE = 'selfMuted'; private string $stateFileDir; private Logger $logger; public function __construct(string $stateFileDir, Logger $logger) { if (!is_dir($stateFileDir)) { throw new \RuntimeException("stateFileDir is no directory"); } $this->stateFileDir = rtrim($stateFileDir, '/'); $this->logger = $logger; } public function updateVoiceState(VoiceStateUpdate $voiceState): void { try { $stateFile = $this->stateFileDir . '/' . sprintf(self::STATE_FILE_TEMPLATE, $voiceState->user_id); if (!file_exists($stateFile)) { $this->createStatusFile($stateFile); } $state = $this->getState($voiceState); file_put_contents($stateFile, json_encode($state)); } catch (\Throwable $t) { $this->logger->error($t); } } private function getState(VoiceStateUpdate $voiceState) { $state = self::STATE_DEFAULT; $state['state'] = self::STATE_ACTIVE; if ($voiceState->mute) { $state['state'] = self::STATE_MUTE; } if ($voiceState->self_mute) { $state['state'] = self::STATE_SELF_MUTE; } return $state; } private function createStatusFile(string $stateFile): void { if (file_exists($stateFile)) { return; } file_put_contents($stateFile, json_encode(self::STATE_DEFAULT)); if (!file_exists($stateFile)) { throw new \RuntimeException("could not create statefile: " . $stateFile); } } }