/**
  * This tests the generate_default_message_templates method with using the
  * FHEE__EE_messenger__get_default_message_types__default_types filter to add a
  * bogus message_type string.  No errors should be triggered, and the invalid default mt
  * should NOT be added to the active array for the messenger.
  *
  * @since 4.6
  * @group 7595
  */
 public function test_filtered_default_message_types_on_activation()
 {
     EE_Registry::instance()->load_helper('MSG_Template');
     EE_Registry::instance()->load_helper('Activation');
     //let's clear out all active messengers to get an accurate test of initial generation of message templates.
     global $wpdb;
     $mtpg_table = $wpdb->prefix . 'esp_message_template_group';
     $mtp_table = $wpdb->prefix . 'esp_message_template';
     $evt_mtp_table = $wpdb->prefix . 'esp_event_message_template';
     $query = "DELETE FROM  {$mtpg_table} WHERE 'GRP_ID' > 0";
     $wpdb->query($query);
     $query = "DELETE FROM {$mtp_table} WHERE 'MTP_ID' > 0";
     $wpdb->query($query);
     $query = "DELETE FROM {$evt_mtp_table} WHERE 'EMT_ID' > 0";
     $wpdb->query($query);
     EEH_MSG_Template::update_active_messengers_in_db(array());
     //set a filter for the invalid message type
     add_filter('FHEE__EE_messenger__get_default_message_types__default_types', function ($default_types, $messenger) {
         $default_types[] = 'bogus_message_type';
         return $default_types;
     }, 10, 2);
     //activate messages... if there's any problems then errors will trigger a fail.
     EEH_Activation::generate_default_message_templates();
     //all went well so let's make sure the activated system does NOT have our invalid message type string.
     $active_messengers = EEH_MSG_Template::get_active_messengers_in_db();
     foreach ($active_messengers as $messenger => $settings) {
         $this->assertFalse(isset($settings['settings'][$messenger . '-message_types']['bogus_message_type']), sprintf('The %s messenger should not have "bogus_message_type" active on it but it does.', $messenger));
     }
 }
 /**
  * tests to make sure forcing a messenger to be active works.
  *
  * @since 4.5.0
  */
 public function test_ensure_messenger_is_active()
 {
     EE_Registry::instance()->load_lib('messages');
     EE_Registry::instance()->load_helper('Activation');
     $msg = new EE_messages();
     $this->assertInstanceOf('EE_messages', $msg);
     //make sure html messenger is setup (should be by default)
     $active_messengers = EEH_MSG_Template::get_active_messengers_in_db();
     $this->assertTrue(isset($active_messengers['html']), sprintf('The messenger %s should be active on fresh install, but it is not.', 'html'));
     //let's UNSET the html messenger from active messengers and update the db
     unset($active_messengers['html']);
     EEH_MSG_Template::update_active_messengers_in_db($active_messengers);
     //now let's FORCE reactivation.
     $response = $msg->ensure_messenger_is_active('html');
     $this->assertFalse($response);
     //that means it was previously inactive which it should be.
     //verify html messenger IS actually active now.
     $active_messengers = EEH_MSG_Template::get_active_messengers_in_db();
     $this->assertTrue(isset($active_messengers['html']), 'The html messenger should have been forced to be active again but it is not.');
     //now verify that trying to ensure is active verifies it's already active
     $response = $msg->ensure_messenger_is_active('html');
     $this->assertTrue($response);
 }
 /**
  * This simply validates active messengers and message types to ensure they actually match installed messengers and message types.  If there's a mismatch then we deactivate the messenger/message type and ensure all related db rows are set inactive.
  *
  * @since 4.3.1
  *
  * @return void
  */
 public static function validate_messages_system()
 {
     //include our helper
     EE_Registry::instance()->load_helper('MSG_Template');
     //get active and installed  messengers/message types.
     $active_messengers = EEH_MSG_Template::get_active_messengers_in_db();
     $installed = EEH_MSG_Template::get_installed_message_objects();
     $installed_messengers = $installed_mts = array();
     //set up the arrays so they can be handled easier.
     foreach ($installed['messengers'] as $im) {
         if ($im instanceof EE_messenger) {
             $installed_messengers[$im->name] = $im;
         }
     }
     foreach ($installed['message_types'] as $imt) {
         if ($imt instanceof EE_message_type) {
             $installed_mts[$imt->name] = $imt;
         }
     }
     //now let's loop through the active array and validate
     foreach ($active_messengers as $messenger => $active_details) {
         //first let's see if this messenger is installed.
         if (!isset($installed_messengers[$messenger])) {
             //not set so let's just remove from actives and make sure templates are inactive.
             unset($active_messengers[$messenger]);
             EEH_MSG_Template::update_to_inactive($messenger);
             continue;
         }
         //messenger is active, so let's just make sure that any active message types not installed are deactivated.
         $mts = !empty($active_details['settings'][$messenger . '-message_types']) ? $active_details['settings'][$messenger . '-message_types'] : array();
         foreach ($mts as $mt_name => $mt) {
             if (!isset($installed_mts[$mt_name])) {
                 unset($active_messengers[$messenger]['settings'][$messenger . '-message_types'][$mt_name]);
                 EEH_MSG_Template::update_to_inactive($messenger, $mt_name);
             }
         }
     }
     //all done! let's update the active_messengers.
     EEH_MSG_Template::update_active_messengers_in_db($active_messengers);
     do_action('AHEE__EEH_Activation__validate_messages_system');
     return;
 }
 /**
  * All this does is set the existing test settings (in the db) for the messenger
  *
  * @access public
  * @return bool 	success/fail
  */
 public function set_existing_test_settings($settings)
 {
     $existing = EEH_MSG_Template::get_active_messengers_in_db();
     $existing[$this->name]['test_settings'] = $settings;
     return EEH_MSG_Template::update_active_messengers_in_db($existing);
 }
 /**
  * unsets the active if we can't find the file (failsafe)
  *
  * @access private
  * @param  string $active_name name of messenger or message type
  * @param  string $kind        messenger or message_type?
  * @return void
  */
 private function _unset_active($active_name, $kind)
 {
     //pluralize
     $active_messengers = EEH_MSG_Template::get_active_messengers_in_db();
     EE_Registry::instance()->load_helper('MSG_Template');
     if ($kind == 'messenger') {
         unset($active_messengers[$active_name]);
         EEH_MSG_Template::update_to_inactive($active_name);
         if (isset($this->_active_messengers[$active_name])) {
             unset($this->_active_messengers[$active_name]);
         }
     } else {
         foreach ($active_messengers as $messenger => $settings) {
             if (!empty($settings['settings'][$messenger . '-message_types'][$active_name])) {
                 unset($active_messengers[$messenger]['settings'][$messenger . '-message_types'][$active_name]);
             }
         }
         EEH_MSG_Template::update_to_inactive('', $active_name);
         if (isset($this->_active_message_types[$active_name])) {
             unset($this->_active_message_types[$active_name]);
         }
     }
     EEH_MSG_Template::update_active_messengers_in_db($active_messengers);
 }
 /**
  * this handles saving the settings for a messenger or message type
  * @return json success or fail message
  */
 public function save_settings()
 {
     if (!isset($this->_req_data['type'])) {
         EE_Error::add_error(__('Cannot save settings because type is unknown (messenger settings or messsage type settings?)', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
         $this->_template_args['error'] = TRUE;
         $this->_return_json();
     }
     if ($this->_req_data['type'] == 'messenger') {
         $settings = $this->_req_data['messenger_settings'];
         //this should be an array.
         $messenger = $settings['messenger'];
         //let's setup the settings data
         foreach ($settings as $key => $value) {
             switch ($key) {
                 case 'messenger':
                     unset($settings['messenger']);
                     break;
                 case 'message_types':
                     if (isset($this->_active_messengers[$messenger]['settings'][$messenger . '-message_types'])) {
                         foreach ($this->_active_messengers[$messenger]['settings'][$messenger . '-message_types'] as $mt => $v) {
                             if (isset($settings['message_types'][$mt])) {
                                 $settings[$messenger . '-message_types'][$mt]['settings'] = isset($this->_active_messengers[$messenger]['settings'][$messenger . '-message_types'][$mt]) ? $this->_active_messengers[$messenger]['settings'][$messenger . '-message_types'][$mt] : array();
                             }
                         }
                     } else {
                         foreach ($value as $mt => $v) {
                             //let's see if this message type is already present and has settings.
                             $settings[$messenger . '-message_types'][$mt]['settings'] = array();
                         }
                     }
                     //k settings are set let's get rid of the message types index
                     unset($settings['message_types']);
                     break;
                 default:
                     $settings[$key] = $value;
                     break;
             }
         }
         $this->_active_messengers[$messenger]['settings'] = $settings;
     } else {
         if ($this->_req_data['type'] == 'message_type') {
             $settings = $this->_req_data['message_type_settings'];
             $messenger = $settings['messenger'];
             $message_type = $settings['message_type'];
             foreach ($settings as $key => $value) {
                 switch ($key) {
                     case 'messenger':
                         unset($settings['messenger']);
                         break;
                     case 'message_type':
                         unset($settings['message_type']);
                         break;
                     default:
                         $settings['settings'][$key] = $value;
                         unset($settings[$key]);
                         break;
                 }
             }
             $this->_active_messengers[$messenger]['settings'][$messenger . '-message_types'][$message_type] = $settings;
         }
     }
     //okay we should have the data all setup.  Now we just update!
     $success = EEH_MSG_Template::update_active_messengers_in_db($this->_active_messengers);
     if ($success) {
         EE_Error::add_success(__('Settings updated', 'event_espresso'));
     } else {
         EE_Error::add_error(__('Settings did not get updated', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
     }
     $this->_template_args['success'] = $success;
     $this->_return_json();
 }
 /**
  * This deregisters a message type that was previously registered with a specific mtname.
  *
  * @since    4.3.0
  *
  * @param string  $mt_name the name for the message type that was previously registered
  * @return void
  */
 public static function deregister($mt_name = NULL)
 {
     if (!empty(self::$_ee_message_type_registry[$mt_name])) {
         //let's make sure that we remove any place this message type was made active
         EE_Registry::instance()->load_helper('MSG_Template');
         $active_messengers = EEH_MSG_Template::get_active_messengers_in_db();
         foreach ($active_messengers as $messenger => $settings) {
             if (!empty($settings['settings'][$messenger . '-message_types'][$mt_name])) {
                 unset($active_messengers[$messenger]['settings'][$messenger . '-message_types'][$mt_name]);
             }
         }
         EEH_MSG_Template::update_to_inactive('', $mt_name);
         EEH_MSG_Template::update_active_messengers_in_db($active_messengers);
         unset(self::$_ee_message_type_registry[$mt_name]);
     }
 }