1
1
<template >
2
- <k-layout >
2
+ <k-layout :title = " channelName || '聊天' " >
3
3
<template #left >
4
4
<div class =" header flex grow-0 shrink-0 box-border" >
5
5
<template v-if =" guildKey " >
20
20
class =" flex px-4 py-1 items-center
21
21
bg-gray-700 bg-op-0 hover:bg-op-100 transition cursor-pointer"
22
22
@click =" setChannel(channel)"
23
+ @contextmenu.stop =" triggerChannel($event, channel)"
23
24
>
24
25
{{ channel.name }}
25
26
</div >
29
30
class =" flex px-4 py-3 gap-x-4 justify-between
30
31
bg-gray-700 bg-op-0 hover:bg-op-100 transition cursor-pointer"
31
32
@click =" setGuild(guild)"
33
+ @contextmenu.stop =" triggerGuild($event, guild)"
32
34
>
33
35
<img v-if =" guild.avatar" :src =" withProxy(guild.avatar)" width =" 48" height =" 48" class =" b-rd-full" />
34
36
<div v-else
47
49
48
50
<template v-if =" channelId " >
49
51
<el-scrollbar >
50
- <div v-for =" message in messages" :key =" message.id" class =" message" >
52
+ <div v-if =" messages?.prev" >正在加载更多消息……</div >
53
+ <div v-for =" message in messages?.data" :key =" message.id" class =" message"
54
+ @contextmenu.stop =" triggerMessage($event, message)" >
55
+ {{ message.id }}
51
56
<message-content :content =" message.content!" ></message-content >
52
57
</div >
58
+ <div v-if =" messages?.next" >正在加载更多消息……</div >
53
59
</el-scrollbar >
54
60
<div class =" footer shrink-0" >
55
61
<chat-input class =" h-6 px-4 py-2" v-model =" input" @send =" handleSend" placeholder =" 发送消息" ></chat-input >
59
65
<k-empty >选择一个频道开始聊天</k-empty >
60
66
</template >
61
67
</k-layout >
68
+
69
+ <el-dialog
70
+ title =" 群组信息"
71
+ :model-value =" !!showGuild"
72
+ @update:model-value =" showGuild = undefined"
73
+ destroy-on-close >
74
+ <ul v-if =" showGuild" >
75
+ <li >群组 ID: {{ showGuild.id }}</li >
76
+ <li >群组名称: {{ showGuild.name }}</li >
77
+ </ul >
78
+ </el-dialog >
79
+
80
+ <el-dialog
81
+ title =" 频道信息"
82
+ :model-value =" !!showChannel"
83
+ @update:model-value =" showChannel = undefined"
84
+ destroy-on-close >
85
+ <ul v-if =" showChannel" >
86
+ <li >频道 ID: {{ showChannel.id }}</li >
87
+ <li >频道名称: {{ showChannel.name }}</li >
88
+ </ul >
89
+ </el-dialog >
90
+
91
+ <el-dialog
92
+ title =" 消息信息"
93
+ :model-value =" !!showMessage"
94
+ @update:model-value =" showMessage = undefined"
95
+ destroy-on-close >
96
+ <ul v-if =" showMessage" >
97
+ <li >消息 ID: {{ showMessage.id }}</li >
98
+ </ul >
99
+ </el-dialog >
62
100
</template >
63
101
64
102
<script lang="ts" setup>
65
103
66
104
import { ref } from ' vue'
67
- import { useContext , useRpc } from ' @cordisjs/client'
105
+ import { useContext , useRpc , useMenu } from ' @cordisjs/client'
68
106
import type { Data } from ' ../src'
69
107
import { Universal } from ' @satorijs/core'
70
108
import { ChatInput , MessageContent } from ' @satorijs/components-vue'
@@ -75,11 +113,32 @@ const ctx = useContext()
75
113
const platform = ref <string >()
76
114
const guildKey = ref <string >()
77
115
const channelId = ref <string >()
116
+ const channelName = ref <string >()
78
117
const channels = ref <Universal .Channel []>([])
79
- const messages = ref <Universal .Message []>([] )
118
+ const messages = ref <Universal .TwoWayList < Universal . Message >>( )
80
119
81
120
const input = ref (' ' )
82
121
122
+ const showGuild = ref <Universal .Guild >()
123
+ const showChannel = ref <Universal .Channel >()
124
+ const showMessage = ref <Universal .Message >()
125
+
126
+ const triggerGuild = useMenu (' chat.guild' )
127
+ const triggerChannel = useMenu (' chat.channel' )
128
+ const triggerMessage = useMenu (' chat.message' )
129
+
130
+ ctx .action (' chat.guild.inspect' , async ({ chat }) => {
131
+ showGuild .value = chat .guild
132
+ })
133
+
134
+ ctx .action (' chat.channel.inspect' , async ({ chat }) => {
135
+ showChannel .value = chat .channel
136
+ })
137
+
138
+ ctx .action (' chat.message.inspect' , async ({ chat }) => {
139
+ showMessage .value = chat .message
140
+ })
141
+
83
142
function short(name : string ) {
84
143
return name .slice (0 , 2 )
85
144
}
@@ -101,11 +160,10 @@ async function setGuild(guild?: Universal.Guild & { platform: string; assignees:
101
160
102
161
async function setChannel(channel : Universal .Channel ) {
103
162
channelId .value = channel .id
104
- messages .value = []
105
- for await (const message of ctx .bots [ctx .chat .guilds .value [guildKey .value ! ].assignees [0 ]].getMessageIter (channel .id )) {
106
- if (channelId .value !== channel .id || messages .value .length >= 100 ) return
107
- messages .value .unshift (message )
108
- }
163
+ messages .value = undefined
164
+ const result = await ctx .bots [ctx .chat .guilds .value [guildKey .value ! ].assignees [0 ]].getMessageList (channel .id )
165
+ result .next = undefined
166
+ if (channelId .value === channel .id ) messages .value = result
109
167
}
110
168
111
169
function handleSend(content : string ) {
0 commit comments