From 68094f904d89c1faa48fd24a1e0f89b212b5591e Mon Sep 17 00:00:00 2001 From: Andreev Gregory Date: Thu, 5 Sep 2024 11:30:40 +0300 Subject: [PATCH] minor fixes, added system messages --- assets/js/chat.js | 104 +++++++++--------- .../backend_logic/api_addmembertochat.cpp | 2 +- .../backend_logic/api_leavechat.cpp | 1 + .../api_removememberfromchat.cpp | 1 + .../backend_logic/api_sendmessage.cpp | 10 +- .../backend_logic/server_data_interact.h | 4 + 6 files changed, 68 insertions(+), 54 deletions(-) diff --git a/assets/js/chat.js b/assets/js/chat.js index 929764e..69a25a7 100644 --- a/assets/js/chat.js +++ b/assets/js/chat.js @@ -132,11 +132,10 @@ function updateOffsets(){ } function shouldShowDeleteMesgBtn(messageSt){ - return !messageSt.isSystem && messageSt.exists && (messageSt.myRoleHere !== userChatRoleReadOnly) &&( - messageSt.myRoleHere === userChatRoleAdmin || messageSt.senderUserId === userinfo.uid); + return !messageSt.isSystem && messageSt.exists && (myRoleHere !== userChatRoleReadOnly) &&( + myRoleHere === userChatRoleAdmin || messageSt.senderUserId === userinfo.uid); } -// todo: fix messageboxes function getMsgTypeClassSenderBased(messageSt){ if (messageSt.isSystem) return "message-box-system" @@ -153,6 +152,8 @@ function getMsgFullTypeClassName(messageSt){ * Supercontainer.container is persistent, Supercontainer.box can change it's class */ function updateMessageSupercontainer(supercontainer, messageSt){ let box = supercontainer.box; + if (messageSt.isSystem) + return; setElementVisibility(box.querySelector(".message-box-button-delete"), shouldShowDeleteMesgBtn(messageSt), "inline"); box.className = getMsgFullTypeClassName(messageSt); // Notice, that no check of previous state is performed. Double loading is a rare event, I can afford to be slow @@ -169,13 +170,11 @@ function decodeSystemMessage(text){ if (verb === "kicked"){ return subjectRef + " kicked " + objectRef; } else if (verb === "summoned"){ - return subjectRef + " summoned " + objectId; + return subjectRef + " summoned " + objectRef; } else if (verb === "left"){ return subjectRef + " left chat"; - } else if (verb === "joined"){ - return subjectId + " joined chat"; } else if (verb === "created"){ - return subjectId + " created this chat"; + return subjectRef + " created this chat"; } return "... Bad log ..."; } @@ -190,56 +189,59 @@ function convertMessageStToSupercontainer(messageSt){ let ID = messageSt.id; - let topPart = document.createElement("div"); - box.appendChild(topPart); - topPart.className = "message-box-top"; + if (messageSt.isSystem){ - if (!members.has(messageSt.senderUserId)) - throw new Error("First - update members"); - let senderMemberSt = members.get(messageSt.senderUserId); - let senderProfileURI = "/user/" + senderMemberSt.nickname; + } else { + let topPart = document.createElement("div"); + box.appendChild(topPart); + topPart.className = "message-box-top"; - let inTopPartSenderName = document.createElement("a"); - topPart.appendChild(inTopPartSenderName); - inTopPartSenderName.className = "message-box-sender-name"; - inTopPartSenderName.innerText = senderMemberSt.name; - inTopPartSenderName.href = senderProfileURI; + if (!members.has(messageSt.senderUserId)) + throw new Error("First - update members"); + let senderMemberSt = members.get(messageSt.senderUserId); + let senderProfileURI = "/user/" + senderMemberSt.nickname; - let inTopPartSenderNickname = document.createElement("a"); - topPart.appendChild(inTopPartSenderNickname); - inTopPartSenderNickname.className = "message-box-sender-name message-box-sender-shortname" - inTopPartSenderNickname.innerText = senderMemberSt.nickname; - inTopPartSenderNickname.href = senderProfileURI; + let inTopPartSenderName = document.createElement("a"); + topPart.appendChild(inTopPartSenderName); + inTopPartSenderName.className = "message-box-sender-name"; + inTopPartSenderName.innerText = senderMemberSt.name; + inTopPartSenderName.href = senderProfileURI; - let inTopPartButtonDelete = document.createElement("img"); - topPart.appendChild(inTopPartButtonDelete); - inTopPartButtonDelete.className = "message-box-button message-box-button-delete"; - inTopPartButtonDelete.src = "/assets/img/delete.svg"; - inTopPartButtonDelete.onclick = (ev) => { - if (ev.button !== 0) - return; - let msgText = box.querySelector(".message-box-msg").innerText; - let previewText = senderMemberSt.nickname + ":\n" + msgText; - if (previewText.length > 1000) - previewText = previewText.substring(0, 1000 - 3); - document.getElementById("win-deletion-msg-preview").innerText = previewText; - storeHiddenMsgIdForDeletionWin = ID; - activatePopupWindowById("msg-deletion-win"); - }; - setElementVisibility(inTopPartButtonDelete, shouldShowDeleteMesgBtn(messageSt), "inline"); + let inTopPartSenderNickname = document.createElement("a"); + topPart.appendChild(inTopPartSenderNickname); + inTopPartSenderNickname.className = "message-box-sender-name message-box-sender-shortname" + inTopPartSenderNickname.innerText = senderMemberSt.nickname; + inTopPartSenderNickname.href = senderProfileURI; - let inTopPartButtonGetLink = document.createElement("img"); - topPart.appendChild(inTopPartButtonGetLink); - inTopPartButtonGetLink.className = "message-box-button"; - inTopPartButtonGetLink.src = "/assets/img/link.svg"; - inTopPartButtonGetLink.onclick = (ev) => { - if (ev.button !== 0) - return; - let URI = window.location.host + "/chat/" + openedchat.nickname + "/m/" + String(ID); - document.getElementById("message-input").innerText += (" " + URI + ""); - console.log("Tried to get link on message " + ID); - }; + let inTopPartButtonDelete = document.createElement("img"); + topPart.appendChild(inTopPartButtonDelete); + inTopPartButtonDelete.className = "message-box-button message-box-button-delete"; + inTopPartButtonDelete.src = "/assets/img/delete.svg"; + inTopPartButtonDelete.onclick = (ev) => { + if (ev.button !== 0) + return; + let msgText = box.querySelector(".message-box-msg").innerText; + let previewText = senderMemberSt.nickname + ":\n" + msgText; + if (previewText.length > 1000) + previewText = previewText.substring(0, 1000 - 3); + document.getElementById("win-deletion-msg-preview").innerText = previewText; + storeHiddenMsgIdForDeletionWin = ID; + activatePopupWindowById("msg-deletion-win"); + }; + setElementVisibility(inTopPartButtonDelete, shouldShowDeleteMesgBtn(messageSt), "inline"); + let inTopPartButtonGetLink = document.createElement("img"); + topPart.appendChild(inTopPartButtonGetLink); + inTopPartButtonGetLink.className = "message-box-button"; + inTopPartButtonGetLink.src = "/assets/img/link.svg"; + inTopPartButtonGetLink.onclick = (ev) => { + if (ev.button !== 0) + return; + let URI = window.location.host + "/chat/" + openedchat.nickname + "/m/" + String(ID); + document.getElementById("message-input").innerText += (" " + URI + ""); + console.log("Tried to get link on message " + ID); + }; + } let msgPart = document.createElement("p"); box.appendChild(msgPart); diff --git a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_addmembertochat.cpp b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_addmembertochat.cpp index ce508aa..d6ce36a 100644 --- a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_addmembertochat.cpp +++ b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_addmembertochat.cpp @@ -40,7 +40,6 @@ namespace iu9cawebchat { void make_her_a_member_of_the_midnight_crew(SqliteConnection& conn, int64_t chatId, int64_t alienUserId, int64_t role) { assert(role != user_chat_role_deleted); - // int64_t old_role = get_role_of_user_in_chat(conn, alienUserId, chatId); alter_user_chat_role(conn, chatId, alienUserId, role); } @@ -67,6 +66,7 @@ namespace iu9cawebchat { } else { return at_api_error_gen_bad_recv(-2l); } + insert_system_message_svo(conn, chatId, uid, "summoned", alien.id); json::JSON Recv; poll_update_chat(conn, Sent, Recv); diff --git a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_leavechat.cpp b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_leavechat.cpp index d2e8daa..cb847ad 100644 --- a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_leavechat.cpp +++ b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_leavechat.cpp @@ -7,6 +7,7 @@ namespace iu9cawebchat { if (get_role_of_user_in_chat(conn, uid, chatId) == user_chat_role_deleted) een9_THROW("Not a member"); kick_from_chat(conn, chatId, uid); + insert_system_message_svo(conn, chatId, uid, "left", -1); json::JSON Recv; poll_update_chat_list(conn, uid, Sent, Recv); return Recv; diff --git a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_removememberfromchat.cpp b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_removememberfromchat.cpp index dbaca1e..cb70a6e 100644 --- a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_removememberfromchat.cpp +++ b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_removememberfromchat.cpp @@ -13,6 +13,7 @@ namespace iu9cawebchat { een9_THROW("Only admin can delete members of chat"); int64_t badAlienId = Sent["userId"].asInteger().get_int(); kick_from_chat(conn, chatId, badAlienId); + insert_system_message_svo(conn, chatId, uid, "kicked", badAlienId); json::JSON Recv; poll_update_chat(conn, Sent, Recv); return Recv; diff --git a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_sendmessage.cpp b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_sendmessage.cpp index 3d4ccf6..63c0902 100644 --- a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_sendmessage.cpp +++ b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/api_sendmessage.cpp @@ -8,8 +8,7 @@ namespace iu9cawebchat { * Chat's HistoryId will increment after this operation * if adding system message, uid is ignored */ - void insert_new_message(SqliteConnection& conn, int64_t uid, int64_t chatId, - const std::string& text, bool isSystem) { + void insert_new_message(SqliteConnection& conn, int64_t uid, int64_t chatId, const std::string& text, bool isSystem) { int64_t chat_HistoryId_BEFORE_MSG = get_current_history_id_of_chat(conn, chatId); int64_t chat_lastMsgId = get_lastMsgId_of_chat(conn, chatId); SqliteStatement req(conn, @@ -24,6 +23,13 @@ namespace iu9cawebchat { {{1, chat_lastMsgId + 1}, {2, chat_HistoryId_BEFORE_MSG + 1}, {3, chatId}}, {}); } + void insert_system_message_svo(SqliteConnection& conn, int64_t chatId, + int64_t subject, const std::string& verb, int64_t object) { + + insert_new_message(conn, -1, chatId, + std::to_string(subject) + "," + verb + "," + std::to_string(object), true); + } + json::JSON internalapi_sendMessage(SqliteConnection& conn, int64_t uid, const json::JSON& Sent) { debug_print_json(Sent); int64_t chatId = Sent["chatUpdReq"]["chatId"].asInteger().get_int(); diff --git a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/server_data_interact.h b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/server_data_interact.h index ba7a4f1..6b591cd 100644 --- a/src/web_chat/iu9_ca_web_chat_lib/backend_logic/server_data_interact.h +++ b/src/web_chat/iu9_ca_web_chat_lib/backend_logic/server_data_interact.h @@ -70,6 +70,10 @@ namespace iu9cawebchat { bool is_nickname_taken(SqliteConnection& conn, const std::string& nickname); void reserve_nickname(SqliteConnection& conn, const std::string& nickname); + void insert_new_message(SqliteConnection& conn, int64_t uid, int64_t chatId, const std::string& text, bool isSystem); + void insert_system_message_svo(SqliteConnection& conn, int64_t chatId, + int64_t subject, const std::string& verb, int64_t object); + /* ============================= API ==================================== */ json::JSON internalapi_chatPollEvents(SqliteConnection& conn, int64_t uid, const json::JSON& Sent); json::JSON internalapi_chatListPollEvents(SqliteConnection& conn, int64_t uid, const json::JSON& Sent);