mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-10-02 20:22:10 +03:00
fd7b3559bc
Monthly sponsor placements need to change without cutting a panel release. Panels now read 3X/sponsors.json from the MHSanaei/sponsors repo (GitHub Pages on sponsors.sanaei.dev) and show active sponsors in four slots: an overview banner, a rotating sidebar card (max three), the login page and a new Sponsors page that also lists open placements. An entry shows only while enable is not false and until is in the future; links must be https and logos are png/webp/jpg by name only. The list is cached for an hour and the last good copy survives upstream failures; logos are proxied through /sponsors/logo/:name with failures cached, so CSP stays 'self' and admin browsers never reach a third party. Admins can hide a slot for 24h. Under XUI_DEBUG the panel reads a sibling ../sponsors/3X checkout so edits can be previewed before push.
56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
export const keys = {
|
|
sponsors: () => ['sponsors'] as const,
|
|
server: {
|
|
status: () => ['server', 'status'] as const,
|
|
fail2banStatus: () => ['server', 'fail2banStatus'] as const,
|
|
},
|
|
nodes: {
|
|
root: () => ['nodes'] as const,
|
|
list: () => ['nodes', 'list'] as const,
|
|
},
|
|
hosts: {
|
|
root: () => ['hosts'] as const,
|
|
list: () => ['hosts', 'list'] as const,
|
|
byInbound: (inboundId: number) => ['hosts', 'byInbound', inboundId] as const,
|
|
tags: () => ['hosts', 'tags'] as const,
|
|
},
|
|
subBalancers: {
|
|
root: () => ['sub-balancers'] as const,
|
|
list: () => ['sub-balancers', 'list'] as const,
|
|
},
|
|
settings: {
|
|
root: () => ['settings'] as const,
|
|
all: () => ['settings', 'all'] as const,
|
|
defaults: () => ['settings', 'defaults'] as const,
|
|
factoryDefaults: () => ['settings', 'factoryDefaults'] as const,
|
|
},
|
|
inbounds: {
|
|
root: () => ['inbounds'] as const,
|
|
slim: () => ['inbounds', 'slim'] as const,
|
|
options: () => ['inbounds', 'options'] as const,
|
|
},
|
|
clients: {
|
|
root: () => ['clients'] as const,
|
|
list: (params: unknown) => ['clients', 'list', params] as const,
|
|
all: () => ['clients', 'all'] as const,
|
|
onlines: () => ['clients', 'onlines'] as const,
|
|
onlinesByGuid: () => ['clients', 'onlinesByGuid'] as const,
|
|
activeInbounds: () => ['clients', 'activeInbounds'] as const,
|
|
lastOnline: () => ['clients', 'lastOnline'] as const,
|
|
groups: () => ['clients', 'groups'] as const,
|
|
},
|
|
xray: {
|
|
root: () => ['xray'] as const,
|
|
config: () => ['xray', 'config'] as const,
|
|
outboundsTraffic: () => ['xray', 'outboundsTraffic'] as const,
|
|
geodata: {
|
|
root: () => ['xray', 'geodata'] as const,
|
|
files: () => ['xray', 'geodata', 'files'] as const,
|
|
categories: (file: string, query: string) =>
|
|
['xray', 'geodata', 'categories', file, query] as const,
|
|
entries: (file: string, code: string, query: string, offset: number, limit: number) =>
|
|
['xray', 'geodata', 'entries', file, code, query, offset, limit] as const,
|
|
},
|
|
},
|
|
} as const;
|