diff --git a/hwe/css/diplomacy.css b/hwe/css/diplomacy.css index f6ff84bc..231bc26c 100644 --- a/hwe/css/diplomacy.css +++ b/hwe/css/diplomacy.css @@ -9,7 +9,7 @@ #newLetter textarea{ width:100%; - min-height:6em; + min-height:3em; color:white; background-color:transparent; border:none; diff --git a/hwe/j_diplomacy_get_letter.php b/hwe/j_diplomacy_get_letter.php index b822a75a..539ba24f 100644 --- a/hwe/j_diplomacy_get_letter.php +++ b/hwe/j_diplomacy_get_letter.php @@ -43,12 +43,26 @@ foreach( ) as $letter ){ - if($permission < 3){ + if($permission < 3 && $letter['detail']){ $letter['detail'] = '(권한이 부족합니다)'; } - $letter['comment'] = []; $letter['aux'] = Json::decode($letter['aux']); - $letters[$letter['no']] = $letter; + $letter['src'] = $letter['aux']['src']; + $letter['dest'] = $letter['aux']['dest']; + + $letter['src']['nationID'] = $letter['src_nation_id']; + $letter['dest']['nationID'] = $letter['dest_nation_id']; + + $letters[$letter['no']] = [ + 'no'=>$letter['no'], + 'src'=>$letter['src'], + 'dest'=>$letter['dest'], + 'prev_no'=>$letter['prev_no'], + 'state'=>$letter['state'], + 'brief'=>$letter['text_brief'], + 'detail'=>$letter['text_detail'], + 'date'=>$letter['date'] + ]; } $nations = []; @@ -63,6 +77,7 @@ Json::die([ 'result'=>true, 'nations'=>$nations, 'letters'=>$letters, + 'myNationID'=>$me['nation'], 'reason'=>'success' ]); diff --git a/hwe/j_diplomacy_respond_letter.php b/hwe/j_diplomacy_respond_letter.php index f7e3a283..76ab1b1d 100644 --- a/hwe/j_diplomacy_respond_letter.php +++ b/hwe/j_diplomacy_respond_letter.php @@ -16,9 +16,9 @@ $reason = Util::getReq('reason', 'string', ''); -increaseRefresh("회의실", 1); +increaseRefresh("외교부", 1); -$me = $db->queryFirstRow('SELECT no, nation, level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID); +$me = $db->queryFirstRow('SELECT no, name, nation, level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID); $con = checkLimit($me['con']); if ($con >= 2) { @@ -35,7 +35,6 @@ if($letterNo === null){ ]); } - $permission = checkSecretPermission($me); if ($permission < 4) { Json::die([ @@ -55,9 +54,21 @@ if(!$letter){ } $aux = Json::decode($letter['aux']); +$me['icon'] = GetImageURL($me['imgsvr'], $me['picture']); + +$srcNation = getNationStaticInfo($letter['src_nation_id']); +$destNation = getNationStaticInfo($letter['dest_nation_id']); + +$src = new MessageTarget($me['no'], $me['name'], $destNation['nation'], $destNation['name'], $destNation['color'], $me['icon']); +$dest = new MessageTarget(0, '', $srcNation['nation'], $srcNation['name'], $srcNation['color']); + +$now = new \DateTime(); +$unlimited = new \DateTime('9999-12-31'); if($isAgree){ $aux['dest']['generalName'] = $me['name']; + $aux['dest']['generalIcon'] = $me['icon']; + $db->update('ng_diplomacy', [ 'state'=>'activated', 'dest_signer'=>$me['no'], @@ -70,6 +81,7 @@ if($isAgree){ 'state'=>'replaced', ], 'no=%i', $letter['prev_no']); } + $msgText = "외교 서신 #{$letterNo}가 승인되었습니다."; } else{ $aux['reason'] = [ @@ -81,9 +93,23 @@ else{ 'state'=>'cancelled', 'aux'=>Json::encode($aux) ], 'no=%i', $letterNo); - //TODO: 외교 서신에 대한 메시지를 양국에 발송해야함 + $msgText = "외교 서신 #{$letterNo}가 거부되었습니다."; + if($reason){ + $msgText .= ' 이유 : '.$reason; + } } +$msg = new Message( + Message::MSGTYPE_DIPLOMACY, + $src, + $dest, + $msgText, + $now, + $unlimited, + ['invalid' => true] +); +$msgID = $msg->send(); + Json::die([ 'result'=>true, 'reason'=>'success' diff --git a/hwe/j_diplomacy_rollback_letter.php b/hwe/j_diplomacy_rollback_letter.php new file mode 100644 index 00000000..eb915564 --- /dev/null +++ b/hwe/j_diplomacy_rollback_letter.php @@ -0,0 +1,89 @@ +setReadOnly(); +$userID = Session::getUserID(); + +$db = DB::db(); + +$letterNo = Util::getReq('letterNo', 'int'); + +increaseRefresh("외교부", 1); + +$me = $db->queryFirstRow('SELECT no, name, nation, level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID); + +$con = checkLimit($me['con']); +if ($con >= 2) { + Json::die([ + 'result'=>false, + 'reason'=>'접속 제한입니다.' + ]); +} + +if($letterNo === null){ + Json::die([ + 'result'=>false, + 'reason'=>'올바르지 않은 입력입니다.' + ]); +} + + +$permission = checkSecretPermission($me); +if ($permission < 4) { + Json::die([ + 'result'=>false, + 'reason'=>'권한이 부족합니다. 수뇌부가 아닙니다.' + ]); +} + +$reason = trim($reason); + +$letter = $db->queryFirstRow('SELECT * FROM ng_diplomacy WHERE no=%i AND src_nation_id = %i AND state = \'proposed\'', $letterNo, $me['nation']); +if(!$letter){ + Json::die([ + 'result'=>false, + 'reason'=>'서신이 없습니다.' + ]); +} + +$aux = Json::decode($letter['aux']); +$me['icon'] = GetImageURL($me['imgsvr'], $me['picture']); + +$srcNation = getNationStaticInfo($letter['src_nation_id']); +$destNation = getNationStaticInfo($letter['dest_nation_id']); + +$src = new MessageTarget($me['no'], $me['name'], $srcNation['nation'], $srcNation['name'], $srcNation['color'], $me['icon']); +$dest = new MessageTarget(0, '', $destNation['nation'], $destNation['name'], $destNation['color']); + +$now = new \DateTime(); +$unlimited = new \DateTime('9999-12-31'); + +$aux['reason'] = [ + 'who'=>$me['no'], + 'action'=>'cancelled', + 'reason'=>$reason +]; +$db->update('ng_diplomacy', [ + 'state'=>'cancelled', + 'aux'=>Json::encode($aux) +], 'no=%i', $letterNo); +$msgText = "외교 서신 #{$letterNo}가 회수되었습니다."; + +$msg = new Message( + Message::MSGTYPE_DIPLOMACY, + $src, + $dest, + $msgText, + $now, + $unlimited, + ['invalid' => true] +); +$msgID = $msg->send(); + +Json::die([ + 'result'=>true, + 'reason'=>'success' +]); \ No newline at end of file diff --git a/hwe/j_diplomacy_send_letter.php b/hwe/j_diplomacy_send_letter.php index 9c229334..38eec6c8 100644 --- a/hwe/j_diplomacy_send_letter.php +++ b/hwe/j_diplomacy_send_letter.php @@ -11,8 +11,8 @@ $db = DB::db(); $destNationNo = Util::getReq('destNation', 'int', 0); $prevNo = Util::getReq('prevNo', 'int', null); -$textBrief = Util::getReq('textBrief'); -$textDetail = Util::getReq('textDetail'); +$textBrief = Util::getReq('brief'); +$textDetail = Util::getReq('detail'); increaseRefresh("외교부", 1); @@ -20,7 +20,7 @@ if($prevNo < 1){ $prevNo = null; } -$me = $db->queryFirstRow('SELECT no, nation, level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID); +$me = $db->queryFirstRow('SELECT no, name, nation, level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID); $con = checkLimit($me['con']); if ($con >= 2) { @@ -131,6 +131,8 @@ else{ $destNation = $nations[0]; } +$me['icon'] = GetImageURL($me['imgsvr'], $me['picture']); + $db->insert('ng_diplomacy', [ 'src_nation_id'=>$srcNation['nation'], 'dest_nation_id'=>$destNation['nation'], @@ -145,7 +147,8 @@ $db->insert('ng_diplomacy', [ 'src'=>[ 'nationName'=>$srcNation['name'], 'nationColor'=>$srcNation['color'], - 'generalName'=>$me['name'] + 'generalName'=>$me['name'], + 'generalIcon'=>$me['icon'] ], 'dest'=>[ 'nationName'=>$destNation['name'], @@ -153,9 +156,33 @@ $db->insert('ng_diplomacy', [ ] ]), ]); +$newLetterNo = $db->insertId(); + +$src = new MessageTarget($me['no'], $me['name'], $srcNation['nation'], $srcNation['name'], $srcNation['color'], $me['icon']); +$dest = new MessageTarget(0, '', $destNation['nation'], $destNation['name'], $destNation['color']); + +$now = new \DateTime(); +$unlimited = new \DateTime('9999-12-31'); + +$josaYi = JosaUtil::pick($newLetterNo, '이'); +if($prevNo){ + $msgText = "문서 #{$prevNo}의 새로운 외교 문서 #{$newLetterNo}{$josaYi} 준비되었습니다. 외교부에서 확인해주세요."; +} +else{ + $msgText = "새로운 외교 문서 #{$newLetterNo}{$josaYi} 준비되었습니다. 외교부에서 확인해주세요."; +} -//TODO: 외교 서신에 대한 메시지를 양국에 발송해야함 +$msg = new Message( + Message::MSGTYPE_DIPLOMACY, + $src, + $dest, + $msgText, + $now, + $unlimited, + ['invalid' => true] +); +$msgID = $msg->send(); Json::die([ 'result'=>true, diff --git a/hwe/js/common.js b/hwe/js/common.js index 52c7d02f..70089aec 100644 --- a/hwe/js/common.js +++ b/hwe/js/common.js @@ -70,6 +70,27 @@ String.prototype.format = function() { }; +function hexToRgb(hex) { + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : null; +} + + +function isBrightColor(color){ + color = hexToRgb(color); + if ((color.r*0.299 + color.g*0.587 + color.b*0.114) > 140){ + return true; + } + else{ + return false; + } +} + + /** * 게임내에서 지원하는 color type만 선택할 수 있도록 해주는 함수 * @param {string} color #AAAAAA 또는 AAAAAA 형태로 작성된 RGB hex color string diff --git a/hwe/js/diplomacy.js b/hwe/js/diplomacy.js index f2d1c544..4cd6e982 100644 --- a/hwe/js/diplomacy.js +++ b/hwe/js/diplomacy.js @@ -1,11 +1,10 @@ function submitLetter(){ - var $letter = $('#newLetter'); - var $brief = $letter.find('input.briefInput'); - var $detail = $letter.find('input.detailInput'); - var $prevNo = $letter.find('input.prevNo'); - var $destNation = $letter.find('input.destNation'); + var $brief = $('#inputBrief'); + var $detail = $('#inputDetail'); + var $prevNo = $('#inputPrevNo'); + var $destNation = $('#inputDestNation'); var brief = $.trim($brief.val()); var detail = $.trim($detail.val()); var prevNo = parseInt($prevNo.val()); @@ -15,7 +14,7 @@ function submitLetter(){ prevNo = null; } - + console.log(brief); if(!brief){ return false; } @@ -34,18 +33,18 @@ function submitLetter(){ } }).then(function(data){ if(!data){ - $title.val(title); - $text.val(text); - alert() + $brief.val(brief); + $detail.val(detail); return quickReject('외교 서신을 보내는데 실패했습니다.'); } if(!data.result){ - $title.val(title); - $text.val(text); + $brief.val(brief); + $detail.val(detail); return quickReject('외교 서신을 보내는데 실패했습니다. : '+data.reason); } - return loadLetters().done(drawLetters); + alert('전송했습니다.'); + location.reload(); }, errUnknown) .fail(function(reason){ @@ -55,18 +54,14 @@ function submitLetter(){ return false; } -function repondLetter(isAgree){ - var $this = $(this); - var $letter = $this.parents('.letter').eq(0); - var letterNo = $letter.data('no'); - +function repondLetter(letterNo, isAgree, reason){ $.post({ url:'j_diplomacy_respond_letter.php', dataType:'json', data:{ letterNo:letterNo, isAgree:isAgree, - reason:'', //TODO: reason 받기 + reason:reason, } }).then(function(data){ if(!data){ @@ -79,7 +74,15 @@ function repondLetter(isAgree){ return quickReject('응답을 실패했습니다. : '+data.reason); } - return loadArticles().done(drawLetters); + if(isAgree){ + alert('승인했습니다.'); + } + else{ + alert('거부했습니다.'); + } + + location.reload(); + return false; }, errUnknown) .fail(function(reason){ @@ -89,22 +92,208 @@ function repondLetter(isAgree){ return false; } -function drawLetter(letterObj){ +function rollbackLetter(letterNo){ + $.post({ + url:'j_diplomacy_rollback_letter.php', + dataType:'json', + data:{ + letterNo:letterNo, + } + }).then(function(data){ + if(!data){ + $text.val(text); + alert() + return quickReject('회수를 실패했습니다.'); + } + if(!data.result){ + $text.val(text); + return quickReject('회수를 실패했습니다. : '+data.reason); + } + + alert('회수했습니다.'); + + location.reload(); + return false; + + }, errUnknown) + .fail(function(reason){ + alert(reason); + }); + + return false; +} + +function drawLetter(idx, letterObj){ + + if(letterObj.state == 'cancelled' || letterObj.state == 'replaced'){ + //TODO: 취소되거나, 대체된 문서도 보여줄 방법을 찾아볼 것 + return; + } + + console.log(letterObj); + var $letterFrame = $('#letterTemplate > .letterFrame'); + var srcColorFormat = { + 'background-color':letterObj.src.nationColor, + 'color':isBrightColor(letterObj.src.nationColor)?'#000000':'#ffffff' + }; + + var destColorFormat = { + 'background-color':letterObj.dest.nationColor, + 'color':isBrightColor(letterObj.dest.nationColor)?'#000000':'#ffffff' + }; + + var targetNation = letterObj.src.nationID==myNationID?letterObj.dest:letterObj.src; + var targetColor = letterObj.src.nationID==myNationID?destColorFormat:srcColorFormat; + var $letter = $letterFrame.clone(); $letter.addClass('letterObj') .data('no', letterObj.no) + .data('brief', letterObj.brief) + .data('detail', letterObj.detail) + .attr('id', 'letter_'+letterObj.no); - //TODO: 국가명, 수뇌명 입력 + $letter.find('.letterHeader').css(targetColor); $letter.find('.date').text(letterObj.date); $letter.find('.letterNo').text('#'+letterObj.no); - $letter.find('.srcNation').text(letterObj.aux['']) - $letter.find('.brief').html(nl2br(escapeHtml(letterObj.brief))); - $letter.find('.detail').html(nl2br(escapeHtml(letterObj.detail))); - //TODO: 바꿀 것 - $('#board').append($letter); + var stateText = { + 'proposed':'제안됨', + 'activated':'승인됨', + 'cancelled':'거부됨', + 'replaced':'대체됨', + }; + $letter.find('.letterStatus').text(stateText[letterObj.state]); + if(letterObj.prev_no !== null){ + $letter.find('.letterPrevNo').text('#'+letterObj.prev_no); + } + else{ + $letter.find('.letterPrevNo').text('신규'); + } + $letter.find('.letterBrief').html(nl2br(escapeHtml(letterObj.brief))); + $letter.find('.letterDetail').html(nl2br(escapeHtml(letterObj.detail))); + + $letter.find('.letterSrc .signerImg img.generalIcon').attr('src', letterObj.src.generalIcon); + $letter.find('.letterSrc .signerNation').text(letterObj.src.nationName).css(srcColorFormat); + $letter.find('.letterSrc .signerName').text(letterObj.src.generalName).css(srcColorFormat); + + if(letterObj.dest.generalName){ + $letter.find('.letterDest .signerImg img.generalIcon').attr('src', letterObj.dest.generalIcon); + $letter.find('.letterDest .signerNation').text(letterObj.dest.nationName).css(destColorFormat); + $letter.find('.letterDest .signerName').text(letterObj.dest.generalName).css(destColorFormat); + } + + if(letterObj.state == 'proposed' && letterObj.src.nationID != myNationID){ + $letter.find('.btnAgree').show().click(function(){ + if(!confirm('승인하시겠습니까?')){ + return false; + } + return repondLetter(letterObj.no, true, null); + }); + $letter.find('.btnDisagree').show().click(function(){ + var reason = prompt('거부하시겠습니까? (이유 [최대 50자])'); + if(reason === null){ + return false; + } + reason = substr.substr(0, 50); + return repondLetter(letterObj.no, false, reason); + }); + } + + if(letterObj.state == 'proposed' && letterObj.src.nationID == myNationID){ + $letter.find('.btnRollback').show().click(function(){ + if(!confirm('회수하시겠습니까?')){ + return false; + } + return rollbackLetter(letterObj.no, false); + }); + } + + + $letter.find('.btnRenew').click(function(){ + var $inputPrevNo = $('#inputPrevNo'); + $inputPrevNo.val(letterObj.no); + $inputPrevNo.trigger('change'); + }) + + + $('#letters').prepend($letter); +} + +function initNewLetterForm(lettersObj){ + console.log(lettersObj); + var nationList = []; + $.each(lettersObj.nations, function(idx, nation){ + nation.id = nation.nation; + nation.text = nation.name; + nationList.push(nation); + }) + + var $destNation = $('#inputDestNation').select2({ + theme: 'bootstrap4', + placeholder: "", + language: "ko", + width:300, + containerCss: { + display: "inline-block !important;", + color: 'white !important' + }, + data:nationList, + templateResult: colorNation, + containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', + dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary', + }); + + + var prevNoList = [{ + id:0, + text:'-새 문서-', + nation:null, + }]; + + $.each(lettersObj.letters, function(idx, letterObj){ + if(letterObj.state == 'replaced' || letterObj.state == 'cancelled'){ + return true; + } + var targetNation = letterObj.src.nationID==myNationID?letterObj.dest:letterObj.src; + prevNoList.push({ + id:letterObj.no, + text:'#{0} <{1}>'.format(letterObj.no, targetNation.nationName), + nation:targetNation.nationID + }); + }); + + var $inputPrevNo = $('#inputPrevNo').select2({ + theme: 'bootstrap4', + placeholder: "", + language: "ko", + width:300, + containerCss: { + display: "inline-block !important;", + color: 'white !important' + }, + data:prevNoList, + containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', + dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary', + }); + $inputPrevNo.on('change', function(e){ + var data = $inputPrevNo.select2('data')[0]; + console.log(data); + if(data.nation == null){ + $destNation.prop("disabled", false); + } + else{ + $destNation.val(data.nation).prop("disabled", true); + var $targetLetter = $('#letter_'+data.id); + resizeTextarea($('#inputBrief').val($targetLetter.data('brief'))); + resizeTextarea($('#inputDetail').val($targetLetter.data('detail'))); + } + }); + + $('#btnSend').click(submitLetter); + + $('#newLetter').show(); } function drawLetters(lettersObj){ @@ -113,12 +302,16 @@ function drawLetters(lettersObj){ return quickReject('받아오는데 실패했습니다.'); } - //TODO: 국가 리스트 출력 - if(!lettersObj.result){ return quickReject('에러가 발생했습니다. : '+lettersObj.reason); } + window.myNationID = lettersObj.myNationID; + + if(permissionLevel == 4){ + initNewLetterForm(lettersObj); + } + $('.letterObj').detach();//첫 버전이니까 일괄 삭제 일괄 로드 $.each(lettersObj.letters, drawLetter); return true; @@ -126,32 +319,40 @@ function drawLetters(lettersObj){ function loadLetters(){ return $.post({ - url:'j_diplomacy_get_letters.php', + url:'j_diplomacy_get_letter.php', dataType:'json', //첫 버전이니까 전체 다 불러오자 data:{ } }); } +function colorNation(nationInfo){ + if(!nationInfo.color){ + return nationInfo.text; + } + + var fgColor = isBrightColor(nationInfo.color)?'#000000':'#ffffff'; + var $nationForm = $('
'+nationInfo.text+'
').css({ + 'color':fgColor, + 'background-color':nationInfo.color + }); + return $nationForm; +} + +function resizeTextarea($obj){ + $obj.height(1).height($obj.prop('scrollHeight')+12 ); +} + $(function(){ $('textarea.autosize').on('keydown keyup', function(){ - $(this).height(1).height( $(this).prop('scrollHeight')+12 ); + resizeTextarea($(this)); }) -$('#submitLetter').click(submitLetter); -$('.respondAgree').click(function(){ - return repondLetter(true); -}); -$('.respondDisagree').click(function(){ - return repondLetter(false); -}); - -/* loadLetters() .then(drawLetters, errUnknown) .fail(function(reason){ alert(reason); -});*/ +}); }); \ No newline at end of file diff --git a/hwe/js/msg.js b/hwe/js/msg.js index 15d463c6..8f4add51 100644 --- a/hwe/js/msg.js +++ b/hwe/js/msg.js @@ -1,24 +1,5 @@ -function hexToRgb(hex) { - var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); - return result ? { - r: parseInt(result[1], 16), - g: parseInt(result[2], 16), - b: parseInt(result[3], 16) - } : null; -} - - -function isBrightColor(color){ - color = hexToRgb(color); - if ((color.r*0.299 + color.g*0.587 + color.b*0.114) > 140){ - return true; - } - else{ - return false; - } -} var messageTemplate = ''; var myGeneralID=null; diff --git a/hwe/t_diplomacy.php b/hwe/t_diplomacy.php index 9f811cf0..87494e27 100644 --- a/hwe/t_diplomacy.php +++ b/hwe/t_diplomacy.php @@ -36,6 +36,8 @@ if ($permission < 1) { + + @@ -48,6 +50,7 @@ var permissionLevel = ; // + @@ -72,6 +75,8 @@ var permissionLevel = ; // +
+