feat: 메시지 띄우기(wip)

This commit is contained in:
2023-03-09 02:20:15 +09:00
parent c4f8e551a5
commit dbab94bc6e
2 changed files with 51 additions and 10 deletions
+1 -1
View File
@@ -29,7 +29,7 @@ class GetRecentMessage extends \sammo\BaseAPI
public function getRequiredSessionMode(): int public function getRequiredSessionMode(): int
{ {
return static::REQ_GAME_LOGIN; return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
} }
private function delayFrequentCall(Session $session): void private function delayFrequentCall(Session $session): void
+50 -9
View File
@@ -20,18 +20,45 @@
<template v-if="messageNational.length == 0"> <template v-if="messageNational.length == 0">
<div>메시지가 없습니다.</div> <div>메시지가 없습니다.</div>
</template> </template>
<MessagePlate
v-for="msg of messageNational"
:key="msg.id"
:modelValue="msg"
:generalID="generalID"
:generalName="generalName"
:nationID="nationID"
:permissionLevel="permissionLevel"
></MessagePlate>
</div> </div>
<div class="PrivateTalk"> <div class="PrivateTalk">
<div>개인 메시지</div> <div>개인 메시지</div>
<template v-if="messagePrivate.length == 0"> <template v-if="messagePrivate.length == 0">
<div>메시지가 없습니다.</div> <div>메시지가 없습니다.</div>
</template> </template>
<MessagePlate
v-for="msg of messagePrivate"
:key="msg.id"
:modelValue="msg"
:generalID="generalID"
:generalName="generalName"
:nationID="nationID"
:permissionLevel="permissionLevel"
></MessagePlate>
</div> </div>
<div class="DiplomacyTalk"> <div class="DiplomacyTalk">
<div>외교 메시지</div> <div>외교 메시지</div>
<template v-if="messageDiplomacy.length == 0"> <template v-if="messageDiplomacy.length == 0">
<div>메시지가 없습니다.</div> <div>메시지가 없습니다.</div>
</template> </template>
<MessagePlate
v-for="msg of messageDiplomacy"
:key="msg.id"
:modelValue="msg"
:generalID="generalID"
:generalName="generalName"
:nationID="nationID"
:permissionLevel="permissionLevel"
></MessagePlate>
</div> </div>
</template> </template>
@@ -42,6 +69,10 @@ import { SammoAPI } from "@/SammoAPI";
import { isString } from "lodash"; import { isString } from "lodash";
import type { MsgItem, MsgResponse, MsgType } from "@/defs/API/Message"; import type { MsgItem, MsgResponse, MsgType } from "@/defs/API/Message";
import MessagePlate from "@/components/MessagePlate.vue"; import MessagePlate from "@/components/MessagePlate.vue";
import { useToast } from "bootstrap-vue-3";
import { unwrap } from "@/util/unwrap";
const toasts = unwrap(useToast());
const emit = defineEmits<{ const emit = defineEmits<{
(event: "request-refresh"): void; (event: "request-refresh"): void;
@@ -66,7 +97,7 @@ onMounted(() => {
const lastSequence = ref(-1); const lastSequence = ref(-1);
const initRefreshLimit = 5; const initRefreshLimit = 20;
let refreshLimit = initRefreshLimit; let refreshLimit = initRefreshLimit;
const refreshP: Set<Promise<boolean>> = new Set(); const refreshP: Set<Promise<boolean>> = new Set();
let lastRefreshDone = 0; let lastRefreshDone = 0;
@@ -93,11 +124,11 @@ function updateMsgResponse(response: MsgResponse) {
} }
} }
if(response.generalName != generalName.value){ if (response.generalName != generalName.value) {
emit("request-refresh"); emit("request-refresh");
return; return;
} }
if(response.nationID != nationID.value){ if (response.nationID != nationID.value) {
emit("request-refresh"); emit("request-refresh");
return; return;
} }
@@ -107,7 +138,6 @@ function updateMsgResponse(response: MsgResponse) {
for (const msgType of Object.keys(messageIndexedList) as (keyof typeof messageIndexedList)[]) { for (const msgType of Object.keys(messageIndexedList) as (keyof typeof messageIndexedList)[]) {
const msgList = messageIndexedList[msgType]; const msgList = messageIndexedList[msgType];
const newMsgList = response[msgType]; const newMsgList = response[msgType];
console.log(msgType, msgList, newMsgList); console.log(msgType, msgList, newMsgList);
if (newMsgList.length == 0) { if (newMsgList.length == 0) {
@@ -171,11 +201,19 @@ function beginRefreshTimer() {
if (refreshP.size > refreshLimit && refreshTimer) { if (refreshP.size > refreshLimit && refreshTimer) {
clearInterval(refreshTimer); clearInterval(refreshTimer);
refreshTimer = null; refreshTimer = null;
alert("서버 응답이 없습니다. 새로고침을 해주세요."); toasts.danger(
{
title: "메시지 자동 갱신 실패",
body: "서버 응답이 없습니다. 새로고침을 해주세요.",
},
{
delay: 1000 * 3600,
}
);
return; return;
} }
refreshP.add(tryRefresh()); void tryRefresh();
} }
}, 2500); }, 2500);
} }
@@ -196,15 +234,17 @@ async function tryRefresh() {
if (lastRefreshDone < now) { if (lastRefreshDone < now) {
lastRefreshDone = now; lastRefreshDone = now;
} }
} catch (e) { } catch (e) {
if (isString(e)) { if (isString(e)) {
alert(e); toasts.warning({
title: '갱신 실패',
body: e,
});
} }
console.error(e); console.error(e);
} }
if(!response){ if (!response) {
return false; return false;
} }
@@ -214,6 +254,7 @@ async function tryRefresh() {
})(); })();
void waiterP.then((result) => { void waiterP.then((result) => {
if (!result) { if (!result) {
console.error("?! result");
refreshLimit--; refreshLimit--;
} else { } else {
refreshLimit = initRefreshLimit; refreshLimit = initRefreshLimit;