dsh-lol-esports:给 DSH Web 端加一个英雄联盟赛事观赛面板

前言

要在 DSH 客户端里看英雄联盟赛事,常见做法是开官网或第三方数据站,赛程、比分、直播链接、局内数据分散在几个页面之间,还要自己换算本地时区。dsh-lol-esports 把这些收进 DSH Web 端左栏的一个面板里:赛程与赛果合并成一条时间线,正在打的比赛附带局内实时数据。下面介绍这个插件的定位、功能、安装方式和已知限制。

这是什么

neilny/dsh-lol-esports 是 NeilNy 维护的一个 DSH 客户端插件,fork 自 Rustyibe/dsh-lol,按自己的节奏改,不跟随上游更新。相对上游的主要增量是一条局内实时数据条,另外在选手名处理、BO 结束判定、空态渲染上做了本地化修改。社区目录把它归在「客户端」分类,Star 数为 0,属于个人项目。

它解决的问题是:S 赛期间,在 DSH 里不用切出插件就能看完赛程、比分、观赛入口,并看到正在进行对局的击杀、经济、推塔、小龙、男爵和十名选手的 K/D/A 与补刀。

核心功能

1、一条按本地日期分组的时间线。赛程与赛果合并,过去的比赛在上、今天居中、未来在下;打开面板自动滚到今天那组,每 60 秒静默刷新。

2、比赛卡片。显示阶段、BO 数、状态徽标、开赛时间、比分;进行中的卡片高亮并带局内实时数据条。

3、阶段筛选。入围赛、瑞士轮、四分之一决赛、半决赛、决赛,只列出当前届真实存在的阶段。

4、观赛链接。官方直播页、逐局中文回放(YouTube 直接跳到该局开始时间)、英文流、Twitch 直播流。

5、按语言取流。界面是中文就优先中文流与中文回放,英文界面优先英文。

6、单场 AI 与整届 AI。单场卡片上的「问 AI」把这场比赛的赛事、阶段、对阵、BO、时间、比分、观赛链接带进新建会话;顶部「聊赛事」按「今天」或某个阶段,把已结束、待打和当前战绩一起带进新会话。

7、局内实时数据。击杀、经济、推塔、小龙、男爵,加十名选手的 K/D/A 与补刀;数据条显示落后直播多少秒的延迟读数,本局结束后换成「本局已结束」。数值变化时滑入,值不变不闪。

8、本地判定 BO 结束。任一方达到赛制所需胜场即判为已结束,不等接口翻状态(Riot 的状态会滞后几分钟)。

9、选手名去前缀。IG TheShy 显示为 TheShy,仅当首段确实等于队伍 code 时才剥,Hans Sama 不受影响。

10、双语。跟随 DSH 语言设置,时间按本地时区。

安装与启用

需要 DSH >= 0.2.1-rc.2 < 0.3.0(engines.dsh 已声明,不满足会被拒绝安装或激活)。安装不需要构建,client.js 是仓库里已打包好的产物。

# 桌面版
dsh plugin --profile desktop add github:NeilNy/dsh-lol-esports

# 或 web 版
dsh plugin --profile web add github:NeilNy/dsh-lol-esports

装完重启 DSH(桌面版 ⌘Q 后重开),左栏会多出一个奖杯图标,点开就是面板。当前版本 1.2.0,MIT 许可,仓库内带 LICENSE。

典型用法

1、打开面板,自动定位到今天那组比赛;往上滑看历史赛程与赛果,往下滑看后续赛程。

2、点击某张比赛卡片,看阶段、比分与观赛链接;比赛进行中时卡片上会多出实时数据条,包括双方击杀、经济、推塔、小龙、男爵,以及双方十名选手的 K/D/A 与补刀。

3、需要基于这场比赛提问时,点卡片上的「问 AI」,赛事、阶段、对阵、BO、时间、比分、观赛链接会作为上下文带进一个新会话。

4、要整届聊天时,点顶部「聊赛事」,可选「今天」或某个阶段,已结束、待打和当前战绩一起进入会话。

5、时间不在自己的时区时不用换算,插件按本地时区渲染,并跟随 DSH 的语言设置切换中英文。

数据与隐私

赛程与详情走 https://esports-api.lolesports.com/persisted/gw/{getSchedule,getEventDetails},带 lolesports 前端的公开 x-api-key;局内实时走 https://feed.lolesports.com/livestats/v1/window/{gameId}(10 秒窗口)。全部是浏览器直连的公开 GET:不经代理、不带账号、不读写本地文件、无遥测。面板是纯前端插件,只注册 main 与 sidebar.panellist 两个槽位。

适用场景与注意

适合想在 DSH 内看 S 赛、或者把赛事上下文带进 AI 会话的人。插件运行在当前 DSH 进程里,权限与该进程一致;安装前应打开仓库核一遍源码与许可证,确认接口调用范围符合自己的预期。这是个人 fork 项目,Star 数为 0,不跟随上游更新,出问题需要自己提 issue 或改代码。

已知限制:

1、只支持 S 赛(Worlds)。要其他联赛需改 client.js 里的 WORLDS_ID(Worlds = 98767975604431411)。

2、实时数据永远慢约一分钟。Riot 的 feed 要求窗口结束时间至少比当前早 50 秒,且 startingTime 对齐 10 秒;插件取 now - 65s,以 20 秒为周期轮询。

3、没有中文或英文 VOD 的对局,详情里只有「官方赛事页」。

4、官网 lolesports.com 强制跳 en-US,官网链接无法本地化。

5、lolesports 的公开 key 若被轮换,需要更新 client.js 顶部的 API_KEY。

开发

源码是 TypeScript + JSX,用 esbuild 打成 client.js(DSH 客户端模块格式),产物提交进仓库,所以安装时不跑构建:

npm install
npm run check    # tsc --noEmit
npm test         # 打包后跑 node:test(模块契约 + 数据层)
npm run build    # src/main.ts -> client.js

仓库结构按职责分文件:src/main.ts 是入口,注册到 window.__ModuleLoader__;src/panel.ts 负责 inject / apply;src/ui.tsx 是 React 组件;src/api.ts 覆盖赛程、详情、局内实时三套接口并做规范化;其余是格式化、链接、i18n、样式、常量与类型。React 只能从宿主注入的 require('react') 拿,不能静态 import,src/runtime.ts 就是为此存在的。

小结

这个插件的价值在于把 S 赛的赛程、赛果、观赛链接和局内实时数据集中进 DSH 左栏,并支持把赛事上下文直接带进 AI 会话。它的边界同样清楚:只覆盖 Worlds,实时数据天然滞后一分钟,依赖 lolesports 的公开接口和 key。装之前值得花几分钟核一遍源码。

  • 目录页:https://www.skillhub.cn/plugins/NeilNy/dsh-lol-esports
  • GitHub:https://github.com/NeilNy/dsh-lol-esports
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜