/**
  * Send an email to {$limit} users
  *
  * @param int $limit Number of users we want to send an email to
  * @return int Number of users we sent an email to
  */
 protected function runStep($limit)
 {
     // Get all users which should receive an email
     $affectedUsers = $this->mqHandler->getAffectedUsers($limit);
     if (empty($affectedUsers)) {
         // No users found to notify, mission abort
         return 0;
     }
     $preferences = new \OC\Preferences(\OC_DB::getConnection());
     $userLanguages = $preferences->getValueForUsers('core', 'lang', $affectedUsers);
     $userEmails = $preferences->getValueForUsers('settings', 'email', $affectedUsers);
     // Get all items for these users
     // We don't use time() but "time() - 1" here, so we don't run into
     // runtime issues and delete emails later, which were created in the
     // same second, but were not collected for the emails.
     $sendTime = time() - 1;
     $mailData = $this->mqHandler->getItemsForUsers($affectedUsers, $sendTime);
     // Send Email
     $default_lang = \OC_Config::getValue('default_language', 'en');
     foreach ($mailData as $user => $data) {
         if (!isset($userEmails[$user])) {
             // The user did not setup an email address
             // So we will not send an email :(
             continue;
         }
         $language = isset($userLanguages[$user]) ? $userLanguages[$user] : $default_lang;
         $this->mqHandler->sendEmailToUser($user, $userEmails[$user], $language, $data);
     }
     // Delete all entries we dealt with
     $this->mqHandler->deleteSentItems($affectedUsers, $sendTime);
     return sizeof($affectedUsers);
 }
Exemple #2
0
 public function testGetUserValues()
 {
     $query = \OC_DB::prepare('INSERT INTO `*PREFIX*preferences` VALUES(?, ?, ?, ?)');
     $query->execute(array('SomeUser', 'testGetUserValues', 'somekey', 'somevalue'));
     $query->execute(array('AnotherUser', 'testGetUserValues', 'somekey', 'someothervalue'));
     $query->execute(array('AUser', 'testGetUserValues', 'somekey', 'somevalue'));
     $preferences = new OC\Preferences(\OC_DB::getConnection());
     $users = array('SomeUser', 'AnotherUser', 'NoValueSet');
     $values = $preferences->getValueForUsers('testGetUserValues', 'somekey', $users);
     $this->assertUserValues($values);
     // Add a lot of users so the array is chunked
     for ($i = 1; $i <= 75; $i++) {
         array_unshift($users, 'NoValueBefore#' . $i);
         array_push($users, 'NoValueAfter#' . $i);
     }
     $values = $preferences->getValueForUsers('testGetUserValues', 'somekey', $users);
     $this->assertUserValues($values);
     // Clean DB after the test
     $query = \OC_DB::prepare('DELETE FROM `*PREFIX*preferences` WHERE `appid` = ?');
     $query->execute(array('testGetUserValues'));
 }
Exemple #3
0
 /**
  * Filters the given user array by their notification setting
  *
  * @param array $users
  * @param string $method
  * @param string $type
  * @return array Returns a "username => b:true" Map for method = stream
  *               Returns a "username => i:batchtime" Map for method = email
  */
 public static function filterUsersBySetting($users, $method, $type)
 {
     if (empty($users) || !is_array($users)) {
         return array();
     }
     $preferences = new \OC\Preferences(\OC_DB::getConnection());
     $filteredUsers = array();
     $potentialUsers = $preferences->getValueForUsers('activity', 'notify_' . $method . '_' . $type, $users);
     foreach ($potentialUsers as $user => $value) {
         if ($value) {
             $filteredUsers[$user] = true;
         }
         unset($users[array_search($user, $users)]);
     }
     // Get the batch time setting from the database
     if ($method == 'email') {
         $potentialUsers = $preferences->getValueForUsers('activity', 'notify_setting_batchtime', array_keys($filteredUsers));
         foreach ($potentialUsers as $user => $value) {
             $filteredUsers[$user] = $value;
         }
     }
     if (empty($users)) {
         return $filteredUsers;
     }
     // If the setting is enabled by default,
     // we add all users that didn't set the preference yet.
     if (UserSettings::getDefaultSetting($method, $type)) {
         foreach ($users as $user) {
             if ($method == 'stream') {
                 $filteredUsers[$user] = true;
             } else {
                 $filteredUsers[$user] = self::getDefaultSetting('setting', 'batchtime');
             }
         }
     }
     return $filteredUsers;
 }