@zhin.js/adapter-qq 1.0.84 → 1.1.2

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.
Files changed (107) hide show
  1. package/CHANGELOG.md +940 -17
  2. package/PERMITS.md +25 -0
  3. package/README.md +135 -233
  4. package/adapters/qq/index.js +50 -0
  5. package/adapters/qq/index.ts +71 -0
  6. package/agents/qq/agent.json +20 -0
  7. package/agents/qq/boundaries.md +3 -0
  8. package/agents/qq/conventions.md +3 -0
  9. package/agents/qq/skills/qq/SKILL.md +22 -0
  10. package/agents/qq/skills/qq/tools/add_role/index.js +21 -0
  11. package/agents/qq/skills/qq/tools/add_role/index.ts +21 -0
  12. package/agents/qq/skills/qq/tools/channel_info/index.js +17 -0
  13. package/agents/qq/skills/qq/tools/channel_info/index.ts +17 -0
  14. package/agents/qq/skills/qq/tools/create_role/index.js +20 -0
  15. package/agents/qq/skills/qq/tools/create_role/index.ts +20 -0
  16. package/agents/qq/skills/qq/tools/list_channels/index.js +18 -0
  17. package/agents/qq/skills/qq/tools/list_channels/index.ts +18 -0
  18. package/agents/qq/skills/qq/tools/list_guilds/index.js +14 -0
  19. package/agents/qq/skills/qq/tools/list_guilds/index.ts +14 -0
  20. package/agents/qq/skills/qq/tools/list_roles/index.js +18 -0
  21. package/agents/qq/skills/qq/tools/list_roles/index.ts +18 -0
  22. package/agents/qq/skills/qq/tools/member_detail/index.js +18 -0
  23. package/agents/qq/skills/qq/tools/member_detail/index.ts +18 -0
  24. package/agents/qq/skills/qq/tools/remove_role/index.js +21 -0
  25. package/agents/qq/skills/qq/tools/remove_role/index.ts +21 -0
  26. package/agents/qq/system.md +3 -0
  27. package/commands/qq/endpoint/add/[[id]]/index.js +3 -0
  28. package/commands/qq/endpoint/add/[[id]]/index.ts +3 -0
  29. package/commands/qq/endpoint/cancel/index.js +11 -0
  30. package/commands/qq/endpoint/cancel/index.ts +15 -0
  31. package/commands/qq/endpoint/definition.js +188 -0
  32. package/commands/qq/endpoint/definition.ts +263 -0
  33. package/commands/qq/endpoint/list/index.js +3 -0
  34. package/commands/qq/endpoint/list/index.ts +3 -0
  35. package/commands/qq/endpoint/remove/[id]/index.js +3 -0
  36. package/commands/qq/endpoint/remove/[id]/index.ts +3 -0
  37. package/lib/client.d.ts +12 -0
  38. package/lib/client.js +2 -0
  39. package/lib/endpoint.d.ts +56 -0
  40. package/lib/endpoint.js +456 -0
  41. package/lib/index.d.ts +8 -18
  42. package/lib/index.js +8 -338
  43. package/lib/outbound.d.ts +17 -0
  44. package/lib/outbound.js +234 -0
  45. package/lib/platform-permit.d.ts +15 -0
  46. package/lib/platform-permit.js +41 -0
  47. package/lib/protocol.d.ts +90 -0
  48. package/lib/protocol.js +161 -0
  49. package/lib/qq-bind-api.d.ts +36 -0
  50. package/lib/qq-bind-api.js +89 -0
  51. package/lib/qq-bind-flow.d.ts +19 -0
  52. package/lib/qq-bind-flow.js +85 -0
  53. package/lib/qq-bot-kind-prompt.d.ts +9 -0
  54. package/lib/qq-bot-kind-prompt.js +37 -0
  55. package/lib/qq-intents.d.ts +27 -0
  56. package/lib/qq-intents.js +51 -0
  57. package/lib/qq-runtime-state.d.ts +30 -0
  58. package/lib/qq-runtime-state.js +14 -0
  59. package/lib/side-event-dispatch.d.ts +10 -0
  60. package/lib/side-event-dispatch.js +114 -0
  61. package/lib/webhook.d.ts +18 -0
  62. package/lib/webhook.js +103 -0
  63. package/lib/ws.d.ts +55 -0
  64. package/lib/ws.js +234 -0
  65. package/middlewares/bot-kind-reply/index.js +47 -0
  66. package/middlewares/bot-kind-reply/index.ts +65 -0
  67. package/package.json +82 -29
  68. package/plugin.js +18 -0
  69. package/schema.json +158 -0
  70. package/src/client.ts +16 -0
  71. package/src/endpoint.ts +534 -0
  72. package/src/index.ts +66 -326
  73. package/src/outbound.ts +255 -0
  74. package/src/platform-permit.ts +56 -0
  75. package/src/protocol.ts +249 -0
  76. package/src/qq-bind-api.ts +145 -0
  77. package/src/qq-bind-flow.ts +127 -0
  78. package/src/qq-bot-kind-prompt.ts +47 -0
  79. package/src/qq-intents.ts +77 -0
  80. package/src/qq-runtime-state.ts +51 -0
  81. package/src/side-event-dispatch.ts +140 -0
  82. package/src/webhook.ts +132 -0
  83. package/src/ws.ts +331 -0
  84. package/client/Dashboard.tsx +0 -230
  85. package/client/index.tsx +0 -11
  86. package/client/tsconfig.json +0 -7
  87. package/client/utils/api.ts +0 -17
  88. package/dist/index.js +0 -30
  89. package/lib/adapter.d.ts +0 -17
  90. package/lib/adapter.d.ts.map +0 -1
  91. package/lib/adapter.js +0 -49
  92. package/lib/adapter.js.map +0 -1
  93. package/lib/bot.d.ts +0 -102
  94. package/lib/bot.d.ts.map +0 -1
  95. package/lib/bot.js +0 -337
  96. package/lib/bot.js.map +0 -1
  97. package/lib/index.d.ts.map +0 -1
  98. package/lib/index.js.map +0 -1
  99. package/lib/types.d.ts +0 -16
  100. package/lib/types.d.ts.map +0 -1
  101. package/lib/types.js +0 -2
  102. package/lib/types.js.map +0 -1
  103. package/plugin.yml +0 -3
  104. package/skills/qq/SKILL.md +0 -97
  105. package/src/adapter.ts +0 -58
  106. package/src/bot.ts +0 -347
  107. package/src/types.ts +0 -24
@@ -1,230 +0,0 @@
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
- }
package/client/index.tsx DELETED
@@ -1,11 +0,0 @@
1
- import type { PluginRegisterHostApi } from '@zhin.js/console-types'
2
- import QQDashboard from './Dashboard'
3
-
4
- export function register(api: PluginRegisterHostApi) {
5
- api.addRoute({
6
- path: '/console/qq',
7
- name: 'QQ官方',
8
- element: api.React.createElement(QQDashboard, { hostReact: api.React }),
9
- })
10
- api.addTool({ id: 'qq', name: 'QQ官方', path: '/console/qq' })
11
- }
@@ -1,7 +0,0 @@
1
- {
2
- "extends": "../node_modules/@zhin.js/console/browser.tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "../dist"
5
- },
6
- "include": ["./**/*"]
7
- }
@@ -1,17 +0,0 @@
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 DELETED
@@ -1,30 +0,0 @@
1
- import{useEffect as Se,useState as c,useCallback as ke}from"react";var Q="zhin_api_token";function ue(){return localStorage.getItem(Q)}async function k(t,o){let l=ue(),f=new Headers(o?.headers);l&&f.set("Authorization",`Bearer ${l}`);let n=await fetch(t,{...o,headers:f});return n.status===401&&(localStorage.removeItem(Q),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),n}import{forwardRef as re,createElement as ie}from"react";var v=(...t)=>t.filter((o,l,f)=>!!o&&o.trim()!==""&&f.indexOf(o)===l).join(" ").trim();var J=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();var _=t=>t.replace(/^([A-Z])|[\s-_]+(\w)/g,(o,l,f)=>f?f.toUpperCase():l.toLowerCase());var V=t=>{let o=_(t);return o.charAt(0).toUpperCase()+o.slice(1)};import{forwardRef as se,createElement as Y}from"react";var U={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};var j=t=>{for(let o in t)if(o.startsWith("aria-")||o==="role"||o==="title")return!0;return!1};import{createContext as de,useContext as le,useMemo as Te,createElement as be}from"react";var fe=de({});var $=()=>le(fe);var ee=se(({color:t,size:o,strokeWidth:l,absoluteStrokeWidth:f,className:n="",children:s,iconNode:m,...L},R)=>{let{size:I=24,strokeWidth:x=2,absoluteStrokeWidth:O=!1,color:h="currentColor",className:q=""}=$()??{},g=f??O?Number(l??x)*24/Number(o??I):l??x;return Y("svg",{ref:R,...U,width:o??I??U.width,height:o??I??U.height,stroke:t??h,strokeWidth:g,className:v("lucide",q,n),...!s&&!j(L)&&{"aria-hidden":"true"},...L},[...m.map(([T,S])=>Y(T,S)),...Array.isArray(s)?s:[s]])});var d=(t,o)=>{let l=re(({className:f,...n},s)=>ie(ee,{ref:s,iconNode:o,className:v(`lucide-${J(V(t))}`,`lucide-${t}`,f),...n}));return l.displayName=V(t),l};var ce=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],w=d("chevron-down",ce);var ne=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],P=d("chevron-right",ne);var pe=[["line",{x1:"4",x2:"20",y1:"9",y2:"9",key:"4lhtct"}],["line",{x1:"4",x2:"20",y1:"15",y2:"15",key:"vyu0kd"}],["line",{x1:"10",x2:"8",y1:"3",y2:"21",key:"1ggp8o"}],["line",{x1:"16",x2:"14",y1:"3",y2:"21",key:"weycgp"}]],C=d("hash",pe);var me=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],p=d("loader-circle",me);var Le=[["path",{d:"M18.36 6.64A9 9 0 0 1 20.77 15",key:"dxknvb"}],["path",{d:"M6.16 6.16a9 9 0 1 0 12.68 12.68",key:"1x7qb5"}],["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],A=d("power-off",Le);var Ie=[["path",{d:"M12 2v10",key:"mnfbl"}],["path",{d:"M18.4 6.6a9 9 0 1 1-12.77.04",key:"obofu9"}]],B=d("power",Ie);var xe=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],M=d("refresh-cw",xe);var Ce=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],F=d("server",Ce);var he=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],D=d("wifi-off",he);var ge=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],y=d("wifi",ge);import{Fragment as we,jsx as a,jsxs as u}from"react/jsx-runtime";function E(){let[t,o]=c([]),[l,f]=c(!0),[n,s]=c(""),[m,L]=c("overview"),[R,I]=c({}),[x,O]=c(""),[h,q]=c([]),[g,T]=c(!1),[S,H]=c(null),[G,z]=c({}),[ae,N]=c(null),b=ke(async()=>{f(!0),s("");try{let i=await(await k("/api/qq/bots")).json();i.success?o(i.data):s(i.error||"\u83B7\u53D6\u6570\u636E\u5931\u8D25")}catch{s("\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u5668")}finally{f(!1)}},[]);Se(()=>{b()},[b]);let te=async(e,i)=>{I(r=>({...r,[e]:!0}));try{let r=i?"disconnect":"connect",Z=await(await k(`/api/qq/bots/${encodeURIComponent(e)}/${r}`,{method:"POST"})).json();Z.success||s(Z.error||"\u64CD\u4F5C\u5931\u8D25"),await b()}catch{s("\u64CD\u4F5C\u5931\u8D25")}finally{I(r=>({...r,[e]:!1}))}},X=async e=>{O(e),T(!0),q([]),H(null),z({});try{let r=await(await k(`/api/qq/bots/${encodeURIComponent(e)}/guilds`)).json();r.success?q(r.data):s(r.error||"\u83B7\u53D6\u9891\u9053\u5931\u8D25")}catch{s("\u83B7\u53D6\u9891\u9053\u5931\u8D25")}finally{T(!1)}},oe=async e=>{if(S===e){H(null);return}if(H(e),!G[e]){N(e);try{let r=await(await k(`/api/qq/bots/${encodeURIComponent(x)}/guilds/${encodeURIComponent(e)}/channels`)).json();r.success&&z(K=>({...K,[e]:r.data}))}catch{}finally{N(null)}}},W=t.filter(e=>e.connected);return u("div",{className:"p-6 max-w-5xl mx-auto",children:[u("div",{className:"flex items-center justify-between mb-6",children:[u("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[a(F,{className:"w-6 h-6"})," QQ \u5B98\u65B9\u673A\u5668\u4EBA"]}),u("button",{onClick:b,disabled:l,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:[a(M,{className:`w-4 h-4 ${l?"animate-spin":""}`})," \u5237\u65B0"]})]}),n&&a("div",{className:"mb-4 p-3 bg-red-50 text-red-600 rounded border border-red-200",children:n}),u("div",{className:"flex gap-1 mb-6 border-b",children:[a("button",{onClick:()=>L("overview"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${m==="overview"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"\u6982\u89C8"}),a("button",{onClick:()=>L("guilds"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${m==="guilds"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"\u9891\u9053\u6D4F\u89C8"})]}),m==="overview"&&u(we,{children:[!l&&!t.length&&!n&&a("div",{className:"text-center text-gray-500 py-12",children:"\u6682\u65E0 QQ \u673A\u5668\u4EBA\u5B9E\u4F8B"}),a("div",{className:"grid gap-4 md:grid-cols-2",children:t.map(e=>u("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[u("div",{className:"flex items-center justify-between mb-3",children:[a("span",{className:"font-medium text-lg",children:e.name}),e.connected?u("span",{className:"flex items-center gap-1 text-green-600 text-sm",children:[a(y,{className:"w-4 h-4"})," \u5728\u7EBF"]}):u("span",{className:"flex items-center gap-1 text-gray-400 text-sm",children:[a(D,{className:"w-4 h-4"})," \u79BB\u7EBF"]})]}),a("div",{className:"grid grid-cols-1 gap-2 text-sm text-gray-600 mb-3",children:u("div",{className:"flex justify-between",children:[a("span",{children:"\u9891\u9053\u6570"}),a("span",{className:"font-mono",children:e.guildCount})]})}),u("div",{className:"flex gap-2",children:[u("button",{onClick:()=>te(e.name,e.connected),disabled:R[e.name],className:`flex items-center gap-1 px-3 py-1.5 rounded text-sm text-white ${e.connected?"bg-red-500 hover:bg-red-600":"bg-green-500 hover:bg-green-600"} disabled:opacity-50`,children:[R[e.name]?a(p,{className:"w-3.5 h-3.5 animate-spin"}):e.connected?a(A,{className:"w-3.5 h-3.5"}):a(B,{className:"w-3.5 h-3.5"}),e.connected?"\u65AD\u5F00":"\u8FDE\u63A5"]}),e.connected&&u("button",{onClick:()=>{L("guilds"),X(e.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:[a(C,{className:"w-3.5 h-3.5"})," \u6D4F\u89C8\u9891\u9053"]})]})]},e.name))})]}),m==="guilds"&&u("div",{children:[W.length>0&&u("div",{className:"mb-4 flex items-center gap-2",children:[a("label",{className:"text-sm text-gray-500",children:"\u9009\u62E9\u673A\u5668\u4EBA\uFF1A"}),u("select",{value:x,onChange:e=>X(e.target.value),className:"border rounded px-2 py-1 text-sm",children:[a("option",{value:"",children:"--"}),W.map(e=>a("option",{value:e.name,children:e.name},e.name))]})]}),!W.length&&a("div",{className:"text-center text-gray-500 py-8",children:"\u6682\u65E0\u5728\u7EBF\u673A\u5668\u4EBA"}),g&&a("div",{className:"flex justify-center py-8",children:a(p,{className:"w-6 h-6 animate-spin text-blue-500"})}),!g&&h.length>0&&a("div",{className:"border rounded-lg bg-card shadow-sm divide-y",children:h.map(e=>u("div",{children:[u("button",{onClick:()=>oe(e.id),className:"w-full flex items-center gap-2 px-4 py-3 hover:bg-gray-50 text-left",children:[S===e.id?a(w,{className:"w-4 h-4 text-gray-400"}):a(P,{className:"w-4 h-4 text-gray-400"}),a("span",{className:"font-medium",children:e.name}),a("span",{className:"text-xs text-gray-400 ml-auto",children:e.id})]}),S===e.id&&a("div",{className:"px-4 pb-3",children:ae===e.id?u("div",{className:"flex items-center gap-2 text-gray-400 text-sm py-2 pl-6",children:[a(p,{className:"w-4 h-4 animate-spin"})," \u52A0\u8F7D\u4E2D\u2026"]}):G[e.id]?.length?a("div",{className:"pl-6 space-y-1",children:G[e.id].map(i=>u("div",{className:"flex items-center gap-2 text-sm text-gray-600 py-1",children:[a(C,{className:"w-3.5 h-3.5 text-gray-400"}),a("span",{children:i.name}),a("span",{className:"text-xs text-gray-400 ml-auto",children:i.id})]},i.id))}):a("div",{className:"pl-6 text-sm text-gray-400 py-1",children:"\u65E0\u5B50\u9891\u9053"})})]},e.id))}),!g&&x&&!h.length&&a("div",{className:"text-center text-gray-400 py-8",children:"\u8BE5\u673A\u5668\u4EBA\u672A\u52A0\u5165\u4EFB\u4F55\u9891\u9053"})]})]})}function Ra(t){t.addRoute({path:"/console/qq",name:"QQ\u5B98\u65B9",element:t.React.createElement(E,{hostReact:t.React})}),t.addTool({id:"qq",name:"QQ\u5B98\u65B9",path:"/console/qq"})}export{Ra as register};
2
- /*! Bundled license information:
3
-
4
- lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs:
5
- lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs:
6
- lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs:
7
- lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs:
8
- lucide-react/dist/esm/defaultAttributes.mjs:
9
- lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs:
10
- lucide-react/dist/esm/context.mjs:
11
- lucide-react/dist/esm/Icon.mjs:
12
- lucide-react/dist/esm/createLucideIcon.mjs:
13
- lucide-react/dist/esm/icons/chevron-down.mjs:
14
- lucide-react/dist/esm/icons/chevron-right.mjs:
15
- lucide-react/dist/esm/icons/hash.mjs:
16
- lucide-react/dist/esm/icons/loader-circle.mjs:
17
- lucide-react/dist/esm/icons/power-off.mjs:
18
- lucide-react/dist/esm/icons/power.mjs:
19
- lucide-react/dist/esm/icons/refresh-cw.mjs:
20
- lucide-react/dist/esm/icons/server.mjs:
21
- lucide-react/dist/esm/icons/wifi-off.mjs:
22
- lucide-react/dist/esm/icons/wifi.mjs:
23
- lucide-react/dist/esm/lucide-react.mjs:
24
- (**
25
- * @license lucide-react v1.16.0 - ISC
26
- *
27
- * This source code is licensed under the ISC license.
28
- * See the LICENSE file in the root directory of this source tree.
29
- *)
30
- */
package/lib/adapter.d.ts DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * QQ 官方适配器
3
- */
4
- import { Adapter, Plugin } from "zhin.js";
5
- import { QQBot } from "./bot.js";
6
- import type { QQBotConfig, ReceiverMode } from "./types.js";
7
- export declare class QQAdapter extends Adapter<QQBot<ReceiverMode>> {
8
- constructor(plugin: Plugin);
9
- createBot(config: QQBotConfig<ReceiverMode>): QQBot<ReceiverMode>;
10
- kickMember(botId: string, sceneId: string, userId: string): Promise<boolean>;
11
- muteMember(botId: string, sceneId: string, userId: string, duration?: number): Promise<boolean>;
12
- muteAll(botId: string, sceneId: string, enable?: boolean): Promise<boolean>;
13
- listMembers(botId: string, sceneId: string): Promise<any[]>;
14
- getGroupInfo(botId: string, sceneId: string): Promise<any>;
15
- start(): Promise<void>;
16
- }
17
- //# sourceMappingURL=adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,OAAO,EACP,MAAM,EACP,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,SAAU,SAAQ,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC7C,MAAM,EAAE,MAAM;IAI1B,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;IAM3D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMzD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAM;IAMzE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAO;IAMrD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAM1C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAQ3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
package/lib/adapter.js DELETED
@@ -1,49 +0,0 @@
1
- /**
2
- * QQ 官方适配器
3
- */
4
- import { Adapter, } from "zhin.js";
5
- import { QQBot } from "./bot.js";
6
- export class QQAdapter extends Adapter {
7
- constructor(plugin) {
8
- super(plugin, "qq", []);
9
- }
10
- createBot(config) {
11
- return new QQBot(this, config);
12
- }
13
- // ── IGroupManagement 标准群管方法 ──────────────────────────────────
14
- async kickMember(botId, sceneId, userId) {
15
- const bot = this.bots.get(botId);
16
- if (!bot)
17
- throw new Error(`Bot ${botId} 不存在`);
18
- return bot.removeGuildMember(sceneId, userId, false);
19
- }
20
- async muteMember(botId, sceneId, userId, duration = 600) {
21
- const bot = this.bots.get(botId);
22
- if (!bot)
23
- throw new Error(`Bot ${botId} 不存在`);
24
- return bot.muteMembers(sceneId, [userId], duration);
25
- }
26
- async muteAll(botId, sceneId, enable = true) {
27
- const bot = this.bots.get(botId);
28
- if (!bot)
29
- throw new Error(`Bot ${botId} 不存在`);
30
- return bot.muteAll(sceneId, enable ? 600 : 0);
31
- }
32
- async listMembers(botId, sceneId) {
33
- const bot = this.bots.get(botId);
34
- if (!bot)
35
- throw new Error(`Bot ${botId} 不存在`);
36
- return bot.getGuildMembers(sceneId);
37
- }
38
- async getGroupInfo(botId, sceneId) {
39
- const bot = this.bots.get(botId);
40
- if (!bot)
41
- throw new Error(`Bot ${botId} 不存在`);
42
- return bot.getGuildInfo(sceneId);
43
- }
44
- // ── 生命周期 ───────────────────────────────────────────────────────
45
- async start() {
46
- await super.start();
47
- }
48
- }
49
- //# sourceMappingURL=adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,OAAO,GAER,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,MAAM,OAAO,SAAU,SAAQ,OAA4B;IACzD,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS,CAAC,MAAiC;QACzC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,gEAAgE;IAEhE,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,OAAe,EAAE,MAAc;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,OAAe,EAAE,MAAc,EAAE,QAAQ,GAAG,GAAG;QAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,OAAe,EAAE,MAAM,GAAG,IAAI;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,OAAe;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,OAAe;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,kEAAkE;IAElE,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CAEF"}
package/lib/bot.d.ts DELETED
@@ -1,102 +0,0 @@
1
- /**
2
- * QQ 官方 Bot 实现
3
- */
4
- import { Bot, PrivateMessageEvent, GroupMessageEvent } from "qq-official-bot";
5
- import { Bot as ZhinBot, Message, SendOptions } from "zhin.js";
6
- import type { QQBotConfig, ReceiverMode, ApplicationPlatform } from "./types.js";
7
- import type { QQAdapter } from "./adapter.js";
8
- export declare class QQBot<T extends ReceiverMode, M extends ApplicationPlatform = ApplicationPlatform> extends Bot implements ZhinBot<QQBotConfig<T, M>, PrivateMessageEvent | GroupMessageEvent> {
9
- adapter: QQAdapter;
10
- $connected: boolean;
11
- $config: QQBotConfig<T, M>;
12
- get pluginLogger(): import("zhin.js").Logger;
13
- get $id(): string;
14
- constructor(adapter: QQAdapter, config: QQBotConfig<T, M>);
15
- private handleQQMessage;
16
- $connect(): Promise<void>;
17
- $disconnect(): Promise<void>;
18
- $formatMessage(msg: PrivateMessageEvent | GroupMessageEvent): Message<PrivateMessageEvent | GroupMessageEvent>;
19
- $sendMessage(options: SendOptions): Promise<string>;
20
- $recallMessage(id: string): Promise<void>;
21
- /**
22
- * 获取频道列表
23
- */
24
- getGuilds(): Promise<any[]>;
25
- /**
26
- * 获取频道详情
27
- * @param guildId 频道 ID
28
- */
29
- getGuildInfo(guildId: string): Promise<any>;
30
- /**
31
- * 获取子频道列表
32
- * @param guildId 频道 ID
33
- */
34
- getChannels(guildId: string): Promise<any[]>;
35
- /**
36
- * 获取子频道详情
37
- * @param channelId 子频道 ID
38
- */
39
- getChannelInfo(channelId: string): Promise<any>;
40
- /**
41
- * 获取频道成员列表
42
- * @param guildId 频道 ID
43
- */
44
- getGuildMembers(guildId: string): Promise<any[]>;
45
- /**
46
- * 获取频道成员详情
47
- * @param guildId 频道 ID
48
- * @param userId 用户 ID
49
- */
50
- getGuildMember(guildId: string, userId: string): Promise<any>;
51
- /**
52
- * 删除频道成员(踢出)
53
- * @param guildId 频道 ID
54
- * @param userId 用户 ID
55
- * @param addBlacklist 是否加入黑名单
56
- * @param deleteHistoryMsg 删除历史消息天数 (-1不删除,0全部删除,3/7/15/30)
57
- */
58
- removeGuildMember(guildId: string, userId: string, addBlacklist?: boolean, deleteHistoryMsg?: -1 | 0 | 3 | 7 | 15 | 30): Promise<boolean>;
59
- /**
60
- * 获取频道角色列表
61
- * @param guildId 频道 ID
62
- */
63
- getGuildRoles(guildId: string): Promise<any[]>;
64
- /**
65
- * 创建频道角色
66
- * @param guildId 频道 ID
67
- * @param name 角色名
68
- * @param color 颜色
69
- * @param hoist 是否在成员列表中单独展示 (0 或 1)
70
- */
71
- createGuildRole(guildId: string, name: string, color?: number, hoist?: 0 | 1): Promise<any>;
72
- /**
73
- * 给成员添加角色
74
- * @param guildId 频道 ID
75
- * @param channelId 子频道 ID
76
- * @param userId 用户 ID
77
- * @param roleId 角色 ID
78
- */
79
- addMemberRole(guildId: string, channelId: string, userId: string, roleId: string): Promise<boolean>;
80
- /**
81
- * 移除成员角色
82
- * @param guildId 频道 ID
83
- * @param channelId 子频道 ID
84
- * @param userId 用户 ID
85
- * @param roleId 角色 ID
86
- */
87
- removeMemberRole(guildId: string, channelId: string, userId: string, roleId: string): Promise<boolean>;
88
- /**
89
- * 禁言成员(批量)
90
- * @param guildId 频道 ID
91
- * @param userIds 用户 ID 列表
92
- * @param muteSeconds 禁言时长(秒),0 表示解除禁言
93
- */
94
- muteMembers(guildId: string, userIds: string[], muteSeconds: number): Promise<boolean>;
95
- /**
96
- * 全员禁言
97
- * @param guildId 频道 ID
98
- * @param muteSeconds 禁言时长(秒),0 表示解除禁言
99
- */
100
- muteAll(guildId: string, muteSeconds: number): Promise<boolean>;
101
- }
102
- //# sourceMappingURL=bot.d.ts.map
package/lib/bot.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}