config = $config; $this->db = $db; $this->talkManager = $talkManager; $this->userManager = $userManager; $this->attendeeMapper = $attendeeMapper; } protected function execute(InputInterface $input, OutputInterface $output): int { $output->writeln('Reading configured rooms from app config...'); // Get configured rooms from app config (stored as JSON) $roomsJson = $this->config->getAppValue(self::APP_ID, 'rooms', '[]'); $rooms = @json_decode($roomsJson, true); if (!is_array($rooms)) { $output->writeln('No configured rooms found.'); return 1; } $roomTokens = array_keys($rooms); $output->writeln('Found ' . count($roomTokens) . ' configured room(s).'); // Get talk-bot user $botUser = $this->userManager->get('talk-bot'); if ($botUser === null) { $output->writeln('talk-bot user not found. Creating it...'); // talk-bot might not exist yet $output->writeln('Run: php occ user:add --password-from-env talk-bot'); return 1; } // Get table prefix $sysPrefix = $this->config->getSystemValueString('dbtableprefix', ''); $talkPrefix = $this->config->getAppValue('spreed', 'databaseprefix', $sysPrefix); $attendeeTable = $talkPrefix . 'talk_attendee'; $added = 0; $skipped = 0; foreach ($roomTokens as $token) { try { $room = $this->talkManager->getRoomForToken($token); $roomId = $room->getId(); // Check if talk-bot is already an attendee try { $attendee = $this->attendeeMapper->findByActor($roomId, 'users', 'talk-bot'); $output->writeln(' Room ' . $token . ': talk-bot already an attendee (id=' . $roomId . ')'); $skipped++; continue; } catch (DoesNotExistException $e) { // Not found - will create } catch (\Exception $e) { $output->writeln(' Room ' . $token . ': query error - ' . $e->getMessage() . ''); $skipped++; continue; } // Create attendee record $newAttendee = new Attendee(); $newAttendee->setRoomId($roomId); $newAttendee->setActorType('users'); $newAttendee->setActorId('talk-bot'); $newAttendee->setDisplayName('talk-bot'); $newAttendee->setParticipantType(Participant::PERMISSIONS_DEFAULT); $newAttendee->setPermissions(Participant::PERMISSIONS_MAX_DEFAULT); $newAttendee->setNotificationLevel(3); // Full level $newAttendee->setFavorite(false); $newAttendee->setArchived(false); try { $this->attendeeMapper->insert($newAttendee); $output->writeln(' Room ' . $token . ': added talk-bot as attendee (room_id=' . $roomId . ')'); $added++; } catch (Exception $e) { $output->writeln(' Room ' . $token . ': insert failed - ' . $e->getMessage() . ''); } } catch (\Exception $e) { $output->writeln(' Room ' . $token . ': ' . $e->getMessage() . ''); } } $output->writeln(''); $output->writeln('Done: ' . $added . ' added, ' . $skipped . ' skipped.'); return 0; } }