@zhin.js/adapter-telegram 1.0.49 → 1.0.50

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,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.50
4
+
5
+ ### Patch Changes
6
+
7
+ - ba30934: fix: web 优化
8
+ - Updated dependencies [ba30934]
9
+ - @zhin.js/console@2.0.5
10
+ - @zhin.js/http@1.0.58
11
+ - zhin.js@1.0.63
12
+ - @zhin.js/logger@0.1.47
13
+
3
14
  ## 1.0.49
4
15
 
5
16
  ### Patch Changes
@@ -0,0 +1,295 @@
1
+ import { useEffect, useState, useCallback } from 'react'
2
+ import { apiFetch } from './utils/api'
3
+ import { RefreshCw, Server, Wifi, WifiOff, Power, PowerOff, Loader2, Link2, BarChart3, ShieldCheck, Plus, X } from 'lucide-react'
4
+
5
+ interface BotInfo {
6
+ name: string
7
+ connected: boolean
8
+ mode: string
9
+ status: string
10
+ botInfo: { username: string; firstName: string } | null
11
+ }
12
+
13
+ interface Admin {
14
+ user_id: number
15
+ username: string
16
+ first_name: string
17
+ status: string
18
+ }
19
+
20
+ type Tab = 'overview' | 'actions'
21
+
22
+ export default function TelegramDashboard() {
23
+ const [bots, setBots] = useState<BotInfo[]>([])
24
+ const [loading, setLoading] = useState(true)
25
+ const [error, setError] = useState('')
26
+ const [tab, setTab] = useState<Tab>('overview')
27
+ const [actionLoading, setActionLoading] = useState<Record<string, boolean>>({})
28
+
29
+ // Quick actions state
30
+ const [selectedBot, setSelectedBot] = useState('')
31
+ const [chatId, setChatId] = useState('')
32
+ const [inviteResult, setInviteResult] = useState('')
33
+ const [admins, setAdmins] = useState<Admin[]>([])
34
+ const [adminsLoading, setAdminsLoading] = useState(false)
35
+
36
+ // Poll state
37
+ const [pollQuestion, setPollQuestion] = useState('')
38
+ const [pollOptions, setPollOptions] = useState(['', ''])
39
+ const [pollAnonymous, setPollAnonymous] = useState(true)
40
+ const [pollMultiple, setPollMultiple] = useState(false)
41
+ const [pollResult, setPollResult] = useState('')
42
+ const [pollLoading, setPollLoading] = useState(false)
43
+
44
+ const fetchData = useCallback(async () => {
45
+ setLoading(true)
46
+ setError('')
47
+ try {
48
+ const res = await apiFetch('/api/telegram/bots')
49
+ const json = await res.json()
50
+ if (json.success) setBots(json.data)
51
+ else setError(json.error || '获取数据失败')
52
+ } catch {
53
+ setError('无法连接服务器')
54
+ } finally {
55
+ setLoading(false)
56
+ }
57
+ }, [])
58
+
59
+ useEffect(() => { fetchData() }, [fetchData])
60
+
61
+ const toggleConnect = async (name: string, connected: boolean) => {
62
+ setActionLoading(prev => ({ ...prev, [name]: true }))
63
+ try {
64
+ const endpoint = connected ? 'disconnect' : 'connect'
65
+ const res = await apiFetch(`/api/telegram/bots/${encodeURIComponent(name)}/${endpoint}`, { method: 'POST' })
66
+ const json = await res.json()
67
+ if (!json.success) setError(json.error || '操作失败')
68
+ await fetchData()
69
+ } catch {
70
+ setError('操作失败')
71
+ } finally {
72
+ setActionLoading(prev => ({ ...prev, [name]: false }))
73
+ }
74
+ }
75
+
76
+ const createInvite = async () => {
77
+ if (!selectedBot || !chatId) return
78
+ setInviteResult('')
79
+ try {
80
+ const res = await apiFetch(`/api/telegram/bots/${encodeURIComponent(selectedBot)}/invite`, {
81
+ method: 'POST',
82
+ headers: { 'Content-Type': 'application/json' },
83
+ body: JSON.stringify({ chat_id: chatId }),
84
+ })
85
+ const json = await res.json()
86
+ if (json.success && json.data?.invite_link) setInviteResult(json.data.invite_link)
87
+ else setError(json.error || '创建失败')
88
+ } catch {
89
+ setError('创建邀请链接失败')
90
+ }
91
+ }
92
+
93
+ const fetchAdmins = async () => {
94
+ if (!selectedBot || !chatId) return
95
+ setAdminsLoading(true)
96
+ setAdmins([])
97
+ try {
98
+ const res = await apiFetch(`/api/telegram/bots/${encodeURIComponent(selectedBot)}/admins?chat_id=${encodeURIComponent(chatId)}`)
99
+ const json = await res.json()
100
+ if (json.success && Array.isArray(json.data)) setAdmins(json.data)
101
+ else setError(json.error || '获取管理员失败')
102
+ } catch {
103
+ setError('获取管理员失败')
104
+ } finally {
105
+ setAdminsLoading(false)
106
+ }
107
+ }
108
+
109
+ const sendPoll = async () => {
110
+ if (!selectedBot || !chatId || !pollQuestion) return
111
+ const validOptions = pollOptions.filter(o => o.trim())
112
+ if (validOptions.length < 2) { setError('至少需要 2 个选项'); return }
113
+ setPollLoading(true)
114
+ setPollResult('')
115
+ try {
116
+ const res = await apiFetch(`/api/telegram/bots/${encodeURIComponent(selectedBot)}/poll`, {
117
+ method: 'POST',
118
+ headers: { 'Content-Type': 'application/json' },
119
+ body: JSON.stringify({ chat_id: chatId, question: pollQuestion, options: validOptions, is_anonymous: pollAnonymous, allows_multiple: pollMultiple }),
120
+ })
121
+ const json = await res.json()
122
+ if (json.success) setPollResult(`投票已发送 (ID: ${json.data?.message_id ?? '未知'})`)
123
+ else setError(json.error || '发送失败')
124
+ } catch {
125
+ setError('发送投票失败')
126
+ } finally {
127
+ setPollLoading(false)
128
+ }
129
+ }
130
+
131
+ const onlineBots = bots.filter(b => b.connected)
132
+
133
+ return (
134
+ <div className="p-6 max-w-5xl mx-auto">
135
+ <div className="flex items-center justify-between mb-6">
136
+ <h1 className="text-2xl font-bold flex items-center gap-2">
137
+ <Server className="w-6 h-6" /> Telegram 机器人
138
+ </h1>
139
+ <button onClick={fetchData} disabled={loading}
140
+ className="flex items-center gap-1 px-3 py-1.5 rounded bg-sky-500 text-white hover:bg-sky-600 disabled:opacity-50 text-sm">
141
+ <RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} /> 刷新
142
+ </button>
143
+ </div>
144
+
145
+ {error && <div className="mb-4 p-3 bg-red-50 text-red-600 rounded border border-red-200 flex items-center justify-between">
146
+ <span>{error}</span>
147
+ <button onClick={() => setError('')} className="text-red-400 hover:text-red-600"><X className="w-4 h-4" /></button>
148
+ </div>}
149
+
150
+ {/* Tabs */}
151
+ <div className="flex gap-1 mb-6 border-b">
152
+ <button onClick={() => setTab('overview')}
153
+ className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${tab === 'overview' ? 'border-sky-500 text-sky-600' : 'border-transparent text-gray-500 hover:text-gray-700'}`}>
154
+ 概览
155
+ </button>
156
+ <button onClick={() => setTab('actions')}
157
+ className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${tab === 'actions' ? 'border-sky-500 text-sky-600' : 'border-transparent text-gray-500 hover:text-gray-700'}`}>
158
+ 快捷操作
159
+ </button>
160
+ </div>
161
+
162
+ {/* Overview Tab */}
163
+ {tab === 'overview' && (
164
+ <>
165
+ {!loading && !bots.length && !error && (
166
+ <div className="text-center text-gray-500 py-12">暂无 Telegram 机器人实例</div>
167
+ )}
168
+ <div className="grid gap-4 md:grid-cols-2">
169
+ {bots.map((bot) => (
170
+ <div key={bot.name} className="border rounded-lg p-4 bg-card shadow-sm">
171
+ <div className="flex items-center justify-between mb-3">
172
+ <span className="font-medium text-lg">{bot.name}</span>
173
+ {bot.connected
174
+ ? <span className="flex items-center gap-1 text-green-600 text-sm"><Wifi className="w-4 h-4" /> 在线</span>
175
+ : <span className="flex items-center gap-1 text-gray-400 text-sm"><WifiOff className="w-4 h-4" /> 离线</span>}
176
+ </div>
177
+ {bot.botInfo && <div className="text-sm text-gray-500 mb-2">@{bot.botInfo.username} ({bot.botInfo.firstName})</div>}
178
+ <div className="text-sm text-gray-600 mb-3">
179
+ <div className="flex justify-between"><span>模式</span><span className="font-mono">{bot.mode}</span></div>
180
+ </div>
181
+ <button
182
+ onClick={() => toggleConnect(bot.name, bot.connected)}
183
+ disabled={actionLoading[bot.name]}
184
+ 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`}>
185
+ {actionLoading[bot.name]
186
+ ? <Loader2 className="w-3.5 h-3.5 animate-spin" />
187
+ : bot.connected ? <PowerOff className="w-3.5 h-3.5" /> : <Power className="w-3.5 h-3.5" />}
188
+ {bot.connected ? '断开' : '连接'}
189
+ </button>
190
+ </div>
191
+ ))}
192
+ </div>
193
+ </>
194
+ )}
195
+
196
+ {/* Quick Actions Tab */}
197
+ {tab === 'actions' && (
198
+ <div className="space-y-6">
199
+ {/* Bot + Chat selector */}
200
+ <div className="flex flex-wrap items-end gap-3">
201
+ <div>
202
+ <label className="block text-xs text-gray-500 mb-1">机器人</label>
203
+ <select value={selectedBot} onChange={(e) => setSelectedBot(e.target.value)}
204
+ className="border rounded px-2 py-1.5 text-sm min-w-[140px]">
205
+ <option value="">--</option>
206
+ {onlineBots.map(b => <option key={b.name} value={b.name}>{b.name}</option>)}
207
+ </select>
208
+ </div>
209
+ <div>
210
+ <label className="block text-xs text-gray-500 mb-1">Chat ID</label>
211
+ <input value={chatId} onChange={(e) => setChatId(e.target.value)} placeholder="-100xxxxxxxxxx"
212
+ className="border rounded px-2 py-1.5 text-sm w-[180px]" />
213
+ </div>
214
+ </div>
215
+
216
+ {!onlineBots.length && <div className="text-center text-gray-500 py-4">暂无在线机器人</div>}
217
+
218
+ {selectedBot && chatId && (
219
+ <div className="grid gap-4 md:grid-cols-2">
220
+ {/* Invite Link */}
221
+ <div className="border rounded-lg p-4 bg-card shadow-sm">
222
+ <h3 className="font-medium flex items-center gap-2 mb-3"><Link2 className="w-4 h-4 text-sky-500" /> 创建邀请链接</h3>
223
+ <button onClick={createInvite} className="px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600">
224
+ 生成链接
225
+ </button>
226
+ {inviteResult && (
227
+ <div className="mt-2 p-2 bg-gray-50 rounded text-sm break-all">
228
+ <a href={inviteResult} target="_blank" rel="noreferrer" className="text-sky-600 hover:underline">{inviteResult}</a>
229
+ </div>
230
+ )}
231
+ </div>
232
+
233
+ {/* Admin List */}
234
+ <div className="border rounded-lg p-4 bg-card shadow-sm">
235
+ <h3 className="font-medium flex items-center gap-2 mb-3"><ShieldCheck className="w-4 h-4 text-sky-500" /> 管理员列表</h3>
236
+ <button onClick={fetchAdmins} disabled={adminsLoading}
237
+ className="px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600 disabled:opacity-50 flex items-center gap-1">
238
+ {adminsLoading && <Loader2 className="w-3.5 h-3.5 animate-spin" />} 查询
239
+ </button>
240
+ {admins.length > 0 && (
241
+ <div className="mt-2 space-y-1">
242
+ {admins.map(a => (
243
+ <div key={a.user_id} className="flex items-center justify-between text-sm py-1 border-b last:border-0">
244
+ <span>{a.first_name} {a.username ? `(@${a.username})` : ''}</span>
245
+ <span className="text-xs text-gray-400">{a.status}</span>
246
+ </div>
247
+ ))}
248
+ </div>
249
+ )}
250
+ </div>
251
+
252
+ {/* Send Poll */}
253
+ <div className="border rounded-lg p-4 bg-card shadow-sm md:col-span-2">
254
+ <h3 className="font-medium flex items-center gap-2 mb-3"><BarChart3 className="w-4 h-4 text-sky-500" /> 发起投票</h3>
255
+ <div className="space-y-2">
256
+ <input value={pollQuestion} onChange={(e) => setPollQuestion(e.target.value)} placeholder="投票问题"
257
+ className="border rounded px-2 py-1.5 text-sm w-full" />
258
+ {pollOptions.map((opt, i) => (
259
+ <div key={i} className="flex items-center gap-2">
260
+ <input value={opt} onChange={(e) => {
261
+ const next = [...pollOptions]; next[i] = e.target.value; setPollOptions(next)
262
+ }} placeholder={`选项 ${i + 1}`}
263
+ className="border rounded px-2 py-1.5 text-sm flex-1" />
264
+ {pollOptions.length > 2 && (
265
+ <button onClick={() => setPollOptions(pollOptions.filter((_, j) => j !== i))}
266
+ className="text-gray-400 hover:text-red-500"><X className="w-4 h-4" /></button>
267
+ )}
268
+ </div>
269
+ ))}
270
+ <button onClick={() => setPollOptions([...pollOptions, ''])}
271
+ className="flex items-center gap-1 text-sm text-sky-500 hover:text-sky-600">
272
+ <Plus className="w-3.5 h-3.5" /> 添加选项
273
+ </button>
274
+ <div className="flex items-center gap-4 text-sm text-gray-600">
275
+ <label className="flex items-center gap-1">
276
+ <input type="checkbox" checked={pollAnonymous} onChange={(e) => setPollAnonymous(e.target.checked)} /> 匿名
277
+ </label>
278
+ <label className="flex items-center gap-1">
279
+ <input type="checkbox" checked={pollMultiple} onChange={(e) => setPollMultiple(e.target.checked)} /> 多选
280
+ </label>
281
+ </div>
282
+ <button onClick={sendPoll} disabled={pollLoading || !pollQuestion}
283
+ className="px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600 disabled:opacity-50 flex items-center gap-1">
284
+ {pollLoading && <Loader2 className="w-3.5 h-3.5 animate-spin" />} 发送投票
285
+ </button>
286
+ {pollResult && <div className="text-sm text-green-600">{pollResult}</div>}
287
+ </div>
288
+ </div>
289
+ </div>
290
+ )}
291
+ </div>
292
+ )}
293
+ </div>
294
+ )
295
+ }
@@ -0,0 +1,11 @@
1
+ import { addPage } from '@zhin.js/client'
2
+ import { Send } from 'lucide-react'
3
+ import TelegramDashboard from './Dashboard'
4
+
5
+ addPage({
6
+ key: 'telegram-management',
7
+ path: '/telegram',
8
+ title: 'Telegram',
9
+ icon: <Send className="w-5 h-5" />,
10
+ element: <TelegramDashboard />,
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{BarChart3 as t,Link2 as n,Loader2 as r,Plus as i,Power as a,PowerOff as o,RefreshCw as s,Send as c,Server as l,ShieldCheck as ee,Wifi as u,WifiOff as d,X as f}from"lucide-react";import{useCallback as p,useEffect as m,useState as h}from"react";import{Fragment as g,jsx as _,jsxs as v}from"react/jsx-runtime";var y="zhin_api_token";function b(){return localStorage.getItem(y)}async function x(e2,t2){let n2=b(),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(y),window.dispatchEvent(new CustomEvent("zhin:auth-required"))),i2}function S(){let[e2,c2]=h([]),[y2,b2]=h(true),[S2,C]=h(""),[w,T]=h("overview"),[E,D]=h({}),[O,k]=h(""),[A,j]=h(""),[M,N]=h(""),[P,F]=h([]),[I,L]=h(false),[R,z]=h(""),[B,V]=h(["",""]),[H,U]=h(true),[W,G]=h(false),[K,q]=h(""),[J,Y]=h(false),X=p(async()=>{b2(true),C("");try{let e3=await(await x("/api/telegram/bots")).json();e3.success?c2(e3.data):C(e3.error||"获取数据失败")}catch{C("无法连接服务器")}finally{b2(false)}},[]);m(()=>{X()},[X]);let Z=async(e3,t2)=>{D(t3=>({...t3,[e3]:true}));try{let n2=t2?"disconnect":"connect",r2=await(await x(`/api/telegram/bots/${encodeURIComponent(e3)}/${n2}`,{method:"POST"})).json();r2.success||C(r2.error||"操作失败"),await X()}catch{C("操作失败")}finally{D(t3=>({...t3,[e3]:false}))}},Q=async()=>{if(!(!O||!A)){N("");try{let e3=await(await x(`/api/telegram/bots/${encodeURIComponent(O)}/invite`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({chat_id:A})})).json();e3.success&&e3.data?.invite_link?N(e3.data.invite_link):C(e3.error||"创建失败")}catch{C("创建邀请链接失败")}}},te=async()=>{if(!(!O||!A)){L(true),F([]);try{let e3=await(await x(`/api/telegram/bots/${encodeURIComponent(O)}/admins?chat_id=${encodeURIComponent(A)}`)).json();e3.success&&Array.isArray(e3.data)?F(e3.data):C(e3.error||"获取管理员失败")}catch{C("获取管理员失败")}finally{L(false)}}},ne=async()=>{if(!O||!A||!R)return;let e3=B.filter(e4=>e4.trim());if(e3.length<2){C("至少需要 2 个选项");return}Y(true),q("");try{let t2=await(await x(`/api/telegram/bots/${encodeURIComponent(O)}/poll`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({chat_id:A,question:R,options:e3,is_anonymous:H,allows_multiple:W})})).json();t2.success?q(`投票已发送 (ID: ${t2.data?.message_id??"未知"})`):C(t2.error||"发送失败")}catch{C("发送投票失败")}finally{Y(false)}},$=e2.filter(e3=>e3.connected);return v("div",{className:"p-6 max-w-5xl mx-auto",children:[v("div",{className:"flex items-center justify-between mb-6",children:[v("h1",{className:"text-2xl font-bold flex items-center gap-2",children:[_(l,{className:"w-6 h-6"})," Telegram 机器人"]}),v("button",{onClick:X,disabled:y2,className:"flex items-center gap-1 px-3 py-1.5 rounded bg-sky-500 text-white hover:bg-sky-600 disabled:opacity-50 text-sm",children:[_(s,{className:`w-4 h-4 ${y2?"animate-spin":""}`})," 刷新"]})]}),S2&&v("div",{className:"mb-4 p-3 bg-red-50 text-red-600 rounded border border-red-200 flex items-center justify-between",children:[_("span",{children:S2}),_("button",{onClick:()=>C(""),className:"text-red-400 hover:text-red-600",children:_(f,{className:"w-4 h-4"})})]}),v("div",{className:"flex gap-1 mb-6 border-b",children:[_("button",{onClick:()=>T("overview"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${w==="overview"?"border-sky-500 text-sky-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"概览"}),_("button",{onClick:()=>T("actions"),className:`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${w==="actions"?"border-sky-500 text-sky-600":"border-transparent text-gray-500 hover:text-gray-700"}`,children:"快捷操作"})]}),w==="overview"&&v(g,{children:[!y2&&!e2.length&&!S2&&_("div",{className:"text-center text-gray-500 py-12",children:"暂无 Telegram 机器人实例"}),_("div",{className:"grid gap-4 md:grid-cols-2",children:e2.map(e3=>v("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[v("div",{className:"flex items-center justify-between mb-3",children:[_("span",{className:"font-medium text-lg",children:e3.name}),e3.connected?v("span",{className:"flex items-center gap-1 text-green-600 text-sm",children:[_(u,{className:"w-4 h-4"})," 在线"]}):v("span",{className:"flex items-center gap-1 text-gray-400 text-sm",children:[_(d,{className:"w-4 h-4"})," 离线"]})]}),e3.botInfo&&v("div",{className:"text-sm text-gray-500 mb-2",children:["@",e3.botInfo.username," (",e3.botInfo.firstName,")"]}),_("div",{className:"text-sm text-gray-600 mb-3",children:v("div",{className:"flex justify-between",children:[_("span",{children:"模式"}),_("span",{className:"font-mono",children:e3.mode})]})}),v("button",{onClick:()=>Z(e3.name,e3.connected),disabled:E[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:[E[e3.name]?_(r,{className:"w-3.5 h-3.5 animate-spin"}):e3.connected?_(o,{className:"w-3.5 h-3.5"}):_(a,{className:"w-3.5 h-3.5"}),e3.connected?"断开":"连接"]})]},e3.name))})]}),w==="actions"&&v("div",{className:"space-y-6",children:[v("div",{className:"flex flex-wrap items-end gap-3",children:[v("div",{children:[_("label",{className:"block text-xs text-gray-500 mb-1",children:"机器人"}),v("select",{value:O,onChange:e3=>k(e3.target.value),className:"border rounded px-2 py-1.5 text-sm min-w-[140px]",children:[_("option",{value:"",children:"--"}),$.map(e3=>_("option",{value:e3.name,children:e3.name},e3.name))]})]}),v("div",{children:[_("label",{className:"block text-xs text-gray-500 mb-1",children:"Chat ID"}),_("input",{value:A,onChange:e3=>j(e3.target.value),placeholder:"-100xxxxxxxxxx",className:"border rounded px-2 py-1.5 text-sm w-[180px]"})]})]}),!$.length&&_("div",{className:"text-center text-gray-500 py-4",children:"暂无在线机器人"}),O&&A&&v("div",{className:"grid gap-4 md:grid-cols-2",children:[v("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[v("h3",{className:"font-medium flex items-center gap-2 mb-3",children:[_(n,{className:"w-4 h-4 text-sky-500"})," 创建邀请链接"]}),_("button",{onClick:Q,className:"px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600",children:"生成链接"}),M&&_("div",{className:"mt-2 p-2 bg-gray-50 rounded text-sm break-all",children:_("a",{href:M,target:"_blank",rel:"noreferrer",className:"text-sky-600 hover:underline",children:M})})]}),v("div",{className:"border rounded-lg p-4 bg-card shadow-sm",children:[v("h3",{className:"font-medium flex items-center gap-2 mb-3",children:[_(ee,{className:"w-4 h-4 text-sky-500"})," 管理员列表"]}),v("button",{onClick:te,disabled:I,className:"px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600 disabled:opacity-50 flex items-center gap-1",children:[I&&_(r,{className:"w-3.5 h-3.5 animate-spin"})," 查询"]}),P.length>0&&_("div",{className:"mt-2 space-y-1",children:P.map(e3=>v("div",{className:"flex items-center justify-between text-sm py-1 border-b last:border-0",children:[v("span",{children:[e3.first_name," ",e3.username?`(@${e3.username})`:""]}),_("span",{className:"text-xs text-gray-400",children:e3.status})]},e3.user_id))})]}),v("div",{className:"border rounded-lg p-4 bg-card shadow-sm md:col-span-2",children:[v("h3",{className:"font-medium flex items-center gap-2 mb-3",children:[_(t,{className:"w-4 h-4 text-sky-500"})," 发起投票"]}),v("div",{className:"space-y-2",children:[_("input",{value:R,onChange:e3=>z(e3.target.value),placeholder:"投票问题",className:"border rounded px-2 py-1.5 text-sm w-full"}),B.map((e3,t2)=>v("div",{className:"flex items-center gap-2",children:[_("input",{value:e3,onChange:e4=>{let n2=[...B];n2[t2]=e4.target.value,V(n2)},placeholder:`选项 ${t2+1}`,className:"border rounded px-2 py-1.5 text-sm flex-1"}),B.length>2&&_("button",{onClick:()=>V(B.filter((e4,n2)=>n2!==t2)),className:"text-gray-400 hover:text-red-500",children:_(f,{className:"w-4 h-4"})})]},t2)),v("button",{onClick:()=>V([...B,""]),className:"flex items-center gap-1 text-sm text-sky-500 hover:text-sky-600",children:[_(i,{className:"w-3.5 h-3.5"})," 添加选项"]}),v("div",{className:"flex items-center gap-4 text-sm text-gray-600",children:[v("label",{className:"flex items-center gap-1",children:[_("input",{type:"checkbox",checked:H,onChange:e3=>U(e3.target.checked)})," 匿名"]}),v("label",{className:"flex items-center gap-1",children:[_("input",{type:"checkbox",checked:W,onChange:e3=>G(e3.target.checked)})," 多选"]})]}),v("button",{onClick:ne,disabled:J||!R,className:"px-3 py-1.5 rounded bg-sky-500 text-white text-sm hover:bg-sky-600 disabled:opacity-50 flex items-center gap-1",children:[J&&_(r,{className:"w-3.5 h-3.5 animate-spin"})," 发送投票"]}),K&&_("div",{className:"text-sm text-green-600",children:K})]})]})]})]})]})}e({key:"telegram-management",path:"/telegram",title:"Telegram",icon:_(c,{className:"w-5 h-5"}),element:_(S,{})});
package/lib/index.d.ts CHANGED
@@ -1,4 +1,12 @@
1
1
  import { TelegramAdapter } 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
  telegram: TelegramAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,QAAQ;QAChB,QAAQ,EAAE,eAAe,CAAC;KAC3B;CACF;AAED,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,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,QAAQ,EAAE,eAAe,CAAC;KAC3B;CACF;AAED,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
package/lib/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Telegram 适配器入口:类型扩展、导出、注册
3
3
  */
4
+ import path from "node:path";
4
5
  import { usePlugin, createGroupManagementTools } from "zhin.js";
5
6
  import { TelegramAdapter } from "./adapter.js";
6
7
  export * from "./types.js";
@@ -278,4 +279,172 @@ useContext('tool', 'telegram', (toolService, telegram) => {
278
279
  }, 'telegram'));
279
280
  return () => disposers.forEach(d => d());
280
281
  });
282
+ // ── Web 控制台 ─────────────────────────────────────────────────────────
283
+ useContext("web", (web) => {
284
+ return web.addEntry(path.resolve(import.meta.dirname, "../client/index.tsx"));
285
+ });
286
+ useContext("router", "telegram", (router, telegram) => {
287
+ router.get("/api/telegram/bots", async (ctx) => {
288
+ try {
289
+ const bots = Array.from(telegram.bots.values());
290
+ const result = bots.map((bot) => {
291
+ try {
292
+ return {
293
+ name: bot.$config.name,
294
+ connected: bot.$connected || false,
295
+ mode: bot.$config.polling !== false ? "polling" : "webhook",
296
+ status: bot.$connected ? "online" : "offline",
297
+ botInfo: bot.botInfo ? { username: bot.botInfo.username, firstName: bot.botInfo.first_name } : null,
298
+ };
299
+ }
300
+ catch {
301
+ return { name: bot.$config.name, connected: false, mode: "unknown", status: "error", botInfo: null };
302
+ }
303
+ });
304
+ ctx.body = { success: true, data: result };
305
+ }
306
+ catch {
307
+ ctx.status = 500;
308
+ ctx.body = { success: false, error: "获取机器人数据失败" };
309
+ }
310
+ });
311
+ // Bot 连接/断开
312
+ router.post("/api/telegram/bots/:name/connect", async (ctx) => {
313
+ try {
314
+ const bot = telegram.bots.get(ctx.params.name);
315
+ if (!bot) {
316
+ ctx.status = 404;
317
+ ctx.body = { success: false, error: "Bot 不存在" };
318
+ return;
319
+ }
320
+ if (bot.$connected) {
321
+ ctx.body = { success: true, message: "已经在线" };
322
+ return;
323
+ }
324
+ await bot.$connect();
325
+ ctx.body = { success: true, message: "连接成功" };
326
+ }
327
+ catch (e) {
328
+ ctx.status = 500;
329
+ ctx.body = { success: false, error: e?.message || "连接失败" };
330
+ }
331
+ });
332
+ router.post("/api/telegram/bots/:name/disconnect", async (ctx) => {
333
+ try {
334
+ const bot = telegram.bots.get(ctx.params.name);
335
+ if (!bot) {
336
+ ctx.status = 404;
337
+ ctx.body = { success: false, error: "Bot 不存在" };
338
+ return;
339
+ }
340
+ if (!bot.$connected) {
341
+ ctx.body = { success: true, message: "已经离线" };
342
+ return;
343
+ }
344
+ await bot.$disconnect();
345
+ ctx.body = { success: true, message: "已断开" };
346
+ }
347
+ catch (e) {
348
+ ctx.status = 500;
349
+ ctx.body = { success: false, error: e?.message || "断开失败" };
350
+ }
351
+ });
352
+ // 快捷操作:创建邀请链接
353
+ router.post("/api/telegram/bots/:name/invite", async (ctx) => {
354
+ try {
355
+ const bot = telegram.bots.get(ctx.params.name);
356
+ if (!bot) {
357
+ ctx.status = 404;
358
+ ctx.body = { success: false, error: "Bot 不存在" };
359
+ return;
360
+ }
361
+ if (!bot.$connected) {
362
+ ctx.status = 400;
363
+ ctx.body = { success: false, error: "Bot 未连接" };
364
+ return;
365
+ }
366
+ const { chat_id } = ctx.request.body || {};
367
+ if (!chat_id) {
368
+ ctx.status = 400;
369
+ ctx.body = { success: false, error: "缺少 chat_id" };
370
+ return;
371
+ }
372
+ const link = await bot.createInviteLink(Number(chat_id));
373
+ ctx.body = { success: true, data: { invite_link: link } };
374
+ }
375
+ catch (e) {
376
+ ctx.status = 500;
377
+ ctx.body = { success: false, error: e?.message || "创建邀请链接失败" };
378
+ }
379
+ });
380
+ // 快捷操作:发起投票
381
+ router.post("/api/telegram/bots/:name/poll", async (ctx) => {
382
+ try {
383
+ const bot = telegram.bots.get(ctx.params.name);
384
+ if (!bot) {
385
+ ctx.status = 404;
386
+ ctx.body = { success: false, error: "Bot 不存在" };
387
+ return;
388
+ }
389
+ if (!bot.$connected) {
390
+ ctx.status = 400;
391
+ ctx.body = { success: false, error: "Bot 未连接" };
392
+ return;
393
+ }
394
+ const { chat_id, question, options, is_anonymous, allows_multiple } = ctx.request.body || {};
395
+ if (!chat_id || !question || !options?.length) {
396
+ ctx.status = 400;
397
+ ctx.body = { success: false, error: "缺少 chat_id, question 或 options" };
398
+ return;
399
+ }
400
+ if (options.length < 2) {
401
+ ctx.status = 400;
402
+ ctx.body = { success: false, error: "至少需要 2 个选项" };
403
+ return;
404
+ }
405
+ const result = await bot.sendPoll(Number(chat_id), question, options, is_anonymous ?? true, allows_multiple ?? false);
406
+ ctx.body = { success: true, data: { message_id: result.message_id } };
407
+ }
408
+ catch (e) {
409
+ ctx.status = 500;
410
+ ctx.body = { success: false, error: e?.message || "发起投票失败" };
411
+ }
412
+ });
413
+ // 快捷操作:获取群管理员
414
+ router.get("/api/telegram/bots/:name/admins", async (ctx) => {
415
+ try {
416
+ const bot = telegram.bots.get(ctx.params.name);
417
+ if (!bot) {
418
+ ctx.status = 404;
419
+ ctx.body = { success: false, error: "Bot 不存在" };
420
+ return;
421
+ }
422
+ if (!bot.$connected) {
423
+ ctx.status = 400;
424
+ ctx.body = { success: false, error: "Bot 未连接" };
425
+ return;
426
+ }
427
+ const chat_id = ctx.query.chat_id;
428
+ if (!chat_id) {
429
+ ctx.status = 400;
430
+ ctx.body = { success: false, error: "缺少 chat_id" };
431
+ return;
432
+ }
433
+ const admins = await bot.getChatAdmins(Number(chat_id));
434
+ ctx.body = {
435
+ success: true,
436
+ data: admins.map((a) => ({
437
+ user_id: a.user.id,
438
+ username: a.user.username,
439
+ first_name: a.user.first_name,
440
+ status: a.status,
441
+ })),
442
+ };
443
+ }
444
+ catch (e) {
445
+ ctx.status = 500;
446
+ ctx.body = { success: false, error: e?.message || "获取管理员失败" };
447
+ }
448
+ });
449
+ });
281
450
  //# 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-telegram",
3
- "version": "1.0.49",
3
+ "version": "1.0.50",
4
4
  "description": "Zhin.js adapter for Telegram",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -36,12 +36,30 @@
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^22.9.0",
39
+ "@types/react": "^19.2.2",
40
+ "@types/react-dom": "^19.2.1",
41
+ "lucide-react": "^0.469.0",
39
42
  "typescript": "^5.9.3",
40
- "zhin.js": "1.0.62"
43
+ "@zhin.js/console": "2.0.5",
44
+ "zhin.js": "1.0.63"
41
45
  },
42
46
  "peerDependencies": {
43
- "@zhin.js/logger": "0.1.46",
44
- "zhin.js": "1.0.62"
47
+ "@zhin.js/client": "1.0.15",
48
+ "@zhin.js/console": "2.0.5",
49
+ "@zhin.js/http": "1.0.58",
50
+ "@zhin.js/logger": "0.1.47",
51
+ "zhin.js": "1.0.63"
52
+ },
53
+ "peerDependenciesMeta": {
54
+ "@zhin.js/client": {
55
+ "optional": true
56
+ },
57
+ "@zhin.js/http": {
58
+ "optional": true
59
+ },
60
+ "@zhin.js/console": {
61
+ "optional": true
62
+ }
45
63
  },
46
64
  "files": [
47
65
  "src",
@@ -57,8 +75,8 @@
57
75
  "registry": "https://registry.npmjs.org"
58
76
  },
59
77
  "scripts": {
60
- "build": "pnpm build:node",
61
- "clean": "rimraf lib",
78
+ "build": "tsc && (test -f ../../services/console/lib/bin.js && node ../../services/console/lib/bin.js build || echo 'Skipping client build: console not built yet')",
79
+ "clean": "rimraf lib dist",
62
80
  "build:node": "tsc"
63
81
  }
64
82
  }
package/src/index.ts CHANGED
@@ -1,8 +1,18 @@
1
1
  /**
2
2
  * Telegram 适配器入口:类型扩展、导出、注册
3
3
  */
4
+ import path from "node:path";
4
5
  import { usePlugin, type Plugin, type Context, type IGroupManagement, createGroupManagementTools, type ToolFeature } from "zhin.js";
5
6
  import { TelegramAdapter } 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 {
@@ -293,3 +303,119 @@ useContext('tool', 'telegram', (toolService: ToolFeature, telegram: TelegramAdap
293
303
 
294
304
  return () => disposers.forEach(d => d());
295
305
  });
306
+
307
+ // ── Web 控制台 ─────────────────────────────────────────────────────────
308
+ useContext("web", (web: WebServer) => {
309
+ return web.addEntry(path.resolve(import.meta.dirname, "../client/index.tsx"));
310
+ });
311
+
312
+ useContext("router", "telegram", (router: any, telegram: TelegramAdapter) => {
313
+ router.get("/api/telegram/bots", async (ctx: any) => {
314
+ try {
315
+ const bots = Array.from(telegram.bots.values());
316
+ const result = bots.map((bot: any) => {
317
+ try {
318
+ return {
319
+ name: bot.$config.name,
320
+ connected: bot.$connected || false,
321
+ mode: bot.$config.polling !== false ? "polling" : "webhook",
322
+ status: bot.$connected ? "online" : "offline",
323
+ botInfo: bot.botInfo ? { username: bot.botInfo.username, firstName: bot.botInfo.first_name } : null,
324
+ };
325
+ } catch {
326
+ return { name: bot.$config.name, connected: false, mode: "unknown", status: "error", botInfo: null };
327
+ }
328
+ });
329
+ ctx.body = { success: true, data: result };
330
+ } catch {
331
+ ctx.status = 500;
332
+ ctx.body = { success: false, error: "获取机器人数据失败" };
333
+ }
334
+ });
335
+
336
+ // Bot 连接/断开
337
+ router.post("/api/telegram/bots/:name/connect", async (ctx: any) => {
338
+ try {
339
+ const bot = telegram.bots.get(ctx.params.name);
340
+ if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
341
+ if (bot.$connected) { ctx.body = { success: true, message: "已经在线" }; return; }
342
+ await bot.$connect();
343
+ ctx.body = { success: true, message: "连接成功" };
344
+ } catch (e: any) {
345
+ ctx.status = 500;
346
+ ctx.body = { success: false, error: e?.message || "连接失败" };
347
+ }
348
+ });
349
+
350
+ router.post("/api/telegram/bots/:name/disconnect", async (ctx: any) => {
351
+ try {
352
+ const bot = telegram.bots.get(ctx.params.name);
353
+ if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
354
+ if (!bot.$connected) { ctx.body = { success: true, message: "已经离线" }; return; }
355
+ await bot.$disconnect();
356
+ ctx.body = { success: true, message: "已断开" };
357
+ } catch (e: any) {
358
+ ctx.status = 500;
359
+ ctx.body = { success: false, error: e?.message || "断开失败" };
360
+ }
361
+ });
362
+
363
+ // 快捷操作:创建邀请链接
364
+ router.post("/api/telegram/bots/:name/invite", async (ctx: any) => {
365
+ try {
366
+ const bot: any = telegram.bots.get(ctx.params.name);
367
+ if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
368
+ if (!bot.$connected) { ctx.status = 400; ctx.body = { success: false, error: "Bot 未连接" }; return; }
369
+ const { chat_id } = ctx.request.body || {};
370
+ if (!chat_id) { ctx.status = 400; ctx.body = { success: false, error: "缺少 chat_id" }; return; }
371
+ const link = await bot.createInviteLink(Number(chat_id));
372
+ ctx.body = { success: true, data: { invite_link: link } };
373
+ } catch (e: any) {
374
+ ctx.status = 500;
375
+ ctx.body = { success: false, error: e?.message || "创建邀请链接失败" };
376
+ }
377
+ });
378
+
379
+ // 快捷操作:发起投票
380
+ router.post("/api/telegram/bots/:name/poll", async (ctx: any) => {
381
+ try {
382
+ const bot: any = telegram.bots.get(ctx.params.name);
383
+ if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
384
+ if (!bot.$connected) { ctx.status = 400; ctx.body = { success: false, error: "Bot 未连接" }; return; }
385
+ const { chat_id, question, options, is_anonymous, allows_multiple } = ctx.request.body || {};
386
+ if (!chat_id || !question || !options?.length) {
387
+ ctx.status = 400; ctx.body = { success: false, error: "缺少 chat_id, question 或 options" }; return;
388
+ }
389
+ if (options.length < 2) { ctx.status = 400; ctx.body = { success: false, error: "至少需要 2 个选项" }; return; }
390
+ const result = await bot.sendPoll(Number(chat_id), question, options, is_anonymous ?? true, allows_multiple ?? false);
391
+ ctx.body = { success: true, data: { message_id: result.message_id } };
392
+ } catch (e: any) {
393
+ ctx.status = 500;
394
+ ctx.body = { success: false, error: e?.message || "发起投票失败" };
395
+ }
396
+ });
397
+
398
+ // 快捷操作:获取群管理员
399
+ router.get("/api/telegram/bots/:name/admins", async (ctx: any) => {
400
+ try {
401
+ const bot: any = telegram.bots.get(ctx.params.name);
402
+ if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
403
+ if (!bot.$connected) { ctx.status = 400; ctx.body = { success: false, error: "Bot 未连接" }; return; }
404
+ const chat_id = ctx.query.chat_id;
405
+ if (!chat_id) { ctx.status = 400; ctx.body = { success: false, error: "缺少 chat_id" }; return; }
406
+ const admins = await bot.getChatAdmins(Number(chat_id));
407
+ ctx.body = {
408
+ success: true,
409
+ data: admins.map((a: any) => ({
410
+ user_id: a.user.id,
411
+ username: a.user.username,
412
+ first_name: a.user.first_name,
413
+ status: a.status,
414
+ })),
415
+ };
416
+ } catch (e: any) {
417
+ ctx.status = 500;
418
+ ctx.body = { success: false, error: e?.message || "获取管理员失败" };
419
+ }
420
+ });
421
+ });