You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							234 lines
						
					
					
						
							7.6 KiB
						
					
					
				
			
		
		
	
	
							234 lines
						
					
					
						
							7.6 KiB
						
					
					
				<?php
 | 
						|
/* For licensing terms, see /license.txt */
 | 
						|
 | 
						|
/**
 | 
						|
 * Class for manage the messages web service
 | 
						|
 * @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
 | 
						|
 * @package chamilo.webservices.messages
 | 
						|
 */
 | 
						|
class MessagesWebService extends WebService
 | 
						|
{
 | 
						|
    const SERVICE_NAME = 'MsgREST';
 | 
						|
    /**
 | 
						|
     * @var string EXTRA_FIELD_GCM_REGISTRATION Variable name of the user extra field.
 | 
						|
     * Necessary for register the registration token from the Google Cloud Messaging
 | 
						|
     */
 | 
						|
    const EXTRA_FIELD_GCM_REGISTRATION = 'gcm_registration_id';
 | 
						|
 | 
						|
    /**
 | 
						|
     * Generate the api key for a user
 | 
						|
     * @param int $userId The user id
 | 
						|
     * @return string The api key
 | 
						|
     */
 | 
						|
    public function generateApiKey($userId)
 | 
						|
    {
 | 
						|
        $apiKey = UserManager::get_api_keys($userId, self::SERVICE_NAME);
 | 
						|
 | 
						|
        if (empty($apiKey)) {
 | 
						|
            UserManager::add_api_key($userId, self::SERVICE_NAME);
 | 
						|
 | 
						|
            $apiKey = UserManager::get_api_keys($userId, self::SERVICE_NAME);
 | 
						|
        }
 | 
						|
 | 
						|
        return current($apiKey);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the user api key
 | 
						|
     * @param string $username The user name
 | 
						|
     * @return string The api key
 | 
						|
     */
 | 
						|
    public function getApiKey($username)
 | 
						|
    {
 | 
						|
        $userInfo = api_get_user_info_from_username($username);
 | 
						|
        $userId = $userInfo['user_id'];
 | 
						|
 | 
						|
        if ($this->apiKey !== null) {
 | 
						|
            return $this->apiKey;
 | 
						|
        } else {
 | 
						|
            $this->apiKey = $this->generateApiKey($userId);
 | 
						|
 | 
						|
            return $this->apiKey;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Check if the api is valid for a user
 | 
						|
     * @param string $username The username
 | 
						|
     * @param string $apiKeyToValidate The api key
 | 
						|
     * @return boolean Whether the api belongs to the user return true. Otherwise return false
 | 
						|
     */
 | 
						|
    public static function isValidApiKey($username, $apiKeyToValidate)
 | 
						|
    {
 | 
						|
        $userInfo = api_get_user_info_from_username($username);
 | 
						|
        $userId = $userInfo['user_id'];
 | 
						|
 | 
						|
        $apiKeys = UserManager::get_api_keys($userId, self::SERVICE_NAME);
 | 
						|
 | 
						|
        if (!empty($apiKeys)) {
 | 
						|
            $apiKey = current($apiKeys);
 | 
						|
 | 
						|
            if ($apiKey == $apiKeyToValidate) {
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the count of new messages for a user
 | 
						|
     * @param string $username The username
 | 
						|
     * @param int $lastId The id of the last received message
 | 
						|
     * @return int The count fo new messages
 | 
						|
     */
 | 
						|
    public function countNewMessages($username, $lastId = 0)
 | 
						|
    {
 | 
						|
        $userInfo = api_get_user_info_from_username($username);
 | 
						|
        $userId = $userInfo['user_id'];
 | 
						|
 | 
						|
        return MessageManager::countMessagesFromLastReceivedMessage($userId, $lastId);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the list of new messages for a user
 | 
						|
     * @param string $username The username
 | 
						|
     * @param int $lastId The id of the last received message
 | 
						|
     * @return array the new message list
 | 
						|
     */
 | 
						|
    public function getNewMessages($username, $lastId = 0)
 | 
						|
    {
 | 
						|
        $messages = array();
 | 
						|
 | 
						|
        $userInfo = api_get_user_info_from_username($username);
 | 
						|
        $userId = $userInfo['user_id'];
 | 
						|
 | 
						|
        $lastMessages = MessageManager::getMessagesFromLastReceivedMessage($userId, $lastId);
 | 
						|
 | 
						|
        foreach ($lastMessages as $message) {
 | 
						|
            $hasAttachments = MessageManager::hasAttachments($message['id']);
 | 
						|
 | 
						|
            $messages[] = array(
 | 
						|
                'id' => $message['id'],
 | 
						|
                'title' => $message['title'],
 | 
						|
                'sender' => array(
 | 
						|
                    'id' => $message['user_id'],
 | 
						|
                    'lastname' => $message['lastname'],
 | 
						|
                    'firstname' => $message['firstname'],
 | 
						|
                    'completeName' => api_get_person_name($message['firstname'], $message['lastname']),
 | 
						|
                ),
 | 
						|
                'sendDate' => $message['send_date'],
 | 
						|
                'content' => $message['content'],
 | 
						|
                'hasAttachments' => $hasAttachments,
 | 
						|
                'platform' => array(
 | 
						|
                    'website' => api_get_path(WEB_PATH),
 | 
						|
                    'messagingTool' => api_get_path(WEB_PATH) . 'main/messages/inbox.php'
 | 
						|
                )
 | 
						|
            );
 | 
						|
        }
 | 
						|
 | 
						|
        return $messages;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Create the user extra field
 | 
						|
     */
 | 
						|
    public static function init()
 | 
						|
    {
 | 
						|
        $extraField = new ExtraField('user');
 | 
						|
        $fieldInfo = $extraField->get_handler_field_info_by_field_variable(self::EXTRA_FIELD_GCM_REGISTRATION);
 | 
						|
 | 
						|
        if (empty($fieldInfo)) {
 | 
						|
            $extraField->save([
 | 
						|
                'variable' => self::EXTRA_FIELD_GCM_REGISTRATION,
 | 
						|
                'field_type' => ExtraField::FIELD_TYPE_TEXT,
 | 
						|
                'display_text' => self::EXTRA_FIELD_GCM_REGISTRATION
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Register the Registration ID (token) obtained from Google Cloud Messaging for a user
 | 
						|
     * @param Chamilo\UserBundle\Entity\User $user The user
 | 
						|
     * @param string $registrationId The token registration id from Google Cloud Messaging
 | 
						|
     * @return int The id after insert or the number of affected rows after update. Otherwhise return false
 | 
						|
     */
 | 
						|
    public static function setGcmRegistrationId(Chamilo\UserBundle\Entity\User $user, $registrationId)
 | 
						|
    {
 | 
						|
        $registrationId = Security::remove_XSS($registrationId);
 | 
						|
        $extraFieldValue = new ExtraFieldValue('user');
 | 
						|
 | 
						|
        return $extraFieldValue->save([
 | 
						|
            'variable' => self::EXTRA_FIELD_GCM_REGISTRATION,
 | 
						|
            'value' => $registrationId,
 | 
						|
            'item_id' => $user->getId()
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Send the push notifications to MobileMessaging app
 | 
						|
     * @param array $userIds The IDs of users who will be notified
 | 
						|
     * @param string $title The notification title
 | 
						|
     * @param string $content The notification content
 | 
						|
     * @return int The number of success notifications. Otherwise returns false
 | 
						|
     */
 | 
						|
    public static function sendPushNotification(array $userIds, $title, $content)
 | 
						|
    {
 | 
						|
        if (api_get_configuration_value('messaging_allow_send_push_notification') !== 'true') {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        $gdcApiKey = api_get_configuration_value('messaging_gdc_api_key');
 | 
						|
 | 
						|
        if ($gdcApiKey === false) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        $content = str_replace(['<br>', '<br/>', '<br />'], "\n", $content);
 | 
						|
        $content = strip_tags($content);
 | 
						|
        $content = html_entity_decode($content, ENT_QUOTES);
 | 
						|
 | 
						|
        $gcmRegistrationIds = [];
 | 
						|
 | 
						|
        foreach ($userIds as $userId) {
 | 
						|
            $extraFieldValue = new ExtraFieldValue('user');
 | 
						|
            $valueInfo = $extraFieldValue->get_values_by_handler_and_field_variable(
 | 
						|
                $userId,
 | 
						|
                self::EXTRA_FIELD_GCM_REGISTRATION
 | 
						|
            );
 | 
						|
 | 
						|
            if (empty($valueInfo)) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
 | 
						|
            $gcmRegistrationIds[] = $valueInfo['value'];
 | 
						|
        }
 | 
						|
 | 
						|
        $headers = [
 | 
						|
            'Authorization: key=' . $gdcApiKey,
 | 
						|
            'Content-Type: application/json'
 | 
						|
        ];
 | 
						|
 | 
						|
        $fields = json_encode([
 | 
						|
            'registration_ids' => $gcmRegistrationIds,
 | 
						|
            'data' => [
 | 
						|
                'title' => $title,
 | 
						|
                'message' => $content
 | 
						|
            ]
 | 
						|
        ]);
 | 
						|
 | 
						|
        $ch = curl_init();
 | 
						|
        curl_setopt($ch, CURLOPT_URL, 'https://gcm-http.googleapis.com/gcm/send');
 | 
						|
        curl_setopt($ch, CURLOPT_POST, true);
 | 
						|
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 | 
						|
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 | 
						|
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 | 
						|
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
 | 
						|
        $result = curl_exec($ch);
 | 
						|
        curl_close($ch);
 | 
						|
 | 
						|
        $decodedResult = json_decode($result);
 | 
						|
 | 
						|
        return $decodedResult->success;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |