From 18942c55aedff979a2be4c20a84bb2c302056acc Mon Sep 17 00:00:00 2001 From: hide_d Date: Fri, 30 Nov 2018 21:29:31 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/css/msg.css | 13 ++++ hwe/index.php | 1 + hwe/j_msg_delete.php | 72 ++++++++++++++++++++++ hwe/j_msg_get_old.php | 2 +- hwe/js/msg.js | 70 +++++++++++++++++++-- hwe/js/templates/message.html | 8 ++- hwe/sammo/DiplomaticMessage.php | 5 +- hwe/sammo/Message.php | 104 +++++++++++++++++++++++++------- 8 files changed, 243 insertions(+), 32 deletions(-) create mode 100644 hwe/j_msg_delete.php 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']; + 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 @@
+ <%if(msgType != 'diplomacy' && src.id == myGeneralID && now <= last5min && invalidType == 'msg_valid'){%> + + <%}%> <%if(msgType == 'private') {%> <%if(src.name == generalName){%> <%e(src.name)%>:<%src.nation%> <%} %> <<%e(time)%>> -
- -
<%e(text)%>
+
+
<%e(text)%>
<%if(this.option && this.option.action) {%>
diff --git a/hwe/sammo/DiplomaticMessage.php b/hwe/sammo/DiplomaticMessage.php index 7464ed30..491d323d 100644 --- a/hwe/sammo/DiplomaticMessage.php +++ b/hwe/sammo/DiplomaticMessage.php @@ -333,7 +333,6 @@ class DiplomaticMessage extends Message{ $this->dest->generalID = $receiverID; $this->dest->generalName = $general['name']; $this->msgOption['used'] = true; - $this->invalidate(); $this->validDiplomacy = false; $josaYi = JosaUtil::pick($this->src->nationName, '이'); @@ -345,9 +344,11 @@ class DiplomaticMessage extends Message{ new \DateTime(), new \DateTime('9999-12-31'), [ - 'delete'=>$this->id + 'delete'=>$this->id, + 'silence'=>true, ] ); + $this->invalidate(); $newMsg->send(); return self::ACCEPTED; diff --git a/hwe/sammo/Message.php b/hwe/sammo/Message.php index 2bef1b1e..dfef9c98 100644 --- a/hwe/sammo/Message.php +++ b/hwe/sammo/Message.php @@ -184,7 +184,7 @@ class Message return false; } - public static function getMessageByID(int $messageID) : Message + public static function getMessageByID(int $messageID) : ?Message { $db = DB::db(); $now = new \DateTime(); @@ -265,6 +265,53 @@ class Message }, $db->query('SELECT * FROM `message` WHERE %l ORDER BY id DESC %? ', $where, $limitSql)); } + public static function deleteMsg(int $msgID, int $generalID):?string{ + $msgObj = static::getMessageByID($msgID); + if($msgObj=== null){ + return '메시지가 없습니다'; + } + + if($msgObj->src->generalID != $generalID){ + return '본인의 메시지만 삭제할 수 있습니다.'; + } + + $prev5min = new \DateTime(); + $prev5min->sub(new \DateInterval('PT5M')); + + if($msgObj->date < $prev5min){ + return '5분 이내의 메시지만 삭제할 수 있습니다.'; + } + + $msgOption = [ + 'hide'=>true, + 'silence'=>true, + 'overwrite'=>[$msgObj->id] + ]; + + if($msgObj->msgType == Message::MSGTYPE_PRIVATE || $msgObj->msgType == Message::MSGTYPE_NATIONAL){ + $msgObj2 = static::getMessageByID($msgObj->msgOption['receiverMessageID']); + if($msgObj2 !== null){ + $msgObj2->invalidate(null, false); + $msgOption['overwrite'][] = [$msgObj2->id]; + } + } + + $in1min = new \DateTime(); + $in1min->add(new \DateInterval('PT1M')); + $newMsg = new Message( + $msgObj->msgType, + $msgObj->src, + $msgObj->dest, + "req_del_msg", + new \DateTime(), + $in1min, + $msgOption + ); + $msgObj->invalidate(null, false); + $newMsg->send(false); + return null; + } + protected function sendRaw(int $mailbox):array{ //NOTE:: 여기선 검증하지 않는다. @@ -302,7 +349,7 @@ class Message } private function sendToSender():array{ - if($this->sendCnt > 0){ + if($this->sendCnt > 1){ throw new \RuntimeException('이미 전송한 메일입니다.'); } if($this->msgType === self::MSGTYPE_PRIVATE && $this->src->generalID !== $this->dest->generalID){ @@ -315,15 +362,17 @@ class Message } private function sendToReceiver() : array{ - if($this->sendCnt > 1 || $this->isInboxMail){ + if($this->sendCnt > 0 || $this->isInboxMail){ throw new \RuntimeException('이미 전송한 메일입니다.'); } if($this->msgType === self::MSGTYPE_PRIVATE){ - //XXX: 알림을 이런식으로 보내는게 맞는가에 대한 의문 있음 - DB::db()->update('general', [ - 'newmsg'=>1 - ], 'no=%i',$this->dest->generalID); + if(!($this->msgOption['silence']??false)){ + //XXX: 알림을 이런식으로 보내는게 맞는가에 대한 의문 있음 + DB::db()->update('general', [ + 'newmsg'=>1 + ], 'no=%i',$this->dest->generalID); + } return $this->sendRaw($this->dest->generalID); } @@ -339,18 +388,7 @@ class Message } public function send(bool $sendDestOnly=false):int{ - if(!$sendDestOnly){ - list($senderMailbox, $sendID) = $this->sendToSender(); - if($sendID){ - $this->mailbox = $senderMailbox; - $this->isInboxMail = false; - $this->id = $sendID; - $this->msgOption['senderMessageID'] = $sendID; - $this->sendCnt = 1; - } - } - - list($receiverMailbox, $receiveID) = $this->sendToReceiver(); + [$receiverMailbox, $receiveID] = $this->sendToReceiver(); if(!$receiveID && !$sendDestOnly){ return $sendID; } @@ -358,17 +396,39 @@ class Message $this->isInboxMail = true; $this->id = $receiveID; $this->msgOption['receiverMessageID'] = $receiveID; - $this->sendCnt = 2; + $this->sendCnt = 1; + + if(!$sendDestOnly){ + [$senderMailbox, $sendID] = $this->sendToSender(); + if($sendID){ + $this->mailbox = $senderMailbox; + $this->isInboxMail = false; + $this->id = $sendID; + $this->msgOption['senderMessageID'] = $sendID; + $this->sendCnt = 2; + } + } return $receiveID; } - public function invalidate(array $newMsgOption=null){ + public function invalidate(?array $newMsgOption=null, bool $hideMsg=true){ if($newMsgOption !== null){ $this->msgOption = $newMsgOption; } - $this->validUntil = new \DateTime('2000-12-31'); + $this->msgOption['invalid'] = true; + + if($hideMsg){ + $this->validUntil = new \DateTime('2000-12-31'); + } + else{ + if(key_exists('receiverMessageID', $this->msgOption)){ + $this->msgOption['originalText'] = $this->msg; + } + $this->msg = '삭제된 메시지입니다.'; + } + $db = DB::db(); $db->update('message', [