@zhin.js/adapter-qq 1.0.64 → 1.0.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @zhin.js/adapter-qq
2
2
 
3
+ ## 1.0.66
4
+
5
+ ### Patch Changes
6
+
7
+ - 9577eba: fix: tool 收集 bug,升级 ts 到 6.0.2
8
+ - Updated dependencies [9577eba]
9
+ - @zhin.js/logger@0.1.48
10
+ - @zhin.js/client@1.0.16
11
+ - zhin.js@1.0.64
12
+ - @zhin.js/console@2.0.6
13
+ - @zhin.js/http@1.0.59
14
+
15
+ ## 1.0.65
16
+
17
+ ### Patch Changes
18
+
19
+ - ba30934: fix: web 优化
20
+ - Updated dependencies [ba30934]
21
+ - @zhin.js/console@2.0.5
22
+ - @zhin.js/http@1.0.58
23
+ - zhin.js@1.0.63
24
+ - @zhin.js/logger@0.1.47
25
+
3
26
  ## 1.0.64
4
27
 
5
28
  ### Patch Changes
@@ -0,0 +1,230 @@
1
+ import { useEffect, useState, useCallback } from 'react'
2
+ import { apiFetch } from './utils/api'
3
+ import { RefreshCw, Server, Wifi, WifiOff, Power, PowerOff, ChevronRight, ChevronDown, Hash, Loader2 } from 'lucide-react'
4
+
5
+ interface BotInfo {
6
+ name: string
7
+ connected: boolean
8
+ guildCount: number
9
+ status: string
10
+ }
11
+
12
+ interface Guild {
13
+ id: string
14
+ name: string
15
+ icon?: string
16
+ description?: string
17
+ }
18
+
19
+ interface Channel {
20
+ id: string
21
+ name: string
22
+ type?: number
23
+ }
24
+
25
+ type Tab = 'overview' | 'guilds'
26
+
27
+ export default function QQDashboard() {
28
+ const [bots, setBots] = useState<BotInfo[]>([])
29
+ const [loading, setLoading] = useState(true)
30
+ const [error, setError] = useState('')
31
+ const [tab, setTab] = useState<Tab>('overview')
32
+ const [actionLoading, setActionLoading] = useState<Record<string, boolean>>({})
33
+
34
+ // Guild browser state
35
+ const [selectedBot, setSelectedBot] = useState('')
36
+ const [guilds, setGuilds] = useState<Guild[]>([])
37
+ const [guildsLoading, setGuildsLoading] = useState(false)
38
+ const [expandedGuild, setExpandedGuild] = useState<string | null>(null)
39
+ const [channels, setChannels] = useState<Record<string, Channel[]>>({})
40
+ const [channelsLoading, setChannelsLoading] = useState<string | null>(null)
41
+
42
+ const fetchData = useCallback(async () => {
43
+ setLoading(true)
44
+ setError('')
45
+ try {
46
+ const res = await apiFetch('/api/qq/bots')
47
+ const json = await res.json()
48
+ if (json.success) setBots(json.data)
49
+ else setError(json.error || '获取数据失败')
50
+ } catch {
51
+ setError('无法连接服务器')
52
+ } finally {
53
+ setLoading(false)
54
+ }
55
+ }, [])
56
+
57
+ useEffect(() => { fetchData() }, [fetchData])
58
+
59
+ const toggleConnect = async (name: string, connected: boolean) => {
60
+ setActionLoading(prev => ({ ...prev, [name]: true }))
61
+ try {
62
+ const endpoint = connected ? 'disconnect' : 'connect'
63
+ const res = await apiFetch(`/api/qq/bots/${encodeURIComponent(name)}/${endpoint}`, { method: 'POST' })
64
+ const json = await res.json()
65
+ if (!json.success) setError(json.error || '操作失败')
66
+ await fetchData()
67
+ } catch {
68
+ setError('操作失败')
69
+ } finally {
70
+ setActionLoading(prev => ({ ...prev, [name]: false }))
71
+ }
72
+ }
73
+
74
+ const loadGuilds = async (botName: string) => {
75
+ setSelectedBot(botName)
76
+ setGuildsLoading(true)
77
+ setGuilds([])
78
+ setExpandedGuild(null)
79
+ setChannels({})
80
+ try {
81
+ const res = await apiFetch(`/api/qq/bots/${encodeURIComponent(botName)}/guilds`)
82
+ const json = await res.json()
83
+ if (json.success) setGuilds(json.data)
84
+ else setError(json.error || '获取频道失败')
85
+ } catch {
86
+ setError('获取频道失败')
87
+ } finally {
88
+ setGuildsLoading(false)
89
+ }
90
+ }
91
+
92
+ const toggleGuild = async (guildId: string) => {
93
+ if (expandedGuild === guildId) { setExpandedGuild(null); return }
94
+ setExpandedGuild(guildId)
95
+ if (channels[guildId]) return
96
+ setChannelsLoading(guildId)
97
+ try {
98
+ const res = await apiFetch(`/api/qq/bots/${encodeURIComponent(selectedBot)}/guilds/${encodeURIComponent(guildId)}/channels`)
99
+ const json = await res.json()
100
+ if (json.success) setChannels(prev => ({ ...prev, [guildId]: json.data }))
101
+ } catch { /* ignore */ } finally {
102
+ setChannelsLoading(null)
103
+ }
104
+ }
105
+
106
+ const onlineBots = bots.filter(b => b.connected)
107
+
108
+ return (
109
+ <div className="p-6 max-w-5xl mx-auto">
110
+ {/* Header */}
111
+ <div className="flex items-center justify-between mb-6">
112
+ <h1 className="text-2xl font-bold flex items-center gap-2">
113
+ <Server className="w-6 h-6" /> QQ 官方机器人
114
+ </h1>
115
+ <button onClick={fetchData} disabled={loading}
116
+ className="flex items-center gap-1 px-3 py-1.5 rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 text-sm">
117
+ <RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} /> 刷新
118
+ </button>
119
+ </div>
120
+
121
+ {error && <div className="mb-4 p-3 bg-red-50 text-red-600 rounded border border-red-200">{error}</div>}
122
+
123
+ {/* Tabs */}
124
+ <div className="flex gap-1 mb-6 border-b">
125
+ <button onClick={() => setTab('overview')}
126
+ className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${tab === 'overview' ? 'border-blue-500 text-blue-600' : 'border-transparent text-gray-500 hover:text-gray-700'}`}>
127
+ 概览
128
+ </button>
129
+ <button onClick={() => setTab('guilds')}
130
+ className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${tab === 'guilds' ? 'border-blue-500 text-blue-600' : 'border-transparent text-gray-500 hover:text-gray-700'}`}>
131
+ 频道浏览
132
+ </button>
133
+ </div>
134
+
135
+ {/* Overview Tab */}
136
+ {tab === 'overview' && (
137
+ <>
138
+ {!loading && !bots.length && !error && (
139
+ <div className="text-center text-gray-500 py-12">暂无 QQ 机器人实例</div>
140
+ )}
141
+ <div className="grid gap-4 md:grid-cols-2">
142
+ {bots.map((bot) => (
143
+ <div key={bot.name} className="border rounded-lg p-4 bg-card shadow-sm">
144
+ <div className="flex items-center justify-between mb-3">
145
+ <span className="font-medium text-lg">{bot.name}</span>
146
+ {bot.connected
147
+ ? <span className="flex items-center gap-1 text-green-600 text-sm"><Wifi className="w-4 h-4" /> 在线</span>
148
+ : <span className="flex items-center gap-1 text-gray-400 text-sm"><WifiOff className="w-4 h-4" /> 离线</span>}
149
+ </div>
150
+ <div className="grid grid-cols-1 gap-2 text-sm text-gray-600 mb-3">
151
+ <div className="flex justify-between"><span>频道数</span><span className="font-mono">{bot.guildCount}</span></div>
152
+ </div>
153
+ <div className="flex gap-2">
154
+ <button
155
+ onClick={() => toggleConnect(bot.name, bot.connected)}
156
+ disabled={actionLoading[bot.name]}
157
+ className={`flex items-center gap-1 px-3 py-1.5 rounded text-sm text-white ${bot.connected ? 'bg-red-500 hover:bg-red-600' : 'bg-green-500 hover:bg-green-600'} disabled:opacity-50`}>
158
+ {actionLoading[bot.name]
159
+ ? <Loader2 className="w-3.5 h-3.5 animate-spin" />
160
+ : bot.connected ? <PowerOff className="w-3.5 h-3.5" /> : <Power className="w-3.5 h-3.5" />}
161
+ {bot.connected ? '断开' : '连接'}
162
+ </button>
163
+ {bot.connected && (
164
+ <button onClick={() => { setTab('guilds'); loadGuilds(bot.name) }}
165
+ className="flex items-center gap-1 px-3 py-1.5 rounded text-sm bg-gray-100 hover:bg-gray-200 text-gray-700">
166
+ <Hash className="w-3.5 h-3.5" /> 浏览频道
167
+ </button>
168
+ )}
169
+ </div>
170
+ </div>
171
+ ))}
172
+ </div>
173
+ </>
174
+ )}
175
+
176
+ {/* Guilds Tab */}
177
+ {tab === 'guilds' && (
178
+ <div>
179
+ {/* Bot selector */}
180
+ {onlineBots.length > 0 && (
181
+ <div className="mb-4 flex items-center gap-2">
182
+ <label className="text-sm text-gray-500">选择机器人:</label>
183
+ <select value={selectedBot} onChange={(e) => loadGuilds(e.target.value)}
184
+ className="border rounded px-2 py-1 text-sm">
185
+ <option value="">--</option>
186
+ {onlineBots.map(b => <option key={b.name} value={b.name}>{b.name}</option>)}
187
+ </select>
188
+ </div>
189
+ )}
190
+ {!onlineBots.length && <div className="text-center text-gray-500 py-8">暂无在线机器人</div>}
191
+ {guildsLoading && <div className="flex justify-center py-8"><Loader2 className="w-6 h-6 animate-spin text-blue-500" /></div>}
192
+
193
+ {/* Guild → Channel tree */}
194
+ {!guildsLoading && guilds.length > 0 && (
195
+ <div className="border rounded-lg bg-card shadow-sm divide-y">
196
+ {guilds.map((g) => (
197
+ <div key={g.id}>
198
+ <button onClick={() => toggleGuild(g.id)}
199
+ className="w-full flex items-center gap-2 px-4 py-3 hover:bg-gray-50 text-left">
200
+ {expandedGuild === g.id ? <ChevronDown className="w-4 h-4 text-gray-400" /> : <ChevronRight className="w-4 h-4 text-gray-400" />}
201
+ <span className="font-medium">{g.name}</span>
202
+ <span className="text-xs text-gray-400 ml-auto">{g.id}</span>
203
+ </button>
204
+ {expandedGuild === g.id && (
205
+ <div className="px-4 pb-3">
206
+ {channelsLoading === g.id
207
+ ? <div className="flex items-center gap-2 text-gray-400 text-sm py-2 pl-6"><Loader2 className="w-4 h-4 animate-spin" /> 加载中…</div>
208
+ : channels[g.id]?.length
209
+ ? <div className="pl-6 space-y-1">
210
+ {channels[g.id].map(ch => (
211
+ <div key={ch.id} className="flex items-center gap-2 text-sm text-gray-600 py-1">
212
+ <Hash className="w-3.5 h-3.5 text-gray-400" />
213
+ <span>{ch.name}</span>
214
+ <span className="text-xs text-gray-400 ml-auto">{ch.id}</span>
215
+ </div>
216
+ ))}
217
+ </div>
218
+ : <div className="pl-6 text-sm text-gray-400 py-1">无子频道</div>}
219
+ </div>
220
+ )}
221
+ </div>
222
+ ))}
223
+ </div>
224
+ )}
225
+ {!guildsLoading && selectedBot && !guilds.length && <div className="text-center text-gray-400 py-8">该机器人未加入任何频道</div>}
226
+ </div>
227
+ )}
228
+ </div>
229
+ )
230
+ }
@@ -0,0 +1,11 @@
1
+ import { addPage } from '@zhin.js/client'
2
+ import { MessageSquare } from 'lucide-react'
3
+ import QQDashboard from './Dashboard'
4
+
5
+ addPage({
6
+ key: 'qq-management',
7
+ path: '/qq',
8
+ title: 'QQ官方',
9
+ icon: <MessageSquare className="w-5 h-5" />,
10
+ element: <QQDashboard />,
11
+ })
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../node_modules/@zhin.js/console/browser.tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "../dist"
5
+ },
6
+ "include": ["./**/*"]
7
+ }
@@ -0,0 +1,17 @@
1
+ const TOKEN_KEY = "zhin_api_token";
2
+
3
+ export function getToken(): string | null {
4
+ return localStorage.getItem(TOKEN_KEY);
5
+ }
6
+
7
+ export async function apiFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {
8
+ const token = getToken();
9
+ const headers = new Headers(init?.headers);
10
+ if (token) headers.set("Authorization", `Bearer ${token}`);
11
+ const res = await fetch(input, { ...init, headers });
12
+ if (res.status === 401) {
13
+ localStorage.removeItem(TOKEN_KEY);
14
+ window.dispatchEvent(new CustomEvent("zhin:auth-required"));
15
+ }
16
+ return res;
17
+ }
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import{addPage as e}from"@zhin.js/client";import{ChevronDown as t,ChevronRight as n,Hash as r,Loader2 as i,MessageSquare as a,Power as o,PowerOff as s,RefreshCw as c,Server as l,Wifi as u,WifiOff as d}from"lucide-react";import{useCallback as f,useEffect as p,useState as m}from"react";import{Fragment as h,jsx as g,jsxs as _}from"react/jsx-runtime";var v="zhin_api_token";function y(){return localStorage.getItem(v)}async function b(e2,t2){let n2=y(),r2=new Headers(t2?.headers);n2&&r2.set("Authorization",`Bearer ${n2}`);let i2=await fetch(e2,{...t2,headers:r2});return i2.status===401&&(localStorage.removeItem(v),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),i2}function x(){let[e2,a2]=m([]),[v2,y2]=m(true),[x2,S]=m(""),[C,w]=m("overview"),[T,E]=m({}),[D,O]=m(""),[k,A]=m([]),[j,M]=m(false),[N,P]=m(null),[F,I]=m({}),[L,R]=m(null),z=f(async()=>{y2(true),S("");try{let e3=await(await b("/api/qq/bots")).json();e3.success?a2(e3.data):S(e3.error||"获取数据失败")}catch{S("无法连接服务器")}finally{y2(false)}},[]);p(()=>{z()},[z]);let B=async(e3,t2)=>{E(t3=>({...t3,[e3]:true}));try{let n2=t2?"disconnect":"connect",r2=await(await b(`/api/qq/bots/${encodeURIComponent(e3)}/${n2}`,{method:"POST"})).json();r2.success||S(r2.error||"操作失败"),await z()}catch{S("操作失败")}finally{E(t3=>({...t3,[e3]:false}))}},V=async e3=>{O(e3),M(true),A([]),P(null),I({});try{let t2=await(await b(`/api/qq/bots/${encodeURIComponent(e3)}/guilds`)).json();t2.success?A(t2.data):S(t2.error||"获取频道失败")}catch{S("获取频道失败")}finally{M(false)}},H=async e3=>{if(N===e3){P(null);return}if(P(e3),!F[e3]){R(e3);try{let t2=await(await b(`/api/qq/bots/${encodeURIComponent(D)}/guilds/${encodeURIComponent(e3)}/channels`)).json();t2.success&&I(n2=>({...n2,[e3]:t2.data}))}catch{}finally{R(null)}}},U=e2.filter(e3=>e3.connected);return _("div",{className:"p-6 max-w-5xl mx-auto",children:[_("div",{className:"flex items-center justify-between mb-6",children:[_("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[g(l,{className:"w-6 h-6"})," QQ 官方机器人"]}),_("button",{onClick:z,disabled:v2,className:"flex items-center gap-1 px-3 py-1.5 rounded bg-blue-500 text-white hover:bg-blue-600 disabled:opacity-50 text-sm",children:[g(c,{className:`w-4 h-4 ${v2?"animate-spin":""}`})," 刷新"]})]}),x2&&g("div",{className:"mb-4 p-3 bg-red-50 text-red-600 rounded border border-red-200",children:x2}),_("div",{className:"flex gap-1 mb-6 border-b",children:[g("button",{onClick:()=>w("overview"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${C==="overview"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"概览"}),g("button",{onClick:()=>w("guilds"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${C==="guilds"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"频道浏览"})]}),C==="overview"&&_(h,{children:[!v2&&!e2.length&&!x2&&g("div",{className:"text-center text-gray-500 py-12",children:"暂无 QQ 机器人实例"}),g("div",{className:"grid gap-4 md:grid-cols-2",children:e2.map(e3=>_("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[_("div",{className:"flex items-center justify-between mb-3",children:[g("span",{className:"font-medium text-lg",children:e3.name}),e3.connected?_("span",{className:"flex items-center gap-1 text-green-600 text-sm",children:[g(u,{className:"w-4 h-4"})," 在线"]}):_("span",{className:"flex items-center gap-1 text-gray-400 text-sm",children:[g(d,{className:"w-4 h-4"})," 离线"]})]}),g("div",{className:"grid grid-cols-1 gap-2 text-sm text-gray-600 mb-3",children:_("div",{className:"flex justify-between",children:[g("span",{children:"频道数"}),g("span",{className:"font-mono",children:e3.guildCount})]})}),_("div",{className:"flex gap-2",children:[_("button",{onClick:()=>B(e3.name,e3.connected),disabled:T[e3.name],className:`flex items-center gap-1 px-3 py-1.5 rounded text-sm text-white ${e3.connected?"bg-red-500 hover:bg-red-600":"bg-green-500 hover:bg-green-600"} disabled:opacity-50`,children:[T[e3.name]?g(i,{className:"w-3.5 h-3.5 animate-spin"}):e3.connected?g(s,{className:"w-3.5 h-3.5"}):g(o,{className:"w-3.5 h-3.5"}),e3.connected?"断开":"连接"]}),e3.connected&&_("button",{onClick:()=>{w("guilds"),V(e3.name)},className:"flex items-center gap-1 px-3 py-1.5 rounded text-sm bg-gray-100 hover:bg-gray-200 text-gray-700",children:[g(r,{className:"w-3.5 h-3.5"})," 浏览频道"]})]})]},e3.name))})]}),C==="guilds"&&_("div",{children:[U.length>0&&_("div",{className:"mb-4 flex items-center gap-2",children:[g("label",{className:"text-sm text-gray-500",children:"选择机器人:"}),_("select",{value:D,onChange:e3=>V(e3.target.value),className:"border rounded px-2 py-1 text-sm",children:[g("option",{value:"",children:"--"}),U.map(e3=>g("option",{value:e3.name,children:e3.name},e3.name))]})]}),!U.length&&g("div",{className:"text-center text-gray-500 py-8",children:"暂无在线机器人"}),j&&g("div",{className:"flex justify-center py-8",children:g(i,{className:"w-6 h-6 animate-spin text-blue-500"})}),!j&&k.length>0&&g("div",{className:"border rounded-lg bg-card shadow-sm divide-y",children:k.map(e3=>_("div",{children:[_("button",{onClick:()=>H(e3.id),className:"w-full flex items-center gap-2 px-4 py-3 hover:bg-gray-50 text-left",children:[N===e3.id?g(t,{className:"w-4 h-4 text-gray-400"}):g(n,{className:"w-4 h-4 text-gray-400"}),g("span",{className:"font-medium",children:e3.name}),g("span",{className:"text-xs text-gray-400 ml-auto",children:e3.id})]}),N===e3.id&&g("div",{className:"px-4 pb-3",children:L===e3.id?_("div",{className:"flex items-center gap-2 text-gray-400 text-sm py-2 pl-6",children:[g(i,{className:"w-4 h-4 animate-spin"})," 加载中…"]}):F[e3.id]?.length?g("div",{className:"pl-6 space-y-1",children:F[e3.id].map(e4=>_("div",{className:"flex items-center gap-2 text-sm text-gray-600 py-1",children:[g(r,{className:"w-3.5 h-3.5 text-gray-400"}),g("span",{children:e4.name}),g("span",{className:"text-xs text-gray-400 ml-auto",children:e4.id})]},e4.id))}):g("div",{className:"pl-6 text-sm text-gray-400 py-1",children:"无子频道"})})]},e3.id))}),!j&&D&&!k.length&&g("div",{className:"text-center text-gray-400 py-8",children:"该机器人未加入任何频道"})]})]})}e({key:"qq-management",path:"/qq",title:"QQ官方",icon:g(a,{className:"w-5 h-5"}),element:g(x,{})});
package/lib/index.d.ts CHANGED
@@ -1,4 +1,12 @@
1
1
  import { QQAdapter } from "./adapter.js";
2
+ import type { WebServer } from "@zhin.js/console";
3
+ declare module "zhin.js" {
4
+ namespace Plugin {
5
+ interface Contexts {
6
+ web: WebServer;
7
+ }
8
+ }
9
+ }
2
10
  declare module "zhin.js" {
3
11
  interface Adapters {
4
12
  qq: QQAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,QAAQ;QAChB,EAAE,EAAE,SAAS,CAAC;KACf;CACF;AAED,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,GAAG,EAAE,SAAS,CAAC;SAChB;KACF;CACF;AAED,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,QAAQ;QAChB,EAAE,EAAE,SAAS,CAAC;KACf;CACF;AAED,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
package/lib/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * QQ 官方适配器入口:类型扩展、导出、注册
3
3
  */
4
+ import path from "node:path";
4
5
  import { usePlugin, createGroupManagementTools } from "zhin.js";
5
6
  import { QQAdapter } from "./adapter.js";
6
7
  export * from "./types.js";
@@ -22,7 +23,7 @@ provide({
22
23
  });
23
24
  useContext('tool', 'qq', (toolService, qq) => {
24
25
  const groupTools = createGroupManagementTools(qq, 'qq');
25
- const disposers = groupTools.map(t => toolService.addTool(t, 'qq'));
26
+ const disposers = groupTools.map(t => toolService.addTool(t, plugin.name));
26
27
  // 获取频道列表
27
28
  disposers.push(toolService.addTool({
28
29
  name: 'qq_list_guilds',
@@ -43,7 +44,7 @@ useContext('tool', 'qq', (toolService, qq) => {
43
44
  const guilds = await bot.getGuilds();
44
45
  return { guilds, count: guilds.length };
45
46
  },
46
- }, 'qq'));
47
+ }, plugin.name));
47
48
  // 获取子频道列表
48
49
  disposers.push(toolService.addTool({
49
50
  name: 'qq_list_channels',
@@ -65,7 +66,7 @@ useContext('tool', 'qq', (toolService, qq) => {
65
66
  const channels = await bot.getChannels(args.guild_id);
66
67
  return { channels, count: channels.length };
67
68
  },
68
- }, 'qq'));
69
+ }, plugin.name));
69
70
  // 获取角色列表
70
71
  disposers.push(toolService.addTool({
71
72
  name: 'qq_list_roles',
@@ -87,7 +88,7 @@ useContext('tool', 'qq', (toolService, qq) => {
87
88
  const roles = await bot.getGuildRoles(args.guild_id);
88
89
  return { roles, count: roles.length };
89
90
  },
90
- }, 'qq'));
91
+ }, plugin.name));
91
92
  // 创建角色
92
93
  disposers.push(toolService.addTool({
93
94
  name: 'qq_create_role',
@@ -111,7 +112,7 @@ useContext('tool', 'qq', (toolService, qq) => {
111
112
  const role = await bot.createGuildRole(args.guild_id, args.name, args.color);
112
113
  return { success: !!role, role, message: role ? `角色 "${args.name}" 创建成功` : '创建失败' };
113
114
  },
114
- }, 'qq'));
115
+ }, plugin.name));
115
116
  // 添加角色
116
117
  disposers.push(toolService.addTool({
117
118
  name: 'qq_add_role',
@@ -136,7 +137,7 @@ useContext('tool', 'qq', (toolService, qq) => {
136
137
  const success = await bot.addMemberRole(args.guild_id, args.channel_id, args.user_id, args.role_id);
137
138
  return { success, message: success ? '已给成员添加角色' : '操作失败' };
138
139
  },
139
- }, 'qq'));
140
+ }, plugin.name));
140
141
  // 移除角色
141
142
  disposers.push(toolService.addTool({
142
143
  name: 'qq_remove_role',
@@ -161,7 +162,7 @@ useContext('tool', 'qq', (toolService, qq) => {
161
162
  const success = await bot.removeMemberRole(args.guild_id, args.channel_id, args.user_id, args.role_id);
162
163
  return { success, message: success ? '已移除成员的角色' : '操作失败' };
163
164
  },
164
- }, 'qq'));
165
+ }, plugin.name));
165
166
  // 子频道详情
166
167
  disposers.push(toolService.addTool({
167
168
  name: 'qq_channel_info',
@@ -183,7 +184,7 @@ useContext('tool', 'qq', (toolService, qq) => {
183
184
  const info = await bot.getChannelInfo(args.channel_id);
184
185
  return info;
185
186
  },
186
- }, 'qq'));
187
+ }, plugin.name));
187
188
  // 单成员详情
188
189
  disposers.push(toolService.addTool({
189
190
  name: 'qq_member_detail',
@@ -206,7 +207,127 @@ useContext('tool', 'qq', (toolService, qq) => {
206
207
  const member = await bot.getGuildMember(args.guild_id, args.user_id);
207
208
  return member;
208
209
  },
209
- }, 'qq'));
210
+ }, plugin.name));
210
211
  return () => disposers.forEach(d => d());
211
212
  });
213
+ // ── Web 控制台 ─────────────────────────────────────────────────────────
214
+ useContext("web", (web) => {
215
+ return web.addEntry(path.resolve(import.meta.dirname, "../client/index.tsx"));
216
+ });
217
+ useContext("router", "qq", (router, qq) => {
218
+ router.get("/api/qq/bots", async (ctx) => {
219
+ try {
220
+ const bots = Array.from(qq.bots.values());
221
+ const result = await Promise.all(bots.map(async (bot) => {
222
+ try {
223
+ let guildCount = 0;
224
+ try {
225
+ const guilds = await bot.getGuilds();
226
+ guildCount = guilds?.length || 0;
227
+ }
228
+ catch { }
229
+ return {
230
+ name: bot.$config.name,
231
+ connected: bot.$connected || false,
232
+ guildCount,
233
+ status: bot.$connected ? "online" : "offline",
234
+ };
235
+ }
236
+ catch {
237
+ return { name: bot.$config.name, connected: false, guildCount: 0, status: "error" };
238
+ }
239
+ }));
240
+ ctx.body = { success: true, data: result };
241
+ }
242
+ catch {
243
+ ctx.status = 500;
244
+ ctx.body = { success: false, error: "获取机器人数据失败" };
245
+ }
246
+ });
247
+ // Bot 连接/断开
248
+ router.post("/api/qq/bots/:name/connect", async (ctx) => {
249
+ try {
250
+ const bot = qq.bots.get(ctx.params.name);
251
+ if (!bot) {
252
+ ctx.status = 404;
253
+ ctx.body = { success: false, error: "Bot 不存在" };
254
+ return;
255
+ }
256
+ if (bot.$connected) {
257
+ ctx.body = { success: true, message: "已经在线" };
258
+ return;
259
+ }
260
+ await bot.$connect();
261
+ ctx.body = { success: true, message: "连接成功" };
262
+ }
263
+ catch (e) {
264
+ ctx.status = 500;
265
+ ctx.body = { success: false, error: e?.message || "连接失败" };
266
+ }
267
+ });
268
+ router.post("/api/qq/bots/:name/disconnect", async (ctx) => {
269
+ try {
270
+ const bot = qq.bots.get(ctx.params.name);
271
+ if (!bot) {
272
+ ctx.status = 404;
273
+ ctx.body = { success: false, error: "Bot 不存在" };
274
+ return;
275
+ }
276
+ if (!bot.$connected) {
277
+ ctx.body = { success: true, message: "已经离线" };
278
+ return;
279
+ }
280
+ await bot.$disconnect();
281
+ ctx.body = { success: true, message: "已断开" };
282
+ }
283
+ catch (e) {
284
+ ctx.status = 500;
285
+ ctx.body = { success: false, error: e?.message || "断开失败" };
286
+ }
287
+ });
288
+ // 频道列表
289
+ router.get("/api/qq/bots/:name/guilds", async (ctx) => {
290
+ try {
291
+ const bot = qq.bots.get(ctx.params.name);
292
+ if (!bot) {
293
+ ctx.status = 404;
294
+ ctx.body = { success: false, error: "Bot 不存在" };
295
+ return;
296
+ }
297
+ if (!bot.$connected) {
298
+ ctx.status = 400;
299
+ ctx.body = { success: false, error: "Bot 未连接" };
300
+ return;
301
+ }
302
+ const guilds = await bot.getGuilds();
303
+ ctx.body = { success: true, data: guilds || [] };
304
+ }
305
+ catch (e) {
306
+ ctx.status = 500;
307
+ ctx.body = { success: false, error: e?.message || "获取频道失败" };
308
+ }
309
+ });
310
+ // 子频道列表
311
+ router.get("/api/qq/bots/:name/guilds/:guildId/channels", async (ctx) => {
312
+ try {
313
+ const bot = qq.bots.get(ctx.params.name);
314
+ if (!bot) {
315
+ ctx.status = 404;
316
+ ctx.body = { success: false, error: "Bot 不存在" };
317
+ return;
318
+ }
319
+ if (!bot.$connected) {
320
+ ctx.status = 400;
321
+ ctx.body = { success: false, error: "Bot 未连接" };
322
+ return;
323
+ }
324
+ const channels = await bot.getChannels(ctx.params.guildId);
325
+ ctx.body = { success: true, data: channels || [] };
326
+ }
327
+ catch (e) {
328
+ ctx.status = 500;
329
+ ctx.body = { success: false, error: e?.message || "获取子频道失败" };
330
+ }
331
+ });
332
+ });
212
333
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-qq",
3
- "version": "1.0.64",
3
+ "version": "1.0.66",
4
4
  "description": "Zhin.js adapter for QQ Official Bot",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -37,12 +37,30 @@
37
37
  "qq-official-bot": "^1.0.12"
38
38
  },
39
39
  "devDependencies": {
40
- "typescript": "^5.9.3",
41
- "zhin.js": "1.0.62"
40
+ "@types/react": "^19.2.2",
41
+ "@types/react-dom": "^19.2.1",
42
+ "lucide-react": "^0.469.0",
43
+ "typescript": "^6.0.0",
44
+ "@zhin.js/console": "2.0.6",
45
+ "zhin.js": "1.0.64"
42
46
  },
43
47
  "peerDependencies": {
44
- "@zhin.js/logger": "0.1.46",
45
- "zhin.js": "1.0.62"
48
+ "@zhin.js/client": "1.0.16",
49
+ "@zhin.js/console": "2.0.6",
50
+ "@zhin.js/http": "1.0.59",
51
+ "@zhin.js/logger": "0.1.48",
52
+ "zhin.js": "1.0.64"
53
+ },
54
+ "peerDependenciesMeta": {
55
+ "@zhin.js/client": {
56
+ "optional": true
57
+ },
58
+ "@zhin.js/http": {
59
+ "optional": true
60
+ },
61
+ "@zhin.js/console": {
62
+ "optional": true
63
+ }
46
64
  },
47
65
  "files": [
48
66
  "src",
@@ -50,6 +68,7 @@
50
68
  "client",
51
69
  "dist",
52
70
  "skills",
71
+ "plugin.yml",
53
72
  "README.md",
54
73
  "node",
55
74
  "CHANGELOG.md"
@@ -59,8 +78,8 @@
59
78
  "registry": "https://registry.npmjs.org"
60
79
  },
61
80
  "scripts": {
62
- "build": "pnpm build:node",
63
- "clean": "rimraf lib",
81
+ "build": "tsc && (test -f ../../services/console/lib/bin.js && node ../../services/console/lib/bin.js build || echo 'Skipping client build: console not built yet')",
82
+ "clean": "rimraf lib dist",
64
83
  "build:node": "tsc"
65
84
  }
66
85
  }
package/plugin.yml ADDED
@@ -0,0 +1,3 @@
1
+ name: adapter-qq
2
+ description: QQ 官方机器人适配器:群管理、频道/子频道管理、角色管理
3
+ version: 1.0.59
package/src/index.ts CHANGED
@@ -1,8 +1,18 @@
1
1
  /**
2
2
  * QQ 官方适配器入口:类型扩展、导出、注册
3
3
  */
4
+ import path from "node:path";
4
5
  import { usePlugin, type Plugin, type IGroupManagement, createGroupManagementTools, type ToolFeature } from "zhin.js";
5
6
  import { QQAdapter } from "./adapter.js";
7
+ import type { WebServer } from "@zhin.js/console";
8
+
9
+ declare module "zhin.js" {
10
+ namespace Plugin {
11
+ interface Contexts {
12
+ web: WebServer;
13
+ }
14
+ }
15
+ }
6
16
 
7
17
  declare module "zhin.js" {
8
18
  interface Adapters {
@@ -35,7 +45,7 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
35
45
  qq as unknown as IGroupManagement,
36
46
  'qq',
37
47
  );
38
- const disposers: (() => void)[] = groupTools.map(t => toolService.addTool(t, 'qq'));
48
+ const disposers: (() => void)[] = groupTools.map(t => toolService.addTool(t, plugin.name));
39
49
 
40
50
  // 获取频道列表
41
51
  disposers.push(toolService.addTool({
@@ -56,7 +66,7 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
56
66
  const guilds = await bot.getGuilds();
57
67
  return { guilds, count: guilds.length };
58
68
  },
59
- }, 'qq'));
69
+ }, plugin.name));
60
70
 
61
71
  // 获取子频道列表
62
72
  disposers.push(toolService.addTool({
@@ -78,7 +88,7 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
78
88
  const channels = await bot.getChannels(args.guild_id);
79
89
  return { channels, count: channels.length };
80
90
  },
81
- }, 'qq'));
91
+ }, plugin.name));
82
92
 
83
93
  // 获取角色列表
84
94
  disposers.push(toolService.addTool({
@@ -100,7 +110,7 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
100
110
  const roles = await bot.getGuildRoles(args.guild_id);
101
111
  return { roles, count: roles.length };
102
112
  },
103
- }, 'qq'));
113
+ }, plugin.name));
104
114
 
105
115
  // 创建角色
106
116
  disposers.push(toolService.addTool({
@@ -124,7 +134,7 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
124
134
  const role = await bot.createGuildRole(args.guild_id, args.name, args.color);
125
135
  return { success: !!role, role, message: role ? `角色 "${args.name}" 创建成功` : '创建失败' };
126
136
  },
127
- }, 'qq'));
137
+ }, plugin.name));
128
138
 
129
139
  // 添加角色
130
140
  disposers.push(toolService.addTool({
@@ -149,7 +159,7 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
149
159
  const success = await bot.addMemberRole(args.guild_id, args.channel_id, args.user_id, args.role_id);
150
160
  return { success, message: success ? '已给成员添加角色' : '操作失败' };
151
161
  },
152
- }, 'qq'));
162
+ }, plugin.name));
153
163
 
154
164
  // 移除角色
155
165
  disposers.push(toolService.addTool({
@@ -174,7 +184,7 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
174
184
  const success = await bot.removeMemberRole(args.guild_id, args.channel_id, args.user_id, args.role_id);
175
185
  return { success, message: success ? '已移除成员的角色' : '操作失败' };
176
186
  },
177
- }, 'qq'));
187
+ }, plugin.name));
178
188
 
179
189
  // 子频道详情
180
190
  disposers.push(toolService.addTool({
@@ -196,7 +206,7 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
196
206
  const info = await bot.getChannelInfo(args.channel_id);
197
207
  return info;
198
208
  },
199
- }, 'qq'));
209
+ }, plugin.name));
200
210
 
201
211
  // 单成员详情
202
212
  disposers.push(toolService.addTool({
@@ -219,7 +229,93 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
219
229
  const member = await bot.getGuildMember(args.guild_id, args.user_id);
220
230
  return member;
221
231
  },
222
- }, 'qq'));
232
+ }, plugin.name));
223
233
 
224
234
  return () => disposers.forEach(d => d());
225
235
  });
236
+
237
+ // ── Web 控制台 ─────────────────────────────────────────────────────────
238
+ useContext("web", (web: WebServer) => {
239
+ return web.addEntry(path.resolve(import.meta.dirname, "../client/index.tsx"));
240
+ });
241
+
242
+ useContext("router", "qq", (router: any, qq: QQAdapter) => {
243
+ router.get("/api/qq/bots", async (ctx: any) => {
244
+ try {
245
+ const bots = Array.from(qq.bots.values());
246
+ const result = await Promise.all(bots.map(async (bot) => {
247
+ try {
248
+ let guildCount = 0;
249
+ try { const guilds = await bot.getGuilds(); guildCount = guilds?.length || 0; } catch {}
250
+ return {
251
+ name: bot.$config.name,
252
+ connected: bot.$connected || false,
253
+ guildCount,
254
+ status: bot.$connected ? "online" : "offline",
255
+ };
256
+ } catch {
257
+ return { name: bot.$config.name, connected: false, guildCount: 0, status: "error" };
258
+ }
259
+ }));
260
+ ctx.body = { success: true, data: result };
261
+ } catch {
262
+ ctx.status = 500;
263
+ ctx.body = { success: false, error: "获取机器人数据失败" };
264
+ }
265
+ });
266
+
267
+ // Bot 连接/断开
268
+ router.post("/api/qq/bots/:name/connect", async (ctx: any) => {
269
+ try {
270
+ const bot = qq.bots.get(ctx.params.name);
271
+ if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
272
+ if (bot.$connected) { ctx.body = { success: true, message: "已经在线" }; return; }
273
+ await bot.$connect();
274
+ ctx.body = { success: true, message: "连接成功" };
275
+ } catch (e: any) {
276
+ ctx.status = 500;
277
+ ctx.body = { success: false, error: e?.message || "连接失败" };
278
+ }
279
+ });
280
+
281
+ router.post("/api/qq/bots/:name/disconnect", async (ctx: any) => {
282
+ try {
283
+ const bot = qq.bots.get(ctx.params.name);
284
+ if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
285
+ if (!bot.$connected) { ctx.body = { success: true, message: "已经离线" }; return; }
286
+ await bot.$disconnect();
287
+ ctx.body = { success: true, message: "已断开" };
288
+ } catch (e: any) {
289
+ ctx.status = 500;
290
+ ctx.body = { success: false, error: e?.message || "断开失败" };
291
+ }
292
+ });
293
+
294
+ // 频道列表
295
+ router.get("/api/qq/bots/:name/guilds", async (ctx: any) => {
296
+ try {
297
+ const bot = qq.bots.get(ctx.params.name);
298
+ if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
299
+ if (!bot.$connected) { ctx.status = 400; ctx.body = { success: false, error: "Bot 未连接" }; return; }
300
+ const guilds = await bot.getGuilds();
301
+ ctx.body = { success: true, data: guilds || [] };
302
+ } catch (e: any) {
303
+ ctx.status = 500;
304
+ ctx.body = { success: false, error: e?.message || "获取频道失败" };
305
+ }
306
+ });
307
+
308
+ // 子频道列表
309
+ router.get("/api/qq/bots/:name/guilds/:guildId/channels", async (ctx: any) => {
310
+ try {
311
+ const bot = qq.bots.get(ctx.params.name);
312
+ if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
313
+ if (!bot.$connected) { ctx.status = 400; ctx.body = { success: false, error: "Bot 未连接" }; return; }
314
+ const channels = await bot.getChannels(ctx.params.guildId);
315
+ ctx.body = { success: true, data: channels || [] };
316
+ } catch (e: any) {
317
+ ctx.status = 500;
318
+ ctx.body = { success: false, error: e?.message || "获取子频道失败" };
319
+ }
320
+ });
321
+ });