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