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 (
+ <>
+
+ >
+ );
+}