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;
}
}