Merge pull request #637 from bjrambo/pr/ncenter-sms

알림센터에 SMS알림 기능 추가.
This commit is contained in:
Johnny 2016-11-18 10:26:13 +09:00 committed by GitHub
commit 9673e71957
10 changed files with 264 additions and 25 deletions

View file

@ -65,11 +65,19 @@ class CoolSMS extends Base implements \Rhymix\Framework\Drivers\SMSInterface
{
$sender = new \Nurigo\Api\Message($this->_config['api_key'], $this->_config['api_secret']);
$status = true;
foreach ($messages as $i => $message)
{
$options = new \stdClass;
$options->type = $message->type;
if ($this->_config['sender_key'])
{
$options->sender_key = $this->_config['sender_key'];
$options->type = 'CTA';
}
else
{
$options->type = $message->type;
}
$options->from = $message->from;
$options->to = implode(',', $message->to);
$options->text = $message->content ?: $message->type;
@ -91,7 +99,6 @@ class CoolSMS extends Base implements \Rhymix\Framework\Drivers\SMSInterface
{
$options->image = $message->image;
}
$result = $sender->send($options);
if (!$result->success_count)
{

View file

@ -37,6 +37,7 @@ $lang->ncenterlite_message_mention = '<strong>%1$s</strong> sent you a message,
$lang->ncenterlite_test_noti = 'Hello, <strong>%s</strong>! This is a test notification.';
$lang->ncenterlite_vote = '<strong>%1$s</strong> upvoted your %3$s, "%2$s".';
$lang->ncenterlite_admin_content_message = '<strong>%1$s</strong> wrote "%3$s" on <strong>%2$s</strong>.';
$lang->ncenterlite_insert_member_message = '<strong>%s!</strong> Welcome to the <strong>membership!!</strong>';
$lang->ncenterlite_ago = 'ago';
$lang->ncenterlite_date['0'] = 'year';
$lang->ncenterlite_date['1'] = 'month';

View file

@ -26,6 +26,7 @@ $lang->ncenterlite_my_list = '내 알림 목록';
$lang->ncenterlite_my_settings = '내 알림 설정';
$lang->ncenterlite_user_settings = '사용자 알림 설정';
$lang->ncenterlite_userconfig_title = '%s님의 알림센터 설정';
$lang->ncenterlite_sms_message_use = 'SMS 문자알림';
$lang->ncenterlite_userconfig_about = '알림센터의 개인의 설정을 저장하도록 합니다.';
$lang->ncenterlite_comment_noti = '댓글 알림';
$lang->ncenterlite_comment_noti_about = '내 게시물의 혹은 내 댓글에 댓글이 달릴경우 알림을 받습니다.';
@ -47,6 +48,7 @@ $lang->ncenterlite_message_mention = '<strong>%s</strong>님이 <strong>"%s"</st
$lang->ncenterlite_test_noti = '<strong>%s</strong>님! 테스트 알림입니다.';
$lang->ncenterlite_vote = '<strong>%s</strong>님이 회원님의 <strong>"%s"</strong> %s을 추천하였습니다.';
$lang->ncenterlite_admin_content_message = '<strong>%1$s</strong>님이 <strong>"%2$s"</strong> 게시판에 <strong>"%3$s"</strong>라고 글을 남겼습니다.';
$lang->ncenterlite_insert_member_message = '<strong>%s</strong>님 <strong>회원가입</strong>을 환영합니다!!';
$lang->ncenterlite_ago = '전';
$lang->ncenterlite_date['0'] = '년';
$lang->ncenterlite_date['1'] = '개월';
@ -122,3 +124,7 @@ $lang->about_mention_suffix_always_cut = '\'알림센터님\'이라는 회원과
$lang->mention_limit = '멘션 갯수 제한';
$lang->about_mention_limit = '서버 과부하와 스팸을 방지하기 위해 한 글에서 지나치게 많은 회원들을 호출하지 못하도록 합니다.';
$lang->ncenterlite_msg_setting_error = '설정에 오류가 있습니다. 다시 설정해 주세요.';
$lang->ncenterlite_use_sms_help = '이 옵션을 사용하게 되면 회원들에게 문자메세지 서비스를 이용하여 알림을 보낼 수 있습니다.';
$lang->member_phone_variable = '회원전화번호 변수';
$lang->member_phone_variable_about = '회원전화번호 변수를 선택합니다. 회원전화번호 변수가 1개일 경우 설치시 자동으로 설정이 저장됩니다. 이 경우 설정을 할 필요가 없어서 설정을 선택할 수 없습니다.';
$lang->fail_module_install = '모듈설치에 실패하였습니다.';

View file

@ -26,8 +26,10 @@ class ncenterliteAdminController extends ncenterlite
'document_read',
'layout_srl',
'mlayout_srl',
'use_sms',
'variable_name',
);
foreach($config_vars as $val)
{
if($obj->{$val})
@ -35,7 +37,7 @@ class ncenterliteAdminController extends ncenterlite
$config->{$val} = $obj->{$val};
}
}
if ($obj->disp_act == 'dispNcenterliteAdminConfig')
{
if (!$obj->use)
@ -43,7 +45,7 @@ class ncenterliteAdminController extends ncenterlite
$config->use = array();
}
}
if ($obj->disp_act == 'dispNcenterliteAdminAdvancedconfig')
{
if (!$config->mention_suffixes)
@ -54,6 +56,11 @@ class ncenterliteAdminController extends ncenterlite
{
$config->mention_suffixes = array_map('trim', explode(',', $config->mention_suffixes));
}
if($obj->variable_name === '0')
{
$config->variable_name = null;
}
}
if ($obj->disp_act == 'dispNcenterliteAdminSeletedmid')
@ -155,7 +162,7 @@ class ncenterliteAdminController extends ncenterlite
{
$this->setMessage('ncenterlite_message_delete_notification_all');
}
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON')))
{
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispNcenterliteAdminList');

View file

@ -11,8 +11,20 @@ class ncenterliteAdminView extends ncenterlite
{
$oNcenterliteModel = getModel('ncenterlite');
$sms = new Rhymix\Framework\SMS;
if($sms::getDefaultDriver()->getName() === 'Dummy')
{
$sms_available = false;
}
else
{
$sms_available = true;
}
$config = $oNcenterliteModel->getConfig();
Context::set('config', $config);
Context::set('sms_available', $sms_available);
}
function dispNcenterliteAdminSeletedmid()
@ -64,8 +76,19 @@ class ncenterliteAdminView extends ncenterlite
{
$oNcenterliteModel = getModel('ncenterlite');
$member_config = getModel('member')->getMemberConfig();
$variable_name = array();
foreach($member_config->signupForm as $value)
{
if($value->type == 'tel')
{
$variable_name[] = $value->name;
}
}
$config = $oNcenterliteModel->getConfig();
Context::set('config', $config);
Context::set('variable_name', $variable_name);
}
function dispNcenterliteAdminList()

View file

@ -31,6 +31,7 @@ class ncenterlite extends ModuleObject
var $_TYPE_TEST = 'T'; // Test Notify create.
var $_TYPE_ADMIN_DOCUMENT = 'B'; // Admin Document Alert
var $_TYPE_CUSTOM = 'U'; //Updated alert(uses type table)
var $_TYPE_INSERT_MEMBER = 'I'; // Insert Member
var $triggers = array(
array('comment.insertComment', 'ncenterlite', 'controller', 'triggerAfterInsertComment', 'after'),
@ -44,7 +45,9 @@ class ncenterlite extends ModuleObject
array('document.updateVotedCount', 'ncenterlite', 'controller', 'triggerAfterVotedupdate', 'after'),
array('moduleHandler.init', 'ncenterlite', 'controller', 'triggerAddMemberMenu', 'after'),
array('document.moveDocumentToTrash', 'ncenterlite', 'controller', 'triggerAfterMoveToTrash', 'after'),
array('member.insertMember', 'ncenterlite', 'controller', 'triggerAfterMemberInsert', 'after'),
);
private $delete_triggers = array(
array('moduleObject.proc', 'ncenterlite', 'controller', 'triggerBeforeModuleObjectProc', 'before')
);
@ -141,6 +144,23 @@ class ncenterlite extends ModuleObject
return true;
}
$config = getModel('ncenterlite')->getConfig();
$member_config = getModel('member')->getMemberConfig();
$variable_name = array();
foreach($member_config->signupForm as $value)
{
if($value->type == 'tel')
{
$variable_name[] = $value->name;
}
}
if(!$config->variable_name && count($variable_name) == 1)
{
return true;
}
return false;
}
@ -226,6 +246,38 @@ class ncenterlite extends ModuleObject
$oDB->dropIndex('ncenterlite_notify', 'idx_notify');
}
$config = getModel('ncenterlite')->getConfig();
if(!$config)
{
$config = new stdClass();
}
if(!$config->variable_name)
{
$member_config = getModel('member')->getMemberConfig();
$variable_name = array();
foreach($member_config->signupForm as $value)
{
if($value->type === 'tel')
{
$variable_name[] = $value->name;
}
}
if(count($variable_name) === 1)
{
foreach($variable_name as $item)
{
$config->variable_name = $item;
}
$output = $oModuleController->insertModuleConfig('ncenterlite', $config);
if(!$output->toBool())
{
return new Object(-1, 'fail_module_install');
}
}
}
return new Object(0, 'success_updated');
}

View file

@ -496,6 +496,31 @@ class ncenterliteController extends ncenterlite
return new Object();
}
function triggerAfterMemberInsert(&$obj)
{
// 관리자가 회원을 추가하는 경우 알림을 발송하지 않는다.
if($obj->is_admin && Context::get('logged_info')->is_admin === 'Y')
{
return new Object();
}
$args = new stdClass();
$args->member_srl = $obj->member_srl;
$args->srl = $obj->member_srl;
$args->target_p_srl = '1';
$args->target_srl = $obj->member_srl;
$args->target_member_srl = $obj->member_srl;
$args->type = $this->_TYPE_INSERT_MEMBER;
$args->target_type = $this->_TYPE_INSERT_MEMBER;
$args->target_summary = lang('cmd_signup');
$args->regdate = date('YmdHis');
$args->notify = $this->_getNotifyId($args);
$args->target_url = getNotEncodedFullUrl('', 'act', 'dispMemberInfo');
$this->_insertNotify($args);
return new Object();
}
function triggerAfterModuleHandlerProc(&$oModule)
{
$vars = Context::getRequestVars();
@ -1076,6 +1101,8 @@ class ncenterliteController extends ncenterlite
return $output;
}
$this->sendSmsMessage($args);
if($output->toBool())
{
$trigger_notify = ModuleHandler::triggerCall('ncenterlite._insertNotify', 'after', $args);
@ -1208,4 +1235,47 @@ class ncenterliteController extends ncenterlite
return array_values($members);
}
function sendSmsMessage($args)
{
$logged_info = Context::get('logged_info');
if($logged_info->member_srl == $args->member_srl)
{
return false;
}
$config = getModel('ncenterlite')->getConfig();
$content = getModel('ncenterlite')->getNotificationText($args);
$content = preg_replace('/<\/?(strong|)[^>]*>/', '', $content);
$sms = getModel('ncenterlite')->getSmsHandler();
if($sms === false)
{
return false;
}
$member_info = getModel('member')->getMemberInfoByMemberSrl($args->member_srl);
if($config->variable_name)
{
$phone_number = $member_info->{$config->variable_name}[0].$member_info->{$config->variable_name}[1].$member_info->{$config->variable_name}[2];
// Check if a Korean phone number contains a valid area code and the correct number of digits.
$phone_format = Rhymix\Framework\Korea::isValidPhoneNumber($phone_number);
if($phone_format === false)
{
return false;
}
}
else
{
return false;
}
$sms->addTo($phone_number);
$sms->setContent($content);
$output = $sms->send();
return $output;
}
}

View file

@ -38,6 +38,7 @@ class ncenterliteModel extends ncenterlite
if(!$config->skin) $config->skin = 'default';
if(!$config->colorset) $config->colorset = 'black';
if(!$config->zindex) $config->zindex = '9999';
if(!$config->use_sms) $config->use_sms = 'N';
self::$config = $config;
}
@ -304,7 +305,7 @@ class ncenterliteModel extends ncenterlite
public function getNotificationText($notification)
{
global $lang;
// Get the type of notification.
switch ($notification->type)
{
@ -312,30 +313,35 @@ class ncenterliteModel extends ncenterlite
case 'D':
$type = $lang->ncenterlite_document;
break;
// Comment.
case 'C':
$type = $lang->ncenterlite_comment;
break;
// Message.
case 'E':
$type = $lang->ncenterlite_type_message;
break;
// Test.
case 'T':
$type = $lang->ncenterlite_type_test;
break;
// Custom string.
case 'X':
return $notification->target_body;
// Insert member
case 'I':
$type = $lang->cmd_signup;
break;
// Custom language.
case 'Y':
return $lang->{$notification->target_body};
// Custom language with string interpolation.
case 'Z':
return vsprintf($lang->{$notification->target_body}, array(
@ -353,7 +359,7 @@ class ncenterliteModel extends ncenterlite
default:
return $this->getNotifyTypeString($notification->notify_type, unserialize($notification->target_body)) ?: $lang->ncenterlite;
}
// Get the notification text.
switch ($notification->target_type)
{
@ -361,32 +367,32 @@ class ncenterliteModel extends ncenterlite
case 'C':
$str = sprintf($lang->ncenterlite_commented, $notification->target_nick_name, $type, $notification->target_summary);
break;
// Comment on a board.
case 'A':
$str = sprintf($lang->ncenterlite_commented_board, $notification->target_nick_name, $notification->target_browser, $notification->target_summary);
break;
// Mentioned.
case 'M':
$str = sprintf($lang->ncenterlite_mentioned, $notification->target_nick_name, $notification->target_browser, $notification->target_summary, $type);
break;
// Message arrived.
case 'E':
$str = sprintf($lang->ncenterlite_message_mention, $notification->target_nick_name, $notification->target_summary);
break;
// Test notification.
case 'T':
$str = sprintf($lang->ncenterlite_test_noti, $notification->target_nick_name);
break;
// New document on a board.
case 'P':
$str = sprintf($lang->ncenterlite_board, $notification->target_nick_name, $notification->target_browser, $notification->target_summary);
break;
// New document.
case 'S':
if($notification->target_browser)
@ -398,22 +404,26 @@ class ncenterliteModel extends ncenterlite
$str = sprintf($lang->ncenterlite_article, $notification->target_nick_name, $notification->target_summary);
}
break;
// Voted.
case 'V':
$str = sprintf($lang->ncenterlite_vote, $notification->target_nick_name, $notification->target_summary, $type);
break;
// Admin notification.
case 'B':
$str = sprintf($lang->ncenterlite_admin_content_message, $notification->target_nick_name, $notification->target_browser, $notification->target_summary);
break;
case 'I':
$str = sprintf($lang->ncenterlite_insert_member_message, $notification->target_nick_name);
break;
// Other.
default:
$str = $lang->ncenterlite;
}
return $str;
}
@ -491,4 +501,47 @@ class ncenterliteModel extends ncenterlite
return $output->data;
}
public static function getSmsHandler()
{
static $oSmsHandler = null;
if($oSmsHandler === null)
{
$config = self::getConfig();
if($config->use_sms != 'Y')
{
$oSmsHandler = false;
return $oSmsHandler;
}
else
{
$oSmsHandler = new Rhymix\Framework\SMS;
if($oSmsHandler::getDefaultDriver()->getName() === 'Dummy')
{
$oSmsHandler = false;
return $oSmsHandler;
}
$variable_name = array();
$member_config = getModel('member')->getMemberConfig();
foreach($member_config->signupForm as $value)
{
if($value->type == 'tel')
{
$variable_name[] = $value->name;
}
}
if(empty($variable_name))
{
$oSmsHandler = false;
return $oSmsHandler;
}
}
}
return $oSmsHandler;
}
}

View file

@ -6,6 +6,16 @@
<input type="hidden" name="act" value="procNcenterliteAdminInsertConfig" />
<section class="section">
<div class="x_control-group">
<label class="x_control-label" for="variable_name">{$lang->member_phone_variable}</label>
<div class="x_controls">
<select name="variable_name" id="variable_name" disabled="disabled"|cond="empty($variable_name)">
<option value="0">{$lang->notuse}</option>
<option loop="$variable_name => $val" value="{$val}" selected="selected"|cond="$config->variable_name == $val">{$val}</option>
</select>
<p class="x_help-block">{$lang->member_phone_variable_about}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->ncenterlite_mention_target}</label>
<div class="x_controls">

View file

@ -20,6 +20,16 @@
<p class="x_help-block">{$lang->about_admin_content}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="use_sms">{$lang->ncenterlite_sms_message_use}</label>
<div class="x_controls">
<select name="use_sms" disabled="disabled"|cond="!$sms_available" id="use_sms">
<option value="Y" selected="selected"|cond="$config->use_sms=='Y' && $sms_available">{$lang->ncenterlite_activate}</option>
<option value="N" selected="selected"|cond="$config->use_sms=='N' || !$sms_available">{$lang->ncenterlite_inactivate}</option>
</select>
<p>{$lang->ncenterlite_use_sms_help}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="display_use">{$lang->ncenterlite_display}</label>
<div class="x_controls">