From 0fef173d66098b21cf0758586183f506a515ac3e Mon Sep 17 00:00:00 2001 From: "Alex.exe" <40430040+NfoAlex@users.noreply.github.com> Date: Wed, 12 Jun 2024 01:01:55 +0900 Subject: [PATCH] Channel order (#46) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [add] - チャンネル順序を取得できるSocketハンドラと関数作成 * [add] - チャンネル順序用のinterface追加 * [change] - コメントとログ無効化 * [fix] - リンクデータパース時のデータ判別式が間違い * [add] - チャンネル順序の上書き関数とSocketハンドラを作成 --- src/actionHandler/Message/fetchHistory.ts | 2 +- .../User/fetchUserChannelOrder.ts | 29 +++++++++ .../User/saveUserChannelOrder.ts | 40 +++++++++++++ src/actionHandler/User/saveUserConfig.ts | 2 +- src/socketHandler/User.ts | 59 +++++++++++++++++++ src/type/Channel.ts | 7 +++ 6 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 src/actionHandler/User/fetchUserChannelOrder.ts create mode 100644 src/actionHandler/User/saveUserChannelOrder.ts diff --git a/src/actionHandler/Message/fetchHistory.ts b/src/actionHandler/Message/fetchHistory.ts index a82ea6b7..2fc38973 100644 --- a/src/actionHandler/Message/fetchHistory.ts +++ b/src/actionHandler/Message/fetchHistory.ts @@ -137,7 +137,7 @@ export default async function fetchHistory( for (let index in history) { //リンクプレビューのJSONパース、nullかundefinedなら空JSONに const linkDataParsed:IMessage["linkData"] = - (history[index].linkData!==null || history[index].linkData!==undefined) + (history[index].linkData!==null && history[index].linkData!==undefined) ? JSON.parse(history[index].linkData) : diff --git a/src/actionHandler/User/fetchUserChannelOrder.ts b/src/actionHandler/User/fetchUserChannelOrder.ts new file mode 100644 index 00000000..b721d051 --- /dev/null +++ b/src/actionHandler/User/fetchUserChannelOrder.ts @@ -0,0 +1,29 @@ +import sqlite3 from "sqlite3"; +const db = new sqlite3.Database("./records/USER.db"); + +export default async function fetchUserChannelOrder(userId: string) { + try { + + return new Promise((resolve) => { + db.all( + ` + SELECT channelOrder FROM USERS_SAVES + WHERE userId=? + `, + userId, + (err:Error, channelOrderData:[{channelOrder: string}]) => { + //console.log("fetchUserChannelOrder :: db : channelOrder->", channelOrderData); + //文字列をJSONにしてから返す + resolve(JSON.parse(channelOrderData[0].channelOrder)); + return; + } + ) + }); + + } catch(e) { + + console.log("fetchUserChannelOrder :: エラー->", e); + return null; + + } +} \ No newline at end of file diff --git a/src/actionHandler/User/saveUserChannelOrder.ts b/src/actionHandler/User/saveUserChannelOrder.ts new file mode 100644 index 00000000..ebb0ba1a --- /dev/null +++ b/src/actionHandler/User/saveUserChannelOrder.ts @@ -0,0 +1,40 @@ +import sqlite3 from "sqlite3"; +const db = new sqlite3.Database("./records/USER.db"); + +import type { IChannelOrder } from "../../type/Channel"; + +export default async function saveUserChannelOrder(userId:string, channelOrder:IChannelOrder) +:Promise { + return new Promise((resolve) => { + try { + + //設定データを書き込み更新 + db.run( + ` + UPDATE USERS_SAVES SET channelOrder=? + WHERE userId=? + ` + , + [JSON.stringify(channelOrder), userId], + (err) => { + if (err) { + console.log("saveUserChannelOrder :: エラー->", err); + //失敗と返す + resolve(false); + return; + } else { + //成功と返す + resolve(true); + return; + } + }); + + } catch(e) { + + console.log("saveUserChannelOrder :: エラー->", e); + resolve(false); + return; + + } + }); +} \ No newline at end of file diff --git a/src/actionHandler/User/saveUserConfig.ts b/src/actionHandler/User/saveUserConfig.ts index 1e788fd9..17e1cb7c 100644 --- a/src/actionHandler/User/saveUserConfig.ts +++ b/src/actionHandler/User/saveUserConfig.ts @@ -33,7 +33,7 @@ export default async function saveUserConfig(userId:string, datConfig:IUserConfi } catch(e) { - console.log("saveUserConfig :: saveUserConfig : エラー->", e); + console.log("saveUserConfig :: エラー->", e); resolve(false); return; diff --git a/src/socketHandler/User.ts b/src/socketHandler/User.ts index 37b1d8d9..7351e466 100644 --- a/src/socketHandler/User.ts +++ b/src/socketHandler/User.ts @@ -9,9 +9,12 @@ import fetchUserAll from "../actionHandler/User/fetchUserAll"; import banUser from "../actionHandler/User/banUser"; import pardonUser from "../actionHandler/User/pardonUser"; import roleCheck from "../util/roleCheck"; +import fetchUserChannelOrder from "../actionHandler/User/fetchUserChannelOrder"; +import saveUserChannelOrder from "../actionHandler/User/saveUserChannelOrder"; import type IRequestSender from "../type/requestSender"; import type { IUserConfig } from "../type/User"; +import type { IChannelOrder } from "../type/Channel"; module.exports = (io:Server) => { io.on("connection", (socket:Socket) => { @@ -42,6 +45,33 @@ module.exports = (io:Server) => { socket.emit("RESULT::fetchUserConfig", { result:"ERROR_DB_THING", data:null }); } }); + + //ユーザーごとのチャンネル順序を取得 + socket.on("fetchUserChannelOrder", async (dat:{RequestSender:IRequestSender}) => { + /* + 返し : { + result: "SUCCESS"|"ERROR_DB_THING"|"ERROR_SESSION_ERROR", + data: ServerInfoLimited + } + */ + + /* セッション認証 */ + if (!(await checkSession(dat.RequestSender))) { + socket.emit("RESULT::fetchUserChannelOrder", { result:"ERROR_SESSION_ERROR", data:null }); + return; + } + + try { + //チャンネル順序の読み取り + const resultChannelOrder = await fetchUserChannelOrder(dat.RequestSender.userId); + + //返す + socket.emit("RESULT::fetchUserChannelOrder", { result:"SUCCESS", data:resultChannelOrder }); + } catch(e) { + //返す + socket.emit("RESULT::fetchUserChannelOrder", { result:"ERROR_DB_THING", data:null }); + } + }); //設定データを保存する socket.on("saveUserConfig", async (dat:{RequestSender:IRequestSender, config:IUserConfig}) => { @@ -72,6 +102,35 @@ module.exports = (io:Server) => { } }); + //ユーザーごとのチャンネル順序を保存 + socket.on("saveUserChannelOrder", async (dat:{RequestSender:IRequestSender, channelOrder:IChannelOrder}) => { + /* + 返し : { + result: "SUCCESS"|"ERROR_DB_THING"|"ERROR_SESSION_ERROR", + data: null + } + */ + + //セッション確認 + if (!(await checkSession(dat.RequestSender))) { + socket.emit("RESULT::saveUserChannelOrder", { result:"ERROR_SESSION_ERROR", data:null }); + return; + } + + try { + //書き込み、結果受け取り + const resultSaveUserChannelOrder:boolean = await saveUserChannelOrder(dat.RequestSender.userId, dat.channelOrder); + //結果に応じて結果と設定データを返す + if (resultSaveUserChannelOrder) { + socket.emit("RESULT::saveUserChannelOrder", { result:"SUCCESS", data:null}); + } else { + socket.emit("RESULT::saveUserChannelOrder", { result:"ERROR_DB_THING", data:null}); + } + } catch(e) { + socket.emit("RESULT::saveUserChannelOrder", { result:"ERROR_DB_THING", data:null }); + } + }); + //一人分のユーザー情報取得(ユーザーIDから) socket.on("fetchUserInfo", async (dat:{RequestSender:IRequestSender, userId:string}) => { /* diff --git a/src/type/Channel.ts b/src/type/Channel.ts index 41478a6c..72c58e10 100644 --- a/src/type/Channel.ts +++ b/src/type/Channel.ts @@ -15,3 +15,10 @@ export interface IChannel { isPrivate: boolean, speakableRole: string[] } + +export interface IChannelOrder { + channelId: string, + isThread: boolean, + isFolder: boolean, + child?: [] +}