diff --git a/plugin/kannelsms/config.php b/plugin/kannelsms/config.php new file mode 100644 index 0000000000..18497b6646 --- /dev/null +++ b/plugin/kannelsms/config.php @@ -0,0 +1,14 @@ + + */ +require_once __DIR__ . '/../../main/inc/global.inc.php'; + +require_once 'lib/kannelsms.lib.php'; +require_once 'vendor/kannelsms_api.php'; +require_once 'lib/kannelsms_plugin.class.php'; diff --git a/plugin/kannelsms/index.php b/plugin/kannelsms/index.php new file mode 100644 index 0000000000..b3d9bbc7f3 --- /dev/null +++ b/plugin/kannelsms/index.php @@ -0,0 +1 @@ + + */ +/** + * Initialization + */ +require_once dirname(__FILE__).'/config.php'; +KannelsmsPlugin::create()->install(); diff --git a/plugin/kannelsms/lang/english.php b/plugin/kannelsms/lang/english.php new file mode 100644 index 0000000000..acc1a041af --- /dev/null +++ b/plugin/kannelsms/lang/english.php @@ -0,0 +1,105 @@ +"; + +$strings['hostAddress'] = "Host address"; +$strings['hostAddress_help'] = "This is the address where your SMS gateway is hosted. Example: http://mobilegateway.com/tools/gateways/smssender"; +$strings['username'] = "Username"; +$strings['password'] = "Password"; +$strings['from'] = "Sender mobile number"; + +$strings['sms_types'] = "Send SMS when"; +$strings['mobile_phone_number'] = "Mobile"; + +$strings['MessageWelcomeXLoginXPasswordX'] = "A user is added to the platform"; +$strings['MessageXNewFileSharedCourseXByX'] = "A file is added to dropbox"; +$strings['MessageXAccountApprovedConnectX'] = "An account is approved"; +$strings['MessageXNewCourseXBeenCreatedX'] = "A new course is created"; +$strings['MessageXNewUserXSubscribedCourseX'] = "A user is subscribed to a course"; +$strings['MessageXNewCourseSuggestedTeacherX'] = "A new course is suggested"; +$strings['MessageXCourseOpeningRequestCodeXRegistered'] = "A new course opening request is registered"; +$strings['MessageXCourseOpeningRequestCourseCodeXApproved'] = "A new course opening request is approved"; +$strings['MessageXRequestOpenCourseCodeXReject'] = "A new course opening request is rejected"; +$strings['MessageXCourseOpeningRequestCourseCodeX'] = "Additional information is required for a new course opening request"; +$strings['MessageXBeenSubscribedCourseX'] = "A user is added to the course but not registered to it yet"; +$strings['MessageXAssignmentBeenCreatedCourseX'] = "Homework is created"; +$strings['MessageXAccountCreatedUpdatedLoginXPasswordX'] = "A user account is created or updated"; +$strings['MessageXPasswordUpdatedLoginXPasswordX'] = "A user password is updated"; +$strings['MessageXRequestedPasswordChange'] = "A user requests a password change"; +$strings['MessageXReceivedNewPersonalMessages'] = "New personal messages are received in user's inbox or forum"; +$strings['MessageXNewUserXPendingApproval'] = "A new user registration is pending for approval"; +$strings['MessageXXPostedForumXCourseX'] = "A user posts in forum"; +$strings['MessageXXXCheckEmailConnectMoreInfo'] = "An announcement is sent"; +$strings['MessageXXStudentXAnsweredTestX'] = "A student solves an exercise"; +$strings['MessageXXStudentXAnsweredTestXOpenQuestion'] = "A student solves an open question"; +$strings['MessageXXStudentXAnsweredTestXVoiceQuestion'] = "A student solves a voice question"; +$strings['MessageXXAnswerOpenQuestionTestXReviewed'] = "An open question answer is reviewed"; +$strings['MessageXXNewThreadXStartedForumX'] = "A new thread is started in forum"; +$strings['MessageXXNewAnswerPostedXForumX'] = "A new answer is posted in forum"; +$strings['MessageXXNewSystemAnnouncementAdded'] = "A new system announcement is added and the user does not want to send a test email"; +$strings['MessageXTestXNewSystemAnnouncementAdded'] = "A new system announcement is added and the user wants to send a test email"; +$strings['MessageXXSystemAnnouncementUpdate'] = "A new system announcement is updated and the user does not want to send a test email"; +$strings['MessageXTestXSystemAnnouncementUpdate'] = "A new system announcement is updated and the user wants to send a test email"; +$strings['MessageXUserXUploadedAssignmentXCourseXStudentSubmitsPaper'] = "An assignment is uploaded and there is no current session (this will be sent only to coaches)"; +$strings['MessageXUserXUploadedAssignmentXCheckXStudentSubmitsPaper'] = "An assignment is uploaded (this will be sent only to teachers)"; +$strings['MessageXUserXUploadedAssignmentXCourseX'] = "... and there is no current session (this will be sent only to coaches)"; +$strings['MessageXUserXUploadedAssignmentXCheckX'] = "... (this will be sent only to teachers)"; +$strings['MessageXSubscribedSessionX'] = "A session is created or updated and new users are subscribed"; +$strings['MessageXSubscribedSessionXCSV'] = "New users are subscribed to a session importing a CSV file"; +$strings['MessageXUserXSuggestedBeFriends'] = "A friendship invitation is received"; +$strings['MessageXUserXAnsweredInboxMessage'] = "A message reply is received in inbox"; +$strings['MessageXBeenInvitedJoinGroupX'] = "A group join invitation is received"; +$strings['MessageXMessagesSentEditedGroupXEdited'] = "A group topic message is updated"; +$strings['MessageXMessagesSentEditedGroupXAdded'] = "A group topic message is added"; +$strings['MessageXBeenInvitedCompleteSurveyXCourseX'] = "A new survey is created"; +$strings['MessageXReminderAssignmentXCourseXDue'] = "A reminder is sent to students who have not uploaded their assignment yet"; +$strings['MessageXUserDetailsModified'] = "User details have been updated"; + +$strings['WelcomeXLoginXPasswordX'] = "Welcome to %s. Here are your user account details: login: %s, password: %s"; +$strings['XNewFileSharedCourseXByX'] = "%s: A new file has been shared with you in course %s by %s"; +$strings['XAccountApprovedConnectX'] = "%s: Your account has been approved by an administrator. You can now connect to %s"; +$strings['XNewCourseXBeenCreatedX'] = "%s: A new course (%s) has been created by %s"; +$strings['XNewUserXSubscribedCourseX'] = "%s: A new user (%s) has just subscribed to your course (%s)"; +$strings['XNewCourseSuggestedTeacherX'] = "%s: A new course has been suggested by teacher (%s). Please connect to the admin page to review it"; +$strings['XCourseOpeningRequestCodeXRegistered'] = "%s: Your course opening request (code %s) has been registered. You will be informed when it is approved"; +$strings['XCourseOpeningRequestCourseCodeXApproved'] = "%s: Your course opening request for course code %s has been approved. Connect to your portal to use it"; +$strings['XRequestOpenCourseCodeXReject'] = "%s: We are sorry to inform you that your request to open course code %s has been rejected"; +$strings['XCourseOpeningRequestCourseCodeX'] = "%s: Your course opening request for course code %s requires more information. Check e-mail for more info"; +$strings['XBeenSubscribedCourseX'] = "%s: You have been subscribed to course %s"; +$strings['XAssignmentBeenCreatedCourseX'] = "%s: A new assignment has been created in course %s. Please connect for more info"; +$strings['XAccountCreatedUpdatedLoginXPasswordX'] = "%s: Your account has been created or updated. You can now login as %s, password: %s"; +$strings['XPasswordUpdatedLoginXPasswordX'] = "%s: Your password has been updated. You can now login as %s, password: %s"; +$strings['XRequestedPasswordChange'] = "%s: You have requested a password change. Please check your e-mail for more information"; +$strings['XReceivedNewPersonalMessages'] = "%s: You have received new personal messages in your inbox or in the forum. Please check your e-mail for more info"; +$strings['XNewUserXPendingApproval'] = "%s: A new user (%s) registration is pending your approval. Please connect to the admin panel to review"; +$strings['XXPostedForumXCourseX'] = "%s: %s just posted on forum %s in course %s"; +$strings['XXXCheckEmailConnectMoreInfo'] = "%s: %s: %s. Check your e-mail or connect for more info"; +$strings['XXStudentXAnsweredTestX'] = "%s: %s: Student %s has just answered test %s"; +$strings['XXStudentXAnsweredTestXOpenQuestion'] = "%s: %s: Student %s answered test %s's open question. Please connect to review"; +$strings['XXStudentXAnsweredTestXVoiceQuestion'] = "%s: %s: Student %s answered test %s's voice question. Please connect to review"; +$strings['XXAnswerOpenQuestionTestXReviewed'] = "%s: %s: Your answer to an open question in test %s has been reviewed"; +$strings['XXNewThreadXStartedForumX'] = "%s: %s: A new thread (%s) has been started in forum %s"; +$strings['XXNewAnswerPostedXForumX'] = "%s: %s: A new answer has been posted to (%s) in forum %s"; +$strings['XXNewSystemAnnouncementAdded'] = "%s: %s"; +$strings['XTestXNewSystemAnnouncementAdded'] = "%s (test): %s"; +$strings['XXSystemAnnouncementUpdate'] = "%s: %s (update)"; +$strings['XTestXSystemAnnouncementUpdate'] = "%s (test): %s"; +$strings['XUserXUploadedAssignmentXCourseXStudentSubmitsPaper'] = "%s: User %s uploaded assignment %s in course %s"; +$strings['XUserXUploadedAssignmentXCheckXStudentSubmitsPaper'] = "%s: User %s uploaded assignment %s. Check %s"; +$strings['XUserXUploadedAssignmentXCourseX'] = "%s: User %s uploaded assignment %s in course %s"; +$strings['XUserXUploadedAssignmentXCheckX'] = "%s: User %s uploaded assignment %s. Check %s"; +$strings['XSubscribedSessionX'] = "%s: You have been subscribed to session %s"; +$strings['XSubscribedSessionXCSV'] = "%s: You have been subscribed to session %s"; +$strings['XUserXSuggestedBeFriends'] = "%s: User %s suggested you should be friends. Check your inbox or e-mail for details"; +$strings['XUserXAnsweredInboxMessage'] = "%s: User %s just answered your Inbox message"; +$strings['XBeenInvitedJoinGroupX'] = "%s: you have been invited to join group %s. Check your Inbox for details"; +$strings['XMessagesSentEditedGroupXEdited'] = "%s: Messages sent or edited in group %s. Check your Inbox for details"; +$strings['XMessagesSentEditedGroupXAdded'] = "%s: Messages sent or edited in group %s. Check your Inbox for details"; +$strings['XBeenInvitedCompleteSurveyXCourseX'] = "%s: You have been invited to complete survey %s in course %s"; +$strings['XReminderAssignmentXCourseXDue'] = "%s: This is a simple reminder that your assignment (%s) in course %s is still due"; +$strings['XUserDetailsModified'] = "%s: Your user details have been modified. Please check your e-mail for more information"; diff --git a/plugin/kannelsms/lang/spanish.php b/plugin/kannelsms/lang/spanish.php new file mode 100644 index 0000000000..e8d34c8c67 --- /dev/null +++ b/plugin/kannelsms/lang/spanish.php @@ -0,0 +1,105 @@ +"; + +$strings['hostAddress'] = "Dirección del servidor"; +$strings['hostAddress_help'] = "Ésta es la dirección en donde se aloja su pasarela de SMS. Ejemplo: http://mobilegateway.com/tools/gateways/smssender"; +$strings['username'] = "Nombre de usuario"; +$strings['password'] = "Contraseña"; +$strings['from'] = "Número de móvil remitente"; + +$strings['sms_types'] = "Enviar un SMS cuando"; +$strings['mobile_phone_number'] = "Móvil"; + +$strings['MessageWelcomeXLoginXPasswordX'] = "Se añada un usuario a la plataforma"; +$strings['MessageXNewFileSharedCourseXByX'] = "Un archivo se añada a dropbox"; +$strings['MessageXAccountApprovedConnectX'] = "Se apruebe una cuenta de usuario"; +$strings['MessageXNewCourseXBeenCreatedX'] = "Se cree un curso nuevo"; +$strings['MessageXNewUserXSubscribedCourseX'] = "Un usuario se suscriba a un curso"; +$strings['MessageXNewCourseSuggestedTeacherX'] = "Un profesor sugiera un curso nuevo"; +$strings['MessageXCourseOpeningRequestCodeXRegistered'] = "Se registre una solicitud de apertura de curso"; +$strings['MessageXCourseOpeningRequestCourseCodeXApproved'] = "Se apruebe una solicitud de apertura de curso"; +$strings['MessageXRequestOpenCourseCodeXReject'] = "Se rechace una solicitud de apertura de curso"; +$strings['MessageXCourseOpeningRequestCourseCodeX'] = "Se requiera más información de una solicitud de apertura de curso"; +$strings['MessageXBeenSubscribedCourseX'] = "Se le suscriba a un curso a un usuario que aún no está registrado"; +$strings['MessageXAssignmentBeenCreatedCourseX'] = "Se cree una nueva tarea en un curso"; +$strings['MessageXAccountCreatedUpdatedLoginXPasswordX'] = "Se cree o actualice una cuenta de usuario"; +$strings['MessageXPasswordUpdatedLoginXPasswordX'] = "Se actualice la contraseña de un usuario"; +$strings['MessageXRequestedPasswordChange'] = "Un usuario solicite un cambio de contraseña"; +$strings['MessageXReceivedNewPersonalMessages'] = "Se reciban mensajes personales nuevos en la bandeja de entrada o en el foro"; +$strings['MessageXNewUserXPendingApproval'] = "Una inscripción de un nuevo usuario esté pendiente de aprobación"; +$strings['MessageXXPostedForumXCourseX'] = "Un usuario escriba en el foro"; +$strings['MessageXXXCheckEmailConnectMoreInfo'] = "Se envíe una notificación"; +$strings['MessageXXStudentXAnsweredTestX'] = "Un estudiante resuelva un ejercicio de un examen"; +$strings['MessageXXStudentXAnsweredTestXOpenQuestion'] = "Un estudiante conteste a una pregunta abierta de un examen"; +$strings['MessageXXStudentXAnsweredTestXVoiceQuestion'] = "Un estudiante conteste a una pregunta de voz de un examen"; +$strings['MessageXXAnswerOpenQuestionTestXReviewed'] = "Se revise una pregunta abierta de un examen"; +$strings['MessageXXNewThreadXStartedForumX'] = "Se cree un hilo nuevo en el foro"; +$strings['MessageXXNewAnswerPostedXForumX'] = "Se escriba una respuesta nueva en el foro"; +$strings['MessageXXNewSystemAnnouncementAdded'] = "Se añada una notificación y el usuario no desee enviar un examen por correo electrónico"; +$strings['MessageXTestXNewSystemAnnouncementAdded'] = "Se añada una notificación y el usuario desee enviar un examen por correo electrónico"; +$strings['MessageXXSystemAnnouncementUpdate'] = "Se actualice una notificación y el usuario no desee enviar un examen por correo electrónico"; +$strings['MessageXTestXSystemAnnouncementUpdate'] = "Se actualice una notificación y el usuario desee enviar un examen por correo electrónico"; +$strings['MessageXUserXUploadedAssignmentXCourseXStudentSubmitsPaper'] = "Un estudiante suba su tarea y no exista una sesión (se enviará sólo a coordinadores)"; +$strings['MessageXUserXUploadedAssignmentXCheckXStudentSubmitsPaper'] = "Un estudiante suba su tarea (se enviará sólo a profesores)"; +$strings['MessageXUserXUploadedAssignmentXCourseX'] = "... y no exista una sesión (se enviará sólo a coordinadores)"; +$strings['MessageXUserXUploadedAssignmentXCheckX'] = "... (se enviará sólo a profesores)"; +$strings['MessageXSubscribedSessionX'] = "Se cree o edite una sesión nueva y se suscriban a usuarios nuevos"; +$strings['MessageXSubscribedSessionXCSV'] = "Se suscriban a usuarios nuevos desde un archivo CSV"; +$strings['MessageXUserXSuggestedBeFriends'] = "Se reciba una invitación de amistad"; +$strings['MessageXUserXAnsweredInboxMessage'] = "Se reciba la contestación a un mensaje en la bandeja de entrada"; +$strings['MessageXBeenInvitedJoinGroupX'] = "Se reciba una invitación para unirse a un grupo"; +$strings['MessageXMessagesSentEditedGroupXEdited'] = "Se actualice un mensaje en un tema de grupo"; +$strings['MessageXMessagesSentEditedGroupXAdded'] = "Se añada un mensaje en un tema de grupo"; +$strings['MessageXBeenInvitedCompleteSurveyXCourseX'] = "Se cree una encuesta nueva"; +$strings['MessageXReminderAssignmentXCourseXDue'] = "Se envíe un recordatorio a los estudiantes que no hayan enviado su tarea"; +$strings['MessageXUserDetailsModified'] = "Se actualice información de un usuario"; + +$strings['WelcomeXLoginXPasswordX'] = "Bienvenido a %s. Éstos son sus datos de acceso: usuario: %s, contraseña: %s"; +$strings['XNewFileSharedCourseXByX'] = "%s: Un nuevo archivo ha sido compartido contigo en el curso %s por %s"; +$strings['XAccountApprovedConnectX'] = "%s: Su cuenta ha sido aprobada por un administrador. Ya puede conectarse a %s"; +$strings['XNewCourseXBeenCreatedX'] = "%s: Un nuevo curso (%s) ha sido creado por %s"; +$strings['XNewUserXSubscribedCourseX'] = "%s: Un nuevo usuario (%s) se ha suscrito a su curso (%s)"; +$strings['XNewCourseSuggestedTeacherX'] = "%s: Un nuevo curso ha sido sugerido por el profesor (%s). Por favor, conéctese a la página de administración para revisarlo"; +$strings['XCourseOpeningRequestCodeXRegistered'] = "%s: Su solicitud de apertura de curso (código %s) ha sido registrada. Será informado cuando ésta sea aprobada"; +$strings['XCourseOpeningRequestCourseCodeXApproved'] = "%s: Su solicitud de apertura de curso para el código de curso %s ha sido aprobada. Conéctese a su portal para usarlo"; +$strings['XRequestOpenCourseCodeXReject'] = "%s: Lamentamos informarle que su solicitud de apertura de curso para el código de curso %s ha sido rechazada"; +$strings['XCourseOpeningRequestCourseCodeX'] = "%s: Su solicitud de apertura de curso para el código de curso %s requiere más información. Compruebe su e-mail para más información"; +$strings['XBeenSubscribedCourseX'] = "%s: Ha sido suscrito al curso %s"; +$strings['XAssignmentBeenCreatedCourseX'] = "%s: Una nueva tarea ha sido creada en el curso %s. Por favor, conéctese para más información"; +$strings['XAccountCreatedUpdatedLoginXPasswordX'] = "%s: Su cuenta ha sido creada o actualizada. Ya puede conectarse como %s, contraseña: %s"; +$strings['XPasswordUpdatedLoginXPasswordX'] = "%s: Su contraseña ha sido actualizada. Ya puede conectarse como %s, contraseña: %s"; +$strings['XRequestedPasswordChange'] = "%s: Ha solicitado un cambio de contraseña. Por favor, compruebe su e-mail para más información"; +$strings['XReceivedNewPersonalMessages'] = "%s: Ha recibido mensajes personales nuevos en su bandeja de entrada o en el foro. Por favor, compruebe su e-mail para más información"; +$strings['XNewUserXPendingApproval'] = "%s: Una inscripción de un nuevo usuario (%s) está pendiente de su aprobación. Por favor, conéctese al panel de administración para revisarla"; +$strings['XXPostedForumXCourseX'] = "%s: %s acaba de escribir en el foro %s del curso %s"; +$strings['XXXCheckEmailConnectMoreInfo'] = "%s: %s: %s. Compruebe su e-mail o conéctese para más información"; +$strings['XXStudentXAnsweredTestX'] = "%s: %s: El estudiante %s acaba de contestar al test %s"; +$strings['XXStudentXAnsweredTestXOpenQuestion'] = "%s: %s: El estudiante %s contestó a la pregunta abierta del test %s. Por favor, conéctese para revisarla"; +$strings['XXStudentXAnsweredTestXVoiceQuestion'] = "%s: %s: El estudiante %s contestó a la pregunta de voz del test %s. Por favor, conéctese para revisarla"; +$strings['XXAnswerOpenQuestionTestXReviewed'] = "%s: %s: Su respuesta a la pregunta abierta en el test %s ha sido revisada."; +$strings['XXNewThreadXStartedForumX'] = "%s: %s: Se ha comenzado un nuevo hilo (%s) en el foro %s"; +$strings['XXNewAnswerPostedXForumX'] = "%s: %s: Se ha escrito una nueva respuesta a (%s) en el foro %s"; +$strings['XXNewSystemAnnouncementAdded'] = "%s: %s"; +$strings['XTestXNewSystemAnnouncementAdded'] = "%s (prueba): %s"; +$strings['XXSystemAnnouncementUpdate'] = "%s: %s (actualización)"; +$strings['XTestXSystemAnnouncementUpdate'] = "%s (prueba): %s"; +$strings['XUserXUploadedAssignmentXCourseXStudentSubmitsPaper'] = "%s: El usuario %s subió la tarea %s al curso %s"; +$strings['XUserXUploadedAssignmentXCheckXStudentSubmitsPaper'] = "%s: El usuario %s subió la tarea %s. Compruébelo en %s"; +$strings['XUserXUploadedAssignmentXCourseX'] = "%s: El usuario %s subió la tarea %s al curso %s"; +$strings['XUserXUploadedAssignmentXCheckX'] = "%s: El usuario %s subió la tarea %s. Compruébelo en %s"; +$strings['XSubscribedSessionX'] = "%s: Ha sido suscrito a la sesión %s"; +$strings['XSubscribedSessionXCSV'] = "%s: Ha sido suscrito a la sesión %s"; +$strings['XUserXSuggestedBeFriends'] = "%s: El usuario %s le sugirió que podrían ser amigos. Compruebe su bandeja de entrada o su e-mail para más detalles"; +$strings['XUserXAnsweredInboxMessage'] = "%s: El usuario acaba de contestar a su mensaje de la bandeja de entrada"; +$strings['XBeenInvitedJoinGroupX'] = "%s: Ha sido invitado a unirse al grupo %s. Compruebe su bandeja de entrada para más detalles"; +$strings['XMessagesSentEditedGroupXEdited'] = "%s: Hay mensajes enviados o editados en el grupo %s. Compruebe su bandeja de entrada para más detalles"; +$strings['XMessagesSentEditedGroupXAdded'] = "%s: Hay mensajes enviados o editados en el grupo %s. Compruebe su bandeja de entrada para más detalles"; +$strings['XBeenInvitedCompleteSurveyXCourseX'] = "%s: Ha sido invitado a completar la encuesta %s del curso %s"; +$strings['XReminderAssignmentXCourseXDue'] = "%s: Se le recuerda que su tarea (%s) del curso %s aún está pendiente"; +$strings['XUserDetailsModified'] = "%s: Su información de usuario ha sido modificada. Compruebe su e-mail para más información"; diff --git a/plugin/kannelsms/lib/kannelsms.lib.php b/plugin/kannelsms/lib/kannelsms.lib.php new file mode 100644 index 0000000000..cb5ab33dd7 --- /dev/null +++ b/plugin/kannelsms/lib/kannelsms.lib.php @@ -0,0 +1,650 @@ + + * + * Kannelsms-Chamilo connector class + */ + +class Kannelsms +{ + public $api; + public $hostAddress; + public $username; + public $password; + public $from; + public $plugin_enabled = false; + + /** + * Constructor (generates a connection to the API) + * @param string Kannelsms API key required to use the plugin + * @return void + */ + public function __construct($apiKey = null) + { + $plugin = KannelsmsPlugin::create(); + $kannelSMSPlugin = $plugin->get('tool_enable'); + $this->table = Database::get_main_table('user_field_values'); + if ($kannelSMSPlugin == true) { + $this->api = new Kannel(' '); + $this->hostAddress = $plugin->get('hostAddress'); + $this->username = $plugin->get('username'); + $this->password = $plugin->get('password'); + $this->from = $plugin->get('from'); + $this->plugin_enabled = true; + } + } + + /** + * getMobilePhoneNumberById (retrieves a user mobile phone number by user id) + * @param int $userId User id + * @return int User's mobile phone number + */ + private function getMobilePhoneNumberById($userId) + { + $mobilePhoneNumberExtraField = new ExtraField('user'); + $mobilePhoneNumberExtraField = $mobilePhoneNumberExtraField->get_handler_field_info_by_field_variable('mobile_phone_number'); + + $mobilePhoneNumberExtraFieldValue = new ExtraFieldValue('user'); + $mobilePhoneNumberExtraFieldValue = $mobilePhoneNumberExtraFieldValue->get_values_by_handler_and_field_id($userId, $mobilePhoneNumberExtraField['id']); + + return $mobilePhoneNumberExtraFieldValue['field_value']; + } + + /** + * send (sends an SMS to the user) + * @param array Data needed to send the SMS. It is mandatory to include the + * 'smsType' and 'userId' (or 'mobilePhoneNumber') fields at least. + * More data may be neccesary depending on the message type + * Example: $additional_parameters = array( + * 'smsType' => EXAMPLE_SMS_TYPE, + * 'userId' => $userId, + * 'moreData' => $moreData + * ); + * @return void + */ + public function send($additionalParameters) + { + if (trim($this->hostAddress)) { + $message = array( + "to" => array_key_exists("mobilePhoneNumber",$additionalParameters) ? + $additionalParameters['mobilePhoneNumber'] : + $this->getMobilePhoneNumberById($additionalParameters['userId']), + "message" => $this->getSms($additionalParameters) + ); + + if (!empty($message['message'])) { + if(extension_loaded('curl')) { + $url = $this->hostAddress.'?username='. + $this->username.'&password='.$this->password.'&from='. + $this->from.'&to='.$message['to'].'&msg='.urlencode($message['message']); + $ch = curl_init($url); + curl_exec($ch); + curl_close($ch); + } + + // Commented for future message logging / tracking purposes + /*if( $result["success"] ) { + echo "Message sent - ID: " . $result["id"]; + } else { + echo "Message failed - Error: " . $result["error_message"]; + }*/ + } + + } + } + + /** + * buildSms (builds an SMS from a template and data) + * @param object KannelsmsPlugin object + * @param object Template object + * @param string Template file name + * @param string Text key from lang file + * @param array Data to fill message variables (if any) + * @return object Template object with message property updated + */ + public function buildSms($plugin, $tpl, $templateName, $messageKey, $parameters = null) + { + $result = Database::select( + 'selected_value', + 'settings_current', + array( + 'where'=> array('variable = ?' => array('kannelsms_message'.$messageKey)) + ) + ); + + if (empty($result)) { + $tpl->assign('message', ''); + } else { + $templatePath = 'kannelsms/sms_templates/'; + $content = $tpl->fetch($templatePath.$templateName); + $message = $plugin->get_lang($messageKey); + if ($parameters !== null) { + $message = vsprintf($message, $parameters); + } + $tpl->assign('message', $message); + } + + return $tpl->params['message']; + } + + /** + * getSms (returns an SMS message depending of its type) + * @param array Data needed to send the SMS. It is mandatory to include the + * 'smsType' and 'userId' (or 'mobilePhoneNumber') fields at least. + * More data may be neccesary depending on the message type + * Example: $additional_parameters = array( + * 'smsType' => EXAMPLE_SMS_TYPE, + * 'userId' => $userId, + * 'moreData' => $moreData + * ); + * @return string A ready to be sent SMS + */ + public function getSms($additionalParameters) + { + $plugin = KannelsmsPlugin::create(); + $tool_name = $plugin->get_lang('plugin_title'); + $tpl = new Template($tool_name); + + switch ($additionalParameters['smsType']) { + case KannelsmsPlugin::WELCOME_LOGIN_PASSWORD: + $userInfo = api_get_user_info($additionalParameters['userId']); + return $this->buildSms( + $plugin, + $tpl, + 'welcome_login_password.tpl', + 'WelcomeXLoginXPasswordX', + array( + api_get_setting('siteName'), + $userInfo['username'], + $additionalParameters['password'] + ) + ); + break; + case KannelsmsPlugin::NEW_FILE_SHARED_COURSE_BY: + return $this->buildSms( + $plugin, + $tpl, + 'new_file_shared_course_by.tpl', + 'XNewFileSharedCourseXByX', + array( + api_get_setting('siteName'), + $additionalParameters['courseTitle'], + $additionalParameters['userUsername'] + ) + ); + break; + case KannelsmsPlugin::ACCOUNT_APPROVED_CONNECT: + return $this->buildSms( + $plugin, + $tpl, + 'account_approved_connect.tpl', + 'XAccountApprovedConnectX', + array( + api_get_setting('siteName'), + $tpl->params['_p']['web'] + ) + ); + break; + case KannelsmsPlugin::NEW_COURSE_BEEN_CREATED: + return $this->buildSms( + $plugin, + $tpl, + 'new_course_been_created.tpl', + 'XNewCourseXBeenCreatedX', + array( + api_get_setting('siteName'), + $additionalParameters['courseName'], + $additionalParameters['creatorUsername'] + ) + ); + break; + case KannelsmsPlugin::NEW_USER_SUBSCRIBED_COURSE: + return $this->buildSms( + $plugin, + $tpl, + 'new_user_subscribed_course.tpl', + 'XNewUserXSubscribedCourseX', + array( + api_get_setting('siteName'), + $additionalParameters['userUsername'], + $additionalParameters['courseCode'] + ) + ); + break; + case KannelsmsPlugin::NEW_COURSE_SUGGESTED_TEACHER: + return $this->buildSms( + $plugin, + $tpl, + 'new_course_suggested_teacher.tpl', + 'XNewCourseSuggestedTeacherX', + array( + api_get_setting('siteName'), + $additionalParameters['userUsername'] + ) + ); + break; + case KannelsmsPlugin::COURSE_OPENING_REQUEST_CODE_REGISTERED: + return $this->buildSms( + $plugin, + $tpl, + 'course_opening_request_code_registered.tpl', + 'XCourseOpeningRequestCodeXRegistered', + array( + api_get_setting('siteName'), + $additionalParameters['courseCode'] + ) + ); + break; + case KannelsmsPlugin::COURSE_OPENING_REQUEST_CODE_APPROVED: + return $this->buildSms( + $plugin, + $tpl, + 'course_opening_request_course_code_approved.tpl', + 'XCourseOpeningRequestCourseCodeXApproved', + array( + api_get_setting('siteName'), + $additionalParameters['courseCode'] + ) + ); + break; + case KannelsmsPlugin::COURSE_OPENING_REQUEST_CODE_REJECTED: + return $this->buildSms( + $plugin, + $tpl, + 'request_open_course_code_rejected.tpl', + 'XRequestOpenCourseCodeXReject', + array( + api_get_setting('siteName'), + $additionalParameters['courseCode'] + ) + ); + break; + case KannelsmsPlugin::COURSE_OPENING_REQUEST_CODE: + return $this->buildSms( + $plugin, + $tpl, + 'course_opening_request_course_code.tpl', + 'XCourseOpeningRequestCourseCodeX', + array( + api_get_setting('siteName'), + $additionalParameters['courseCode'] + ) + ); + break; + case KannelsmsPlugin::BEEN_SUBSCRIBED_COURSE: + return $this->buildSms( + $plugin, + $tpl, + 'been_subscribed_course.tpl', + 'XBeenSubscribedCourseX', + array( + api_get_setting('siteName'), + $additionalParameters['courseTitle'] + ) + ); + break; + case KannelsmsPlugin::ASSIGNMENT_BEEN_CREATED_COURSE: + return $this->buildSms( + $plugin, + $tpl, + 'assignment_been_created_course.tpl', + 'XAssignmentBeenCreatedCourseX', + array( + api_get_setting('siteName'), + $additionalParameters['courseTitle'] + ) + ); + break; + // Message types to be implemented. Fill the array parameter with arguments. + /*case KannelsmsPlugin::ACCOUNT_CREATED_UPDATED_LOGIN_PASSWORD: + return $this->buildSms( + $plugin, + $tpl, + 'account_created_updated_login_password.tpl', + 'XAccountCreatedUpdatedLoginXPasswordX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::PASSWORD_UPDATED_LOGIN_PASSWORD: + return $this->buildSms( + $plugin, + $tpl, + 'password_updated_login_password.tpl', + 'XPasswordUpdatedLoginXPasswordX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::REQUESTED_PASSWORD_CHANGE: + return $this->buildSms( + $plugin, + $tpl, + 'requested_password_change.tpl', + 'XPasswordUpdatedLoginXPasswordX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::RECEIVED_NEW_PERSONAL_MESSAGES: + return $this->buildSms( + $plugin, + $tpl, + 'received_new_personal_messages.tpl', + 'XReceivedNewPersonalMessages', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::NEW_USER_PENDING_APPROVAL: + return $this->buildSms( + $plugin, + $tpl, + 'new_user_pending_approval.tpl', + 'XNewUserXPendingApproval', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::POSTED_FORUM_COURSE: + return $this->buildSms( + $plugin, + $tpl, + 'posted_forum_course.tpl', + 'XXPostedForumXCourseX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::CHECK_EMAIL_CONNECT_MORE_INFO: + return $this->buildSms( + $plugin, + $tpl, + 'check_email_connect_more_info.tpl', + 'XXXCheckEmailConnectMoreInfo', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::STUDENT_ANSWERED_TEST: + return $this->buildSms( + $plugin, + $tpl, + 'student_answered_test.tpl', + 'XXStudentXAnsweredTestX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::STUDENT_ANSWERED_TEST_OPEN_QUESTION: + return $this->buildSms( + $plugin, + $tpl, + 'student_answered_test_open_question.tpl', + 'XXStudentXAnsweredTestXOpenQuestion', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::STUDENT_ANSWERED_TEST_VOICE_QUESTION: + return $this->buildSms( + $plugin, + $tpl, + 'student_answered_test_voice_question.tpl', + 'XXStudentXAnsweredTestXVoiceQuestion', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::ANSWER_OPEN_QUESTION_TEST_REVIEWED: + return $this->buildSms( + $plugin, + $tpl, + 'answer_open_question_test_reviewed.tpl', + 'XXAnswerOpenQuestionTestXReviewed', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::NEW_THREAD_STARTED_FORUM: + return $this->buildSms( + $plugin, + $tpl, + 'new_thread_started_forum.tpl', + 'XXNewThreadXStartedForumX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::NEW_ANSWER_POSTED_FORUM: + return $this->buildSms( + $plugin, + $tpl, + 'new_answer_posted_forum.tpl', + 'XXNewAnswerPostedXForumX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::NEW_SYSTEM_ANNOUNCEMENT_ADDED: + return $this->buildSms( + $plugin, + $tpl, + 'new_system_announcement_added.tpl', + 'XXNewSystemAnnouncementAdded', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::TEST_NEW_SYSTEM_ANNOUNCEMENT_ADDED: + return $this->buildSms( + $plugin, + $tpl, + 'test_new_system_announcement_added.tpl', + 'XTestXNewSystemAnnouncementAdded', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::SYSTEM_ANNOUNCEMENT_UPDATE: + return $this->buildSms( + $plugin, + $tpl, + 'system_announcement_update.tpl', + 'XXSystemAnnouncementUpdate', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::TEST_SYSTEM_ANNOUNCEMENT_UPDATE: + return $this->buildSms( + $plugin, + $tpl, + 'test_system_announcement_update.tpl', + 'XXSystemAnnouncementUpdate', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::USER_UPLOADED_ASSIGNMENT_COURSE_STUDENT_SUBMITS_PAPER: + return $this->buildSms( + $plugin, + $tpl, + 'user_uploaded_assignment_course_student_submits_paper.tpl', + 'XUserXUploadedAssignmentXCourseXStudentSubmitsPaper', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::USER_UPLOADED_ASSIGNMENT_CHECK_STUDENT_SUBMITS_PAPER: + return $this->buildSms( + $plugin, + $tpl, + 'user_uploaded_assignment_check_student_submits_paper.tpl', + 'XUserXUploadedAssignmentXCheckXStudentSubmitsPaper', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::USER_UPLOADED_ASSIGNMENT_COURSE: + return $this->buildSms( + $plugin, + $tpl, + 'user_uploaded_assignment_course.tpl', + 'XUserXUploadedAssignmentXCourseX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::USER_UPLOADED_ASSIGNMENT_CHECK: + return $this->buildSms( + $plugin, + $tpl, + 'user_uploaded_assignment_check.tpl', + 'XUserXUploadedAssignmentXCheckX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::SUBSCRIBED_SESSION: + return $this->buildSms( + $plugin, + $tpl, + 'subscribed_session.tpl', + 'XSubscribedSessionX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::SUBSCRIBED_SESSION_CSV: + return $this->buildSms( + $plugin, + $tpl, + 'subscribed_session_csv.tpl', + 'XSubscribedSessionXCSV', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::USER_SUGGESTED_BE_FRIENDS: + return $this->buildSms( + $plugin, + $tpl, + 'user_suggested_be_friends.tpl', + 'XUserXSuggestedBeFriends', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::USER_ANSWERED_INBOX_MESSAGE: + return $this->buildSms( + $plugin, + $tpl, + 'user_answered_inbox_message.tpl', + 'XUserXAnsweredInboxMessage', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::BEEN_INVITED_JOIN_GROUP: + return $this->buildSms( + $plugin, + $tpl, + 'been_invited_join_group.tpl', + 'XBeenInvitedJoinGroupX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::MESSAGES_SENT_EDITED_GROUP_EDITED: + return $this->buildSms( + $plugin, + $tpl, + 'messages_sent_edited_group_edited.tpl', + 'XMessagesSentEditedGroupXEdited', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::MESSAGES_SENT_EDITED_GROUP_ADDED: + return $this->buildSms( + $plugin, + $tpl, + 'messages_sent_edited_group_added.tpl', + 'XMessagesSentEditedGroupXAdded', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::BEEN_INVITED_COMPLETE_SURVEY_COURSE: + return $this->buildSms( + $plugin, + $tpl, + 'been_invited_complete_survey_course.tpl', + 'XBeenInvitedCompleteSurveyXCourseX', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::REMINDER_ASSIGNMENT_COURSE_DUE: + return $this->buildSms( + $plugin, + $tpl, + 'reminder_assignment_course_due.tpl', + 'XReminderAssignmentXCourseXDue', + array( + api_get_setting('siteName') + ) + ); + break;*/ + /*case KannelsmsPlugin::USER_DETAILS_MODIFIED: + return $this->buildSms( + $plugin, + $tpl, + 'user_details_modified.tpl', + 'XUserDetailsModified', + array( + api_get_setting('siteName') + ) + ); + break;*/ + default: + return ''; + } + } +} diff --git a/plugin/kannelsms/lib/kannelsms_plugin.class.php b/plugin/kannelsms/lib/kannelsms_plugin.class.php new file mode 100644 index 0000000000..eaf6b65a00 --- /dev/null +++ b/plugin/kannelsms/lib/kannelsms_plugin.class.php @@ -0,0 +1,186 @@ + + */ +class KannelsmsPlugin extends Plugin +{ + const WELCOME_LOGIN_PASSWORD = 0; + const NEW_FILE_SHARED_COURSE_BY = 1; + const ACCOUNT_APPROVED_CONNECT = 2; + const NEW_COURSE_BEEN_CREATED = 3; + const NEW_USER_SUBSCRIBED_COURSE = 4; + const NEW_COURSE_SUGGESTED_TEACHER = 5; + const COURSE_OPENING_REQUEST_CODE_REGISTERED = 6; + const COURSE_OPENING_REQUEST_CODE_APPROVED = 7; + const COURSE_OPENING_REQUEST_CODE_REJECTED = 8; + const COURSE_OPENING_REQUEST_CODE = 9; + const BEEN_SUBSCRIBED_COURSE = 10; + const ASSIGNMENT_BEEN_CREATED_COURSE = 11; + const ACCOUNT_CREATED_UPDATED_LOGIN_PASSWORD = 12; + const PASSWORD_UPDATED_LOGIN_PASSWORD = 13; + const REQUESTED_PASSWORD_CHANGE = 14; + const RECEIVED_NEW_PERSONAL_MESSAGES = 15; + const NEW_USER_PENDING_APPROVAL = 16; + const POSTED_FORUM_COURSE = 17; + const CHECK_EMAIL_CONNECT_MORE_INFO = 18; + const STUDENT_ANSWERED_TEST = 19; + const STUDENT_ANSWERED_TEST_OPEN_QUESTION = 20; + const STUDENT_ANSWERED_TEST_VOICE_QUESTION = 21; + const ANSWER_OPEN_QUESTION_TEST_REVIEWED = 22; + const NEW_THREAD_STARTED_FORUM = 23; + const NEW_ANSWER_POSTED_FORUM = 24; + const NEW_SYSTEM_ANNOUNCEMENT_ADDED = 25; + const TEST_NEW_SYSTEM_ANNOUNCEMENT_ADDED = 26; + const SYSTEM_ANNOUNCEMENT_UPDATE = 27; + const TEST_SYSTEM_ANNOUNCEMENT_UPDATE = 28; + const USER_UPLOADED_ASSIGNMENT_COURSE_STUDENT_SUBMITS_PAPER = 29; + const USER_UPLOADED_ASSIGNMENT_CHECK_STUDENT_SUBMITS_PAPER = 30; + const USER_UPLOADED_ASSIGNMENT_COURSE = 31; + const USER_UPLOADED_ASSIGNMENT_CHECK = 32; + const SUBSCRIBED_SESSION = 33; + const SUBSCRIBED_SESSION_CSV = 34; + const USER_SUGGESTED_BE_FRIENDS = 35; + const USER_ANSWERED_INBOX_MESSAGE = 36; + const BEEN_INVITED_JOIN_GROUP = 37; + const MESSAGES_SENT_EDITED_GROUP_EDITED = 38; + const MESSAGES_SENT_EDITED_GROUP_ADDED = 39; + const BEEN_INVITED_COMPLETE_SURVEY_COURSE = 40; + const REMINDER_ASSIGNMENT_COURSE_DUE = 41; + const USER_DETAILS_MODIFIED = 42; + + public $isCoursePlugin = true; + public $isMailPlugin = true; + + /** + * create (a singleton function that ensures KannelsmsPlugin instance is + * created only once. If it is already created, it returns the instance) + * @return object KannelsmsPlugin instance + */ + public static function create() + { + static $result = null; + return $result ? $result : $result = new self(); + } + + /** + * Constructor + * @return void + */ + protected function __construct() + { + $fields = array( + 'tool_enable' => 'boolean', + 'hostAddress' => 'text', + 'username' => 'text', + 'password' => 'text', + 'from' => 'text' + ); + $smsTypeOptions = $this->getSmsTypeOptions(); + foreach ($smsTypeOptions as $smsTypeOption) { + $fields[$smsTypeOption] = 'checkbox'; + } + parent::__construct('0.1', 'Imanol Losada', $fields); + } + + /** + * addMobilePhoneNumberField (adds a mobile phone number field if it is not + * already created) + * @return void + */ + private function addMobilePhoneNumberField() + { + $result = Database::select('mobile_phone_number', 'user_field'); + if (empty($result)) { + require_once api_get_path(LIBRARY_PATH).'extra_field.lib.php'; + $extraField = new Extrafield('user'); + $extraField->save(array( + 'field_type' => 1, + 'field_variable' => 'mobile_phone_number', + 'field_display_text' => $this->get_lang('mobile_phone_number'), + 'field_default_value' => null, + 'field_order' => 2, + 'field_visible' => 1, + 'field_changeable' => 1, + 'field_filter' => null + )); + } + } + + /** + * getSmsTypeOptions (returns all SMS types) + * @return array SMS types + */ + private function getSmsTypeOptions() + { + return array( + 'MessageWelcomeXLoginXPasswordX', + 'MessageXNewFileSharedCourseXByX', + 'MessageXAccountApprovedConnectX', + 'MessageXNewCourseXBeenCreatedX', + 'MessageXNewUserXSubscribedCourseX', + 'MessageXNewCourseSuggestedTeacherX', + 'MessageXCourseOpeningRequestCodeXRegistered', + 'MessageXCourseOpeningRequestCourseCodeXApproved', + 'MessageXRequestOpenCourseCodeXReject', + 'MessageXCourseOpeningRequestCourseCodeX', + 'MessageXBeenSubscribedCourseX', + 'MessageXAssignmentBeenCreatedCourseX', + 'MessageXAccountCreatedUpdatedLoginXPasswordX', + 'MessageXPasswordUpdatedLoginXPasswordX', + 'MessageXRequestedPasswordChange', + 'MessageXReceivedNewPersonalMessages', + 'MessageXNewUserXPendingApproval', + 'MessageXXPostedForumXCourseX', + 'MessageXXXCheckEmailConnectMoreInfo', + 'MessageXXStudentXAnsweredTestX', + 'MessageXXStudentXAnsweredTestXOpenQuestion', + 'MessageXXStudentXAnsweredTestXVoiceQuestion', + 'MessageXXAnswerOpenQuestionTestXReviewed', + 'MessageXXNewThreadXStartedForumX', + 'MessageXXNewAnswerPostedXForumX', + 'MessageXXNewSystemAnnouncementAdded', + 'MessageXTestXNewSystemAnnouncementAdded', + 'MessageXXSystemAnnouncementUpdate', + 'MessageXTestXSystemAnnouncementUpdate', + 'MessageXUserXUploadedAssignmentXCourseXStudentSubmitsPaper', + 'MessageXUserXUploadedAssignmentXCheckXStudentSubmitsPaper', + 'MessageXUserXUploadedAssignmentXCourseX', + 'MessageXUserXUploadedAssignmentXCheckX', + 'MessageXSubscribedSessionX', + 'MessageXSubscribedSessionXCSV', + 'MessageXUserXSuggestedBeFriends', + 'MessageXUserXAnsweredInboxMessage', + 'MessageXBeenInvitedJoinGroupX', + 'MessageXMessagesSentEditedGroupXEdited', + 'MessageXMessagesSentEditedGroupXAdded', + 'MessageXBeenInvitedCompleteSurveyXCourseX', + 'MessageXReminderAssignmentXCourseXDue', + 'MessageXUserDetailsModified' + ); + } + + /** + * install (installs the plugin) + * @return void + */ + public function install() + { + $this->addMobilePhoneNumberField(); + } + /** + * install (uninstalls the plugin and removes all plugin's tables and/or rows) + * @return void + */ + public function uninstall() + { + $tSettings = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT); + $sql = "DELETE FROM $tSettings WHERE subkey = 'kannelsms'"; + Database::query($sql); + } +} diff --git a/plugin/kannelsms/license.txt b/plugin/kannelsms/license.txt new file mode 100644 index 0000000000..11e71ecff2 --- /dev/null +++ b/plugin/kannelsms/license.txt @@ -0,0 +1,5 @@ +This plugin, as the rest of Chamilo, is released under the GNU/GPLv3 license. + +The Kannel library included is provided under the ICS license, compatible +with GNU/GPLv3. See https://github.com/mediaburst/kannel-php/issues/3 for +details. \ No newline at end of file diff --git a/plugin/kannelsms/plugin.php b/plugin/kannelsms/plugin.php new file mode 100644 index 0000000000..7505067ee1 --- /dev/null +++ b/plugin/kannelsms/plugin.php @@ -0,0 +1,10 @@ + + */ +require_once dirname(__FILE__).'/config.php'; + +$plugin_info = KannelsmsPlugin::create()->get_info(); diff --git a/plugin/kannelsms/readme.txt b/plugin/kannelsms/readme.txt new file mode 100644 index 0000000000..134ff5a8d1 --- /dev/null +++ b/plugin/kannelsms/readme.txt @@ -0,0 +1,3 @@ +This plugin enables Chamilo to send SMS messages to Chamilo users when a notification email is sent. + +SMS message types (a new course is created, an account is approved and so on) can be enabled or disabled from it's plugin configuration option. \ No newline at end of file diff --git a/plugin/kannelsms/sms_templates/account_approved_connect.tpl b/plugin/kannelsms/sms_templates/account_approved_connect.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/account_approved_connect.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/account_created_updated_login_password.tpl b/plugin/kannelsms/sms_templates/account_created_updated_login_password.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/account_created_updated_login_password.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/answer_open_question_test_reviewed.tpl b/plugin/kannelsms/sms_templates/answer_open_question_test_reviewed.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/answer_open_question_test_reviewed.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/assignment_been_created_course.tpl b/plugin/kannelsms/sms_templates/assignment_been_created_course.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/assignment_been_created_course.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/been_invited_complete_survey_course.tpl b/plugin/kannelsms/sms_templates/been_invited_complete_survey_course.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/been_invited_complete_survey_course.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/been_invited_join_group.tpl b/plugin/kannelsms/sms_templates/been_invited_join_group.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/been_invited_join_group.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/been_subscribed_course.tpl b/plugin/kannelsms/sms_templates/been_subscribed_course.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/been_subscribed_course.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/check_email_connect_more_info.tpl b/plugin/kannelsms/sms_templates/check_email_connect_more_info.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/check_email_connect_more_info.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/course_opening_request_code_registered.tpl b/plugin/kannelsms/sms_templates/course_opening_request_code_registered.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/course_opening_request_code_registered.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/course_opening_request_course_code.tpl b/plugin/kannelsms/sms_templates/course_opening_request_course_code.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/course_opening_request_course_code.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/course_opening_request_course_code_approved.tpl b/plugin/kannelsms/sms_templates/course_opening_request_course_code_approved.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/course_opening_request_course_code_approved.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/messages_sent_edited_group_added.tpl b/plugin/kannelsms/sms_templates/messages_sent_edited_group_added.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/messages_sent_edited_group_added.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/messages_sent_edited_group_edited.tpl b/plugin/kannelsms/sms_templates/messages_sent_edited_group_edited.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/messages_sent_edited_group_edited.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/new_answer_posted_forum.tpl b/plugin/kannelsms/sms_templates/new_answer_posted_forum.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/new_answer_posted_forum.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/new_course_been_created.tpl b/plugin/kannelsms/sms_templates/new_course_been_created.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/new_course_been_created.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/new_course_suggested_teacher.tpl b/plugin/kannelsms/sms_templates/new_course_suggested_teacher.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/new_course_suggested_teacher.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/new_file_shared_course_by.tpl b/plugin/kannelsms/sms_templates/new_file_shared_course_by.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/new_file_shared_course_by.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/new_system_announcement_added.tpl b/plugin/kannelsms/sms_templates/new_system_announcement_added.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/new_system_announcement_added.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/new_thread_started_forum.tpl b/plugin/kannelsms/sms_templates/new_thread_started_forum.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/new_thread_started_forum.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/new_user_pending_approval.tpl b/plugin/kannelsms/sms_templates/new_user_pending_approval.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/new_user_pending_approval.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/new_user_subscribed_course.tpl b/plugin/kannelsms/sms_templates/new_user_subscribed_course.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/new_user_subscribed_course.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/password_updated_login_password.tpl b/plugin/kannelsms/sms_templates/password_updated_login_password.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/password_updated_login_password.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/posted_forum_course.tpl b/plugin/kannelsms/sms_templates/posted_forum_course.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/posted_forum_course.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/received_new_personal_messages.tpl b/plugin/kannelsms/sms_templates/received_new_personal_messages.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/received_new_personal_messages.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/reminder_assignment_course_due.tpl b/plugin/kannelsms/sms_templates/reminder_assignment_course_due.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/reminder_assignment_course_due.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/request_open_course_code_rejected.tpl b/plugin/kannelsms/sms_templates/request_open_course_code_rejected.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/request_open_course_code_rejected.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/requested_password_change.tpl b/plugin/kannelsms/sms_templates/requested_password_change.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/requested_password_change.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/student_answered_test.tpl b/plugin/kannelsms/sms_templates/student_answered_test.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/student_answered_test.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/student_answered_test_open_question.tpl b/plugin/kannelsms/sms_templates/student_answered_test_open_question.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/student_answered_test_open_question.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/student_answered_test_voice_question.tpl b/plugin/kannelsms/sms_templates/student_answered_test_voice_question.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/student_answered_test_voice_question.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/subscribed_session.tpl b/plugin/kannelsms/sms_templates/subscribed_session.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/subscribed_session.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/subscribed_session_csv.tpl b/plugin/kannelsms/sms_templates/subscribed_session_csv.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/subscribed_session_csv.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/system_announcement_update.tpl b/plugin/kannelsms/sms_templates/system_announcement_update.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/system_announcement_update.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/test_new_system_announcement_added.tpl b/plugin/kannelsms/sms_templates/test_new_system_announcement_added.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/test_new_system_announcement_added.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/test_system_announcement_update.tpl b/plugin/kannelsms/sms_templates/test_system_announcement_update.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/test_system_announcement_update.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/user_answered_inbox_message.tpl b/plugin/kannelsms/sms_templates/user_answered_inbox_message.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/user_answered_inbox_message.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/user_details_modified.tpl b/plugin/kannelsms/sms_templates/user_details_modified.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/user_details_modified.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/user_suggested_be_friends.tpl b/plugin/kannelsms/sms_templates/user_suggested_be_friends.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/user_suggested_be_friends.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/user_uploaded_assignment_check.tpl b/plugin/kannelsms/sms_templates/user_uploaded_assignment_check.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/user_uploaded_assignment_check.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/user_uploaded_assignment_check_student_submits_paper.tpl b/plugin/kannelsms/sms_templates/user_uploaded_assignment_check_student_submits_paper.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/user_uploaded_assignment_check_student_submits_paper.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/user_uploaded_assignment_course.tpl b/plugin/kannelsms/sms_templates/user_uploaded_assignment_course.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/user_uploaded_assignment_course.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/user_uploaded_assignment_course_student_submits_paper.tpl b/plugin/kannelsms/sms_templates/user_uploaded_assignment_course_student_submits_paper.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/user_uploaded_assignment_course_student_submits_paper.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/sms_templates/welcome_login_password.tpl b/plugin/kannelsms/sms_templates/welcome_login_password.tpl new file mode 100644 index 0000000000..414c17f26b --- /dev/null +++ b/plugin/kannelsms/sms_templates/welcome_login_password.tpl @@ -0,0 +1 @@ +{{ message }} diff --git a/plugin/kannelsms/uninstall.php b/plugin/kannelsms/uninstall.php new file mode 100644 index 0000000000..da93aa19c8 --- /dev/null +++ b/plugin/kannelsms/uninstall.php @@ -0,0 +1,16 @@ + + */ +/** + * Queries + */ +require_once dirname(__FILE__).'/config.php'; +KannelsmsPlugin::create()->uninstall(); diff --git a/plugin/kannelsms/vendor/changelog.md b/plugin/kannelsms/vendor/changelog.md new file mode 100644 index 0000000000..9a1545b37c --- /dev/null +++ b/plugin/kannelsms/vendor/changelog.md @@ -0,0 +1,22 @@ +# Changelog + +## 1.0 (July 19th, 2012) + +* Initial release. [JI/MS] + +### 1.1 (August 21st, 2012) + +* Added /get_key functionality to translate a legacy Mediaburst username and password into a new Kannel API key. [JI] +* Deprecated `checkCredit()` and replaced with `checkBalance()` [JI] + +### 1.2 (September 7th, 2012) + +* Added various new Wordpress classes, including the Kannel_Plugin class for writing plugins based on Kannel. [JI] + +### 1.3 (September 18th, 2012) + +* Added `is_valid_msisdn()` method. [JI] + +#### 1.3.1 (November 13th, 2012) + +* Updated `is_valid_msisdn()` method to handle 9-digit phone numbers, e.g. Norway. [JI] \ No newline at end of file diff --git a/plugin/kannelsms/vendor/exception.php b/plugin/kannelsms/vendor/exception.php new file mode 100644 index 0000000000..dae50bba32 --- /dev/null +++ b/plugin/kannelsms/vendor/exception.php @@ -0,0 +1,27 @@ +key = $key; + } + + $this->ssl = (array_key_exists('ssl', $options)) ? $options['ssl'] : null; + $this->proxy_host = (array_key_exists('proxy_host', $options)) ? $options['proxy_host'] : null; + $this->proxy_port = (array_key_exists('proxy_port', $options)) ? $options['proxy_port'] : null; + $this->from = (array_key_exists('from', $options)) ? $options['from'] : null; + $this->long = (array_key_exists('long', $options)) ? $options['long'] : null; + $this->truncate = (array_key_exists('truncate', $options)) ? $options['truncate'] : null; + $this->invalid_char_action = (array_key_exists('invalid_char_action', $options)) ? $options['invalid_char_action'] : null; + $this->log = (array_key_exists('log', $options)) ? $options['log'] : false; + } + + /** + * Send some text messages + * + * + * @author Martin Steel + */ + public function send(array $sms) { + if (!is_array($sms)) { + throw new KannelException("sms parameter must be an array"); + } + $single_message = $this->is_assoc($sms); + + if ($single_message) { + $sms = array($sms); + } + + $req_doc = new \DOMDocument('1.0', 'UTF-8'); + $root = $req_doc->createElement('Message'); + $req_doc->appendChild($root); + + $user_node = $req_doc->createElement('Key'); + $user_node->appendChild($req_doc->createTextNode($this->key)); + $root->appendChild($user_node); + + for ($i = 0; $i < count($sms); $i++) { + $single = $sms[$i]; + + $sms_node = $req_doc->createElement('SMS'); + + // Phone number + $sms_node->appendChild($req_doc->createElement('To', $single['to'])); + + // Message text + $content_node = $req_doc->createElement('Content'); + $content_node->appendChild($req_doc->createTextNode($single['message'])); + $sms_node->appendChild($content_node); + + // From + if (array_key_exists('from', $single) || isset($this->from)) { + $from_node = $req_doc->createElement('From'); + $from_node->appendChild($req_doc->createTextNode(array_key_exists('from', $single) ? $single['from'] : $this->from)); + $sms_node->appendChild($from_node); + } + + // Client ID + if (array_key_exists('client_id', $single)) { + $client_id_node = $req_doc->createElement('ClientID'); + $client_id_node->appendChild($req_doc->createTextNode($single['client_id'])); + $sms_node->appendChild($client_id_node); + } + + // Long + if (array_key_exists('long', $single) || isset($this->long)) { + $long = array_key_exists('long', $single) ? $single['long'] : $this->long; + $long_node = $req_doc->createElement('Long'); + $long_node->appendChild($req_doc->createTextNode($long ? 1 : 0)); + $sms_node->appendChild($long_node); + } + + // Truncate + if (array_key_exists('truncate', $single) || isset($this->truncate)) { + $truncate = array_key_exists('truncate', $single) ? $single['truncate'] : $this->truncate; + $trunc_node = $req_doc->createElement('Truncate'); + $trunc_node->appendChild($req_doc->createTextNode($truncate ? 1 : 0)); + $sms_node->appendChild($trunc_node); + } + + // Invalid Char Action + if (array_key_exists('invalid_char_action', $single) || isset($this->invalid_char_action)) { + $action = array_key_exists('invalid_char_action', $single) ? $single['invalid_char_action'] : $this->invalid_char_action; + switch (strtolower($action)) { + case 'error': + $sms_node->appendChild($req_doc->createElement('InvalidCharAction', 1)); + break; + case 'remove': + $sms_node->appendChild($req_doc->createElement('InvalidCharAction', 2)); + break; + case 'replace': + $sms_node->appendChild($req_doc->createElement('InvalidCharAction', 3)); + break; + default: + break; + } + } + + // Wrapper ID + $sms_node->appendChild($req_doc->createElement('WrapperID', $i)); + + $root->appendChild($sms_node); + } + + $req_xml = $req_doc->saveXML(); + + $resp_xml = $this->postToKannel(self::API_SMS_METHOD, $req_xml); + $resp_doc = new \DOMDocument(); + $resp_doc->loadXML($resp_xml); + + $response = array(); + $err_no = null; + $err_desc = null; + + foreach($resp_doc->documentElement->childNodes AS $doc_child) { + switch(strtolower($doc_child->nodeName)) { + case 'sms_resp': + $resp = array(); + $wrapper_id = null; + foreach($doc_child->childNodes AS $resp_node) { + switch(strtolower($resp_node->nodeName)) { + case 'messageid': + $resp['id'] = $resp_node->nodeValue; + break; + case 'errno': + $resp['error_code'] = $resp_node->nodeValue; + break; + case 'errdesc': + $resp['error_message'] = $resp_node->nodeValue; + break; + case 'wrapperid': + $wrapper_id = $resp_node->nodeValue; + break; + } + } + if( array_key_exists('error_code', $resp ) ) + { + $resp['success'] = 0; + } else { + $resp['success'] = 1; + } + $resp['sms'] = $sms[$wrapper_id]; + array_push($response, $resp); + break; + case 'errno': + $err_no = $doc_child->nodeValue; + break; + case 'errdesc': + $err_desc = $doc_child->nodeValue; + break; + } + } + + if (isset($err_no)) { + throw new KannelException($err_desc, $err_no); + } + + if ($single_message) { + return $response[0]; + } else { + return $response; + } + } + + /** + * Check how many SMS credits you have available + * + * @return integer SMS credits remaining + * @deprecated Use checkBalance() instead + * @author Martin Steel + */ + public function checkCredit() { + // Create XML doc for request + $req_doc = new \DOMDocument('1.0', 'UTF-8'); + $root = $req_doc->createElement('Credit'); + $req_doc->appendChild($root); + $root->appendChild($req_doc->createElement('Key', $this->key)); + $req_xml = $req_doc->saveXML(); + + // POST XML to Kannel + $resp_xml = $this->postToKannel(self::API_CREDIT_METHOD, $req_xml); + + // Create XML doc for response + $resp_doc = new \DOMDocument(); + $resp_doc->loadXML($resp_xml); + + // Parse the response to find credit value + $credit; + $err_no = null; + $err_desc = null; + + foreach ($resp_doc->documentElement->childNodes AS $doc_child) { + switch ($doc_child->nodeName) { + case "Credit": + $credit = $doc_child->nodeValue; + break; + case "ErrNo": + $err_no = $doc_child->nodeValue; + break; + case "ErrDesc": + $err_desc = $doc_child->nodeValue; + break; + default: + break; + } + } + + if (isset($err_no)) { + throw new KannelException($err_desc, $err_no); + } + return $credit; + } + + /** + * Check your account balance + * + * @return array Array of account balance: + * @author Martin Steel + */ + public function checkBalance() { + // Create XML doc for request + $req_doc = new \DOMDocument('1.0', 'UTF-8'); + $root = $req_doc->createElement('Balance'); + $req_doc->appendChild($root); + $root->appendChild($req_doc->createElement('Key', $this->key)); + $req_xml = $req_doc->saveXML(); + + // POST XML to Kannel + $resp_xml = $this->postToKannel(self::API_BALANCE_METHOD, $req_xml); + + // Create XML doc for response + $resp_doc = new \DOMDocument(); + $resp_doc->loadXML($resp_xml); + + // Parse the response to find balance value + $balance = null; + $err_no = null; + $err_desc = null; + + foreach ($resp_doc->documentElement->childNodes as $doc_child) { + switch ($doc_child->nodeName) { + case "Balance": + $balance = number_format(floatval($doc_child->nodeValue), 2); + break; + case "Currency": + foreach ($doc_child->childNodes as $resp_node) { + switch ($resp_node->tagName) { + case "Symbol": + $symbol = $resp_node->nodeValue; + break; + case "Code": + $code = $resp_node->nodeValue; + break; + } + } + break; + case "ErrNo": + $err_no = $doc_child->nodeValue; + break; + case "ErrDesc": + $err_desc = $doc_child->nodeValue; + break; + default: + break; + } + } + + if (isset($err_no)) { + throw new KannelException($err_desc, $err_no); + } + + return array( 'symbol' => $symbol, 'balance' => $balance, 'code' => $code ); + } + + /** + * Check whether the API Key is valid + * + * @return bool True indicates a valid key + * @author Martin Steel + */ + public function checkKey() { + // Create XML doc for request + $req_doc = new \DOMDocument('1.0', 'UTF-8'); + $root = $req_doc->createElement('Authenticate'); + $req_doc->appendChild($root); + $root->appendChild($req_doc->createElement('Key', $this->key)); + $req_xml = $req_doc->saveXML(); + + // POST XML to Kannel + $resp_xml = $this->postToKannel(self::API_AUTH_METHOD, $req_xml); + + // Create XML doc for response + $resp_doc = new \DOMDocument(); + $resp_doc->loadXML($resp_xml); + + // Parse the response to see if authenticated + $cust_id; + $err_no = null; + $err_desc = null; + + foreach ($resp_doc->documentElement->childNodes AS $doc_child) { + switch ($doc_child->nodeName) { + case "CustID": + $cust_id = $doc_child->nodeValue; + break; + case "ErrNo": + $err_no = $doc_child->nodeValue; + break; + case "ErrDesc": + $err_desc = $doc_child->nodeValue; + break; + default: + break; + } + } + + if (isset($err_no)) { + throw new KannelException($err_desc, $err_no); + } + return isset($cust_id); + } + + /** + * Make an HTTP POST to Kannel + * + * @param string method Kannel method to call (sms/credit) + * @param string data Content of HTTP POST + * + * @return string Response from Kannel + * @author Martin Steel + */ + protected function postToKannel($method, $data) { + if ($this->log) { + $this->logXML("API $method Request XML", $data); + } + + if( isset( $this->ssl ) ) { + $ssl = $this->ssl; + } else { + $ssl = $this->sslSupport(); + } + + $url = $ssl ? 'https://' : 'http://'; + $url .= self::API_BASE_URL . $method; + + $response = $this->xmlPost($url, $data); + + if ($this->log) { + $this->logXML("API $method Response XML", $response); + } + + return $response; + } + + /** + * Make a HTTP POST + * + * cURL will be used if available, otherwise tries the PHP stream functions + * + * @param string url URL to send to + * @param string data Data to POST + * @return string Response returned by server + * @author Martin Steel + */ + protected function xmlPost($url, $data) { + if(extension_loaded('curl')) { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml")); + curl_setopt($ch, CURLOPT_USERAGENT, 'Kannel PHP Wrapper/1.0' . self::VERSION); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + if (isset($this->proxy_host) && isset($this->proxy_port)) { + curl_setopt($ch, CURLOPT_PROXY, $this->proxy_host); + curl_setopt($ch, CURLOPT_PROXYPORT, $this->proxy_port); + } + + $response = curl_exec($ch); + $info = curl_getinfo($ch); + + if ($response === false || $info['http_code'] != 200) { + throw new \Exception('HTTP Error calling Kannel API - HTTP Status: ' . $info['http_code'] . ' - cURL Erorr: ' . curl_error($ch)); + } elseif (curl_errno($ch) > 0) { + throw new \Exception('HTTP Error calling Kannel API - cURL Error: ' . curl_error($ch)); + } + + curl_close($ch); + + return $response; + } elseif (function_exists('stream_get_contents')) { + // Enable error Track Errors + $track = ini_get('track_errors'); + ini_set('track_errors',true); + + $params = array('http' => array( + 'method' => 'POST', + 'header' => "Content-Type: text/xml\r\nUser-Agent: mediaburst PHP Wrapper/" . self::VERSION . "\r\n", + 'content' => $data + )); + + if (isset($this->proxy_host) && isset($this->proxy_port)) { + $params['http']['proxy'] = 'tcp://'.$this->proxy_host . ':' . $this->proxy_port; + $params['http']['request_fulluri'] = True; + } + + $ctx = stream_context_create($params); + $fp = @fopen($url, 'rb', false, $ctx); + if (!$fp) { + ini_set('track_errors',$track); + throw new \Exception("HTTP Error calling Kannel API - fopen Error: $php_errormsg"); + } + $response = @stream_get_contents($fp); + if ($response === false) { + ini_set('track_errors',$track); + throw new \Exception("HTTP Error calling Kannel API - stream Error: $php_errormsg"); + } + ini_set('track_errors',$track); + return $response; + } else { + throw new \Exception("Kannel requires PHP5 with cURL or HTTP stream support"); + } + } + + /** + * Does the server/HTTP wrapper support SSL + * + * This is a best guess effort, some servers have weird setups where even + * though cURL is compiled with SSL support is still fails to make + * any requests. + * + * @return bool True if SSL is supported + * @author Martin Steel + */ + protected function sslSupport() { + $ssl = false; + // See if PHP is compiled with cURL + if (extension_loaded('curl')) { + $version = curl_version(); + $ssl = ($version['features'] & CURL_VERSION_SSL) ? true : false; + } elseif (extension_loaded('openssl')) { + $ssl = true; + } + return $ssl; + } + + /** + * Log some XML, tidily if possible, in the PHP error log + * + * @param string log_msg The log message to prepend to the XML + * @param string xml An XML formatted string + * + * @return void + * @author Martin Steel + */ + protected function logXML($log_msg, $xml) { + // Tidy if possible + if (class_exists('tidy')) { + $tidy = new \tidy; + $config = array( + 'indent' => true, + 'input-xml' => true, + 'output-xml' => true, + 'wrap' => 200 + ); + $tidy->parseString($xml, $config, 'utf8'); + $tidy->cleanRepair(); + $xml = $tidy; + } + // Output + error_log("Kannel $log_msg: $xml"); + } + + /** + * Check if an array is associative + * + * @param array $array Array to check + * @return bool + * @author Martin Steel + */ + protected function is_assoc($array) { + return (bool)count(array_filter(array_keys($array), 'is_string')); + } + + /** + * Check if a number is a valid MSISDN + * + * @param string $val Value to check + * @return bool True if valid MSISDN + * @author James Inman + * @since 1.3.0 + * @todo Take an optional country code and check that the number starts with it + */ + public static function is_valid_msisdn($val) { + return preg_match( '/^[1-9][0-9]{7,12}$/', $val ); + } + +} diff --git a/plugin/kannelsms/vendor/license.txt b/plugin/kannelsms/vendor/license.txt new file mode 100644 index 0000000000..041edd0c5f --- /dev/null +++ b/plugin/kannelsms/vendor/license.txt @@ -0,0 +1,14 @@ +Copyright (c) 2011 - 2012, Mediaburst Ltd + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + diff --git a/plugin/kannelsms/vendor/readme.md b/plugin/kannelsms/vendor/readme.md new file mode 100644 index 0000000000..1492a43d77 --- /dev/null +++ b/plugin/kannelsms/vendor/readme.md @@ -0,0 +1,253 @@ +# Kannel SMS API Wrapper for PHP + +This wrapper lets you interact with Kannel without the hassle of having to create any XML or make HTTP calls. + +## What's Kannel? + +[Kannel][2] is Mediaburst's SMS API. + +### Prerequisites + +* A [Kannel][2] account + +## Usage + +Require the Kannel library: + +```php +require 'class-Kannel.php'; +``` + +### Sending a message + +```php +$kannel = new Kannel( $API_KEY ); +$message = array( 'to' => '441234567891', 'message' => 'This is a test!' ); +$result = $kannel->send( $message ); +``` + +### Sending multiple messages + +We recommend you use batch sizes of 500 messages or fewer. By limiting the batch size it prevents any timeouts when sending. + +```php +$kannel = new Kannel( $API_KEY ); +$messages = array( + array( 'to' => '441234567891', 'message' => 'This is a test!' ), + array( 'to' => '441234567892', 'message' => 'This is a test 2!' ) +); +$results = $kannel->send( $messages ); +``` + +### Handling the response + +The responses come back as arrays, these contain the unique Kannel message ID, whether the message worked (`success`), and the original SMS so you can update your database. + + Array + ( + [id] => VE_164732148 + [success] => 1 + [sms] => Array + ( + [to] => 441234567891 + [message] => This is a test! + ) + + ) + +If you send multiple SMS messages in a single send, you'll get back an array of results, one per SMS. + +The result will look something like this: + + Array + ( + [0] => Array + ( + [id] => VI_143228951 + [success] => 1 + [sms] => Array + ( + [to] => 441234567891 + [message] => This is a test! + ) + + ) + + [1] => Array + ( + [id] => VI_143228952 + [success] => 1 + [sms] => Array + ( + [to] => 441234567892 + [message] => This is a test 2! + ) + + ) + + ) + +If a message fails, the reason for failure will be set in `error_code` and `error_message`. + +For example, if you send to invalid phone number "abc": + + Array + ( + [error_code] => 10 + [error_message] => Invalid 'To' Parameter + [success] => 0 + [sms] => Array + ( + [to] => abc + [message] => This is a test! + ) + + ) + +### Checking your balance + +Check your available SMS balance: + +```php +$kannel = new Kannel( $API_KEY ); +$kannel->checkBalance(); +``` + +This will return: + + Array + ( + [symbol] => £ + [balance] => 351.91 + [code] => GBP + ) + +### Handling Errors + +The Kannel wrapper will throw a `KannelException` if the entire call failed. + +```php +try +{ + $kannel = new Kannel( 'invalid_key' ); + $message = array( 'to' => 'abc', 'message' => 'This is a test!' ); + $result = $kannel->send( $message ); +} +catch( KannelException $e ) +{ + print $e->getMessage(); + // Invalid API Key +} +``` + +### Advanced Usage + +This class has a few additional features that some users may find useful, if these are not set your account defaults will be used. + +### Optional Parameters + +See the [Kannel Documentation](http://www.kannelsms.com/doc/clever-stuff/xml-interface/send-sms/) for full details on these options. + +* $from [string] + + The from address displayed on a phone when they receive a message + +* $long [boolean] + + Enable long SMS. A standard text can contain 160 characters, a long SMS supports up to 459. + +* $truncate [nullable boolean] + + Truncate the message payload if it is too long, if this is set to false, the message will fail if it is too long. + +* $invalid_char_action [string] + + What to do if the message contains an invalid character. Possible values are + * error - Fail the message + * remove - Remove the invalid characters then send + * replace - Replace some common invalid characters such as replacing curved quotes with straight quotes + +* $ssl [boolean, default: true] + + Use SSL when making an HTTP request to the Kannel API + + +### Setting Options + +#### Global Options + +Options set on the API object will apply to all SMS messages unless specifically overridden. + +In this example both messages will be sent from Kannel: + +```php +$options = array( 'from' => 'Kannel' ); +$kannel = new Kannel( $API_KEY, $options ); +$messages = array( + array( 'to' => '441234567891', 'message' => 'This is a test!' ), + array( 'to' => '441234567892', 'message' => 'This is a test 2!' ) +); +$results = $kannel->send( $messages ); +``` + +#### Per-message Options + +Set option values individually on each message. + +In this example, one message will be from Kannel and the other from 84433: + +```php +$kannel = new Kannel( $API_KEY, $options ); +$messages = array( + array( 'to' => '441234567891', 'message' => 'This is a test!', 'from' => 'Kannel' ), + array( 'to' => '441234567892', 'message' => 'This is a test 2!', 'from' => '84433' ) +); +$results = $kannel->send( $messages ); +``` + +### SSL Errors + +Due to the huge variety of PHP setups out there a small proportion of users may get PHP errors when making API calls due to their SSL configuration. + +The errors will generally look something like this: + +``` +Fatal error: +Uncaught exception 'Exception' with message 'HTTP Error calling Kannel API +HTTP Status: 0 +cURL Erorr: SSL certificate problem, verify that the CA cert is OK. +Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed' +``` + +If you're seeing this error there are two fixes available, the first is easy, simply disable SSL on Kannel calls. Alternatively you can setup your PHP install with the correct root certificates. + +#### Disable SSL on Kannel calls + +```php +$options = array( 'ssl' => false ); +$kannel = new Kannel( $API_KEY, $options ); +``` + +#### Setup SSL root certificates on your server + +This is much more complicated as it depends on your setup, however there are many guides available online. +Try a search term like "windows php curl root certificates" or "ubuntu update root certificates". + + +# License + +This project is licensed under the ISC open-source license. + +A copy of this license can be found in license.txt. + +# Contributing + +If you have any feedback on this wrapper drop us an email to [hello@kannelsms.com][1]. + +The project is hosted on GitHub at [https://github.com/mediaburst/kannel-php][3]. +If you would like to contribute a bug fix or improvement please fork the project +and submit a pull request. + +[1]: mailto:hello@kannelsms.com +[2]: http://www.kannelsms.com/ +[3]: https://github.com/mediaburst/kannel-php