외교부 추가

This commit is contained in:
2019-01-26 06:30:29 +09:00
parent 016c0f3743
commit 64b79d6af5
9 changed files with 443 additions and 77 deletions
+1 -1
View File
@@ -9,7 +9,7 @@
#newLetter textarea{
width:100%;
min-height:6em;
min-height:3em;
color:white;
background-color:transparent;
border:none;
+18 -3
View File
@@ -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'
]);
+30 -4
View File
@@ -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'
+89
View File
@@ -0,0 +1,89 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->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'
]);
+32 -5
View File
@@ -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,
+21
View File
@@ -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
+241 -40
View File
@@ -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 = $('<div>'+nationInfo.text+'</div>').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);
});*/
});
});
-19
View File
@@ -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;
+11 -5
View File
@@ -36,6 +36,8 @@ if ($permission < 1) {
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../e_lib/select2/select2.min.css')?>
<?=WebUtil::printCSS('../e_lib/select2/select2-bootstrap4.css')?>
<!--<?=WebUtil::printCSS('../e_lib/tui.editor/tui-editor.min.css')?>-->
<!--<?=WebUtil::printCSS('../e_lib/tui.editor/tui-editor-contents.min.css')?>-->
<?=WebUtil::printCSS('../d_shared/common.css')?>
@@ -48,6 +50,7 @@ var permissionLevel = <?=$permission?>; //
<?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/select2/select2.full.min.js')?>
<!--<?=WebUtil::printJS('../e_lib/tui.editor/tui-editor-Editor-all.min.js')?>-->
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/diplomacy.js')?>
@@ -72,6 +75,8 @@ var permissionLevel = <?=$permission?>; //
</tfoot>
</table>
<div id='letters'></div>
<!-- 설계미스. template와 shadowdom으로 변경 -->
<div id='letterTemplate' style='display:none;'>
<table class='letterFrame bg0'>
@@ -79,8 +84,8 @@ var permissionLevel = <?=$permission?>; //
<tr><td colspan='2' class='letterHeader'>홍길동<span class='letterNationName'></span>국과의 외교 문서<span class='letterDate'>2099-12-31 23:59:59</span></td>
</thead>
<tbody>
<tr><th class='bg1'>문서 번호</th><td>#<span class='letterNo'></span></td></tr>
<tr><th class='bg1'>이전 문서</th><td>#<span class='letterPrevNo'></span></td></tr>
<tr><th class='bg1'>문서 번호</th><td><span class='letterNo'></span></td></tr>
<tr><th class='bg1'>이전 문서</th><td><span class='letterPrevNo'></span></td></tr>
<tr><th class='bg1'>상태</th><td><span class='letterStatus'></span></td></tr>
<tr><th class='bg1'>내용(공개)</th><td><div class='letterBrief'></div></td></tr>
<tr><th class='bg1'>내용(비밀)</th><td><div class='letterDetail'></div></td></tr>
@@ -98,9 +103,10 @@ var permissionLevel = <?=$permission?>; //
</div>
</td></tr>
<tr class='letterActionPlate'><th class='bg1'>동작</th><td>
<button type='button' class='btnAgree'>승</button>
<button type='button' class='btnDisagree'>거</button>
<button type='button' class='btnRenew'>갱신</button>
<button type='button' class='btnAgree' style='display:none;'>승</button>
<button type='button' class='btnDisagree' style='display:none;'>거</button>
<button type='button' class='btnRollback' style='display:none;'>회수</button>
<button type='button' class='btnRenew'>추가 문서 작성</button>
</td></tr>
</tfoot>
</table>