diff --git a/hwe/css/msg.css b/hwe/css/msg.css index bddc7f7c..ddb00405 100644 --- a/hwe/css/msg.css +++ b/hwe/css/msg.css @@ -87,6 +87,7 @@ font-weight: bold; margin-bottom:3px; color:white; + position: relative; } .message_input_form{ @@ -141,6 +142,10 @@ height: 1.2em; } +.msg_invalid{ + color:rgba(255,255,255,0.5); +} + .msg_body{ padding-left:64px; } @@ -153,6 +158,14 @@ border-radius: 3px; } +.btn-delete-msg{ + position: absolute; + right: 0; + top: 0; + margin:2px 2px 0 2px; + font-size:8px; +} + /* .public_message .msg_target{ box-shadow: 2px 2px darkslategrey; diff --git a/hwe/index.php b/hwe/index.php index 3c65e8f8..ee51383b 100644 --- a/hwe/index.php +++ b/hwe/index.php @@ -88,6 +88,7 @@ $mapTheme = $admin['map_theme']; =WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?> =WebUtil::printJS('../e_lib/jquery.redirect.js')?> =WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?> +=WebUtil::printJS('../e_lib/moment.min.js')?> =WebUtil::printJS('../d_shared/common_path.js')?> =WebUtil::printJS('js/common.js')?> =WebUtil::printJS('js/main.js')?> diff --git a/hwe/j_msg_delete.php b/hwe/j_msg_delete.php new file mode 100644 index 00000000..15a680b8 --- /dev/null +++ b/hwe/j_msg_delete.php @@ -0,0 +1,72 @@ +false, + 'reason'=>'올바르지 않은 범위 입니다.' + ]); +} + +$lastMsgGet = Json::decode($session->lastMsgGet)??[]; +$now = new \DateTime(); +$delayTime = false; +if(count($lastMsgGet) >= 10){ + try{ + if($lastMsgGet[0] !== 'string'){ + throw new \Exception('Why not string?'); + } + $first = new \DateTime($lastMsgGet[0]); + $diff = $first->diff($now); + if($diff->days == 0 && $diff->h > 0 && $diff->i == 0 && $diff->s <= 5){ + $delayTime = true; + } + array_shift($lastMsgGet); + } + catch(\Exception $e){ + $lastMsgGet = []; + } +} +$lastMsgGet[] = $now; +$session->lastMsgGet = Json::encode($lastMsgGet); + +if($delayTime){ + sleep(1); +} +$session->setReadOnly(); + +list($generalID, $nationID, $generalName) = DB::db()->queryFirstList( + 'select `no`, `nation`, `name` from `general` where owner = %i', + $userID +); + +if($nationID === null){ + Json::die([ + 'result'=>false, + 'reason'=>'장수가 사망했습니다.' + ]); +} + +$reason = Message::deleteMsg($msgID, $generalID); +if($reason === null){ + $result = [ + 'result'=>true, + 'reason'=>'success' + ]; +} +else{ + $result = [ + 'result'=>false, + 'reason'=>$reason + ]; +} + + +Json::die($result); \ No newline at end of file diff --git a/hwe/j_msg_get_old.php b/hwe/j_msg_get_old.php index 0cb2b825..0c7b6d54 100644 --- a/hwe/j_msg_get_old.php +++ b/hwe/j_msg_get_old.php @@ -10,7 +10,7 @@ $userID = Session::getUserID(); $reqTo = Util::getReq('to', 'int'); $reqType = Util::getReq('type', 'string'); -if(!$reqTo === null){ +if($reqTo === null){ Json::die([ 'result'=>false, 'reason'=>'올바르지 않은 범위 입니다.' diff --git a/hwe/js/msg.js b/hwe/js/msg.js index 55396f6f..1cc1bce0 100644 --- a/hwe/js/msg.js +++ b/hwe/js/msg.js @@ -47,6 +47,17 @@ function responseMessage(msgID, response){ }).then(refreshMsg); } +function deleteMessage(msgID){ + $.ajax({ + url: 'j_msg_delete.php', + type: 'post', + dataType:'json', + data: { + msgID:msgID + } + }).then(refreshMsg); +} + function refreshMsg(result){ if(result && !result.result){ alert(result.reason); @@ -79,6 +90,18 @@ function showOldMsg(msgType){ } function redrawMsg(deferred, addFront){ + function checkErasable(obj){ + + var now = moment().format('YYYY-MM-DD HH:mm:ss'); + $('.btn-delete-msg').each(function(){ + var $btn = $(this); + var eraseUntil = $btn.data('erase_until'); + if(eraseUntil < now){ + $btn.detach(); + } + }) + return obj; + } function checkClear(obj){ if(!obj.result){ var t = $.Deferred(); @@ -167,6 +190,7 @@ function redrawMsg(deferred, addFront){ var needRefreshLastContact = (msgType == 'private'); + var now = moment().format('YYYY-MM-DD HH:mm:ss'); //list의 맨 앞이 가장 최신 메시지임. var $msgs = msgSource.map(function(msg){ @@ -199,6 +223,15 @@ function redrawMsg(deferred, addFront){ else{ msg.allowButton = true; } + msg.myGeneralID = myGeneralID; + msg.last5min = moment(msg.time).add(5, 'minute').format('YYYY-MM-DD HH:mm:ss'); + msg.now = now; + if(msg.option && msg.option.invalid){ + msg.invalidType = 'msg_invalid'; + } + else{ + msg.invalidType = 'msg_valid'; + } var msgHtml = TemplateEngine(messageTemplate, msg); @@ -212,11 +245,39 @@ function redrawMsg(deferred, addFront){ $msg = $existMsg; } - if(msg.option && msg.option.parent){ - //parent는 삭제. - $('#msg_{0}'.format(msg.option.parent)).detach(); + var hideMsg = false; + if(msg.option){ + console.log(msg.option); + if(msg.option.delete !== undefined){ + //delete는 삭제. + $('#msg_{0}'.format(msg.option.delete)).detach(); + } + if(msg.option.overwrite !== undefined){ + //overwrite는 숨기기. + $.map(msg.option.overwrite, function (overwriteID) { + console.log(overwriteID); + var $msg = $('#msg_{0}'.format(overwriteID)); + $msg.find('.btn-delete-msg').detach(); + $msg.find('.msg_content').html('삭제된 메시지입니다.').removeClass('msg_valid').addClass('msg_invalid'); + }); + + } + if(msg.option.hide){ + hideMsg = true; + } } + if(hideMsg){ + return null; + } + + $msg.find('.btn-delete-msg').click(function(){ + if(!confirm("삭제하시겠습니까?")){ + return false; + } + deleteMessage(msg.id); + }); + $msg.find('button.prompt_yes').click(function(){ if(!confirm("수락하시겠습니까?")){ return false; @@ -253,6 +314,7 @@ function redrawMsg(deferred, addFront){ } deferred + .then(checkErasable) .then(checkClear) .then(registerSequence) .then(refineMessageObjs) @@ -459,7 +521,7 @@ function activateMessageForm(){ jQuery(function($){ //tmp_template.html은 추후 msg.js에 통합될 수 있음 - var getTemplate = $.get('js/templates/message.html?3',function(obj){ + var getTemplate = $.get('js/templates/message.html?7',function(obj){ messageTemplate = obj; }); diff --git a/hwe/js/templates/message.html b/hwe/js/templates/message.html index 58c7e386..d4b2d9af 100644 --- a/hwe/js/templates/message.html +++ b/hwe/js/templates/message.html @@ -12,6 +12,9 @@