From ab4e816169b522c7d16e055ddcde3aaa534f6ffc Mon Sep 17 00:00:00 2001 From: tako0614 Date: Tue, 16 Jul 2024 03:57:37 +0900 Subject: [PATCH] Refactor code to use 'timestamp' instead of 'time' in ChatTalkContent --- components/chat.tsx | 6 +- fresh.gen.ts | 6 ++ islands/HeaderButton.tsx | 5 +- islands/setDefaultState.tsx | 15 +++- routes/addFriend/friends/[name].tsx | 102 +++++++++++++++++++++ routes/api/v2/client/talks/friend/data.ts | 104 ++++++++++++++-------- routes/setting/friends/[name].tsx | 102 +++++++++++++++++++++ routes/talk/friends/[name].tsx | 102 +++++++++++++++++++++ 8 files changed, 396 insertions(+), 46 deletions(-) create mode 100644 routes/addFriend/friends/[name].tsx create mode 100644 routes/setting/friends/[name].tsx create mode 100644 routes/talk/friends/[name].tsx diff --git a/components/chat.tsx b/components/chat.tsx index 6aa8d32f..e6dba18d 100644 --- a/components/chat.tsx +++ b/components/chat.tsx @@ -11,6 +11,7 @@ function createAppState(obj: { roomid: string; userName: string; page: number; + friendid?: string; }): AppStateType { const isChoiceUser = signal(obj.isChoiceUser); const ws = signal(null); @@ -23,7 +24,7 @@ function createAppState(obj: { const inputMessage = signal(""); const setIsValidInput = signal(false); const roomType = signal(""); - const friendid = signal(""); + const friendid = signal(obj.friendid || ""); return { isChoiceUser: isChoiceUser, ws: ws, @@ -40,12 +41,13 @@ function createAppState(obj: { friendid: friendid, }; } -function chat(props: { page: any; userName: string }) { +function chat(props: { page: any; userName: string,friendid?: string }) { const AppState = createAppState({ isChoiceUser: false, roomid: "", userName: props.userName, page: props.page, + friendid: props.friendid, }); return ( <> diff --git a/fresh.gen.ts b/fresh.gen.ts index d975abd7..3381bc48 100644 --- a/fresh.gen.ts +++ b/fresh.gen.ts @@ -5,6 +5,7 @@ import * as $_404 from "./routes/_404.tsx"; import * as $_app from "./routes/_app.tsx"; import * as $_middleware from "./routes/_middleware.ts"; +import * as $addFriend_friends_name_ from "./routes/addFriend/friends/[name].tsx"; import * as $addFriend_index from "./routes/addFriend/index.tsx"; import * as $api_v2_client_bgimage from "./routes/api/v2/client/bgimage.ts"; import * as $api_v2_client_block_server from "./routes/api/v2/client/block/server.ts"; @@ -87,7 +88,9 @@ import * as $api_v2_server_information_users_icon from "./routes/api/v2/server/i import * as $api_v2_server_information_users_profile from "./routes/api/v2/server/information/users/profile.ts"; import * as $api_v2_server_pubkey from "./routes/api/v2/server/pubkey.ts"; import * as $index from "./routes/index.tsx"; +import * as $setting_friends_name_ from "./routes/setting/friends/[name].tsx"; import * as $setting_index from "./routes/setting/index.tsx"; +import * as $talk_friends_name_ from "./routes/talk/friends/[name].tsx"; import * as $talk_index from "./routes/talk/index.tsx"; import * as $ChatSend from "./islands/ChatSend.tsx"; import * as $ChatTalkContent from "./islands/ChatTalkContent.tsx"; @@ -111,6 +114,7 @@ const manifest = { "./routes/_404.tsx": $_404, "./routes/_app.tsx": $_app, "./routes/_middleware.ts": $_middleware, + "./routes/addFriend/friends/[name].tsx": $addFriend_friends_name_, "./routes/addFriend/index.tsx": $addFriend_index, "./routes/api/v2/client/bgimage.ts": $api_v2_client_bgimage, "./routes/api/v2/client/block/server.ts": $api_v2_client_block_server, @@ -193,7 +197,9 @@ const manifest = { "./routes/api/v2/server/information/users/profile.ts": $api_v2_server_information_users_profile, "./routes/api/v2/server/pubkey.ts": $api_v2_server_pubkey, "./routes/index.tsx": $index, + "./routes/setting/friends/[name].tsx": $setting_friends_name_, "./routes/setting/index.tsx": $setting_index, + "./routes/talk/friends/[name].tsx": $talk_friends_name_, "./routes/talk/index.tsx": $talk_index, }, islands: { diff --git a/islands/HeaderButton.tsx b/islands/HeaderButton.tsx index af2fb280..b179645d 100644 --- a/islands/HeaderButton.tsx +++ b/islands/HeaderButton.tsx @@ -4,13 +4,14 @@ export default function HeaderButton(props: { page: any; children: any; state: a class="l-header__ul-item" onClick={() => { const url = window.location.href; - const roomid = url.split("/")[4]; + const roomid = url.split("/")[5]; + const roomkind = url.split("/")[4]; props.state.page.value = props.page; if (roomid == undefined) { history.pushState("", "", urlPramator(props.page)); return; } - history.pushState("", "", urlPramator(props.page) + roomid); + history.pushState("", "", urlPramator(props.page) + roomkind + "/" + roomid); }} > {props.children} diff --git a/islands/setDefaultState.tsx b/islands/setDefaultState.tsx index 7beb1490..44d0db38 100644 --- a/islands/setDefaultState.tsx +++ b/islands/setDefaultState.tsx @@ -19,11 +19,21 @@ export default function setDefaultState({ state }: { state: AppStateType }) { }, [state.inputMessage.value]); useEffect(() => { state.ws.value = new WebSocket("/api/v2/client/main"); + state.ws.value.onopen = () => { + console.log("connected"); + } state.ws.value.onmessage = (event: any) => { const data = JSON.parse(event.data); switch (data.type) { case "connected": state.sessionid.value = data.sessionid; + if(state.friendid.value){ + state.ws.value?.send(JSON.stringify({ + type: "joinFriend", + sessionid: state.sessionid.value, + friendid: state.friendid.value, + })); + } break; case "joined": { @@ -37,7 +47,7 @@ export default function setDefaultState({ state }: { state: AppStateType }) { window.history.pushState( "", "", - "/talk/" + state.friendid.value, + "/talk/friends/" + state.friendid.value, ); const talkData = fetch("/api/v2/client/talks/friend/data?friendid=" + state.friendid.value + "&limit=50"); talkData.then((res) => res.json()).then((res) => { @@ -48,9 +58,6 @@ export default function setDefaultState({ state }: { state: AppStateType }) { break; } }; - state.ws.value.onopen = () => { - console.log("connected"); - }; }, []); return <>; } diff --git a/routes/addFriend/friends/[name].tsx b/routes/addFriend/friends/[name].tsx new file mode 100644 index 00000000..293a3133 --- /dev/null +++ b/routes/addFriend/friends/[name].tsx @@ -0,0 +1,102 @@ +import users from "../../../models/users.ts"; +import { load } from "$std/dotenv/mod.ts"; +import Chat from "../../../components/chat.tsx"; +import Welcome from "../../../components/welcome.tsx"; +import SetUp from "../../../islands/setup.tsx"; +const env = await load(); +export const handler = { + async GET(req: any, ctx: any) { + const name = ctx.params.name; + if (!ctx.state.data.loggedIn) { + if (ctx.state.data.isSetUp) { + return ctx.render({ loggedIn: false, isAddFriendForm: false, isSetUp: true }); + } + return ctx.render({ loggedIn: false, isAddFriendForm: false, isSetUp: false }); + } + const requrl = new URL(req.url); + const key = requrl.searchParams.get("key") || ""; + if (key === "" || key === null || key === undefined) { + return ctx.render({ + loggedIn: true, + isAddFriendForm: false, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + } + const userInfo = await users.findOne({ addFriendKey: key }); + if (userInfo === null || userInfo === undefined) { + return ctx.render({ + loggedIn: true, + isAddFriendForm: false, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + } + const sessionUserId: string = ctx.state.data.userid; + const userInfoId: string = userInfo.uuid; + if (sessionUserId != userInfoId) { + return ctx.render({ + loggedIn: true, + key, + isAddFriendForm: true, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + } + return ctx.render({ + loggedIn: true, + key, + isAddFriendForm: false, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + }, +}; +export default function Home({ data }: { data: any }) { + if (!data.loggedIn) { + if (data.isSetUp) { + return ( + <> + + tako's | takos.jp + + + + + + ); + } + return ( + <> + <> + + tako's | takos.jp + + + + + { + /* + + */ + } + + + ); + } + return ( + <> + + + ); +} diff --git a/routes/api/v2/client/talks/friend/data.ts b/routes/api/v2/client/talks/friend/data.ts index 9bdc589d..1aaf6aa9 100644 --- a/routes/api/v2/client/talks/friend/data.ts +++ b/routes/api/v2/client/talks/friend/data.ts @@ -73,54 +73,82 @@ export const handler = { messagesData = await messages.find({ roomid: roomid }).sort({ _id: -1 }).limit(parseInt(limit)); } else if (before) { //そのメッセージの前のメッセージを取得 - messagesData = await messages.find({ roomid: roomid, messageid: { $lt: before } }).sort({ _id: -1 }).limit(parseInt(limit)); + messagesData = await messages.find({ roomid: roomid, messageid: { $lt: before } }).sort({ _id: -1 }).limit(parseInt(limit)); } else if (after) { //そのメッセージの後のメッセージを取得 - messagesData = await messages.find({ roomid: roomid, messageid: { $gt: after } }).sort({ _id: -1 }).limit(parseInt(limit)); + messagesData = await messages.find({ roomid: roomid, messageid: { $gt: after } }).sort({ _id: -1 }).limit(parseInt(limit)); } const result = await Promise.all(messagesData.map(async (message) => { - const CacheUser = usersCache.get(message.userid); - if (CacheUser) { - if(message.messageType === "text") { - return { - messageid: message.messageid, - userName: CacheUser.userName, - message: message.message, - timestamp: message.timestamp, - type: message.messageType, - }; - } - } - let userInfo - //= await users.findOne({ uuid: message.userid }); - if(takos.splitUserName(message.userid).domain !== env["DOMAIN"]) { + const CacheUser = usersCache.get(message.userid); + const read = await Promise.all(message.read.map(async (read: { userid: string; read: any }) => { + const user = usersCache.get(read.userid); + if (!user) { + let userInfo; + //= await users.findOne({ uuid: message.userid }); + if (takos.splitUserName(message.userid).domain !== env["DOMAIN"]) { const remoteFriend = await remoteFriends.findOne({ uuid: message.userid }); userInfo = remoteFriend; - } else { + } else { userInfo = await users.findOne({ uuid: message.userid }); - } - if (!userInfo) { - if(message.messageType === "text") { - return { - messageid: message.messageid, - userName: "Unknown", - message: message.message, - timestamp: message.timestamp, - type: message.messageType, - }; } - } - usersCache.set(message.userid, userInfo); - if(message.messageType === "text") { + usersCache.set(message.userid, userInfo); + if (!userInfo) { return { - messageid: message.messageid, - userName: userInfo?.userName, - message: message.message, - timestamp: message.timestamp, - type: message.messageType, - }; + userid: read.userid, + userName: "Unknown", + read: read.read, + }; + } + return userInfo.userName + "@" + takos.splitUserName(read.userid).domain; } + return user.userName + "@" + takos.splitUserName(read.userid).domain; })); - return new Response(JSON.stringify({ status: true, message: "Success", data: result }), { status: 200, headers: { "Content-Type": "application/json" } }); + console.log(read); + if (CacheUser) { + if (message.messageType === "text") { + return { + messageid: message.messageid, + userName: CacheUser.userName, + message: message.message, + timestamp: message.timestamp, + type: message.messageType, + read: read, + }; + } + } + let userInfo; + //= await users.findOne({ uuid: message.userid }); + if (takos.splitUserName(message.userid).domain !== env["DOMAIN"]) { + const remoteFriend = await remoteFriends.findOne({ uuid: message.userid }); + userInfo = remoteFriend; + } else { + userInfo = await users.findOne({ uuid: message.userid }); + } + usersCache.set(message.userid, userInfo); + if (!userInfo) { + if (message.messageType === "text") { + return { + messageid: message.messageid, + userName: "Unknown", + message: message.message, + timestamp: message.timestamp, + type: message.messageType, + read: message.read, + }; + } + } + usersCache.set(message.userid, userInfo); + if (message.messageType === "text") { + return { + messageid: message.messageid, + userName: userInfo?.userName, + message: message.message, + timestamp: message.timestamp, + type: message.messageType, + read: read, + }; + } + })); + return new Response(JSON.stringify({ status: true, message: "Success", data: result }), { status: 200, headers: { "Content-Type": "application/json" } }); }, }; diff --git a/routes/setting/friends/[name].tsx b/routes/setting/friends/[name].tsx new file mode 100644 index 00000000..67540a6f --- /dev/null +++ b/routes/setting/friends/[name].tsx @@ -0,0 +1,102 @@ +import users from "../../../models/users.ts"; +import { load } from "$std/dotenv/mod.ts"; +import Chat from "../../../components/chat.tsx"; +import Welcome from "../../../components/welcome.tsx"; +import SetUp from "../../../islands/setup.tsx"; +const env = await load(); +export const handler = { + async GET(req: any, ctx: any) { + const name = ctx.params.name; + if (!ctx.state.data.loggedIn) { + if (ctx.state.data.isSetUp) { + return ctx.render({ loggedIn: false, isAddFriendForm: false, isSetUp: true }); + } + return ctx.render({ loggedIn: false, isAddFriendForm: false, isSetUp: false }); + } + const requrl = new URL(req.url); + const key = requrl.searchParams.get("key") || ""; + if (key === "" || key === null || key === undefined) { + return ctx.render({ + loggedIn: true, + isAddFriendForm: false, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + } + const userInfo = await users.findOne({ addFriendKey: key }); + if (userInfo === null || userInfo === undefined) { + return ctx.render({ + loggedIn: true, + isAddFriendForm: false, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + } + const sessionUserId: string = ctx.state.data.userid; + const userInfoId: string = userInfo.uuid; + if (sessionUserId != userInfoId) { + return ctx.render({ + loggedIn: true, + key, + isAddFriendForm: true, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + } + return ctx.render({ + loggedIn: true, + key, + isAddFriendForm: false, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + }, +}; +export default function Home({ data }: { data: any }) { + if (!data.loggedIn) { + if (data.isSetUp) { + return ( + <> + + tako's | takos.jp + + + + + + ); + } + return ( + <> + <> + + tako's | takos.jp + + + + + { + /* + + */ + } + + + ); + } + return ( + <> + + + ); +} diff --git a/routes/talk/friends/[name].tsx b/routes/talk/friends/[name].tsx new file mode 100644 index 00000000..572e81ca --- /dev/null +++ b/routes/talk/friends/[name].tsx @@ -0,0 +1,102 @@ +import users from "../../../models/users.ts"; +import { load } from "$std/dotenv/mod.ts"; +import Chat from "../../../components/chat.tsx"; +import Welcome from "../../../components/welcome.tsx"; +import SetUp from "../../../islands/setup.tsx"; +const env = await load(); +export const handler = { + async GET(req: any, ctx: any) { + const name = ctx.params.name; + if (!ctx.state.data.loggedIn) { + if (ctx.state.data.isSetUp) { + return ctx.render({ loggedIn: false, isAddFriendForm: false, isSetUp: true }); + } + return ctx.render({ loggedIn: false, isAddFriendForm: false, isSetUp: false }); + } + const requrl = new URL(req.url); + const key = requrl.searchParams.get("key") || ""; + if (key === "" || key === null || key === undefined) { + return ctx.render({ + loggedIn: true, + isAddFriendForm: false, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + } + const userInfo = await users.findOne({ addFriendKey: key }); + if (userInfo === null || userInfo === undefined) { + return ctx.render({ + loggedIn: true, + isAddFriendForm: false, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + } + const sessionUserId: string = ctx.state.data.userid; + const userInfoId: string = userInfo.uuid; + if (sessionUserId != userInfoId) { + return ctx.render({ + loggedIn: true, + key, + isAddFriendForm: true, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + } + return ctx.render({ + loggedIn: true, + key, + isAddFriendForm: false, + userName: ctx.state.data.userName, + userNickName: ctx.state.data.nickName, + name, + }); + }, +}; +export default function Home({ data }: { data: any }) { + if (!data.loggedIn) { + if (data.isSetUp) { + return ( + <> + + tako's | takos.jp + + + + + + ); + } + return ( + <> + <> + + tako's | takos.jp + + + + + { + /* + + */ + } + + + ); + } + return ( + <> + + + ); +}