├── .env.dev ├── .env.prod ├── .github └── workflows │ ├── Issues Helper.yml │ └── python-package.yml ├── .gitignore ├── .gitmodules ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── doc ├── NoneBotPlugin.svg ├── nbp_logo.png ├── screenshot.png ├── screenshot1.png ├── screenshot2.png ├── screenshot3.png ├── screenshot4.png ├── screenshot5.png └── screenshot6.png ├── nonebot_plugin_blive_danmaku ├── __init__.py ├── app │ ├── __init__.py │ ├── frontend │ │ ├── assets │ │ │ ├── SC-bg-img-0e2aa755.png │ │ │ ├── echarts-0647520d.js │ │ │ ├── elementPlus-2f9ad77c.js │ │ │ ├── elementPlus-ce22a485.css │ │ │ ├── guard-1-k-823c4f26.png │ │ │ ├── guard-2-k-a0b7be7c.png │ │ │ ├── guard-3-k-3c7bacae.png │ │ │ ├── html2canvas-18c4afc9.js │ │ │ ├── index-01fd1861.css │ │ │ ├── index-13e4e779.js │ │ │ ├── index-35dc9657.js │ │ │ ├── index-434a6b8b.js │ │ │ ├── index-4f53a516.css │ │ │ ├── index-5034aea2.js │ │ │ ├── index-544d3f89.js │ │ │ ├── index-c6df6c50.js │ │ │ ├── index-cd2e8127.css │ │ │ ├── index-edb1e61b.js │ │ │ ├── lodash-742d3967.js │ │ │ ├── sc-8f8a299b.css │ │ │ ├── sc-badge-1-f98dcdbf.png │ │ │ ├── sc-badge-2-abaf3760.png │ │ │ ├── sc-c94b5754.js │ │ │ ├── vendor-9f742c23.js │ │ │ └── vendor-b57f6aba.css │ │ ├── icon │ │ │ └── favicon.ico │ │ └── index.html │ ├── models.py │ └── router.py ├── command │ ├── __init__.py │ ├── listener │ │ ├── __init__.py │ │ ├── cookie.py │ │ └── kick.py │ ├── sub │ │ ├── __init__.py │ │ ├── sub_add.py │ │ ├── sub_delete.py │ │ ├── sub_list.py │ │ ├── sub_off.py │ │ ├── sub_on.py │ │ └── sub_open.py │ └── subscribe │ │ ├── __init__.py │ │ ├── danmaku.py │ │ └── live.py ├── config.py ├── database │ ├── __init__.py │ ├── db.py │ └── model.py └── utils │ └── __init__.py ├── poetry.lock └── pyproject.toml /.env.dev: -------------------------------------------------------------------------------- 1 | LOG_LEVEL=DEBUG 2 | COMMAND_START=[""] 3 | COMMAND_SEP=[""] -------------------------------------------------------------------------------- /.env.prod: -------------------------------------------------------------------------------- 1 | COMMAND_START=[""] 2 | COMMAND_SEP=[""] -------------------------------------------------------------------------------- /.github/workflows/Issues Helper.yml: -------------------------------------------------------------------------------- 1 | name: Issues Helper 2 | 3 | on: 4 | issues: 5 | types: [opened] 6 | 7 | jobs: 8 | reply-helper: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: new issue 12 | uses: actions-cool/issues-helper@v3 13 | with: 14 | actions: "create-comment" 15 | token: ${{ secrets.ACTION_TOKEN }} 16 | issue-number: ${{ github.event.issue.number }} 17 | body: | 18 | 你好 @${{ github.event.issue.user.login }},我已收到你的issue,问题有新的进展或疑问我会及时回复你。 19 | -------------------------------------------------------------------------------- /.github/workflows/python-package.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests and lint with a variety of Python versions 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python 3 | 4 | name: Python package 5 | 6 | on: 7 | push: 8 | branches: [ "master" ] 9 | pull_request: 10 | branches: [ "master" ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | strategy: 17 | fail-fast: false 18 | matrix: 19 | python-version: ["3.10","3.11"] 20 | 21 | steps: 22 | - name: Checkout repository 23 | uses: actions/checkout@v2 24 | with: 25 | submodules: 'recursive' 26 | - uses: actions/checkout@v3 27 | - name: Set up Python ${{ matrix.python-version }} 28 | uses: actions/setup-python@v3 29 | with: 30 | python-version: ${{ matrix.python-version }} 31 | cache: "pip" 32 | - name: Install dependencies 33 | run: | 34 | python -m pip install --upgrade pip 35 | python -m pip install flake8 tox pipx 36 | python -m pipx ensurepath 37 | pipx install poetry 38 | poetry install 39 | - name: Lint with flake8 40 | run: | 41 | # stop the build if there are Python syntax errors or undefined names 42 | flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics 43 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide 44 | flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics 45 | - name: Test with tox 46 | run: | 47 | tox -e py 48 | - name: Build 49 | run: | 50 | python -m pip install build 51 | python -m build 52 | - name: Upload test package 53 | uses: actions/upload-artifact@v3 54 | if: ${{ !github.head_ref }} 55 | with: 56 | name: nonebot_plugin_blive_danmaku_py${{ matrix.python-version }}_${{ github.sha }}.whl 57 | path: dist/*.whl 58 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/python 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=python 4 | 5 | ### Python ### 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | .pypirc 11 | 12 | # C extensions 13 | *.so 14 | 15 | # Distribution / packaging 16 | .Python 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | .eggs/ 23 | lib/ 24 | lib64/ 25 | parts/ 26 | sdist/ 27 | var/ 28 | wheels/ 29 | pip-wheel-metadata/ 30 | share/python-wheels/ 31 | *.egg-info/ 32 | .installed.cfg 33 | *.egg 34 | MANIFEST 35 | 36 | # PyInstaller 37 | # Usually these files are written by a python script from a template 38 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 39 | *.manifest 40 | *.spec 41 | 42 | # Installer logs 43 | pip-log.txt 44 | pip-delete-this-directory.txt 45 | 46 | # Unit test / coverage reports 47 | htmlcov/ 48 | .tox/ 49 | .nox/ 50 | .coverage 51 | .coverage.* 52 | .cache 53 | nosetests.xml 54 | coverage.xml 55 | *.cover 56 | *.py,cover 57 | .hypothesis/ 58 | .pytest_cache/ 59 | pytestdebug.log 60 | 61 | # Translations 62 | *.mo 63 | *.pot 64 | 65 | # Django stuff: 66 | *.log 67 | local_settings.py 68 | db.sqlite3 69 | db.sqlite3-journal 70 | 71 | # Flask stuff: 72 | instance/ 73 | .webassets-cache 74 | 75 | # Scrapy stuff: 76 | .scrapy 77 | 78 | # Sphinx documentation 79 | docs/_build/ 80 | doc/_build/ 81 | 82 | # PyBuilder 83 | target/ 84 | 85 | # Jupyter Notebook 86 | .ipynb_checkpoints 87 | 88 | # IPython 89 | profile_default/ 90 | ipython_config.py 91 | 92 | # pyenv 93 | .python-version 94 | 95 | # pipenv 96 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 97 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 98 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 99 | # install all needed dependencies. 100 | #Pipfile.lock 101 | 102 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 103 | __pypackages__/ 104 | 105 | # Celery stuff 106 | celerybeat-schedule 107 | celerybeat.pid 108 | 109 | # SageMath parsed files 110 | *.sage.py 111 | 112 | # Environments 113 | .env 114 | .venv 115 | env/ 116 | venv/ 117 | ENV/ 118 | env.bak/ 119 | venv.bak/ 120 | 121 | # Spyder project settings 122 | .spyderproject 123 | .spyproject 124 | 125 | # Rope project settings 126 | .ropeproject 127 | 128 | # mkdocs documentation 129 | /site 130 | 131 | # mypy 132 | .mypy_cache/ 133 | .dmypy.json 134 | dmypy.json 135 | 136 | # Pyre type checker 137 | .pyre/ 138 | 139 | # pytype static type analyzer 140 | .pytype/ 141 | 142 | # End of https://www.toptal.com/developers/gitignore/api/python -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "nonebot_plugin_blive_danmaku/blivedm"] 2 | path = nonebot_plugin_blive_danmaku/blivedm 3 | url = https://github.com/zangxx66/blivedm 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.languageServer": "Pylance", 3 | "python.analysis.typeCheckingMode": "basic" 4 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 ricardo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | NoneBotPluginLogo 3 |
4 |

NoneBotPluginText

5 |
6 | 7 |
8 | 9 | # nonebot_plugin_blive_danmaku 10 | 11 | _💫 B站直播间路灯插件 💫_ 12 | 13 | [![pypi](https://img.shields.io/pypi/v/nonebot-plugin-blive-danmaku.svg)](https://pypi.org/project/nonebot-plugin-blive-danmaku/) ![python](https://img.shields.io/pypi/pyversions/nonebot-plugin-blive-danmaku) [![license](https://img.shields.io/github/license/zangxx66/nonebot_plugin_blive_danmaku.svg)](https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/main/LICENSE) 14 | 15 |
16 | 17 | ## 简介 18 | - 基于[nonebot2](https://v2.nonebot.dev/)开发的B站直播间弹幕监听插件,参考了Haruka和blivechat的部分代码。 19 | - 起源于[哈鹿hallu](https://space.bilibili.com/3493118494116797)的一条动态,苦于做视频时没有人做路灯,翻录播的时候头都大了,说要花钱请个全职路灯,我寻思与其把钱送给别人,不如交给Bot去做路灯。 20 | ![](/doc/screenshot1.png) 21 | - 路灯:指把直播过程中有趣的点记录下来,给剪辑根据记录的时间点和内容做出对应的视频。 22 | 23 | ## 功能 24 | 25 | - 用弹幕的形式记录直播高能点 26 | - 弹幕指令为`#路灯`加上记录的内容 27 | - 仅在开播时弹幕指令才会生效 28 | 29 | ## 依赖 30 | 31 | - Python >= 3.10 32 | - OneBot V11 33 | 34 | ## 安装 35 | - 方式一:使用`nb-cli`安装插件 36 | ``` 37 | nb plugin install nonebot-plugin-blive-danmaku 38 | ``` 39 | - 方式二:使用`pip`安装 40 | ``` 41 | python -m pip install nonebot-plugin-blive-danmaku 42 | ``` 43 | ## 配置 44 | 45 | |名称|类型|默认值|描述| 46 | |-----|-----|-----|-----| 47 | |danmaku_group_notice|bool|False|全局群开播提醒| 48 | |danmaku_host|str||外部访问地址,若配置了公网访问地址请填写此项,以便bot能够发送正确的面板地址,例如:`“http://www.your_domain.com”`,`“http://192.168.0.2"`
非80,443端口需要带上端口号,例如:`“http://www.your_domain.com:12450”`,`“http://192.168.0.2:12450"`| 49 | 50 | ## 指令 51 | 52 | |指令|说明| 53 | |------|------| 54 | |/添加订阅 UID|UID为B站用户的uid,不是直播间id,以下同理| 55 | |/取消订阅 UID|删除订阅| 56 | |/开启路灯 UID|开启直播间弹幕监听| 57 | |/关闭路灯 UID|关闭直播间弹幕监听| 58 | |/订阅列表|| 59 | |/查看面板|打开网页版查询| 60 | |/开启统计 UID|开启弹幕统计,包含每场直播弹幕数,平均弹幕数,观看人数,每分钟弹幕数。
`注:开启后磁盘将增加更多的占用空间,如果磁盘空间不足建议关闭数据统计。`| 61 | |/关闭统计 UID|关闭弹幕统计| 62 | |/导入cookie 已登录账号的cookie|添加一个cookie,避免弹幕用户名打码| 63 | 64 | ## 效果预览 65 | 66 | ![](/doc/screenshot.png) 67 | ![](/doc/screenshot2.png) 68 | ![](/doc/screenshot4.png) 69 | ![](/doc/screenshot5.png) 70 | ![](/doc/screenshot6.png) 71 | 72 | ## 反向代理(可选,如果需要配置外部网络访问面板) 73 | 74 | > 这里仅以最简单的配置为例,不包含SSL访问 75 | 76 | Nginx 77 | 78 | ``` nginx 79 | server { 80 | listen 80; 81 | server_name www.your_domain.com; 82 | 83 | location /danmaku/ { 84 | proxy_pass http://127.0.0.1:8080/danmaku/; 85 | proxy_http_version 1.1; 86 | proxy_set_header Upgrade $http_upgrade; 87 | proxy_set_header Connection keep-alive; 88 | proxy_set_header Host $host; 89 | proxy_set_header X-Real-IP $remote_addr; 90 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 91 | proxy_cache_bypass $http_upgrade; 92 | } 93 | 94 | location /ws { 95 | deny all; 96 | } 97 | } 98 | ``` 99 | 100 | Apache 101 | 102 | ``` apache 103 | 104 | ServerName www.your_domain.com 105 | ProxyRequests Off 106 | ProxyPass "/danmaku/" http://127.0.0.1:8080/danmaku/ 107 | ProxyPassReverse "/danmaku/" http://127.0.0.1:8080/danmaku/ 108 | 109 | ``` 110 | 111 | ## 更新日志 112 | - v0.4.0 113 | - 支持添加cookie,避免弹幕用户名打码 114 | - v0.3.4 115 | - 添加词云 116 | - 新增黑暗模式 117 | - v0.3.3 118 | - 修复弹幕用户名打码 119 | - fix [#12](https://github.com/zangxx66/nonebot_plugin_blive_danmaku/issues/12) 120 | - v0.3.0 121 | - 适配nonebot2 2.0.0 122 | - 增加弹幕统计 123 | - 新增记录SuperChat内容,可在面板生成SuperChat图片 124 | - 更新依赖 [#11](https://github.com/zangxx66/nonebot_plugin_blive_danmaku/issues/11) 125 | - v0.2.9 126 | - 面板查询开播历史列表,标题旁展示该场直播的路灯数量 127 | - Bot被踢出群后清除该群的订阅 128 | - fix路灯列表搜索bug 129 | - Clean Up Code 130 | - v0.2.8 131 | - 封面地址不再绑定url,面板地址变更导致封面图片异常的可手动清理 [#10](https://github.com/zangxx66/nonebot_plugin_blive_danmaku/issues/10) 132 | - 面板添加侧边菜单应对多个订阅的展示 133 | - v0.2.7 134 | - 面板支持表情显示 135 | - v0.2.6 136 | - :wink: 节日快乐 137 | - 面板稍微添加了一点小小的工作 138 | - v0.2.5 139 | - 前端添加条件搜索 140 | - v0.2.4 141 | - 移除直播间ws监听多余的输出 142 | - 更新前端 143 | - v0.2.0 144 | - 修复历史bug 145 | - 添加网页面板,外部访问请自行配置反向代理服务器 146 | - v0.1.4 147 | - 添加开播提醒,`.env`新增全局配置项`danmaku_group_notice`开关 [#3](https://github.com/zangxx66/nonebot_plugin_blive_danmaku/issues/3) 148 | - 调整日志级别 [#5](https://github.com/zangxx66/nonebot_plugin_blive_danmaku/issues/5) 149 | - v0.1.3 150 | - bot提醒在时间后面加上直播时长显示,避免直播画面没有当前时间的场景 151 | - v0.1.2 152 | - fix局部变量无法正常更新的bug 153 | - v0.1.0 154 | - 基于nonebot2,实现同步路灯弹幕到qq群 155 | 156 | ## 感谢 157 | - [HarukaBot](https://github.com/SK-415/HarukaBot) 158 | - [blivechat](https://github.com/xfgryujk/blivechat) 159 | - [nonebot2](https://v2.nonebot.dev/) 160 | - [blive-sc-gen](https://github.com/FangDingli/blive-sc-gen) 161 | 162 | -------------------------------------------------------------------------------- /doc/NoneBotPlugin.svg: -------------------------------------------------------------------------------- 1 | NoneBot Plugin -------------------------------------------------------------------------------- /doc/nbp_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/doc/nbp_logo.png -------------------------------------------------------------------------------- /doc/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/doc/screenshot.png -------------------------------------------------------------------------------- /doc/screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/doc/screenshot1.png -------------------------------------------------------------------------------- /doc/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/doc/screenshot2.png -------------------------------------------------------------------------------- /doc/screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/doc/screenshot3.png -------------------------------------------------------------------------------- /doc/screenshot4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/doc/screenshot4.png -------------------------------------------------------------------------------- /doc/screenshot5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/doc/screenshot5.png -------------------------------------------------------------------------------- /doc/screenshot6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/doc/screenshot6.png -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/__init__.py: -------------------------------------------------------------------------------- 1 | import nonebot 2 | from .utils import on_startup 3 | from nonebot import get_driver 4 | from nonebot.log import logger 5 | from nonebot.plugin import PluginMetadata 6 | from .config import Config as danmaku_config 7 | from fastapi import FastAPI 8 | 9 | __plugin_meta__ = PluginMetadata( 10 | name="B站直播间路灯插件", 11 | description="通过弹幕记录直播高能点", 12 | usage="弹幕指令为'#路灯 加上记录的内容',仅在开播时弹幕指令才会生效", 13 | type="application", 14 | homepage="https://github.com/zangxx66/nonebot_plugin_blive_danmaku", 15 | config=danmaku_config, 16 | supported_adapters={"~onebot.v11"}, 17 | extra={} 18 | ) 19 | __version__ = "0.3.3" 20 | from . import command 21 | from .app import app 22 | 23 | driver = get_driver() 24 | driver.on_startup(on_startup) 25 | 26 | host = driver.config.host 27 | port = driver.config.port 28 | 29 | fast_api: FastAPI = nonebot.get_app() 30 | fast_api.mount("/danmaku", app, name="blive-danmaku plugin") 31 | logger.info("Web UI running on " 32 | f"http://{host}:{port}/danmaku/") 33 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/__init__.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from fastapi import FastAPI, Request 3 | from fastapi.middleware.gzip import GZipMiddleware 4 | from fastapi.middleware.cors import CORSMiddleware 5 | from fastapi.staticfiles import StaticFiles 6 | from fastapi.exceptions import RequestValidationError 7 | from fastapi.responses import JSONResponse 8 | from fastapi.templating import Jinja2Templates 9 | from .router import router 10 | from nonebot.log import logger 11 | 12 | 13 | dist_path = Path(__file__).parent / "frontend" 14 | cache_path = Path(__file__).parent / "frontend" / "static" 15 | 16 | if not dist_path.is_dir(): 17 | raise FileNotFoundError("WebUI path not found") 18 | if not cache_path.is_dir(): 19 | Path.mkdir(cache_path) 20 | 21 | app = FastAPI(title="nonebot_plugin_blive_danmaku", 22 | description="live room danmaku manager", 23 | version="0.2.0", 24 | docs_url=None, 25 | redoc_url=None, 26 | openapi_url=None) 27 | 28 | 29 | @app.exception_handler(RequestValidationError) 30 | async def exception_handle(request: Request, exc: RequestValidationError): 31 | logger.error(f"fastapi请求异常:{exc.errors()}") 32 | return JSONResponse(status_code=418, content={"code": -1, "msg": "请求异常", "data": exc.errors()}) 33 | 34 | 35 | app.add_middleware(GZipMiddleware, minimum_size=1024) 36 | app.add_middleware(CORSMiddleware, allow_origins=['*'], allow_credentials=True, allow_methods=['*'], allow_headers=['*']) 37 | app.include_router(router, prefix="/api") 38 | app.mount("/", StaticFiles(directory=dist_path, html=True), name="main") 39 | 40 | templates = Jinja2Templates(directory=dist_path) 41 | 42 | 43 | @app.get("/") 44 | async def main(request: Request): 45 | return templates.TemplateResponse("index.html", {"request": request}) 46 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/SC-bg-img-0e2aa755.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/nonebot_plugin_blive_danmaku/app/frontend/assets/SC-bg-img-0e2aa755.png -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/guard-1-k-823c4f26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/nonebot_plugin_blive_danmaku/app/frontend/assets/guard-1-k-823c4f26.png -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/guard-2-k-a0b7be7c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/nonebot_plugin_blive_danmaku/app/frontend/assets/guard-2-k-a0b7be7c.png -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/guard-3-k-3c7bacae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/nonebot_plugin_blive_danmaku/app/frontend/assets/guard-3-k-3c7bacae.png -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-01fd1861.css: -------------------------------------------------------------------------------- 1 | .danmaku-room-card .el-image[data-v-f577db64]{padding:0;width:100%;height:10rem} 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-13e4e779.js: -------------------------------------------------------------------------------- 1 | import{u as A,g as _,e as H,b as N,d as E,f as k,_ as R}from"./index-c6df6c50.js";import{a as p,H as z,j,k as q,C as K,I as M,D as O,e as W,F as X,l as F,b as G,o as Q}from"./elementPlus-2f9ad77c.js";import{E as J,r as f,aK as Y,b as Z,K as $,j as ee,k as o,P as s,S as n,u as r,a0 as x,T as b,h as v,W as d,X as te,aP as w}from"./vendor-9f742c23.js";import"./lodash-742d3967.js";const oe={class:"danmaku-room-list",style:{"padding-top":"0%",width:"60%",margin:"0 auto"}},ae={class:"danmaku-page-header"},se={class:"text-large font-600 mr-3"},ne={class:"image-slot"},le={class:"image-slot"},ie={style:{"text-align":"left"}},re={class:"danmaku-room-title"},ce={style:{"text-align":"left"}},_e={style:{"text-align":"left"}},de=J({__name:"index",setup(ue){const l=f({}),c=f(!0),g=f("120px"),C=w({loader:()=>k(()=>import("./index-544d3f89.js"),["assets/index-544d3f89.js","assets/index-c6df6c50.js","assets/vendor-9f742c23.js","assets/vendor-b57f6aba.css","assets/elementPlus-2f9ad77c.js","assets/lodash-742d3967.js","assets/elementPlus-ce22a485.css","assets/index-4f53a516.css"])}),I=w({loader:()=>k(()=>import("./index-edb1e61b.js"),["assets/index-edb1e61b.js","assets/elementPlus-2f9ad77c.js","assets/vendor-9f742c23.js","assets/vendor-b57f6aba.css","assets/lodash-742d3967.js","assets/elementPlus-ce22a485.css","assets/index-c6df6c50.js","assets/index-4f53a516.css","assets/echarts-0647520d.js"])}),i=A(),S=Y(),D=()=>{const e=i.getType,t=i.getTypeId,a=i.getUid;S.replace({name:"history",query:{type:e,type_id:t,uid:a}})},L=()=>{const e=_("roomid");if(e==null)return p({title:"Error",message:"房间号不存在,请返回上一页重新进入",type:"error"}),c.value=!1,!1;c.value=!0,H({id:e}).then(async t=>{if(t.code!=0)p({title:"Error",message:"系统异常",type:"error"});else{const a=t.data.room_info;if(document.title=a.title,a.cover.startsWith("/")&&(a.cover=N+a.cover),l.value=a,i.getUid===0){const m=_("uid");i.setUid(m)}}c.value=!1}).catch(t=>{console.error(t),c.value=!1,p({title:"Error",message:"请求异常",type:"error"})})},u=()=>{const e=document.querySelector(".danmaku-main");g.value=e.clientHeight*.5+"px"};return Z(()=>{u(),window.addEventListener("resize",u);const e=_("type"),t=_("type_id");e!=null&&t!=null&&i.setState(t,e),L()}),$(()=>{window.removeEventListener("resize",u)}),(e,t)=>{const a=z,h=W,m=X,T=F,P=G,B=Q,U=j,V=q,y=K;return v(),ee("div",oe,[o("div",ae,[s(a,{icon:r(M),onBack:D},{content:n(()=>[o("span",se,d(l.value.name),1)]),_:1},8,["icon"])]),x((v(),b(U,null,{default:n(()=>[s(T,{class:"danmaku-room-card"},{default:n(()=>[s(m,{src:l.value.cover,referrerpolicy:"no-referrer",fit:"fill"},{placeholder:n(()=>[x(o("div",ne,null,512),[[y,!0]])]),error:n(()=>[o("div",le,[s(h,null,{default:n(()=>[s(r(O))]),_:1})])]),_:1},8,["src"])]),_:1}),s(B,null,{default:n(()=>[o("ul",ie,[s(P,{type:"primary",target:"_blank",href:"https://space.bilibili.com/"+l.value.uid},{default:n(()=>[o("div",re,d(l.value.title),1)]),_:1},8,["href"])]),o("ul",ce,[o("span",null," 开始时间:"+d(r(E)(l.value.start_time)),1)]),o("ul",_e,[o("span",null," 结束时间:"+d(r(E)(l.value.end_time)),1)])]),_:1})]),_:1})),[[y,c.value]]),s(V,{"max-height":g.value,"view-style":{overflowX:"hidden"}},{default:n(()=>[l.value.statistics?(v(),b(r(I),{key:0})):te("",!0),s(r(C))]),_:1},8,["max-height"])])}}});const ge=R(de,[["__scopeId","data-v-f577db64"]]);export{ge as default}; 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-35dc9657.js: -------------------------------------------------------------------------------- 1 | import{p as m,c as p}from"./elementPlus-2f9ad77c.js";import{G as v,C as f,_ as x}from"./index-c6df6c50.js";import{E as h,r as l,b,v as y,j as g,P as c,S as s,h as C,k as a,W as i,V as n,u as k}from"./vendor-9f742c23.js";import"./lodash-742d3967.js";const w={class:"home"},B={class:"text item"},E={class:"text item"},N=h({__name:"index",setup(V){const t=l(""),r=l(""),_=setInterval(()=>{const o=v(),e=o.hour();e>=6&&e<12?t.value="早上好":e>=12&&e<14?t.value="中午好":e>=14&&e<18?t.value="下午好":e>=18&&e<24?t.value="晚上好":t.value="凌晨好",r.value=o.format("HH:mm:ss")},1e3);return b(()=>{document.title="主页";const o=document.querySelector(".home");o.style.height=window.innerHeight-60+"px"}),y(()=>{clearInterval(_)}),(o,e)=>{const d=p,u=m;return C(),g("div",w,[c(u,{class:"box-card"},{header:s(()=>[a("span",null,i(t.value),1)]),default:s(()=>[a("div",B," 现在是"+i(r.value)+",切片再累也要记得休息。 ",1),a("div",E,[n(" 封面图片若出现无法显示的情况,可"),c(d,{link:"",type:"primary",onClick:e[0]||(e[0]=H=>k(f)(!1))},{default:s(()=>[n("点击此处")]),_:1}),n("重置图片缓存。 ")])]),_:1})])}}});const j=x(N,[["__scopeId","data-v-6ba5b063"]]);export{j as default}; 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-434a6b8b.js: -------------------------------------------------------------------------------- 1 | import{a as V,p as O,q as H,r as J,t as Z,k as ee,u as te,v as ae,w as le,x as oe,c as se,y as ne,e as re,A as de,B as ue,C as ce,D as ie,F as _e,G as pe}from"./elementPlus-2f9ad77c.js";import{E as me,r as c,aK as fe,b as ve,j as I,P as e,S as t,u as g,k as d,h as y,V as p,a0 as N,T as x,Q as ge,ad as ye,W as E}from"./vendor-9f742c23.js";import{u as he,g as w,a as ke,b as be,c as Ee,d as F}from"./index-c6df6c50.js";import"./lodash-742d3967.js";const Ce={class:"danmaku-room-list"},Ve={class:"image-slot"},xe=["onClick"],we={style:{padding:"14px"}},Te={class:"danmaku-badge"},ze={class:"bottom"},De={class:"time"},Se=d("br",null,null,-1),Ue=d("br",null,null,-1),Ye={style:{"margin-top":"20px","margin-bottom":"20px"}},Le=me({__name:"index",setup(Be){const h=c([]),T=c(0),k=c(1),L=c([10,20,30,50]),C=c(20),m=c(!0),z=c(),o=c({}),n=he(),M=s=>{C.value=s,b()},G=s=>{k.value=s,b()},R=fe(),D=s=>{R.push({path:"/room",query:{roomid:s,type:n.getType,type_id:n.getTypeId,uid:n.getUid}})},S=()=>{z.value.setScrollTop(0)},b=()=>{m.value=!0;const s=n.getType,l=n.getTypeId,i=n.getUid;if(!s||!l)return V({title:"Error",message:"当前地址有误,请从bot重新获取面板地址",type:"error"}),m.value=!1,!1;const _={type:s,type_id:l,uid:i,page:k.value,size:C.value,title:o.value.title,danmaku:o.value.danmaku,start:o.value.start,end:o.value.end};ke(_).then(u=>{if(u.code!=0)return V({title:"Error",message:u.msg||"系统异常",type:"error"}),!1;const r=u.data,f=r.rows;for(let v of f)v.cover.startsWith("/")&&(v.cover=be+v.cover);h.value=[],Object.assign(h.value,f),T.value=r.total,m.value=!1,S()}).catch(u=>{m.value=!1,console.error(u),V({title:"Error",message:"请求异常",type:"error"})})},X=()=>{k.value=1,b()},j=()=>{const s={uid:n.getUid};Ee(s).then(l=>{document.title=l.data.data})};return ve(()=>{S();const s=w("type"),l=w("type_id");n.setState(l,s);const i=w("uid");n.setUid(i),j(),b()}),(s,l)=>{const i=te,_=ae,u=le,r=oe,f=se,v=ne,U=O,Y=re,q=H,Q=_e,W=pe,$=de,B=J,A=ue,P=ce;return y(),I("div",Ce,[e(U,{style:{width:"100%"}},{default:t(()=>[e(v,{ref:"form",model:o.value,inline:"","label-position":"left","label-width":"50px"},{default:t(()=>[e(_,{label:"标题"},{default:t(()=>[e(i,{modelValue:o.value.title,"onUpdate:modelValue":l[0]||(l[0]=a=>o.value.title=a),clearable:"",placeholder:"输入一个直播标题"},null,8,["modelValue"])]),_:1}),e(_,{label:"路灯"},{default:t(()=>[e(i,{modelValue:o.value.danmaku,"onUpdate:modelValue":l[1]||(l[1]=a=>o.value.danmaku=a),clearable:"",placeholder:"这里可以搜索路灯"},null,8,["modelValue"])]),_:1}),e(_,{label:"时间"},{default:t(()=>[e(r,{span:6},{default:t(()=>[e(u,{modelValue:o.value.start,"onUpdate:modelValue":l[2]||(l[2]=a=>o.value.start=a),type:"date",label:"Pick a date","value-format":"X",placeholder:"选择一个开始日期",format:"YYYY-MM-DD"},null,8,["modelValue"])]),_:1}),e(r,{class:"text-center",span:6},{default:t(()=>[p("-")]),_:1}),e(r,{span:6},{default:t(()=>[e(u,{modelValue:o.value.end,"onUpdate:modelValue":l[3]||(l[3]=a=>o.value.end=a),type:"date",label:"Pick a date","value-format":"X",placeholder:"选择一个结束日期",format:"YYYY-MM-DD"},null,8,["modelValue"])]),_:1})]),_:1}),e(_,null,{default:t(()=>[e(f,{type:"primary",onClick:X},{default:t(()=>[p("搜索")]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),e(q,null,{default:t(()=>[e(Y,null,{default:t(()=>[e(g(Z))]),_:1})]),_:1}),e(g(ee),{class:"danmaku-scroll-area","max-height":"40rem",ref_key:"scrollbar",ref:z,"view-style":{overflowX:"hidden"}},{default:t(()=>[N((y(),x(B,{gutter:10,style:{width:"100em"}},{default:t(()=>[h.value.length>0?(y(!0),I(ge,{key:0},ye(h.value,a=>(y(),x(r,{key:a.id,span:6,style:{"padding-top":"1%","padding-bottom":"1%"}},{default:t(()=>[e(U,{class:"danmaku-room-card"},{default:t(()=>[e(Q,{alt:a.title,src:a.cover,referrerpolicy:"no-referrer",loading:"lazy","scroll-container":".danmaku-scroll-area",style:{cursor:"pointer"},onClick:K=>D(a.id)},{placeholder:t(()=>[N(d("div",Ve,null,512),[[P,!0]])]),error:t(()=>[d("div",{class:"image-slot",onClick:K=>D(a.id)},[e(Y,null,{default:t(()=>[e(g(ie))]),_:1})],8,xe)]),_:2},1032,["alt","src","onClick"]),d("div",we,[e(W,{value:a.count,max:99},{default:t(()=>[d("span",Te,E(a.title),1)]),_:2},1032,["value"]),d("div",ze,[d("time",De,[p("开始:"+E(g(F)(a.start_time))+" ",1),Se,p("~"),Ue,p(" 结束:"+E(g(F)(a.end_time)),1)]),e(f,{text:"",class:"button"},{default:t(()=>[p(E(a.name),1)]),_:2},1024)])])]),_:2},1024)]),_:2},1024))),128)):(y(),x(r,{key:1,span:24},{default:t(()=>[e($,{description:"No data"})]),_:1}))]),_:1})),[[P,m.value]])]),_:1},512),d("div",Ye,[e(B,{gutter:20},{default:t(()=>[e(r,{span:12,offset:0},{default:t(()=>[e(A,{background:"",layout:"total,sizes,prev,pager,next","page-size":C.value,"page-sizes":L.value,total:T.value,"current-page":k.value,onSizeChange:M,onCurrentChange:G},null,8,["page-size","page-sizes","total","current-page"])]),_:1})]),_:1})])])}}});export{Le as default}; 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-4f53a516.css: -------------------------------------------------------------------------------- 1 | :root{font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,微软雅黑,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-text-size-adjust:100%}body.dark{background-color:#121212;color:#fff}body.dark .danmaku-room-title{color:#fff}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;overflow:hidden}h1{font-size:3.2em;line-height:1.1}.day-night-btn-div .components{inset:1rem;margin:auto}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.card{padding:2em}#app{max-width:1280px;text-align:center}.danmaku-main{top:5%;width:100rem}.danmaku-room-list{left:50%;margin:0 auto;top:0%;position:absolute;transform:translate(-45%,90px)}.danmaku-page-header{padding:1rem}.flex-grow{flex-grow:.99}.danmaku-aside{box-shadow:var(--el-box-shadow-light)}.danmaku-log-item{text-align:left}.danmaku-badge{margin-right:1vh}.danmaku-message{padding-right:1%}.danmaku-room-card .block{padding:30px 0;text-align:center;border-right:solid 1px var(--el-border-color);display:inline-block;width:49%;box-sizing:border-box;vertical-align:top}.danmaku-room-card .demonstration{display:block;color:var(--el-text-color-secondary);font-size:14px;margin-bottom:20px}.danmaku-room-card .el-image{padding:0 5px;width:100%;height:200px}.danmaku-room-card .image-slot{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:var(--el-fill-color-light);color:var(--el-text-color-secondary);font-size:30px}.danmaku-room-card .image-slot .el-icon{font-size:30px}.danmaku-room-title{color:#000;font-weight:700;font-size:20px}.demo-input-suffix{margin-top:3%}.danmaku-hot-word{text-align:left;padding-top:1rem}.danmaku-chart{width:65rem;height:300px;padding-top:1rem}.el-badge .el-badge__content{user-select:none;-moz-user-select:none;-webkit-user-select:none;cursor:default}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}.time{font-size:12px;color:#999}.bottom{margin-top:13px;line-height:12px;display:flex;justify-content:space-between;align-items:center}.button{padding:0;min-height:auto}.h-100\%{height:100%}.h-32px{height:32px}.h-40px{height:40px}.h-56px{height:56px}.h-8{height:2rem}.h1{height:.25rem}.h2{height:.5rem}.h3{height:.75rem}.h4{height:1rem}.ha{height:auto}.w-100\%,.w-full,[w-full=""]{width:100%}.w-100px{width:100px}.w-20,[w~="20"]{width:5rem}.w-32px{width:32px}.w-35{width:8.75rem}.w-8{width:2rem}.w-89px{width:89px}[h~="30"]{height:7.5rem}[w~="30"]{width:7.5rem}[w~="40"]{width:10rem}[w~="46"]{width:11.5rem}.m-0{margin:0rem}.m-1{margin:.25rem}.m-2,[m~="2"]{margin:.5rem}.m-4,[m~="4"]{margin:1rem}[m~=auto]{margin:auto}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.my,.my-4{margin-top:1rem;margin-bottom:1rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}[m~=y-12]{margin-top:3rem;margin-bottom:3rem}.m-b-2px{margin-bottom:2px}.m-r-8px{margin-right:8px}.m-t-16px{margin-top:16px}.m-t-2px,.mt-2px{margin-top:2px}.mb-1,[mb-1=""]{margin-bottom:.25rem}.mb-2,[m~=b-2],[mb-2=""]{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.me{margin-inline-end:1rem}.ml-1{margin-left:.25rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-1{margin-top:.25rem}.mt-2,[m~=t-2]{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-32px{margin-top:32px}.mt-4,[m~=t-4]{margin-top:1rem}.mt-8{margin-top:2rem}[m~=t-0]{margin-top:0rem}.components[data-v-bdc87af7]{--width: 180px;--height: 70px}.components.night[data-v-bdc87af7]{background-color:#191e32}.components.night .main-button[data-v-bdc87af7]{left:calc(var(--width) * 110 / 180);background-color:#c3c8d2;box-shadow:3px 3px 5px #00000080,inset -3px -5px 3px -3px #00000080,inset 4px 5px 2px -2px #ffffd2}.components.night .daytime-background[data-v-bdc87af7]:nth-child(2){left:calc(var(--width) * 90 / 180)}.components.night .daytime-background[data-v-bdc87af7]:nth-child(3){left:calc(var(--width) * 60 / 180)}.components.night .daytime-background[data-v-bdc87af7]:nth-child(4){left:calc(var(--width) * 30 / 180)}.components.night .cloud[data-v-bdc87af7],.components.night .cloud-light[data-v-bdc87af7]{bottom:calc(var(--height) * -65 / 70)}.components.night .moon[data-v-bdc87af7]{opacity:1}.components.night .stars[data-v-bdc87af7]{top:0;opacity:1}.components[data-v-bdc87af7]{position:sticky;width:var(--width);height:var(--height);border-radius:var(--height);overflow:hidden;transition:.7s;background-color:#4685c0;box-shadow:inset 0 0 5px 3px #00000080}.components>*[data-v-bdc87af7]{transition:.7s}.components .main-button[data-v-bdc87af7]{position:absolute;left:0;margin:calc(var(--width) * 7.5 / 180) 0 0 calc(var(--width) * 7.5 / 180);width:calc(var(--width) * 55 / 180);height:calc(var(--width) * 55 / 180);border-radius:50%;cursor:pointer;transition:.7s;transition-timing-function:cubic-bezier(0,.5,1.3,1);background-color:#ffc323;box-shadow:3px 3px 5px #00000080,inset -3px -5px 3px -3px #00000080,inset 4px 5px 2px -2px #ffe650}.components .moon[data-v-bdc87af7]{box-shadow:inset 0 0 1px 1px #0000004d;border-radius:50%;transition:.5s;opacity:0;transition-timing-function:cubic-bezier(0,.5,1.3,1);position:absolute;background-color:#96a0b4}.components .moon[data-v-bdc87af7]:nth-child(1){top:calc(var(--height) * 7.5 / 70);left:calc(var(--width) * 25 / 180);width:calc(var(--width) * 12.5 / 180);height:calc(var(--width) * 12.5 / 180)}.components .moon[data-v-bdc87af7]:nth-child(2){top:calc(var(--height) * 20 / 70);left:calc(var(--width) * 7.5 / 180);width:calc(var(--width) * 20 / 180);height:calc(var(--width) * 20 / 180)}.components .moon[data-v-bdc87af7]:nth-child(3){top:calc(var(--height) * 32.5 / 70);left:calc(var(--width) * 32.5 / 180);width:calc(var(--width) * 12.5 / 180);height:calc(var(--width) * 12.5 / 180)}.components .daytime-background[data-v-bdc87af7]{position:absolute;transition:.7s;border-radius:50%;transition-timing-function:cubic-bezier(0,.5,1.3,1)}.components .daytime-background[data-v-bdc87af7]:nth-child(2){top:calc(var(--height) * -20 / 70);left:calc(var(--width) * -20 / 180);width:calc(var(--width) * 110 / 180);height:calc(var(--width) * 110 / 180);background-color:#fff3;z-index:-2}.components .daytime-background[data-v-bdc87af7]:nth-child(3){top:calc(var(--height) * -35 / 70);left:calc(var(--width) * -15 / 180);width:calc(var(--width) * 135 / 180);height:calc(var(--width) * 135 / 180);background-color:#ffffff1a;z-index:-3}.components .daytime-background[data-v-bdc87af7]:nth-child(4){top:calc(var(--height) * -45 / 70);left:calc(var(--width) * -15 / 180);width:calc(var(--width) * 160 / 180);height:calc(var(--width) * 160 / 180);background-color:#ffffff0d;z-index:-4}.components .cloud[data-v-bdc87af7],.components .cloud-light[data-v-bdc87af7]{transition:.7s}.components .cloud[data-v-bdc87af7]{z-index:-2;position:absolute;bottom:0;right:0}.components .cloud-light[data-v-bdc87af7]{position:absolute;z-index:-3;right:0;bottom:calc(var(--height) * 25 / 70);opacity:.5;transform:rotate(-5deg)}.components .cloud-son[data-v-bdc87af7]{z-index:-1;border-radius:50%;background-color:#fff;position:absolute}.components .cloud-son[data-v-bdc87af7]:nth-child(1),.components .cloud-son[data-v-bdc87af7]:nth-child(7){right:calc(var(--height) * -20 / 70);bottom:calc(var(--width) * 10 / 180);width:calc(var(--width) * 50 / 180);height:calc(var(--width) * 50 / 180)}.components .cloud-son[data-v-bdc87af7]:nth-child(2),.components .cloud-son[data-v-bdc87af7]:nth-child(8){right:calc(var(--height) * -10 / 70);bottom:calc(var(--width) * -25 / 180);width:calc(var(--width) * 60 / 180);height:calc(var(--width) * 60 / 180)}.components .cloud-son[data-v-bdc87af7]:nth-child(3),.components .cloud-son[data-v-bdc87af7]:nth-child(9){right:calc(var(--height) * 20 / 70);bottom:calc(var(--width) * -40 / 180);width:calc(var(--width) * 60 / 180);height:calc(var(--width) * 60 / 180)}.components .cloud-son[data-v-bdc87af7]:nth-child(4),.components .cloud-son[data-v-bdc87af7]:nth-child(10){right:calc(var(--height) * 50 / 70);bottom:calc(var(--width) * -35 / 180);width:calc(var(--width) * 60 / 180);height:calc(var(--width) * 60 / 180)}.components .cloud-son[data-v-bdc87af7]:nth-child(5),.components .cloud-son[data-v-bdc87af7]:nth-child(11){right:calc(var(--height) * 75 / 70);bottom:calc(var(--width) * -60 / 180);width:calc(var(--width) * 75 / 180);height:calc(var(--width) * 75 / 180)}.components .cloud-son[data-v-bdc87af7]:nth-child(6),.components .cloud-son[data-v-bdc87af7]:nth-child(12){right:calc(var(--height) * 110 / 70);bottom:calc(var(--width) * -50 / 180);width:calc(var(--width) * 60 / 180);height:calc(var(--width) * 60 / 180)}.components .stars[data-v-bdc87af7]{top:calc(var(--height) * -65 / 70);z-index:-2;transition:.7s;transition-timing-function:cubic-bezier(0,.5,1.3,1);position:absolute}.components .stars .big[data-v-bdc87af7]{width:calc(var(--width) * 15 / 180);height:calc(var(--width) * 15 / 180)}.components .stars .medium[data-v-bdc87af7]{width:calc(var(--width) * 10 / 180);height:calc(var(--width) * 10 / 180)}.components .stars .small[data-v-bdc87af7]{width:calc(var(--width) * 6 / 180);height:calc(var(--width) * 6 / 180)}.components .stars .star[data-v-bdc87af7]{background-color:#fff;clip-path:polygon(30% 0%,54% 32%,100% 30%,65% 56%,70% 100%,42% 61%,0% 70%,34% 44%);position:absolute}.components .stars .star[data-v-bdc87af7]:nth-child(1){top:calc(var(--height) * 10 / 70);left:calc(var(--width) * 40 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(2){top:calc(var(--height) * 20 / 70);left:calc(var(--width) * 95 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(3){top:calc(var(--height) * 20 / 70);left:calc(var(--width) * 20 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(4){top:calc(var(--height) * 35 / 70);left:calc(var(--width) * 50 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(5){top:calc(var(--height) * 50 / 70);left:calc(var(--width) * 80 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(6){top:calc(var(--height) * 50 / 70);left:calc(var(--width) * 20 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(7){top:calc(var(--height) * 40 / 70);left:calc(var(--width) * 27.5 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(8){top:calc(var(--height) * 55 / 70);left:calc(var(--width) * 45 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(9){top:calc(var(--height) * 20 / 70);left:calc(var(--width) * 75 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(10){top:calc(var(--height) * 32.5 / 70);left:calc(var(--width) * 67.5 / 180)}.components .stars .star[data-v-bdc87af7]:nth-child(11){top:calc(var(--height) * 40 / 70);left:calc(var(--width) * 95 / 180)}*,:before,:after{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgba(0,0,0,0);--un-ring-shadow:0 0 rgba(0,0,0,0);--un-shadow-inset: ;--un-shadow:0 0 rgba(0,0,0,0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 rgba(0,0,0,0);--un-ring-shadow:0 0 rgba(0,0,0,0);--un-shadow-inset: ;--un-shadow:0 0 rgba(0,0,0,0);--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.flex-center{display:flex;align-items:center;justify-content:center}.visible{visibility:visible}.absolute,[pos~=absolute]{position:absolute}.relative{position:relative}.sticky{position:sticky}.bottom-0,[pos~=bottom-0]{bottom:0}.right-0,[pos~=right-0]{right:0}.right-8px,[pos~=right-8px]{right:8px}.top-10px,[pos~=top-10px]{top:10px}.float-left{float:left}.-m-x-5px{margin-left:-5px;margin-right:-5px}.-ml-12px{margin-left:-12px}.ml-0{margin-left:0}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4px{margin-left:4px}.ml-6px{margin-left:6px}.mr-2px{margin-right:2px}.mr-3{margin-right:.75rem}.mr-5px{margin-right:5px}.mt-6px{margin-top:6px}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.inline,[inline=""]{display:inline}.block{display:block}.inline-block{display:inline-block}.hidden{display:none}.h-14px{height:14px}.h-16px{height:16px}.h-20px{height:20px}.h-27px{height:27px}.h-34px{height:34px}.h-6{height:1.5rem}.h-full{height:100%}.h22px{height:22px}.min-h-12px{min-height:12px}.min-h-38px{min-height:38px}.min-w-12px{min-width:12px}.min-w-130px{min-width:130px}.w-105px{width:105px}.w-16px,.w16px{width:16px}.w-50{width:12.5rem}.w-90\%{width:90%}.w-auto{width:auto}.w-full{width:100%}.w22px{width:22px}.flex{display:flex}.inline-flex{display:inline-flex}.flex-grow{flex-grow:1}.transform{transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.resize{resize:both}.items-center{align-items:center}.justify-start{justify-content:flex-start}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ws-normal{white-space:normal}.ws-nowrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.border,[border~="1px"]{border-width:1px}[border~=transparent]{border-color:transparent}.rd-2px,[border~=rd-2px]{border-radius:2px}.b-rd-l-1px{border-top-left-radius:1px;border-bottom-left-radius:1px}.rd-b-0,[border~=rd-b-0]{border-bottom-left-radius:0;border-bottom-right-radius:0}.rd-b-6px,[border~=rd-b-6px]{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.rd-t-0,[border~=rd-t-0]{border-top-left-radius:0;border-top-right-radius:0}.rd-t-6px,[border~=rd-t-6px]{border-top-left-radius:6px;border-top-right-radius:6px}[border~=solid]{border-style:solid}.bg-\#fff{--un-bg-opacity:1;background-color:rgba(255,255,255,var(--un-bg-opacity))}[bg~=cover]{background-size:cover}[bg~=contain]{background-size:contain}[bg~=center-center]{background-position:center center}[bg~=center]{background-position:center}[bg~=right-top]{background-position:right top}[bg~=no-repeat]{background-repeat:no-repeat}.p-5px{padding:5px}.p-x-10px{padding-left:10px;padding-right:10px}.p-x-4px{padding-left:4px;padding-right:4px}.p-x-5px{padding-left:5px;padding-right:5px}.p-y-8px{padding-top:8px;padding-bottom:8px}.px{padding-left:1rem;padding-right:1rem}.p-t-6px{padding-top:6px}.pt{padding-top:1rem}.text-center,[text~=center]{text-align:center}[text~=left]{text-align:left}.v-middle{vertical-align:middle}.v-text-bottom{vertical-align:text-bottom}.text-12px,[text~="12px"]{font-size:12px}.text-14px,[text~="14px"]{font-size:14px}.font-600{font-weight:600}.fw-700{font-weight:700}.lh-14px{line-height:14px}.lh-18px{line-height:18px}.lh-20px{line-height:20px}.lh-27px{line-height:27px}.text-\#333,[text~="#333"]{--un-text-opacity:1;color:rgba(51,51,51,var(--un-text-opacity))}[text~="#61666D"]{--un-text-opacity:1;color:rgba(97,102,109,var(--un-text-opacity))}[text~="#fff"],[text~=white]{--un-text-opacity:1;color:rgba(255,255,255,var(--un-text-opacity))}[text~=transparent]{color:transparent}.op-78{opacity:.78}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.font-yahei{font-family:Microsoft YaHei,"Microsoft Sans Serif",Microsoft SanSerf,微软雅黑} 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-5034aea2.js: -------------------------------------------------------------------------------- 1 | import{r as u,k as f,x as v,J as h,p as w,K as y}from"./elementPlus-2f9ad77c.js";import{E as b,j as s,P as t,S as e,h as r,Q as g,ad as k,k as l,W as x}from"./vendor-9f742c23.js";import"./lodash-742d3967.js";const E={class:"danmaku-room-list"},C=l("div",null," 更新日志 ",-1),S={class:"card-header danmaku-log-item"},B=["innerHTML"],V=b({__name:"index",setup(T){document.title="更新日志";const i=[{version:"v0.3.0",content:"适配nonebot2 2.0.0
增加弹幕统计
新增记录SuperChat内容,可在面板生成SuperChat图片",hollow:!0,type:"primary",timestamp:"2023/6/24 12:58:00"},{version:"v0.2.9",content:"面板查询开播历史列表,标题旁展示该场直播的路灯数量
Bot被踢出群后清除该群的订阅
fix路灯列表搜索bug",hollow:!1,type:"default",timestamp:"2023/6/11 04:38:00"},{version:"v0.2.8",content:"封面地址不再绑定url,面板地址变更导致封面图片异常的可手动清理
面板添加侧边菜单应对多个订阅的展示",hollow:!1,type:"default",timestamp:"2023/6/4 22:32:00"},{version:"v0.2.7",content:"面板支持表情显示",hollow:!1,type:"default",timestamp:"2023/5/27 08:50:00"},{version:"v0.2.6",content:"节日快乐
面板稍微添加了一点小小的工作",hollow:!1,type:"default",timestamp:"2023/4/29 15:12:00"},{version:"v0.2.5",content:"前端添加条件搜索",hollow:!1,type:"default",timestamp:"2023/4/24 04:54:00"},{version:"v0.2.4",content:"移除直播间ws监听多余的输出
更新前端",hollow:!1,type:"default",timestamp:"2023/4/16 21:23:00"},{version:"v0.2.0",content:"修复历史bug
添加网页面板,外部访问请自行配置反向代理服务器",hollow:!1,type:"default",timestamp:"2023/4/15 16:49:00"},{version:"v0.1.4",content:"添加开播提醒,.env新增全局配置项danmaku_group_notice开关
调整日志级别",hollow:!1,type:"default",timestamp:"2023/4/11 01:50:00"},{version:"v0.1.3",content:"bot提醒在时间后面加上直播时长显示,避免直播画面没有当前时间的场景",hollow:!1,type:"default",timestamp:"2023/4/9 03:14:00"},{version:"v0.1.2",content:"fix局部变量无法正常更新的bug",hollow:!1,type:"default",timestamp:"2023/4/8 03:53:00"},{version:"v0.1.0",content:"基于nonebot2,实现同步路灯弹幕到qq群",hollow:!1,type:"default",timestamp:"2023/4/7 23:10:00"}];return(L,q)=>{const n=v,a=u,m=w,p=y,c=h,_=f;return r(),s("div",E,[t(a,{gutter:20},{default:e(()=>[t(n,{span:6},{default:e(()=>[C]),_:1})]),_:1}),t(_,{noresize:"","max-height":"50rem"},{default:e(()=>[t(a,null,{default:e(()=>[t(n,{span:24,offset:0},{default:e(()=>[t(c,null,{default:e(()=>[(r(),s(g,null,k(i,(o,d)=>t(p,{center:"",placement:"top",key:d,hollow:o.hollow,type:o.type,timestamp:o.timestamp},{default:e(()=>[t(m,null,{header:e(()=>[l("div",S,x(o.version),1)]),default:e(()=>[l("div",{class:"danmaku-log-item",innerHTML:o.content},null,8,B)]),_:2},1024)]),_:2},1032,["hollow","type","timestamp"])),64))]),_:1})]),_:1})]),_:1})]),_:1})])}}});export{V as default}; 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-544d3f89.js: -------------------------------------------------------------------------------- 1 | import{f as F,g as R,h as B,F as H,R as P}from"./index-c6df6c50.js";import{L as A,M as j,a as f,u as I,r as Q,c as q,N as z,A as G,x as O}from"./elementPlus-2f9ad77c.js";import{E as U,aP as W,r as y,s as $,b as J,ax as K,h as n,j as u,k as m,P as l,S as r,u as g,Q as x,ad as X,V as i,W as c,a0 as L,T as k}from"./vendor-9f742c23.js";import"./lodash-742d3967.js";const Y={class:"demo-input-suffix"},Z=m("span",{class:"ml-3 inline-flex items-center"},"路灯:",-1),ee={key:0,class:"ml-2"},te=["innerHTML"],ae={key:1,class:"ml-2"},se=["innerHTML"],ue=U({__name:"index",setup(ne){const w=W({loader:()=>F(()=>import("./sc-c94b5754.js"),["assets/sc-c94b5754.js","assets/elementPlus-2f9ad77c.js","assets/vendor-9f742c23.js","assets/vendor-b57f6aba.css","assets/lodash-742d3967.js","assets/elementPlus-ce22a485.css","assets/html2canvas-18c4afc9.js","assets/index-c6df6c50.js","assets/index-4f53a516.css","assets/sc-8f8a299b.css"])}),h=y(),C=t=>{const s={width:269,battery:Number(t.price*10),userName:t.uname,userRole:t.guard.toString(),scContent:t.message,showTrans:!1,transContent:"",showFansMedal:!1,medalName:"",medalLevel:1,guardMileStone:"0"};h.value.open(s)},d=y([]),_=y({danmaku:""}),T=()=>{const t=R("roomid");B({rid:t}).then(s=>{if(s.code!=0)f({title:"Error",message:s.msg||"获取弹幕异常",type:"error"});else{const o=s.data.rows;for(let a of o)a.hour_minute=H(a.create_time),a.message=P(a.message),(!a.type||a.type=="street_lamp")&&(a.message=a.message.replace("#路灯","").trim());d.value=o}})},D=$(()=>{const t=_.value.danmaku;return t?d.value.filter(o=>o.message.includes(t)||o.uname.includes(t)):d.value}),M=()=>{f({title:"提示",message:"已复制时间点到剪切板",type:"success"})},N=()=>{f({title:"Error",message:"复制失败",type:"error"})},v=t=>({msg:t,success:M,error:N});return J(()=>{T()}),(t,s)=>{const o=I,a=Q,p=q,V=z,b=G,S=O,E=K("clipboard");return n(),u(x,null,[m("div",Y,[l(a,{gutter:20},{default:r(()=>[Z,l(o,{class:"w-50",style:{width:"12.5rem"},modelValue:_.value.danmaku,"onUpdate:modelValue":s[0]||(s[0]=e=>_.value.danmaku=e),placeholder:"请在此输入搜索内容","prefix-icon":g(A),clearable:""},null,8,["modelValue","prefix-icon"])]),_:1})]),l(a,{gutter:20},{default:r(()=>[l(S,{span:24},{default:r(()=>[d.value.length>0?(n(!0),u(x,{key:0},X(D.value,e=>(n(),u("ul",{key:e.id,style:{"text-align":"left"}},[e.type=="street_lamp"||!e.type?(n(),u("span",ee,[i(c(e.uname)+"  "+c(e.hour_minute)+" (",1),L((n(),k(p,{type:"info",link:""},{default:r(()=>[i(c(e.live_duration),1)]),_:2},1024)),[[E,v(e.live_duration)]]),i(") : "),m("span",{innerHTML:e.message},null,8,te)])):(n(),u("span",ae,[i(c(e.uname)+"  "+c(e.hour_minute)+"(",1),L((n(),k(p,{type:"info",link:""},{default:r(()=>[i(c(e.live_duration),1)]),_:2},1024)),[[E,v(e.live_duration)]]),i(") : "),m("span",{class:"danmaku-message",innerHTML:e.message},null,8,se),l(V,{effect:"dark",placement:"top",content:"点击生成SC图片"},{default:r(()=>[l(p,{onClick:oe=>C(e),icon:g(j),size:"small",type:"primary",circle:""},null,8,["onClick","icon"])]),_:2},1024)]))]))),128)):(n(),k(b,{key:1,description:"No data"}))]),_:1})]),_:1}),l(g(w),{ref_key:"hd",ref:h},null,512)],64)}}});export{ue as default}; 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-c6df6c50.js: -------------------------------------------------------------------------------- 1 | var Z=Object.defineProperty;var ee=(e,a,c)=>a in e?Z(e,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):e[a]=c;var $=(e,a,c)=>(ee(e,typeof a!="symbol"?a+"":a,c),c);import{aD as ae,aE as H,aF as E,E as N,s as O,h as j,j as V,k as p,G as P,H as w,u as v,aG as ce,aH as te,aI as de,r as x,T as S,S as i,P as n,V as m,aJ as U,aK as A,y as se,Q as B,b as oe,K as ne,at as ie,ad as fe,W as le,aL as be,aM as pe,aN as re,aA as me,aO as ue}from"./vendor-9f742c23.js";import{E as he,a as C,b as ge,c as ve,d as _e,h as ye,s as je,e as we,f as G,g as xe,i as M,j as Ee,z as ke,k as Ce,l as Ne,m as Ie,n as Te,o as Se}from"./elementPlus-2f9ad77c.js";import"./lodash-742d3967.js";(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))s(t);new MutationObserver(t=>{for(const d of t)if(d.type==="childList")for(const o of d.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&s(o)}).observe(document,{childList:!0,subtree:!0});function c(t){const d={};return t.integrity&&(d.integrity=t.integrity),t.referrerPolicy&&(d.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?d.credentials="include":t.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function s(t){if(t.ep)return;t.ep=!0;const d=c(t);fetch(t.href,d)}})();const L=ae("storeId",{state:()=>({type_id:0,type:"",uid:0}),getters:{getTypeId:e=>e.type_id,getType:e=>e.type,getUid:e=>e.uid},actions:{setState(e,a){if(!e||!a)throw new Error("参数错误,需要从bot提供的地址进入");if(isNaN(Number(e)))throw new TypeError("type_id类型错误");{const c=Number(e);this.type=a,this.type_id=c}},setUid(e){if(e){if(isNaN(Number(e)))throw new TypeError("uid类型错误");{const a=Number(e);this.uid=a}}else throw new Error("参数错误")}}}),Ve=`${location.protocol}//${location.host}/danmaku`;class Le{constructor(a){$(this,"baseUrl");this.baseUrl=a}getInsideConfig(){return{baseUrl:this.baseUrl,params:{}}}async get(a,c={},s=null){const t=this.getInsideConfig();return t.params=c,(await H.get(t.baseUrl+a,t)).data}async post(a,c={},s=null){const t=this.getInsideConfig();return s!=null&&Object.assign(t,s),(await H.post(t.baseUrl+a,c,t)).data}}const _=new Le(Ve),na=async(e={})=>await _.get("/api/get_sub_list",e),ia=async(e={})=>await _.get("/api/get_room",e),fa=async(e={})=>await _.get("/api/get_room_danmaku",e),Re=async(e={})=>await _.get("/api/get_liver_list",e),la=async(e={})=>await _.get("/api/get_liver_name",e),$e=async(e={})=>await _.get("/api/clear_cache",e),ba=async(e={})=>await _.get("/api/get_statistics",e),He=[{emoji:"[dog]",url:"http://i0.hdslb.com/bfs/live/4428c84e694fbf4e0ef6c06e958d9352c3582740.png",map:"4428c84e694fbf4e0ef6c06e958d9352c3582740.png"},{emoji:"[花]",url:"http://i0.hdslb.com/bfs/live/7dd2ef03e13998575e4d8a803c6e12909f94e72b.png",map:"7dd2ef03e13998575e4d8a803c6e12909f94e72b.png"},{emoji:"[妙]",url:"http://i0.hdslb.com/bfs/live/08f735d950a0fba267dda140673c9ab2edf6410d.png",map:"08f735d950a0fba267dda140673c9ab2edf6410d.png"},{emoji:"[哇]",url:"http://i0.hdslb.com/bfs/live/650c3e22c06edcbca9756365754d38952fc019c3.png",map:"650c3e22c06edcbca9756365754d38952fc019c3.png"},{emoji:"[爱]",url:"http://i0.hdslb.com/bfs/live/1daaa5d284dafaa16c51409447da851ff1ec557f.png",map:"1daaa5d284dafaa16c51409447da851ff1ec557f.png"},{emoji:"[手机]",url:"http://i0.hdslb.com/bfs/live/b159f90431148a973824f596288e7ad6a8db014b.png",map:"b159f90431148a973824f596288e7ad6a8db014b.png"},{emoji:"[撇嘴]",url:"http://i0.hdslb.com/bfs/live/4255ce6ed5d15b60311728a803d03dd9a24366b2.png",map:"4255ce6ed5d15b60311728a803d03dd9a24366b2.png"},{emoji:"[委屈]",url:"http://i0.hdslb.com/bfs/live/69312e99a00d1db2de34ef2db9220c5686643a3f.png",map:"69312e99a00d1db2de34ef2db9220c5686643a3f.png"},{emoji:"[抓狂]",url:"http://i0.hdslb.com/bfs/live/a7feb260bb5b15f97d7119b444fc698e82516b9f.png",map:"a7feb260bb5b15f97d7119b444fc698e82516b9f.png"},{emoji:"[比心]",url:"http://i0.hdslb.com/bfs/live/4e029593562283f00d39b99e0557878c4199c71d.png",map:"4e029593562283f00d39b99e0557878c4199c71d.png"},{emoji:"[赞]",url:"http://i0.hdslb.com/bfs/live/2dd666d3651bafe8683acf770b7f4163a5f49809.png",map:"2dd666d3651bafe8683acf770b7f4163a5f49809.png"},{emoji:"[滑稽]",url:"http://i0.hdslb.com/bfs/live/8624fd172037573c8600b2597e3731ef0e5ea983.png",map:"8624fd172037573c8600b2597e3731ef0e5ea983.png"},{emoji:"[吃瓜]",url:"http://i0.hdslb.com/bfs/live/ffb53c252b085d042173379ac724694ce3196194.png",map:"ffb53c252b085d042173379ac724694ce3196194.png"},{emoji:"[笑哭]",url:"http://i0.hdslb.com/bfs/live/c5436c6806c32b28d471bb23d42f0f8f164a187a.png",map:"c5436c6806c32b28d471bb23d42f0f8f164a187a.png"},{emoji:"[捂脸]",url:"http://i0.hdslb.com/bfs/live/e6073c6849f735ae6cb7af3a20ff7dcec962b4c5.png",map:"e6073c6849f735ae6cb7af3a20ff7dcec962b4c5.png"},{emoji:"[喝彩]",url:"http://i0.hdslb.com/bfs/live/b51824125d09923a4ca064f0c0b49fc97d3fab79.png",map:"b51824125d09923a4ca064f0c0b49fc97d3fab79.png"},{emoji:"[偷笑]",url:"http://i0.hdslb.com/bfs/live/e2ba16f947a23179cdc00420b71cc1d627d8ae25.png",map:"e2ba16f947a23179cdc00420b71cc1d627d8ae25.png"},{emoji:"[大笑]",url:"http://i0.hdslb.com/bfs/live/e2589d086df0db8a7b5ca2b1273c02d31d4433d4.png",map:"e2589d086df0db8a7b5ca2b1273c02d31d4433d4.png"},{emoji:"[惊喜]",url:"http://i0.hdslb.com/bfs/live/9c75761c5b6e1ff59b29577deb8e6ad996b86bd7.png",map:"9c75761c5b6e1ff59b29577deb8e6ad996b86bd7.png"},{emoji:"[傲娇]",url:"http://i0.hdslb.com/bfs/live/b5b44f099059a1bafb2c2722cfe9a6f62c1dc531.png",map:"b5b44f099059a1bafb2c2722cfe9a6f62c1dc531.png"},{emoji:"[疼]",url:"http://i0.hdslb.com/bfs/live/492b10d03545b7863919033db7d1ae3ef342df2f.png",map:"492b10d03545b7863919033db7d1ae3ef342df2f.png"},{emoji:"[吓]",url:"http://i0.hdslb.com/bfs/live/c6bed64ffb78c97c93a83fbd22f6fdf951400f31.png",map:"c6bed64ffb78c97c93a83fbd22f6fdf951400f31.png"},{emoji:"[阴险]",url:"http://i0.hdslb.com/bfs/live/a4df45c035b0ca0c58f162b5fb5058cf273d0d09.png",map:"a4df45c035b0ca0c58f162b5fb5058cf273d0d09.png"},{emoji:"[惊讶]",url:"http://i0.hdslb.com/bfs/live/bc26f29f62340091737c82109b8b91f32e6675ad.png",map:"bc26f29f62340091737c82109b8b91f32e6675ad.png"},{emoji:"[生病]",url:"http://i0.hdslb.com/bfs/live/84c92239591e5ece0f986c75a39050a5c61c803c.png",map:"84c92239591e5ece0f986c75a39050a5c61c803c.png"},{emoji:"[嘘]",url:"http://i0.hdslb.com/bfs/live/b6226219384befa5da1d437cb2ff4ba06c303844.png",map:"b6226219384befa5da1d437cb2ff4ba06c303844.png"},{emoji:"[奸笑]",url:"http://i0.hdslb.com/bfs/live/5935e6a4103d024955f749d428311f39e120a58a.png",map:"5935e6a4103d024955f749d428311f39e120a58a.png"},{emoji:"[囧]",url:"http://i0.hdslb.com/bfs/live/204413d3cf330e122230dcc99d29056f2a60e6f2.png",map:"204413d3cf330e122230dcc99d29056f2a60e6f2.png"},{emoji:"[捂脸2]",url:"http://i0.hdslb.com/bfs/live/a2ad0cc7e390a303f6d243821479452d31902a5f.png",map:"a2ad0cc7e390a303f6d243821479452d31902a5f.png"},{emoji:"[出窍]",url:"http://i0.hdslb.com/bfs/live/bb8e95fa54512ffea07023ea4f2abee4a163e7a0.png",map:"bb8e95fa54512ffea07023ea4f2abee4a163e7a0.png"},{emoji:"[吐了啊]",url:"http://i0.hdslb.com/bfs/live/2b6b4cc33be42c3257dc1f6ef3a39d666b6b4b1a.png",map:"2b6b4cc33be42c3257dc1f6ef3a39d666b6b4b1a.png"},{emoji:"[鼻子]",url:"http://i0.hdslb.com/bfs/live/f4ed20a70d0cb85a22c0c59c628aedfe30566b37.png",map:"f4ed20a70d0cb85a22c0c59c628aedfe30566b37.png"},{emoji:"[调皮]",url:"http://i0.hdslb.com/bfs/live/84fe12ecde5d3875e1090d83ac9027cb7d7fba9f.png",map:"84fe12ecde5d3875e1090d83ac9027cb7d7fba9f.png"},{emoji:"[酸]",url:"http://i0.hdslb.com/bfs/live/98fd92c6115b0d305f544b209c78ec322e4bb4ff.png",map:"98fd92c6115b0d305f544b209c78ec322e4bb4ff.png"},{emoji:"[冷]",url:"http://i0.hdslb.com/bfs/live/b804118a1bdb8f3bec67d9b108d5ade6e3aa93a9.png",map:"b804118a1bdb8f3bec67d9b108d5ade6e3aa93a9.png"},{emoji:"[OK]",url:"http://i0.hdslb.com/bfs/live/86268b09e35fbe4215815a28ef3cf25ec71c124f.png",map:"86268b09e35fbe4215815a28ef3cf25ec71c124f.png"},{emoji:"[微笑]",url:"http://i0.hdslb.com/bfs/live/f605dd8229fa0115e57d2f16cb019da28545452b.png",map:"f605dd8229fa0115e57d2f16cb019da28545452b.png"},{emoji:"[藏狐]",url:"http://i0.hdslb.com/bfs/live/05ef7849e7313e9c32887df922613a7c1ad27f12.png",map:"05ef7849e7313e9c32887df922613a7c1ad27f12.png"},{emoji:"[龇牙]",url:"http://i0.hdslb.com/bfs/live/8b99266ea7b9e86cf9d25c3d1151d80c5ba5c9a1.png",map:"8b99266ea7b9e86cf9d25c3d1151d80c5ba5c9a1.png"},{emoji:"[防护]",url:"http://i0.hdslb.com/bfs/live/17435e60dcc28ce306762103a2a646046ff10b0a.png",map:"17435e60dcc28ce306762103a2a646046ff10b0a.png"},{emoji:"[笑]",url:"http://i0.hdslb.com/bfs/live/a91a27f83c38b5576f4cd08d4e11a2880de78918.png",map:"a91a27f83c38b5576f4cd08d4e11a2880de78918.png"},{emoji:"[一般]",url:"http://i0.hdslb.com/bfs/live/8d436de0c3701d87e4ca9c1be01c01b199ac198e.png",map:"8d436de0c3701d87e4ca9c1be01c01b199ac198e.png"},{emoji:"[嫌弃]",url:"http://i0.hdslb.com/bfs/live/c409425ba1ad2c6534f0df7de350ba83a9c949e5.png",map:"c409425ba1ad2c6534f0df7de350ba83a9c949e5.png"},{emoji:"[无语]",url:"http://i0.hdslb.com/bfs/live/4781a77be9c8f0d4658274eb4e3012c47a159f23.png",map:"4781a77be9c8f0d4658274eb4e3012c47a159f23.png"},{emoji:"[哈欠]",url:"http://i0.hdslb.com/bfs/live/6e496946725cd66e7ff1b53021bf1cc0fc240288.png",map:"6e496946725cd66e7ff1b53021bf1cc0fc240288.png"},{emoji:"[可怜]",url:"http://i0.hdslb.com/bfs/live/8e88e6a137463703e96d4f27629f878efa323456.png",map:"8e88e6a137463703e96d4f27629f878efa323456.png"},{emoji:"[歪嘴笑]",url:"http://i0.hdslb.com/bfs/live/bea1f0497888f3e9056d3ce14ba452885a485c02.png",map:"bea1f0497888f3e9056d3ce14ba452885a485c02.png"},{emoji:"[亲亲]",url:"http://i0.hdslb.com/bfs/live/10662d9c0d6ddb3203ecf50e77788b959d4d1928.png",map:"10662d9c0d6ddb3203ecf50e77788b959d4d1928.png"},{emoji:"[问号]",url:"http://i0.hdslb.com/bfs/live/a0c456b6d9e3187399327828a9783901323bfdb5.png",map:"a0c456b6d9e3187399327828a9783901323bfdb5.png"},{emoji:"[波吉]",url:"http://i0.hdslb.com/bfs/live/57dee478868ed9f1ce3cf25a36bc50bde489c404.png",map:"57dee478868ed9f1ce3cf25a36bc50bde489c404.png"},{emoji:"[OH]",url:"http://i0.hdslb.com/bfs/live/0d5123cddf389302df6f605087189fd10919dc3c.png",map:"0d5123cddf389302df6f605087189fd10919dc3c.png"},{emoji:"[再见]",url:"http://i0.hdslb.com/bfs/live/f408e2af700adcc2baeca15510ef620bed8d4c43.png",map:"f408e2af700adcc2baeca15510ef620bed8d4c43.png"},{emoji:"[白眼]",url:"http://i0.hdslb.com/bfs/live/7fa907ae85fa6327a0466e123aee1ac32d7c85f7.png",map:"7fa907ae85fa6327a0466e123aee1ac32d7c85f7.png"},{emoji:"[鼓掌]",url:"http://i0.hdslb.com/bfs/live/d581d0bc30c8f9712b46ec02303579840c72c42d.png",map:"d581d0bc30c8f9712b46ec02303579840c72c42d.png"},{emoji:"[大哭]",url:"http://i0.hdslb.com/bfs/live/816402551e6ce30d08b37a917f76dea8851fe529.png",map:"816402551e6ce30d08b37a917f76dea8851fe529.png"},{emoji:"[呆]",url:"http://i0.hdslb.com/bfs/live/179c7e2d232cd74f30b672e12fc728f8f62be9ec.png",map:"179c7e2d232cd74f30b672e12fc728f8f62be9ec.png"},{emoji:"[流汗]",url:"http://i0.hdslb.com/bfs/live/b00e2e02904096377061ec5f93bf0dd3321f1964.png",map:"b00e2e02904096377061ec5f93bf0dd3321f1964.png"},{emoji:"[生气]",url:"http://i0.hdslb.com/bfs/live/2c69dad2e5c0f72f01b92746bc9d148aee1993b2.png",map:"2c69dad2e5c0f72f01b92746bc9d148aee1993b2.png"},{emoji:"[加油]",url:"http://i0.hdslb.com/bfs/live/fbc3c8bc4152a65bbf4a9fd5a5d27710fbff2119.png",map:"fbc3c8bc4152a65bbf4a9fd5a5d27710fbff2119.png"},{emoji:"[害羞]",url:"http://i0.hdslb.com/bfs/live/d8ce9b05c0e40cec61a15ba1979c8517edd270bf.png",map:"d8ce9b05c0e40cec61a15ba1979c8517edd270bf.png"},{emoji:"[虎年]",url:"http://i0.hdslb.com/bfs/live/a51af0d7d9e60ce24f139c468a3853f9ba9bb184.png",map:"a51af0d7d9e60ce24f139c468a3853f9ba9bb184.png"},{emoji:"[doge2]",url:"http://i0.hdslb.com/bfs/live/f547cc853cf43e70f1e39095d9b3b5ac1bf70a8d.png",map:"f547cc853cf43e70f1e39095d9b3b5ac1bf70a8d.png"},{emoji:"[金钱豹]",url:"http://i0.hdslb.com/bfs/live/b6e8131897a9a718ee280f2510bfa92f1d84429b.png",map:"b6e8131897a9a718ee280f2510bfa92f1d84429b.png"},{emoji:"[瓜子]",url:"http://i0.hdslb.com/bfs/live/fd35718ac5a278fd05fe5287ebd41de40a59259d.png",map:"fd35718ac5a278fd05fe5287ebd41de40a59259d.png"},{emoji:"[墨镜]",url:"http://i0.hdslb.com/bfs/live/5e01c237642c8b662a69e21b8e0fbe6e7dbc2aa1.png",map:"5e01c237642c8b662a69e21b8e0fbe6e7dbc2aa1.png"},{emoji:"[难过]",url:"http://i0.hdslb.com/bfs/live/5776481e380648c0fb3d4ad6173475f69f1ce149.png",map:"5776481e380648c0fb3d4ad6173475f69f1ce149.png"},{emoji:"[抱抱]",url:"http://i0.hdslb.com/bfs/live/abddb0b621b389fc8c2322b1cfcf122d8936ba91.png",map:"abddb0b621b389fc8c2322b1cfcf122d8936ba91.png"},{emoji:"[跪了]",url:"http://i0.hdslb.com/bfs/live/4f2155b108047d60c1fa9dccdc4d7abba18379a0.png",map:"4f2155b108047d60c1fa9dccdc4d7abba18379a0.png"},{emoji:"[摊手]",url:"http://i0.hdslb.com/bfs/live/1e0a2baf088a34d56e2cc226b2de36a5f8d6c926.png",map:"1e0a2baf088a34d56e2cc226b2de36a5f8d6c926.png"},{emoji:"[热]",url:"http://i0.hdslb.com/bfs/live/6df760280b17a6cbac8c1874d357298f982ba4cf.png",map:"6df760280b17a6cbac8c1874d357298f982ba4cf.png"},{emoji:"[三星堆]",url:"http://i0.hdslb.com/bfs/live/0a1ab3f0f2f2e29de35c702ac1ecfec7f90e325d.png",map:"0a1ab3f0f2f2e29de35c702ac1ecfec7f90e325d.png"},{emoji:"[鼠]",url:"http://i0.hdslb.com/bfs/live/98f842994035505c728e32e32045d649e371ecd6.png",map:"98f842994035505c728e32e32045d649e371ecd6.png"},{emoji:"[汤圆]",url:"http://i0.hdslb.com/bfs/live/23ae12d3a71b9d7a22c8773343969fcbb94b20d0.png",map:"23ae12d3a71b9d7a22c8773343969fcbb94b20d0.png"},{emoji:"[泼水]",url:"http://i0.hdslb.com/bfs/live/29533893115c4609a4af336f49060ea13173ca78.png",map:"29533893115c4609a4af336f49060ea13173ca78.png"},{emoji:"[鬼魂]",url:"http://i0.hdslb.com/bfs/live/5d86d55ba9a2f99856b523d8311cf75cfdcccdbc.png",map:"5d86d55ba9a2f99856b523d8311cf75cfdcccdbc.png"},{emoji:"[不行]",url:"http://i0.hdslb.com/bfs/live/607f74ccf5eec7d2b17d91b9bb36be61a5dd196b.png",map:"607f74ccf5eec7d2b17d91b9bb36be61a5dd196b.png"},{emoji:"[响指]",url:"http://i0.hdslb.com/bfs/live/3b2fedf09b0ac79679b5a47f5eb3e8a38e702387.png",map:"3b2fedf09b0ac79679b5a47f5eb3e8a38e702387.png"},{emoji:"[牛]",url:"http://i0.hdslb.com/bfs/live/5e61223561203c50340b4c9b41ba7e4b05e48ae2.png",map:"5e61223561203c50340b4c9b41ba7e4b05e48ae2.png"},{emoji:"[保佑]",url:"http://i0.hdslb.com/bfs/live/241b13adb4933e38b7ea6f5204e0648725e76fbf.png",map:"241b13adb4933e38b7ea6f5204e0648725e76fbf.png"},{emoji:"[抱拳]",url:"http://i0.hdslb.com/bfs/live/3f170894dd08827ee293afcb5a3d2b60aecdb5b1.png",map:"3f170894dd08827ee293afcb5a3d2b60aecdb5b1.png"},{emoji:"[给力]",url:"http://i0.hdslb.com/bfs/live/d1ba5f4c54332a21ed2ca0dcecaedd2add587839.png",map:"d1ba5f4c54332a21ed2ca0dcecaedd2add587839.png"},{emoji:"[耶]",url:"http://i0.hdslb.com/bfs/live/eb2d84ba623e2335a48f73fb5bef87bcf53c1239.png",map:"eb2d84ba623e2335a48f73fb5bef87bcf53c1239.png"}];E.locale("zh-cn");const pa=e=>e===0?"/":E.unix(e).format("yyyy-MM-D HH:mm:ss"),ra=e=>{if(isNaN(Number(e)))return E(e).format("HH:mm:ss");{const a=Number(e);return E.unix(a).format("HH:mm:ss")}},D=e=>{const a=window.location.hash.split("?",2)[1];if(a){const c=new RegExp("(^|&)"+e+"=([^&]*)(&|$)"),s=a.match(c);return s!=null?decodeURIComponent(s[2]):null}},ma=()=>E(),Oe=e=>{const a=L();he.confirm("是否重置图片缓存?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{const c={type:a.getType,type_id:a.getTypeId};return $e(c)}).then(c=>{c.code===0?(C({title:"提示",message:"操作成功",type:"success"}),e&&location.reload()):C({title:"提示",message:"操作失败",type:"error"})}).catch(c=>{c&&console.error(c)})},ua=e=>{for(let a of He)e.includes(a.emoji)&&(e=e.replaceAll(a.emoji,``));return e},R=e=>(te("data-v-bdc87af7"),e=e(),de(),e),De=R(()=>p("div",{class:"moon"},null,-1)),ze=R(()=>p("div",{class:"moon"},null,-1)),Pe=R(()=>p("div",{class:"moon"},null,-1)),Ue=[De,ze,Pe],Ae=ce('
',6),Be=N({__name:"dayNightSwitch",props:{size:{type:Number,default:180},modelValue:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(e,{emit:a}){const c=e;let s=O(()=>c.size),t=O(()=>c.size*70/180);const d=()=>{a("update:modelValue",!c.modelValue)};return(o,u)=>(j(),V("div",{class:P({components:!0,night:e.modelValue}),style:w({"--width":`${v(s)}px`,"--height":`${v(t)}px`})},[p("div",{class:"main-button",onClick:d},Ue),Ae],6))}});const Ge=(e,a)=>{const c=e.__vccOpts||e;for(const[s,t]of a)c[s]=t;return c},Me=Ge(Be,[["__scopeId","data-v-bdc87af7"]]),We=p("br",null,null,-1),Fe=N({__name:"helpDialog",setup(e,{expose:a}){const c=x(!1);return a({open(){c.value=!0}}),(s,t)=>{const d=ge,o=ve,u=_e;return j(),S(u,{modelValue:c.value,"onUpdate:modelValue":t[1]||(t[1]=h=>c.value=h),title:"帮助",width:"30%",center:""},{footer:i(()=>[n(o,{onClick:t[0]||(t[0]=h=>c.value=!1)},{default:i(()=>[m("确定")]),_:1})]),default:i(()=>[p("span",null,[m(" 感谢使用nonebot-plugin-blive-danmaku直播间路灯插件"),We,m(" 有任何问题或建议请"),n(d,{type:"primary",target:"_blank",href:"https://github.com/zangxx66/nonebot_plugin_blive_danmaku/issues"},{default:i(()=>[m(" 点击此处 ")]),_:1}),m("反馈。 ")])]),_:1},8,["modelValue"])}}}),Ke=p("div",{class:"flex-grow"},null,-1),Qe={class:"day-night-btn-div"},qe=N({__name:"header",props:{style:Object},setup(e){const a=e,c=U({selector:"body"}),s=A(),t=L(),d=()=>{const h=t.getTypeId,l=t.getType;s.push({name:"change",query:{type:l,type_id:h}})},o=x(),u=()=>{o.value.open()};return(h,l)=>{const r=we,f=G,b=xe,g=M;return j(),V(B,null,[n(g,{"background-color":"#545c64","text-color":"#fff",ellipsis:!1,router:!1,style:w(a.style),mode:"horizontal"},{default:i(()=>[n(f,{index:"0"},{default:i(()=>[n(r,null,{default:i(()=>[n(v(ye))]),_:1}),m(" blive_danmaku ")]),_:1}),Ke,p("div",Qe,[n(Me,{size:50,modelValue:v(c),"onUpdate:modelValue":l[0]||(l[0]=y=>se(c)?c.value=y:null)},null,8,["modelValue"])]),n(b,{index:"1"},{title:i(()=>[n(r,null,{default:i(()=>[n(v(je))]),_:1})]),default:i(()=>[n(f,{index:"1-1",onClick:l[1]||(l[1]=y=>v(Oe)(!0))},{default:i(()=>[m(" 修复图片缓存 ")]),_:1}),n(f,{index:"1-2",onClick:d},{default:i(()=>[m(" 更新日志 ")]),_:1}),n(f,{index:"1-3",onClick:u},{default:i(()=>[m(" 帮助 ")]),_:1})]),_:1})]),_:1},8,["style"]),n(Fe,{ref_key:"hd",ref:o},null,512)],64)}}}),Je=p("span",null,"Home",-1),Xe=N({__name:"App",setup(e){const a=U(),c=x([]),s=x(1020),t=x(1920),d=A(),o=L(),u=()=>{const f=o.getTypeId,b=o.getType;d.replace({path:"/",query:{type:b,type_id:f}})},h=(f,b)=>{const g=o.getTypeId,y=o.getType;d.push({name:"history",query:{type:y,type_id:g,uid:f}})},l=()=>{const f=window.innerWidth,b=window.innerHeight;s.value=b-60,t.value=f;const g=document.querySelector(".danmaku-main");g.style.width=t.value-200+"px"},r=()=>{const f={type_id:o.getTypeId,type:o.getType};Re(f).then(b=>{b.code===0?Object.assign(c.value,b.data.data):C({title:"Error",message:b.msg||"请求异常",type:"error"})}).catch(b=>{console.error(b),C({title:"Error",message:b||"系统异常",type:"error"})})};return oe(()=>{l(),window.addEventListener("resize",l);const f=D("type"),b=D("type_id");o.setState(b,f),r()}),ne(()=>{window.removeEventListener("resize",l)}),(f,b)=>{const g=G,y=M,W=Ce,F=Ne,K=Ie,Q=ie("RouterView"),q=Te,J=Se,X=Ee;return j(),S(X,{class:P({"danmaku-menu":!0,dark:v(a)})},{default:i(()=>[n(K,{offset:.1},{default:i(()=>[n(qe,{style:w({width:t.value+"px"})},null,8,["style"]),n(F,{width:"200px",class:"danmaku-aside",style:w({height:s.value+"px"})},{default:i(()=>[n(W,{"max-height":s.value},{default:i(()=>[n(y,null,{default:i(()=>[n(g,{index:"0",onClick:u},{default:i(()=>[Je]),_:1}),(j(!0),V(B,null,fe(c.value,(T,Y)=>(j(),S(g,{index:Y+1,onClick:ca=>h(T.uid,T.name)},{default:i(()=>[p("span",null,le(T.name),1)]),_:2},1032,["index","onClick"]))),256))]),_:1})]),_:1},8,["max-height"])]),_:1},8,["style"]),p("div",{class:"h-6",id:"danmaku-menu-line",style:w({width:t.value+"px"})},null,4)]),_:1}),n(J,{class:"danmaku-main"},{default:i(()=>[n(q,{locale:v(ke)},{default:i(()=>[n(Q)]),_:1},8,["locale"])]),_:1})]),_:1},8,["class"])}}}),Ye="modulepreload",Ze=function(e){return"/danmaku/"+e},z={},k=function(a,c,s){if(!c||c.length===0)return a();const t=document.getElementsByTagName("link");return Promise.all(c.map(d=>{if(d=Ze(d),d in z)return;z[d]=!0;const o=d.endsWith(".css"),u=o?'[rel="stylesheet"]':"";if(!!s)for(let r=t.length-1;r>=0;r--){const f=t[r];if(f.href===d&&(!o||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${d}"]${u}`))return;const l=document.createElement("link");if(l.rel=o?"stylesheet":Ye,o||(l.as="script",l.crossOrigin=""),l.href=d,document.head.appendChild(l),o)return new Promise((r,f)=>{l.addEventListener("load",r),l.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${d}`)))})})).then(()=>a())},ea=be({history:pe(),routes:[{name:"home",path:"/",component:()=>k(()=>import("./index-35dc9657.js"),["assets/index-35dc9657.js","assets/elementPlus-2f9ad77c.js","assets/vendor-9f742c23.js","assets/vendor-b57f6aba.css","assets/lodash-742d3967.js","assets/elementPlus-ce22a485.css","assets/index-cd2e8127.css"])},{name:"history",path:"/history",component:()=>k(()=>import("./index-434a6b8b.js"),["assets/index-434a6b8b.js","assets/elementPlus-2f9ad77c.js","assets/vendor-9f742c23.js","assets/vendor-b57f6aba.css","assets/lodash-742d3967.js","assets/elementPlus-ce22a485.css"])},{name:"room",path:"/room",component:()=>k(()=>import("./index-13e4e779.js"),["assets/index-13e4e779.js","assets/elementPlus-2f9ad77c.js","assets/vendor-9f742c23.js","assets/vendor-b57f6aba.css","assets/lodash-742d3967.js","assets/elementPlus-ce22a485.css","assets/index-01fd1861.css"])},{name:"change",path:"/change",component:()=>k(()=>import("./index-5034aea2.js"),["assets/index-5034aea2.js","assets/elementPlus-2f9ad77c.js","assets/vendor-9f742c23.js","assets/vendor-b57f6aba.css","assets/lodash-742d3967.js","assets/elementPlus-ce22a485.css"])}]});const aa=re(),I=me(Xe);I.use(ea);I.use(aa);I.use(ue);I.mount("#app");export{Oe as C,ra as F,ma as G,ua as R,Ge as _,na as a,Ve as b,la as c,pa as d,ia as e,k as f,D as g,fa as h,ba as i,L as u}; 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-cd2e8127.css: -------------------------------------------------------------------------------- 1 | .home[data-v-6ba5b063]{left:50%;margin:0 auto;top:0%;position:absolute;transform:translate(-50%,30%);overflow:hidden}.box-card .item[data-v-6ba5b063]{text-align:left} 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/index-edb1e61b.js: -------------------------------------------------------------------------------- 1 | import{a as _,O as x,x as E,r as $}from"./elementPlus-2f9ad77c.js";import{g as A,i as D,F as M}from"./index-c6df6c50.js";import{i as p,L as S,u as B,a as C,b as L,c as O,d as j,e as F,f as G,g as N,h as Q,j as T,k as I}from"./echarts-0647520d.js";import{E as f,K as y,h as v,j as g,r as h,aJ as R,aQ as U,b as V,k as c,P as n,S as u,Q as W}from"./vendor-9f742c23.js";import"./lodash-742d3967.js";const H={id:"echart-wordcloud",style:{width:"65rem",height:"200px"}},J=f({__name:"wordcloud",setup(k,{expose:r}){let t;return r({loadData(i){const e=Array();i.forEach(s=>{e.push({name:s.message,value:Number(s.sum)})}),t=p(document.getElementById("echart-wordcloud")),t.setOption({tooltip:{show:!0},series:[{type:"wordCloud",right:null,bottom:null,data:e,drawOutOfBound:!0,layoutAnimation:!0,rotationRange:[0,0],textStyle:{fontFamily:"sans-serif",color:function(){return"rgb("+[Math.round(Math.random()*250),Math.round(Math.random()*250),Math.round(Math.random()*250)].join(",")+")"}}}]})}}),y(()=>{t&&(t.dispose(),t=null)}),(i,e)=>(v(),g("div",H))}}),K={class:"danmaku-hot-word"},P=c("div",{id:"danmaku-chart",class:"danmaku-chart"},null,-1),tt=f({__name:"index",setup(k){const r=h(),t=h({total:0,avg_danmaku:0,watched:0,minute_danmaku:Array()}),i=()=>{const a={xAxis:{type:"category",data:Array.from(t.value.minute_danmaku,({countTime:o})=>M(o)),boundaryGap:!1,axisTick:{alignWithLabel:!0}},yAxis:{type:"value",boundaryGap:[0,"100%"],name:"弹幕数"},series:[{name:"弹幕数",data:Array.from(t.value.minute_danmaku,({sum:o})=>o),type:"line",symbol:"rect",sampling:"lttb",smooth:!0,itemStyle:{color:"rgb(255, 70, 131)"},areaStyle:{color:new S(0,0,0,1,[{offset:0,color:"rgb(255, 158, 68)"},{offset:1,color:"rgb(255, 70, 131)"}])}}],tooltip:{trigger:"axis",position:o=>[o[0],"10%"]},title:{text:"每分钟弹幕统计"},dataZoom:[{type:"inside",start:0,end:100},{start:0,end:100}]};return B([C,L,O,j,F,G,N,Q,T,I]),a};let e;const s=R(),m=()=>{const l=i(),a=s.value?"dark":void 0,o=document.getElementById("danmaku-chart");e&&(e.dispose(),e=null),e||(e=p(o,a)),e.setOption(l)};U(s,async l=>{m()});const w=()=>{const l=A("roomid");D({rid:l}).then(a=>{if(a.code!=0)_({title:"提示",message:"获取统计信息失败",type:"error"});else{t.value.avg_danmaku=a.data.avg_danmaku,t.value.total=a.data.total;const o=a.data.hot_word;r.value.loadData(o),t.value.minute_danmaku=a.data.min_danmaku,t.value.watched=a.data.watched,m()}}).catch(a=>{_({title:"提示",message:a||"获取统计信息失败",type:"error"}),console.error(a)})};return V(()=>{w()}),y(()=>{e&&(e.dispose(),e=null)}),(l,a)=>{const o=x,d=E,b=$;return v(),g(W,null,[c("div",null,[n(b,null,{default:u(()=>[n(d,{span:8},{default:u(()=>[n(o,{title:"弹幕数",value:t.value.total},null,8,["value"])]),_:1}),n(d,{span:8},{default:u(()=>[n(o,{title:"平均每分钟弹幕",value:t.value.avg_danmaku},null,8,["value"])]),_:1}),n(d,{span:8},{default:u(()=>[n(o,{title:"观看人数",value:t.value.watched},null,8,["value"])]),_:1})]),_:1}),c("div",K,[n(J,{ref_key:"cloud",ref:r},null,512)])]),P],64)}}});export{tt as default}; 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/lodash-742d3967.js: -------------------------------------------------------------------------------- 1 | var we=typeof global=="object"&&global&&global.Object===Object&&global;const Qt=we;var Se=typeof self=="object"&&self&&self.Object===Object&&self,Pe=Qt||Se||Function("return this")();const m=Pe;var je=m.Symbol;const $=je;var Vt=Object.prototype,xe=Vt.hasOwnProperty,Ee=Vt.toString,B=$?$.toStringTag:void 0;function Ie(t){var e=xe.call(t,B),r=t[B];try{t[B]=void 0;var n=!0}catch{}var i=Ee.call(t);return n&&(e?t[B]=r:delete t[B]),i}var Ce=Object.prototype,Me=Ce.toString;function Le(t){return Me.call(t)}var Fe="[object Null]",Re="[object Undefined]",$t=$?$.toStringTag:void 0;function D(t){return t==null?t===void 0?Re:Fe:$t&&$t in Object(t)?Ie(t):Le(t)}function I(t){return t!=null&&typeof t=="object"}var Ne="[object Symbol]";function Q(t){return typeof t=="symbol"||I(t)&&D(t)==Ne}function De(t,e){for(var r=-1,n=t==null?0:t.length,i=Array(n);++r-1&&t%1==0&&t-1&&t%1==0&&t<=Ar}function ae(t){return t!=null&&ne(t.length)&&!te(t)}var mr=Object.prototype;function gt(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||mr;return t===r}function Or(t,e){for(var r=-1,n=Array(t);++r-1}function Bn(t,e){var r=this.__data__,n=k(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}function P(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e0&&r(o)?e>1?de(o,e-1,r,n,i):bt(i,o):n||(i[i.length]=o)}return i}function Eo(t){var e=t==null?0:t.length;return e?de(t,1):[]}var ia=le(Object.getPrototypeOf,Object);const he=ia;function Io(){if(!arguments.length)return[];var t=arguments[0];return w(t)?t:[t]}function oa(){this.__data__=new P,this.size=0}function sa(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}function fa(t){return this.__data__.get(t)}function ua(t){return this.__data__.has(t)}var ca=200;function la(t,e){var r=this.__data__;if(r instanceof P){var n=r.__data__;if(!K||n.lengtho))return!1;var u=a.get(t),d=a.get(e);if(u&&d)return u==e&&d==t;var l=-1,p=!0,_=r&Qi?new J:void 0;for(a.set(t,e),a.set(e,t);++l=e||E<0||l&&U>=a}function y(){var b=at();if(h(b))return O(b);o=setTimeout(y,v(b))}function O(b){return o=void 0,p&&n?_(b):(n=i=void 0,s)}function W(){o!==void 0&&clearTimeout(o),u=0,n=f=i=o=void 0}function R(){return o===void 0?s:O(at())}function x(){var b=at(),E=h(b);if(n=arguments,i=this,f=b,E){if(o===void 0)return T(f);if(l)return clearTimeout(o),o=setTimeout(y,e),_(f)}return o===void 0&&(o=setTimeout(y,e)),s}return x.cancel=W,x.flush=R,x}function Mo(t){for(var e=-1,r=t==null?0:t.length,n={};++ee>=1&&e<5,()=>({start:"#5c968e",end:"#5c968e"})],[e=>e>=5&&e<9,()=>({start:"#5d7b9e",end:"#5d7b9e"})],[e=>e>=9&&e<13,()=>({start:"#8d7ca6",end:"#8d7ca6"})],[e=>e>=13&&e<17,()=>({start:"#be6686",end:"#be6686"})],[e=>e>=17&&e<21,()=>({start:"#c79d24",end:"#c79d24"})],[e=>e>=21&&e<25,()=>({start:"#1a544b",end:"#529d92"})],[e=>e>=25&&e<29,()=>({start:"#06154c",end:"#6888f1"})],[e=>e>=29&&e<33,()=>({start:"#2d0855",end:"#9d9bff"})],[e=>e>=33&&e<37,()=>({start:"#7a0423",end:"#e986bb"})],[e=>e>=37,()=>({start:"#ff610b",end:"#ffd084"})]],ae=e=>ee.find(t=>t[0](e))[1](),te=["","#ffe854","#ffe854","#67e8ff"];B.locale("zh-cn");const le=async(e,a,t="sc")=>{const r=await X(document.getElementById(e),{scale:a,backgroundColor:null,useCORS:!0}),d=document.createElement("a");d.download=`${t}-image-${B().unix()}.png`,d.href=r.toDataURL("image/png"),d.click(),d.remove()},oe=[[e=>e<500,()=>({info:"#EDF5FF",content:"#2A60B2"})],[e=>e>=500&&e<1e3,()=>({info:"#dbfffd",content:"#427d9e"})],[e=>e>=1e3&&e<5e3,()=>({info:"#fff1c5",content:"#e2b52b"})],[e=>e>=5e3&&e<1e4,()=>({info:"#ffead2",content:"#e09443"})],[e=>e>=1e4&&e<2e4,()=>({info:"#ffe7e4",content:"#e54d4d"})],[e=>e>=2e4,()=>({info:"#ffd8d8",content:"#ab1a32"})]],y=e=>oe.find(t=>t[0](e))[1](),se=["#666","#FF7C28","#E17AFF","#00D1F1"],ne=e=>e>=5e3&&e<2e4?new URL("/danmaku/assets/sc-badge-1-f98dcdbf.png",self.location).href:e>=2e4&&e<3e4?new URL("/danmaku/assets/sc-badge-2-abaf3760.png",self.location).href:e>=3e4?new URL("data:image/png;base64,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",self.location).href:new URL("",import.meta.url).href,de="data:image/png;base64,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",re="/danmaku/assets/guard-1-k-823c4f26.png",ue="data:image/png;base64,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",ie="/danmaku/assets/guard-2-k-a0b7be7c.png",pe="data:image/png;base64,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",me="/danmaku/assets/guard-3-k-3c7bacae.png",ce={class:"mr-5px ml-6px relative v-middle inline-block lh-18px text-12px"},Ae={class:"block -ml-12px mr-2px w22px h22px",bg:"no-repeat contain center-center"},fe=["src"],ve={class:"block"},be=w({__name:"FansMedal",props:{userRole:{},medalName:{},medalLevel:{},guardMileStone:{}},setup(e){const a=e;let t="";const r=b({start:"",end:""});return C(()=>{const d=a.medalLevel||1;r.value=ae(d)}),C(()=>{t=new URL(Object.assign({"../images/guard-1-0.png":de,"../images/guard-1-k.png":re,"../images/guard-2-0.png":ue,"../images/guard-2-k.png":ie,"../images/guard-3-0.png":pe,"../images/guard-3-k.png":me})[`../images/guard-${a.userRole}-${a.guardMileStone==="w"?"k":a.guardMileStone}.png`],self.location).href}),(d,l)=>(V(),R("div",ce,[s("div",{class:"relative block box-content h-14px lh-14px ws-nowrap font-yahei",border:"1px solid transparent rd-2px",text:"white 12px",style:m({borderColor:d.userRole==="0"?r.value.start:g(te)[d.userRole]})},[s("div",{class:"flex flex-center float-left box-content min-w-12px h-full lh-14px p-x-4px b-rd-l-1px",text:"white 12px center ws-nowrap",style:m({backgroundImage:`linear-gradient(45deg,${r.value.start},${r.value.end})`})},[M(s("i",Ae,[s("img",{class:"w-full h-full",src:a.userRole==="0"?"":`${g(t)}`,alt:""},null,8,fe)],512),[[U,a.userRole!=="0"]]),s("span",ve,A(a.medalName),1)],4),s("div",{class:"block box-content h-full w16px bg-#fff float-left fans-medal-level",text:"center transparent",style:m({color:r.value.start})},A(a.medalLevel),5)],4)]))}});const ge=J(be,[["__scopeId","data-v-32eb01b2"]]),he={class:"h-20px lh-20px",text:"14px #333",pos:"absolute top-10px right-8px"},xe={class:"h-34px flex justify-start items-center p-x-5px box-border sc_card_head",bg:"no-repeat right-top contain",border:"1px solid rd-t-6px rd-b-0"},Fe={class:"w-90% inline-block ml-0 text-#333",style:{"text-align":"left"}},Me={class:"inline-block w-auto v-text-bottom h-27px lh-27px"},Ue={class:"relative min-h-12px break-words",style:{"text-align":"left"}},ke={text:"12px #fff left",class:"lh-20px"},Ce={class:"relative min-h-12px break-words mt-6px p-t-6px input-trans-contain"},we={text:"12px #fff left",class:"lh-20px"},Ve=w({__name:"SuperChat",props:{width:{},battery:{},userName:{},userRole:{},scContent:{},showTrans:{type:Boolean},transContent:{},showFansMedal:{type:Boolean},medalName:{},medalLevel:{},guardMileStone:{}},setup(e){const a=e;_(r=>({31650159:t.value.content,ae7c7864:t.value.info}));const t=b(y(a.battery));return C(()=>{t.value=y(a.battery)}),(r,d)=>(V(),R("div",{id:"SuperChat",class:"relative p-5px break-words ws-normal -m-x-5px min-w-130px min-h-38px",text:"12px #61666D",style:m({width:`${a.width}px`})},[s("div",he,A(`${a.battery} 电池`),1),s("div",xe,[s("div",Fe,[M(s("div",Me,[o(ge,{userRole:a.userRole,medalName:a.medalName,medalLevel:a.medalLevel,guardMileStone:a.guardMileStone},null,8,["userRole","medalName","medalLevel","guardMileStone"])],512),[[U,r.showFansMedal]]),s("div",{class:"inline-block w-105px op-78 text-14px truncate v-text-bottom h-27px lh-27px ml-4px fw-700",style:m({color:g(se)[~~a.userRole]})},A(a.userName),5)])]),s("div",{class:"relative p-y-8px p-x-10px box-border",border:"rd-t-0 rd-b-6px min-h-38px",style:m({backgroundColor:t.value.content})},[s("div",Ue,[s("span",ke,A(a.scContent),1)]),M(s("div",Ce,[s("span",we,A(a.transContent),1)],512),[[U,a.showTrans]]),M(s("div",{pos:"absolute right-0 bottom-0",class:"w-16px h-16px",bg:"center cover no-repeat",style:m({backgroundImage:`url(${g(ne)(a.battery)})`})},null,4),[[U,a.battery>=5e3]])],4)],4))}});const ye=J(Ve,[["__scopeId","data-v-152096d4"]]),Be={style:{"text-align":"left","padding-top":"1rem"}},Se=w({__name:"sc",setup(e,{expose:a}){const t=b({width:269,battery:300,userName:"",userRole:"0",scContent:"",showTrans:!1,transContent:"",showFansMedal:!1,medalName:"",medalLevel:1,guardMileStone:"0"}),r=(p,n)=>{if(!p||p==null)return"";let h=0,x="";for(let c=0;c255?2:1,!(h>n));c++)x=p.substring(0,c+1);return x},d=b(!1),l=b({isFansName:t.value.showFansMedal,fansName:r(t.value.medalName,6),fansLevel:t.value.medalLevel,guardMil:t.value.guardMileStone,userRole:t.value.userRole}),L=()=>{d.value=!1,l.value.isFansName=!1,l.value.fansName="",l.value.guardMil="0",l.value.fansLevel=1};return a({open(p){t.value=p,t.value.medalName=r(t.value.medalName,6),l.value.isFansName=t.value.showFansMedal,l.value.userRole=t.value.userRole,d.value=!0}}),(p,n)=>{const h=Q,x=Y,c=P,f=D,F=W,I=O,K=H,S=T,k=q,N=j,E=Z,G=z;return V(),$(G,{modelValue:d.value,"onUpdate:modelValue":n[6]||(n[6]=u=>d.value=u),"append-to-body":!0,"before-close":L,draggable:"",title:"生成SC图片",width:"40%"},{default:i(()=>[o(ye,{width:t.value.width,battery:t.value.battery,userName:t.value.userName,userRole:l.value.userRole,scContent:t.value.scContent,showTrans:t.value.showTrans,transContent:t.value.transContent,showFansMedal:l.value.isFansName,medalName:l.value.fansName,medalLevel:l.value.fansLevel,guardMileStone:l.value.guardMil},null,8,["width","battery","userName","userRole","scContent","showTrans","transContent","showFansMedal","medalName","medalLevel","guardMileStone"]),s("div",Be,[o(h,{type:"primary",onClick:n[0]||(n[0]=u=>g(le)("SuperChat",1))},{default:i(()=>[v("导出图片")]),_:1})]),o(x,{"content-position":"left"},{default:i(()=>[v("设置")]),_:1}),o(E,{model:l.value,inline:!0},{default:i(()=>[o(f,{label:"显示粉丝牌"},{default:i(()=>[o(c,{modelValue:l.value.isFansName,"onUpdate:modelValue":n[1]||(n[1]=u=>l.value.isFansName=u)},null,8,["modelValue"])]),_:1}),o(f,{label:"用户身份"},{default:i(()=>[o(I,{style:{width:"10rem"},modelValue:l.value.userRole,"onUpdate:modelValue":n[2]||(n[2]=u=>l.value.userRole=u)},{default:i(()=>[o(F,{label:"普通",value:"0"}),o(F,{label:"舰长",value:"3"}),o(F,{label:"提督",value:"2"}),o(F,{label:"总督",value:"1"})]),_:1},8,["modelValue"])]),_:1}),o(f,{label:"粉丝牌名称"},{default:i(()=>[o(K,{clearable:"",formatter:u=>r(u,6),style:{width:"10rem"},modelValue:l.value.fansName,"onUpdate:modelValue":n[3]||(n[3]=u=>l.value.fansName=u)},null,8,["formatter","modelValue"])]),_:1}),o(f,{label:"粉丝牌等级"},{default:i(()=>[o(S,{modelValue:l.value.fansLevel,"onUpdate:modelValue":n[4]||(n[4]=u=>l.value.fansLevel=u),min:"1"},null,8,["modelValue"])]),_:1}),o(f,{label:"舰队里程碑"},{default:i(()=>[o(N,{modelValue:l.value.guardMil,"onUpdate:modelValue":n[5]||(n[5]=u=>l.value.guardMil=u)},{default:i(()=>[o(k,{label:"0"},{default:i(()=>[v("其他")]),_:1}),o(k,{label:"k"},{default:i(()=>[v("千舰")]),_:1}),o(k,{label:"w"},{default:i(()=>[v("万舰")]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])}}});export{Se as default}; 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/assets/vendor-b57f6aba.css: -------------------------------------------------------------------------------- 1 | :where(html){line-height:1.15}:where(h1){font-size:2em;margin-block-end:.67em;margin-block-start:.67em}:where(dl,ol,ul) :where(dl,ol,ul){margin-block-end:0;margin-block-start:0}:where(hr){box-sizing:content-box;color:inherit;height:0}:where(pre){font-family:monospace,monospace;font-size:1em}:where(abbr[title]){text-decoration:underline;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(table){border-color:currentColor;text-indent:0}:where(button,input,select){margin:0}:where(button){text-transform:none}:where(button,input:is([type="button" i],[type="reset" i],[type="submit" i])){-webkit-appearance:button}:where(progress){vertical-align:baseline}:where(select){text-transform:none}:where(textarea){margin:0}:where(input[type="search" i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(button,input:is([type="button" i],[type="color" i],[type="reset" i],[type="submit" i]))::-moz-focus-inner{border-style:none;padding:0}:where(button,input:is([type="button" i],[type="color" i],[type="reset" i],[type="submit" i]))::-moz-focusring{outline:1px dotted ButtonText}:where(:-moz-ui-invalid){box-shadow:none}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(summary){display:list-item} 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/nonebot_plugin_blive_danmaku/app/frontend/icon/favicon.ico -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | nonebot-plugin-blive-danmaku 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/models.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | from typing import Dict, Any 3 | from typing import Optional 4 | 5 | 6 | class ResponseItem(BaseModel): 7 | code: int 8 | msg: Optional[str] 9 | data: Optional[Dict[str, Any]] 10 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/app/router.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, Query 2 | from ..database import Db as db 3 | from . import models 4 | import os 5 | from pathlib import Path 6 | from bilireq.grpc.dynamic import grpc_get_user_dynamics 7 | 8 | router = APIRouter(tags=["api"]) 9 | full_path = Path(__file__).parent / "frontend" / "static" 10 | 11 | 12 | @router.get("/get_sub_list", response_model=models.ResponseItem) 13 | async def get_type_sub_list(type: str = Query(..., max_length=50), 14 | type_id: int = Query(...), 15 | uid: int = Query(None), 16 | page: int = Query(1), 17 | size: int = Query(30), 18 | title: str = Query(None), 19 | danmaku: str = Query(None), 20 | start: int = Query(None), 21 | end: int = Query(None)): 22 | """ 23 | 获取订阅主播的直播列表 24 | """ 25 | skip = (page - 1) * size 26 | where = "1=1 " 27 | where += f"and s.type='{type}' " 28 | if type_id > 0: 29 | where += f"and type_id='{type_id}' " 30 | if title is not None: 31 | where += f"and (title like '%{title}%' or name like '%{title}%') " 32 | if start is not None and start > 0: 33 | where += f"and start_time>='{start}' " 34 | if end is not None and end > 0: 35 | where += f"and (end_time>'0' and end_time<'{end}') " 36 | if danmaku is not None: 37 | where += f"and message like '%{danmaku}%' " 38 | if uid is not None and uid > 0: 39 | where += f"and room.uid='{uid}' " 40 | total, dict = await db.get_rooms_by_paged(size, skip, where) 41 | return models.ResponseItem(code=0, msg="", data={"rows": dict, "total": total}) 42 | 43 | 44 | @router.get("/get_room", response_model=models.ResponseItem) 45 | async def get_room_info(id: int = Query(...)): 46 | """ 47 | 获取直播场次信息 48 | """ 49 | # room_info = await db.get_room(id=id) 50 | room_info = await db.get_room_info(id=id) 51 | if not room_info: 52 | return models.ResponseItem(code=-1, msg="房间号码有误", data=None) 53 | return models.ResponseItem(code=0, msg="", data={"room_info": room_info}) 54 | 55 | 56 | @router.get("/get_room_danmaku", response_model=models.ResponseItem) 57 | async def get_room_danmaku(rid: int = Query(...), type: str = Query(None)): 58 | """ 59 | 获取弹幕 60 | """ 61 | danmaku_list = await db.get_danmaku_by_rid(room_id=rid, type=type) 62 | return models.ResponseItem(code=0, msg="", data={"rows": danmaku_list, "total": len(danmaku_list)}) 63 | 64 | 65 | @router.get("/get_liver_list", response_model=models.ResponseItem) 66 | async def get_liver_list(type: str = Query(...), type_id = Query(...)): 67 | """ 68 | 获取订阅的主播列表 69 | """ 70 | subs = await db.get_subs(type=type, type_id=type_id) 71 | result = [] 72 | for sub in subs: 73 | dy = (await grpc_get_user_dynamics(sub.uid)).list 74 | name = dy[0].modules[0].module_author.author.name 75 | result.append({"name": name, "uid": sub.uid}) 76 | return models.ResponseItem(code=0, msg="", data={"data": result}) 77 | 78 | 79 | @router.get("/clear_cache", response_model=models.ResponseItem) 80 | async def clear_cache(type: str = Query(...), type_id: int = Query(...), uid: int = Query(None)): 81 | """ 82 | 重置封面图片 83 | """ 84 | subs = await db.get_subs(type=type, type_id=type_id) 85 | room_list = [] 86 | for sub in subs: 87 | live_room = await db.get_rooms(uid=sub.uid) 88 | room_list.extend(live_room) 89 | for room in room_list: 90 | filename = os.path.basename(room.cover) 91 | origin_url = "https://i0.hdslb.com/bfs/live/new_room_cover/" + filename 92 | await db.update_room("cover", origin_url, id=room.id) 93 | 94 | save_path = os.path.join(full_path, filename) 95 | if os.path.isfile(save_path): 96 | os.remove(save_path) 97 | return models.ResponseItem(code=0, msg=None, data=None) 98 | 99 | 100 | @router.get("/get_liver_name", response_model=models.ResponseItem) 101 | async def get_liver_name(uid: int = Query(...)): 102 | dy = (await grpc_get_user_dynamics(uid)).list 103 | name = dy[0].modules[0].module_author.author.name 104 | return models.ResponseItem(code=0, data={"data": name}, msg=None) 105 | 106 | 107 | @router.get("/get_gift", response_model=models.ResponseItem) 108 | async def get_gift(rid: int = Query(...), 109 | page: int = Query(1), 110 | size: int = Query(50), 111 | keyword: str = Query(None), 112 | type: str = Query(None)): 113 | """ 114 | 获取礼物列表 115 | """ 116 | 117 | skip = (page - 1) * size 118 | rows = await db.get_gift_by_paged(room_id=rid, page=skip, size=size, keyword=keyword, type=type) 119 | return models.ResponseItem(code=0, data={"rows": rows}, msg=None) 120 | 121 | 122 | @router.get("/get_gift_count", response_model=models.ResponseItem) 123 | async def get_gift_count(rid: int = Query(...), 124 | keyword: str = Query(None), 125 | type: str = Query(None)): 126 | total = await db.get_gift_count(room_id=rid, keyword=keyword,type=type) 127 | return models.ResponseItem(code=0, data={"total": total}, msg=None) 128 | 129 | 130 | @router.get("/get_statistics", response_model=models.ResponseItem) 131 | async def get_statistics(rid: int = Query(...)): 132 | """ 133 | 获取统计数据 134 | """ 135 | res = await db.get_statistics(room_id=rid) 136 | return models.ResponseItem(code=0, data=res, msg=None) 137 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/__init__.py: -------------------------------------------------------------------------------- 1 | from .sub import sub_add, sub_delete, sub_list, sub_off, sub_on, sub_open 2 | from .subscribe import danmaku, live 3 | from .listener import kick, cookie 4 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/listener/__init__.py: -------------------------------------------------------------------------------- 1 | # no 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/listener/cookie.py: -------------------------------------------------------------------------------- 1 | from ...database import Db as db 2 | from nonebot.adapters.onebot.v11.event import MessageEvent 3 | from nonebot.params import ArgPlainText 4 | from nonebot import on_command 5 | from ...utils import cookie_check, handle_cookie 6 | 7 | 8 | cookie_cmd = on_command("导入cookie", priority=5) 9 | cookie_cmd.__doc__ = """导入cookie 已登录账号的cookie""" 10 | cookie_cmd.handle()(handle_cookie) 11 | cookie_cmd.got("cookie", prompt="请输入cookie")(cookie_check) 12 | 13 | 14 | @cookie_cmd.handle() 15 | async def _(event: MessageEvent, cookie: str = ArgPlainText("cookie")): 16 | """ 17 | 导入一个cookie 18 | """ 19 | res = await db.add_cookie(cookie) 20 | if res: 21 | await cookie_cmd.finish("添加cookie成功") 22 | else: 23 | await cookie_cmd.finish("添加cookie失败,可能该cookie已存在") 24 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/listener/kick.py: -------------------------------------------------------------------------------- 1 | from nonebot.plugin import on_notice 2 | from nonebot.adapters.onebot.v11 import Bot 3 | from nonebot.adapters.onebot.v11.event import GroupDecreaseNoticeEvent 4 | from nonebot.log import logger 5 | from ...database.db import Db as db 6 | 7 | notice_listener = on_notice(priority=5) 8 | 9 | 10 | @notice_listener.handle() 11 | async def handle_group_kick(bot: Bot, event: GroupDecreaseNoticeEvent): 12 | """ 13 | Bot退群后清除该群的订阅 14 | """ 15 | if event.sub_type == "kick": 16 | return 17 | group_id = event.group_id 18 | await db.delete_sub(type="group", type_id=group_id) 19 | group_info = await bot.get_group_info(group_id=group_id) 20 | if event.sub_type == "kick_me": 21 | kill_me_user = await bot.get_stranger_info(user_id=event.operator_id) 22 | logger.warning(f'我被{kill_me_user["nickname"]}({event.operator_id})踢出群{group_info["group_name"]}({group_id})啦~~~') 23 | if event.sub_type == "leave": 24 | logger.info(f'主动退出群{group_info["group_name"]}({group_id})') 25 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/sub/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/nonebot_plugin_blive_danmaku/command/sub/__init__.py -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/sub/sub_add.py: -------------------------------------------------------------------------------- 1 | from ...database import Db as db 2 | from nonebot.adapters.onebot.v11.event import MessageEvent 3 | from nonebot.params import ArgPlainText 4 | from nonebot import on_command 5 | from ...utils import get_type_id, handle_uid, permission_check, uid_check 6 | from bilireq.grpc.dynamic import grpc_get_user_dynamics 7 | from bilireq.exceptions import GrpcError 8 | 9 | sub_add = on_command("添加订阅", priority=5) 10 | sub_add.__doc__ = """添加订阅 UID""" 11 | sub_add.handle()(permission_check) 12 | sub_add.handle()(handle_uid) 13 | sub_add.got("uid", prompt="请输入一个UID")(uid_check) 14 | 15 | 16 | @sub_add.handle() 17 | async def _(event: MessageEvent, uid: str = ArgPlainText("uid")): 18 | """添加订阅""" 19 | try: 20 | dy = (await grpc_get_user_dynamics(int(uid))).list 21 | name = dy[0].modules[0].module_author.author.name 22 | except GrpcError as ex: 23 | await sub_add.finish(f"发生未知错误:{ex.code} -> {ex.msg},请联系开发者") 24 | type_id = await get_type_id(event) 25 | sub = await db.get_sub(uid=uid, type=event.message_type, type_id=type_id, bot_id=event.self_id) 26 | if sub is not None: 27 | await sub_add.finish(f"{name}({uid}) 已经订阅") 28 | 29 | res = await db.add_sub(uid=uid, type=event.message_type, type_id=type_id, street_lamp=True, bot_id=event.self_id) 30 | if res: 31 | await sub_add.finish(f"添加订阅 {name}({uid}) 成功") 32 | else: 33 | await sub_add.finish(f'添加订阅 {name}({uid}) 失败') 34 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/sub/sub_delete.py: -------------------------------------------------------------------------------- 1 | from nonebot.adapters.onebot.v11.event import MessageEvent 2 | from nonebot.params import ArgPlainText 3 | from nonebot import on_command 4 | from ...utils import get_type_id, handle_uid, permission_check, uid_check 5 | from bilireq.exceptions import GrpcError 6 | from bilireq.grpc.dynamic import grpc_get_user_dynamics 7 | from ...database import Db as db 8 | 9 | sub_delete = on_command("取消订阅", priority=5) 10 | sub_delete.__doc__ = """取消订阅 UID""" 11 | sub_delete.handle()(permission_check) 12 | sub_delete.handle()(handle_uid) 13 | sub_delete.got("uid", prompt="请输入一个UID")(uid_check) 14 | 15 | 16 | @sub_delete.handle() 17 | async def _(event: MessageEvent, uid: str = ArgPlainText("uid")): 18 | """取消订阅""" 19 | type_id = await get_type_id(event) 20 | try: 21 | dy = (await grpc_get_user_dynamics(int(uid))).list 22 | name = dy[0].modules[0].module_author.author.name 23 | except GrpcError as ex: 24 | await sub_delete.finish(f"发生未知错误:{ex.code} -> {ex.msg},请联系开发者") 25 | res = await db.delete_sub(uid=uid, type_id=type_id, type=event.message_type) 26 | if res: 27 | await sub_delete.finish(f"已取消订阅 {name}({uid})") 28 | await sub_delete.finish(f"未订阅 {name}({uid})") 29 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/sub/sub_list.py: -------------------------------------------------------------------------------- 1 | from nonebot.adapters.onebot.v11.event import MessageEvent 2 | from nonebot.adapters.onebot.v11 import Bot 3 | from nonebot import on_command 4 | from nonebot.log import logger 5 | from ...utils import get_type_id, permission_check 6 | from bilireq.user import get_user_info 7 | from bilireq.grpc.dynamic import grpc_get_user_dynamics 8 | from ...database import Db as db 9 | from ...config import danmaku_config 10 | 11 | 12 | sub_list = on_command("订阅列表", priority=5) 13 | sub_list.__doc__ = """订阅列表""" 14 | sub_list.handle()(permission_check) 15 | 16 | 17 | @sub_list.handle() 18 | async def _(event: MessageEvent, bot: Bot): 19 | """查看订阅列表""" 20 | type_id = await get_type_id(event) 21 | subs = await db.get_subs(type=event.message_type, type_id=type_id) 22 | msg = "订阅列表:\n\n" 23 | for sub in subs: 24 | dy = (await grpc_get_user_dynamics(sub.uid)).list 25 | name = dy[0].modules[0].module_author.author.name 26 | msg += ( 27 | f"{name}({sub.uid}) " 28 | f"路灯:{'开' if sub.street_lamp else '关'} " 29 | f"开播提醒:{'开' if danmaku_config.danmaku_group_notice else '关'} " 30 | f"弹幕统计:{'开' if sub.statistics else '关'}" 31 | ) 32 | await sub_list.finish(msg) 33 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/sub/sub_off.py: -------------------------------------------------------------------------------- 1 | from nonebot.adapters.onebot.v11.event import MessageEvent 2 | from nonebot.params import ArgPlainText 3 | from nonebot import on_command 4 | from ...utils import get_type_id, handle_uid, permission_check, uid_check 5 | from ...database import Db as db 6 | 7 | sub_off = on_command("关闭路灯", priority=5) 8 | sub_off.__doc__ = """关闭路灯 UID""" 9 | sub_off.handle()(permission_check) 10 | sub_off.handle()(handle_uid) 11 | sub_off.got("uid", prompt="请输入一个UID")(uid_check) 12 | 13 | 14 | @sub_off.handle() 15 | async def _(event: MessageEvent, uid: str = ArgPlainText("uid")): 16 | """关闭路灯""" 17 | type_id = await get_type_id(event) 18 | res = await db.update_sub("street_lamp", False, uid=uid, type_id=type_id, type=event.message_type) 19 | if res: 20 | await sub_off.finish(f'已开启 {uid} 路灯') 21 | await sub_off.finish(f'未订阅 {uid}') 22 | 23 | 24 | sub_statistics_off = on_command("关闭统计", priority=5) 25 | sub_statistics_off.__doc__ = """关闭统计 UID""" 26 | sub_statistics_off.handle()(permission_check) 27 | sub_statistics_off.handle()(handle_uid) 28 | sub_statistics_off.got("uid", prompt="请输入一个UID")(uid_check) 29 | 30 | 31 | @sub_statistics_off.handle() 32 | async def _(event: MessageEvent, uid: str = ArgPlainText("uid")): 33 | """关闭统计""" 34 | type_id = await get_type_id(event) 35 | sub = await db.get_sub(uid=uid, type_id=type_id, type=event.message_type) 36 | if not sub: 37 | await sub_statistics_off.finish(f'未订阅 {uid}') 38 | res = await db.update_sub("statistics", False, uid=uid, type_id=type_id, type=event.message_type) 39 | if res: 40 | await sub_statistics_off.finish(f'已关闭 {uid} 弹幕统计') 41 | else: 42 | await sub_statistics_off.finish(f'关闭 {uid} 弹幕统计,失败,请重试') 43 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/sub/sub_on.py: -------------------------------------------------------------------------------- 1 | from nonebot.adapters.onebot.v11.event import MessageEvent 2 | from nonebot.params import ArgPlainText 3 | from nonebot import on_command 4 | from ...utils import get_type_id, handle_uid, permission_check, uid_check 5 | from ...database import Db as db 6 | 7 | sub_on = on_command("开启路灯", priority=5) 8 | sub_on.__doc__ = """开启路灯 UID""" 9 | sub_on.handle()(permission_check) 10 | sub_on.handle()(handle_uid) 11 | sub_on.got("uid", prompt="请输入一个UID")(uid_check) 12 | 13 | 14 | @sub_on.handle() 15 | async def _(event: MessageEvent, uid: str = ArgPlainText("uid")): 16 | """开启路灯""" 17 | type_id = await get_type_id(event) 18 | res = await db.update_sub("street_lamp", True, uid=uid, type_id=type_id, type=event.message_type) 19 | if res: 20 | await sub_on.finish(f'已开启 {uid} 路灯') 21 | await sub_on.finish(f'未订阅 {uid}') 22 | 23 | 24 | sub_statistics_on = on_command("开启统计", priority=5) 25 | sub_statistics_on.__doc__ = """开启统计 UID""" 26 | sub_statistics_on.handle()(permission_check) 27 | sub_statistics_on.handle()(handle_uid) 28 | sub_statistics_on.got("uid", prompt="请输入一个UID")(uid_check) 29 | 30 | 31 | @sub_statistics_on.handle() 32 | async def _(event: MessageEvent, uid: str = ArgPlainText("uid")): 33 | """开启统计""" 34 | type_id = await get_type_id(event) 35 | sub = await db.get_sub(uid=uid, type_id=type_id, type=event.message_type) 36 | if not sub: 37 | await sub_statistics_on.finish(f'未订阅 {uid}') 38 | res = await db.update_sub("statistics", True, uid=uid, type_id=type_id, type=event.message_type) 39 | if res: 40 | await sub_statistics_on.finish(f'已开启 {uid} 弹幕统计') 41 | else: 42 | await sub_statistics_on.finish(f'开启 {uid} 弹幕统计,失败,请重试') 43 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/sub/sub_open.py: -------------------------------------------------------------------------------- 1 | from nonebot.adapters.onebot.v11.event import MessageEvent 2 | from nonebot.adapters.onebot.v11 import Bot 3 | from nonebot import on_command, get_driver 4 | from ...utils import get_type_id 5 | from ...config import danmaku_config 6 | 7 | 8 | sub_open = on_command("查看面板", priority=5) 9 | sub_open.__doc__ = """查看面板""" 10 | 11 | 12 | @sub_open.handle() 13 | async def _(event: MessageEvent, bot: Bot): 14 | """查看面板""" 15 | driver = get_driver() 16 | host = danmaku_config.danmaku_host if danmaku_config.danmaku_host else f"http://{driver.config.host}:{driver.config.port}" 17 | type_id = await get_type_id(event) 18 | type = event.message_type 19 | url = f"{host}/danmaku/#/?type={type}&type_id={type_id}" 20 | await sub_open.finish(url) 21 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/subscribe/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zangxx66/nonebot_plugin_blive_danmaku/ad7b543658ef0645f2c5fe975b7ab373972aaf28/nonebot_plugin_blive_danmaku/command/subscribe/__init__.py -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/subscribe/danmaku.py: -------------------------------------------------------------------------------- 1 | import time 2 | import asyncio 3 | import http.cookies 4 | import aiohttp 5 | from typing import Optional 6 | from bilireq.live import get_rooms_info_by_uids, get_room_info_by_id 7 | 8 | from ...utils import send_msg, get_timespan, get_time_difference, scheduler 9 | from ...blivedm import blivedm 10 | from ...blivedm.blivedm.models import web as web_models 11 | from ...database import Db as db 12 | from nonebot.log import logger 13 | from ...config import danmaku_config 14 | from nonebot import get_driver 15 | 16 | 17 | class ClientModel: 18 | def __init__(self, room_id, cookie): 19 | self.uid = "" 20 | self.name = "" 21 | self.live_time = 0 22 | self.client = blivedm.BLiveClient(room_id, session=cookie) 23 | 24 | 25 | clients: list[ClientModel] = [] 26 | driver = get_driver() 27 | host = danmaku_config.danmaku_host if danmaku_config.danmaku_host else f"http://{driver.config.host}:{driver.config.port}" 28 | session: Optional[aiohttp.ClientSession] = None 29 | 30 | 31 | @scheduler.scheduled_job( 32 | "interval", seconds=15, id="street_lamp_sched" 33 | ) 34 | async def danmaku(): 35 | """ 连接直播间 """ 36 | uids = db.get_sub_list("street_lamp") 37 | 38 | if not uids: 39 | return 40 | 41 | try: 42 | res = await get_rooms_info_by_uids(uids, reqtype="web", proxies=None) 43 | except Exception as ex: 44 | logger.error(f"get_rooms_info_by_uids错误:\n{ex}") 45 | return 46 | 47 | if not res: 48 | return 49 | 50 | logger.debug('爬取路灯列表') 51 | handler = MsgHandler() 52 | cookies = http.cookies.SimpleCookie() 53 | cookies["SESSDATA"] = await db.get_cookie() 54 | cookies["SESSDATA"]["domain"] = "bilibili.com" 55 | 56 | for uid, info in res.items(): 57 | new_status = 0 if info["live_status"] == 2 else info["live_status"] 58 | index = [x for x in clients if x.uid == uid] 59 | 60 | if not index and new_status: 61 | logger.info(f'{info["uname"]}开播了,连接直播间') 62 | room_id = info["short_id"] if info["short_id"] else info["room_id"] 63 | room_info = await get_room_info_by_id(room_id, reqtype="web") 64 | start_timespan = get_timespan(room_info["live_time"]) 65 | 66 | global session 67 | 68 | if session is None: 69 | session = aiohttp.ClientSession() 70 | session.cookie_jar.update_cookies(cookies) 71 | 72 | model = ClientModel(room_id, session) 73 | model.client.set_handler(handler) 74 | model.client.start() 75 | model.uid = uid 76 | model.name = info["uname"] 77 | model.live_time = start_timespan 78 | clients.append(model) 79 | 80 | room = await db.get_room(room_id=room_id, uid=uid, start_time=start_timespan) 81 | 82 | if room is None: 83 | cover = ( 84 | info["cover_from_user"] if info["cover_from_user"] else info["keyframe"] 85 | ) 86 | await db.add_room(room_id=room_id, uid=uid, 87 | cover=cover, title=info["title"], 88 | name=info["uname"], start_time=start_timespan, end_time=0, watch_person=0) 89 | 90 | if index and not new_status: 91 | model = index[0] 92 | await live_off(model) 93 | 94 | 95 | class MsgHandler(blivedm.BaseHandler): 96 | def _on_danmaku(self, client: blivedm.BLiveClient, message: web_models.DanmakuMessage): 97 | if (message.msg.startswith("#路灯")): 98 | logger.info(f'{client.room_owner_uid}的直播间收到路灯:{message.uname} -> {message.msg}') 99 | asyncio.create_task(save_danmaku(client.room_id, client.room_owner_uid, message.uname, int(message.timestamp / 1000), message.msg)) 100 | 101 | def _on_buy_guard(self, client: blivedm.BLiveClient, message: web_models.GuardBuyMessage): 102 | logger.info(f"[{client.room_id}] {message.username} 购买{message.gift_name}") 103 | asyncio.create_task(save_gift(client.room_id, 104 | client.room_owner_uid, 105 | message.username, 106 | message.uid, 107 | message.gift_name, 108 | message.price, 109 | message.num, 110 | "guard", message.guard_level)) 111 | 112 | def _on_super_chat(self, client: blivedm.BLiveClient, message: web_models.SuperChatMessage): 113 | logger.info(f"[{client.room_id}] SC ¥{message.price} {message.uname}:{message.message}") 114 | asyncio.create_task(save_gift(client.room_id, 115 | client.room_owner_uid, 116 | message.uname, message.uid, 117 | message.message, 118 | message.price, 1, 119 | "sc", message.guard_level)) 120 | 121 | def _on_gift(self, client: blivedm.BLiveClient, message: web_models.GiftMessage): 122 | if message.coin_type == "silver": 123 | return 124 | coin = message.total_coin / 1000 125 | logger.info(f"[{client.room_id}] {message.uname} 赠送{message.gift_name}x{message.num} ¥{coin}") 126 | asyncio.create_task(save_gift(client.room_id, 127 | client.room_owner_uid, 128 | message.uname, 129 | message.uid, 130 | message.gift_name, 131 | coin,message.num, 132 | 'gift',message.guard_level)) 133 | 134 | def _on_heartbeat(self, client: blivedm.BLiveClient, message: web_models.HeartbeatMessage): 135 | logger.debug(f"[{client.room_id}] 当前人气值:{message.popularity}") 136 | 137 | def _on_watched(self, client: blivedm.BLiveClient, message: web_models.WatchedMessage): 138 | asyncio.create_task(update_watched(client.room_id, message.num)) 139 | 140 | 141 | async def update_watched(room_id, num): 142 | room_list = await db.get_rooms(room_id=room_id, end_time=0) 143 | room_list.sort(key=lambda x: x.start_time, reverse=True) 144 | room = room_list[0] 145 | if room is None: 146 | return 147 | await db.update_room("watch_person", num, id=room.id) 148 | 149 | 150 | async def live_off(model: ClientModel): 151 | if not model: 152 | return 153 | await disconnect_room(model) 154 | now = int(time.time()) 155 | room = await db.get_room(room_id=model.client.room_id, start_time=model.live_time) 156 | if room is None: 157 | return 158 | await db.update_room("end_time", now, id=room.id) 159 | subs = await db.get_subs(uid=room.uid, street_lamp=True) 160 | for sub in subs: 161 | msg = (f'{model.name}下播了,' 162 | '可前往面板查看本次直播的路灯记录:' 163 | f'{host}/danmaku/#/room?roomid={room.id}&type={sub.type}&type_id={sub.type_id}&uid={sub.uid}') 164 | await send_msg(bot_id=sub.bot_id, send_type=sub.type, type_id=sub.type_id, message=msg) 165 | 166 | 167 | async def disconnect_room(model: ClientModel): 168 | client = model.client 169 | try: 170 | asyncio.gather(client.join()) 171 | finally: 172 | await asyncio.gather(client.stop_and_close()) 173 | clients.remove(model) 174 | logger.info(f'{model.name} 断开直播间连接') 175 | 176 | 177 | async def save_danmaku(room_id, uid, send_name: str, timestamp: int, raw_msg: str): 178 | datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp)) 179 | index = [x for x in clients if x.uid == str(uid)] 180 | if not index: 181 | return 182 | model = index[0] 183 | dt = get_time_difference(model.live_time, timestamp) 184 | room = await db.get_room(room_id=room_id, start_time=model.live_time) 185 | if room is None: 186 | return 187 | danmaku_type = "danamku" 188 | statistics_list = await db.get_subs(uid=uid, statistics=True) 189 | if raw_msg.startswith("#路灯"): 190 | blive_danmaku = raw_msg.replace("#路灯", "", 1).strip() 191 | if not blive_danmaku: 192 | return 193 | street_lamp = f'【{model.name}】 在 {datetime}({dt}) 收到了 {send_name} 发来的路灯【{blive_danmaku}】' 194 | danmaku_type = "street_lamp" 195 | subs = await db.get_subs(uid=uid, street_lamp=True) 196 | for sub in subs: 197 | await send_msg(bot_id=sub.bot_id, send_type=sub.type, type_id=sub.type_id, message=street_lamp) 198 | await db.add_danmaku(room_id=room.id, 199 | uname=send_name, 200 | message=raw_msg, 201 | create_time=datetime, 202 | live_duration=dt, 203 | type=danmaku_type) 204 | if danmaku_type == "danamku" and len(statistics_list) > 0: 205 | await db.add_danmaku(room_id=room.id, 206 | uname=send_name, 207 | message=raw_msg, 208 | create_time=datetime, 209 | live_duration=dt, 210 | type=danmaku_type) 211 | 212 | 213 | async def save_gift(room_id, uid, send_name: str, send_uid: int, name: str, price: int | float, num: int, type: str, guard_level: int): 214 | datetime = int(time.time()) 215 | index = [x for x in clients if x.uid == str(uid)] 216 | if not index: 217 | return 218 | model = index[0] 219 | dt = get_time_difference(model.live_time, datetime) 220 | room = await db.get_room(room_id=room_id, start_time=model.live_time) 221 | if room is None: 222 | return 223 | 224 | coin = price if type == 'sc' else price / 1000 225 | await db.add_gift(rid=room.id, 226 | name=name, 227 | price=coin, 228 | num=num, 229 | uname=send_name, 230 | uid=send_uid, 231 | type=type, 232 | create_time=datetime, 233 | live_duration=dt, 234 | guard=guard_level) 235 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/command/subscribe/live.py: -------------------------------------------------------------------------------- 1 | from bilireq.live import get_rooms_info_by_uids 2 | from ...utils import send_msg, scheduler 3 | from nonebot.log import logger 4 | from nonebot.adapters.onebot.v11 import MessageSegment 5 | from ...database import Db as db 6 | from ...config import danmaku_config 7 | 8 | 9 | live_uids = {} 10 | 11 | 12 | @scheduler.scheduled_job( 13 | "interval", seconds=12, id="live_sched" 14 | ) 15 | async def live(): 16 | """开播提醒""" 17 | if danmaku_config.danmaku_group_notice is False: 18 | return 19 | uids = db.get_sub_list("live") 20 | 21 | if not uids: 22 | return 23 | try: 24 | res = await get_rooms_info_by_uids(uids, reqtype="web", proxies=None) 25 | except Exception as ex: 26 | logger.error(f"开播提醒get_rooms_info_by_uids错误:\n{ex}") 27 | return 28 | if not res: 29 | return 30 | for uid, info in res.items(): 31 | live_status = 0 if info["live_status"] == 2 else info["live_status"] 32 | name = info["uname"] 33 | room_id = info["short_id"] if info["short_id"] else info["room_id"] 34 | if uid not in live_uids: 35 | live_uids[uid] = live_status 36 | continue 37 | status = live_uids[uid] 38 | if live_status == status: 39 | continue 40 | live_uids[uid] = live_status 41 | 42 | if live_status: 43 | logger.info(f"{name} 开播了") 44 | url = f"https://live.bilibili.com/{room_id}" 45 | cover = ( 46 | info["cover_from_user"] if info["cover_from_user"] else info["keyframe"] 47 | ) 48 | title = info["title"] 49 | msg = f"{name} 正在直播:\n{title}\n{MessageSegment.image(cover)}\n{url}" 50 | else: 51 | logger.info(f"{name} 下播了") 52 | cover = ( 53 | info["cover_from_user"] if info["cover_from_user"] else info["keyframe"] 54 | ) 55 | msg = f"{name} 下播了\n{MessageSegment.image(cover)}" 56 | sub_list = await db.get_subs(uid=uid) 57 | for sub in sub_list: 58 | await send_msg(bot_id=sub.bot_id, send_type=sub.type, type_id=sub.type_id, message=msg) 59 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/config.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel, Field 2 | from typing import Optional 3 | from nonebot import get_driver 4 | 5 | 6 | class Config(BaseModel): 7 | # 全局群开播提醒 8 | danmaku_group_notice: Optional[bool] = Field(False, alias="danmaku_group_notice") 9 | # 外部访问地址 10 | danmaku_host: Optional[str] = Field(None, alias="danmaku_host") 11 | 12 | 13 | driver = get_driver() 14 | driver_config = driver.config 15 | danmaku_config = Config.parse_obj(driver_config.dict()) 16 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/database/__init__.py: -------------------------------------------------------------------------------- 1 | from .db import Db 2 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/database/db.py: -------------------------------------------------------------------------------- 1 | from nonebot import get_driver 2 | from nonebot.log import logger 3 | from tortoise import Tortoise 4 | from tortoise.connection import connections 5 | 6 | from ..utils import get_path 7 | from .model import Sub, LiveRoom, Danmaku, Gift, CookieManager, ignore_none 8 | from nonebot_plugin_blive_danmaku import __version__ 9 | import time 10 | 11 | sub_dict = {"street_lamp": [], "live": []} 12 | 13 | 14 | class Db: 15 | @classmethod 16 | async def init(cls): 17 | config = { 18 | "connections": {"danmaku_bot": f"sqlite://{get_path('danmakuBot.sqlite3')}"}, 19 | "apps": { 20 | __version__: { 21 | "models": ["nonebot_plugin_blive_danmaku.database.model"], 22 | "default_connection": "danmaku_bot" 23 | } 24 | } 25 | } 26 | 27 | await Tortoise.init(config=config) # type:ignore 28 | await Tortoise.generate_schemas() # type:ignore 29 | await cls.migrate() 30 | await cls.update_sub_list() 31 | logger.info("load db") 32 | 33 | @classmethod 34 | async def add_sub(cls, **kwargs) -> bool: 35 | if not await Sub.add(**kwargs): 36 | return False 37 | await cls.update_sub_list() 38 | return True 39 | 40 | @classmethod 41 | async def delete_sub(cls, **kwargs) -> bool: 42 | if not await Sub.delete(**kwargs): 43 | return False 44 | await cls.update_sub_list() 45 | return True 46 | 47 | @classmethod 48 | async def update_sub(cls, conf, switch, **kwargs): 49 | res = await Sub.update(kwargs, **{conf: switch}) 50 | if res: 51 | await cls.update_sub_list() 52 | return res 53 | 54 | @classmethod 55 | async def get_subs(cls, **kwargs): 56 | res = await Sub.get(**kwargs) 57 | return res 58 | 59 | @classmethod 60 | async def get_sub(cls, **kwargs): 61 | res = await Sub.get(**kwargs).first() 62 | return res 63 | 64 | @classmethod 65 | def get_sub_list(cls, key): 66 | return sub_dict[key] 67 | 68 | @classmethod 69 | async def update_sub_list(cls): 70 | subs = Sub.all() 71 | sub_dict["street_lamp"] = list(set([sub.uid async for sub in subs if sub.street_lamp])) 72 | sub_dict["live"] = list(set([x.uid async for x in subs])) 73 | 74 | @classmethod 75 | async def get_rooms(cls, **kwargs): 76 | res = await LiveRoom.get(**kwargs) 77 | return res 78 | 79 | @classmethod 80 | async def get_rooms_by_paged(cls, limit, offset, where): 81 | conn = Tortoise.get_connection("danmaku_bot") # type:ignore 82 | _, rows = await conn.execute_query(f"""select * from 83 | (select distinct room.*,(select count(1) 84 | from danmaku a where a.room_id=room.id 85 | and (a.type is null or a.type='street_lamp')) count 86 | from LiveRoom room 87 | left join Sub s on s.uid=room.uid 88 | left join danmaku d on room.id = d.room_id 89 | and (d.type is null or d.type='street_lamp') 90 | where {where} 91 | )t 92 | order by start_time desc 93 | limit ? offset ?""", [limit, offset]) 94 | _, dict = await conn.execute_query(f"""select count(distinct id) total from 95 | (select room.*,s.type,s.type_id,d.message 96 | from LiveRoom room 97 | left join Sub s on s.uid=room.uid 98 | left join danmaku d on room.id = d.room_id and (d.type is null or d.type='street_lamp') 99 | where {where} 100 | )t""") 101 | total = dict[0]["total"] 102 | return total, rows 103 | 104 | @classmethod 105 | async def get_room(cls, **kwargs): 106 | res = await LiveRoom.get(**kwargs).first() 107 | return res 108 | 109 | @classmethod 110 | async def get_room_info(cls, id: int): 111 | conn = Tortoise.get_connection("danmaku_bot") # type:ignore 112 | _, query = await conn.execute_query(""" 113 | select room.*,s.statistics 114 | from liveroom room 115 | left join sub s on s.uid=room.uid 116 | where 117 | room.id=? 118 | """, [id]) 119 | res = query[0] 120 | return res 121 | 122 | @classmethod 123 | async def get_danmaku_by_rid(cls, room_id, type): 124 | conn = Tortoise.get_connection("danmaku_bot") # type:ignore 125 | _, res = await conn.execute_query(""" 126 | select d.id,d.create_time,d.live_duration,d.uname,d.message,d.type,'0' num,'' price, '' guard, '' uid 127 | from danmaku d 128 | where 129 | d.room_id=? 130 | and (d.type='street_lamp' or d.type is null) 131 | union 132 | select g.id,g.create_time,g.live_duration,g.uname,g.name,g.type,g.num,g.price,g.guard,g.uid 133 | from gift g 134 | where 135 | g.rid=? 136 | and g.type='sc' 137 | order by live_duration 138 | """, [room_id, room_id]) 139 | return res 140 | 141 | @classmethod 142 | async def add_room(cls, **kwargs): 143 | res = await LiveRoom.add(**kwargs) 144 | return res 145 | 146 | @classmethod 147 | async def update_room(cls, conf, switch, **kwargs): 148 | res = await LiveRoom.update(kwargs, **{conf: switch}) 149 | return res 150 | 151 | @classmethod 152 | async def add_danmaku(cls, **kwargs): 153 | res = await Danmaku.add(**kwargs) 154 | return res 155 | 156 | @classmethod 157 | async def add_gift(cls, **kwargs): 158 | res = await Gift.add(**kwargs) 159 | return res 160 | 161 | @classmethod 162 | async def get_gift_count(cls, room_id, keyword, type): 163 | kwargs = { 164 | "rid": room_id, 165 | "keyword__contains": keyword, 166 | "type": type 167 | } 168 | res = await Gift.get(**ignore_none(**kwargs)).count() 169 | return res 170 | 171 | @classmethod 172 | async def get_gift_by_paged(cls, room_id, page, size, keyword, type): 173 | kwargs = { 174 | "rid": room_id, 175 | "name__contains": keyword, 176 | "type": type 177 | } 178 | 179 | res = await Gift.get(**ignore_none(**kwargs)).limit(size).offset(page).order_by("create_time") 180 | return res 181 | 182 | @classmethod 183 | async def get_statistics(cls, room_id): 184 | conn = Tortoise.get_connection("danmaku_bot") # type:ignore 185 | _, dict = await conn.execute_query("""select round(count(d.id)/((room.end_time-room.start_time)/60)) avg, 186 | count(d.id) danmaku_total, 187 | room.watch_person 188 | from liveroom room 189 | left join danmaku d on d.room_id=room.id 190 | where room.id=?""", [room_id]) 191 | avg_min_danmaku = dict[0]["avg"] 192 | danmaku_total = dict[0]["danmaku_total"] 193 | watched = dict[0]["watch_person"] 194 | _, hot_word = await conn.execute_query("""select message,count(1) sum from danmaku where room_id=? group by message order by count(1) desc limit 20""", [room_id]) 195 | _, min_danmaku = await conn.execute_query("""select create_time, live_duration, count(create_time) as sum, 196 | datetime(strftime('%s',create_time)/60*60, 'unixepoch') as countTime 197 | from danmaku 198 | where room_id=? 199 | group by strftime('%s', countTime) 200 | order by countTime""", [room_id]) 201 | result = { 202 | "avg_danmaku": avg_min_danmaku, 203 | "total": danmaku_total, 204 | "hot_word": hot_word, 205 | "min_danmaku": min_danmaku, 206 | "watched": watched 207 | } 208 | return result 209 | 210 | @classmethod 211 | async def add_cookie(cls, value): 212 | if not value: 213 | return False 214 | cookie = await CookieManager.get(cookie=value) 215 | if not cookie: 216 | datetime = int(time.time()) 217 | await CookieManager.add(cookie=value, create_time=datetime) 218 | return True 219 | return False 220 | 221 | @classmethod 222 | async def get_cookie(cls): 223 | cookie_list = await CookieManager.get() 224 | if len(cookie_list) == 0: 225 | return "" 226 | cookie_list.sort(key=lambda x: x.create_time, reverse=True) 227 | cookie = cookie_list[0] 228 | return cookie.cookie 229 | 230 | @classmethod 231 | async def migrate(cls): 232 | conn = Tortoise.get_connection("danmaku_bot") # type:ignore 233 | # v0.3.0 234 | _, type = await conn.execute_query("select count(1) Total from sqlite_master where name='danmaku' and sql like '%type%'") 235 | total = type[0]["Total"] 236 | if total == 0: 237 | _, res = await conn.execute_query("alter table danmaku add column type varchar(50)") 238 | _, watch = await conn.execute_query("select count(1) Total from sqlite_master where name='liveroom' and sql like '%watch_person%'") 239 | watch_field = watch[0]["Total"] 240 | if watch_field == 0: 241 | _, res = await conn.execute_query("alter table liveroom add column watch_person bigint") 242 | _, statistics = await conn.execute_query("select count(1) Total from sqlite_master where name='sub' and sql like '%statistics%'") 243 | statistics_field = statistics[0]["Total"] 244 | if statistics_field == 0: 245 | _, res = await conn.execute_query("alter table sub add column statistics int default 0 not null") 246 | 247 | 248 | get_driver().on_startup(Db.init) 249 | get_driver().on_shutdown(connections.close_all) 250 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/database/model.py: -------------------------------------------------------------------------------- 1 | from tortoise.models import Model 2 | from tortoise import fields 3 | from nonebot.log import logger 4 | 5 | 6 | class BaseModel(Model): 7 | @classmethod 8 | def get_(cls, *args, **kwargs): 9 | super().get(*args, **kwargs) 10 | 11 | @classmethod 12 | def get(cls, **kwargs): 13 | return cls.filter(**kwargs) 14 | 15 | @classmethod 16 | async def add(cls, **kwargs): 17 | pk_name = cls.describe()["pk_field"]["name"] 18 | if pk_name == "id" and pk_name not in kwargs: 19 | filters = kwargs 20 | else: 21 | filters = {pk_name: kwargs[pk_name]} 22 | if await cls.get(**filters).exists(): 23 | return False 24 | await cls.create(**kwargs) 25 | return True 26 | 27 | @classmethod 28 | async def delete(cls, **kwargs): 29 | query = cls.get(**kwargs) 30 | if await query.exists(): 31 | await query.delete() 32 | return True 33 | return False 34 | 35 | @classmethod 36 | async def update(cls, q, **kwargs): 37 | query = cls.get(**q) 38 | if await query.exists(): 39 | await query.update(**kwargs) 40 | return True 41 | logger.error(f'更新数据失败:{q} -> {kwargs}') 42 | return False 43 | 44 | class Meta: 45 | abstract = True 46 | 47 | 48 | class Sub(BaseModel): 49 | type_id = fields.BigIntField() 50 | type = fields.CharField(max_length=10) 51 | uid = fields.BigIntField() 52 | street_lamp = fields.BooleanField() 53 | bot_id = fields.BigIntField() 54 | statistics = fields.BooleanField(default=False) 55 | 56 | 57 | class LiveRoom(BaseModel): 58 | id = fields.IntField(pk=True, generated=True) 59 | room_id = fields.BigIntField() 60 | cover = fields.CharField(max_length=500) 61 | title = fields.CharField(max_length=50) 62 | uid = fields.BigIntField() 63 | name = fields.CharField(max_length=50) 64 | start_time = fields.BigIntField() 65 | end_time = fields.BigIntField() 66 | watch_person = fields.BigIntField() 67 | 68 | 69 | class Danmaku(BaseModel): 70 | room_id = fields.BigIntField() 71 | uname = fields.CharField(max_length=50) 72 | message = fields.CharField(max_length=5000) 73 | create_time = fields.CharField(max_length=50) 74 | """创建时间""" 75 | live_duration = fields.CharField(max_length=50) 76 | """开播时长""" 77 | type = fields.CharField(max_length=50, null=True) 78 | 79 | 80 | class Gift(BaseModel): 81 | name = fields.CharField(max_length=200) 82 | price = fields.DecimalField(max_digits=18, decimal_places=2) 83 | num = fields.IntField() 84 | uname = fields.CharField(max_length=50) 85 | uid = fields.BigIntField() 86 | guard = fields.IntField() 87 | type = fields.CharField(max_length=50) 88 | rid = fields.BigIntField() 89 | create_time = fields.BigIntField() 90 | live_duration = fields.CharField(max_length=50) 91 | 92 | 93 | class CookieManager(BaseModel): 94 | cookie = fields.CharField(max_length=5000) 95 | create_time = fields.BigIntField() 96 | 97 | 98 | def ignore_none(**args): 99 | return {key: value for key, value in args.items() if value is not None} 100 | -------------------------------------------------------------------------------- /nonebot_plugin_blive_danmaku/utils/__init__.py: -------------------------------------------------------------------------------- 1 | import nonebot 2 | import time 3 | from pathlib import Path 4 | from typing import Union 5 | from nonebot import require 6 | from nonebot.log import logger 7 | from nonebot.matcher import Matcher 8 | from nonebot.params import ArgPlainText, CommandArg 9 | from nonebot.adapters.onebot.v11 import ( 10 | ActionFailed, 11 | Bot, 12 | Message, 13 | NetworkError, 14 | ) 15 | from nonebot.adapters.onebot.v11.event import GroupMessageEvent, PrivateMessageEvent 16 | from nonebot.adapters.onebot.v11.permission import GROUP_ADMIN, GROUP_OWNER 17 | from nonebot.exception import FinishedException 18 | from nonebot.permission import SUPERUSER 19 | from nonebot import require 20 | require("nonebot_plugin_apscheduler") 21 | from nonebot_plugin_apscheduler import scheduler 22 | 23 | 24 | def get_path(*other): 25 | """获取数据文件路径""" 26 | dir_path = Path.cwd().joinpath("data") 27 | return str(dir_path.joinpath(*other)) 28 | 29 | 30 | async def handle_uid(matcher: Matcher, command_arg: Message = CommandArg(),): 31 | """获取uid""" 32 | uid = command_arg.extract_plain_text().strip() 33 | if uid: 34 | matcher.set_arg("uid", command_arg) 35 | 36 | 37 | async def uid_check(matcher: Matcher, uid: str = ArgPlainText("uid"),): 38 | """检查uid合法性""" 39 | uid = uid.strip() 40 | if not uid.isdecimal(): 41 | await matcher.finish("UID 必须为纯数字") 42 | matcher.set_arg("uid", Message(uid)) 43 | 44 | 45 | async def handle_cookie(matcher: Matcher, command_arg: Message = CommandArg(),): 46 | cookie = command_arg.extract_plain_text().strip() 47 | if cookie: 48 | matcher.set_arg("cookie", command_arg) 49 | 50 | 51 | async def cookie_check(matcher: Matcher, cookie: str = ArgPlainText("cookie"),): 52 | cookie = cookie.strip() 53 | if not cookie: 54 | await matcher.finish("请输入cookie") 55 | matcher.set_arg("cookie", Message(cookie)) 56 | 57 | 58 | async def permission_check(bot: Bot, event: Union[GroupMessageEvent, PrivateMessageEvent]): 59 | """检查管理员权限""" 60 | from ..database import Db as db 61 | 62 | if isinstance(event, PrivateMessageEvent): 63 | if event.sub_type == "group": # 不处理群临时会话 64 | raise FinishedException 65 | return 66 | if isinstance(event, GroupMessageEvent): 67 | if await (GROUP_ADMIN | GROUP_OWNER | SUPERUSER)(bot, event): 68 | return 69 | await bot.send(event, "权限不足,目前只有管理员才能使用") 70 | raise FinishedException 71 | 72 | 73 | async def send_msg(bot_id, send_type, type_id, message): 74 | async def send(bot, send_type, type_id, message): 75 | result = await bot.call_api( 76 | "send_" + send_type + "_msg", 77 | **{ 78 | "message": message, 79 | "user_id" if send_type == "private" else "group_id": type_id, 80 | }, 81 | ) 82 | return result 83 | bots = nonebot.get_bots() 84 | bot = bots.get(str(bot_id)) 85 | if bot is None: 86 | logger.error("未连接任何Bot,推送消息失败") 87 | for key, item in bots.items(): 88 | await send(item, send_type, type_id, message) 89 | logger.warning("尝试使用其他Bot推送消息") 90 | return 91 | try: 92 | await send(bot, send_type, type_id, message) 93 | except ActionFailed as ex: 94 | if ex.info["msg"] == "GROUP_NOT_FOUND": 95 | from ..database import Db as db 96 | 97 | await db.delete_sub(type="group", type_id=type_id) 98 | logger.error(f"推送消息失败,未找到群{type_id},已清理无效的订阅") 99 | elif ex.info["msg"] == "SEND_MSG_API_ERROR": 100 | logger.error(f"推送消息失败,账号可能被风控\n{ex.info}") 101 | else: 102 | logger.error(f"推送消息失败,发生未知错误\n{ex.info}") 103 | except NetworkError as ex: 104 | logger.error(f"推送消息失败,请检查网络配置\n{ex.msg}") 105 | 106 | 107 | async def get_type_id(event): 108 | return event.group_id if isinstance(event, GroupMessageEvent) else event.user_id 109 | 110 | 111 | def on_startup(): 112 | if not Path(get_path()).is_dir(): 113 | Path(get_path()).mkdir(parents=True) 114 | 115 | 116 | def get_timespan(time_str): 117 | """字符串转时间戳""" 118 | time_array = time.strptime(time_str, "%Y-%m-%d %H:%M:%S") 119 | res = int(time.mktime(time_array)) 120 | return res 121 | 122 | 123 | def get_time_difference(live_time: int, now: int): 124 | """计算开播时间到当前时间的时间差""" 125 | sub = now - live_time 126 | m, s = divmod(sub, 60) 127 | h, m = divmod(m, 60) 128 | dt = ("%02d:%02d:%02d" % (h, m, s)) 129 | return dt 130 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "nonebot-plugin-blive-danmaku" 3 | version = "0.4.1" 4 | description = "A danmaku plugin for Nonebot2" 5 | authors = ["ricardo "] 6 | documentation = "https://github.com/zangxx66/nonebot_plugin_blive_danmaku#readme" 7 | license = "MIT" 8 | homepage = "https://github.com/zangxx66/nonebot_plugin_blive_danmaku" 9 | readme = "README.md" 10 | keywords = ["nonebot", "nonebot2", "bilibili", "danmaku"] 11 | classifiers = [ 12 | "Programming Language :: Python :: 3", 13 | "License :: OSI Approved :: MIT License", 14 | "Operating System :: OS Independent", 15 | ] 16 | 17 | [tool.poetry.dependencies] 18 | python = ">=3.10,<4.0" 19 | nonebot2 = {extras = ["fastapi"], version = "^2.1.0"} 20 | nonebot-adapter-onebot = "^2.2.4" 21 | bilireq = "^0.2.11" 22 | nonebot_plugin_apscheduler = "^0.3.0" 23 | aiohttp = "^3.7.4" 24 | Brotli = "^1.0.9" 25 | Pillow = "^9.5.0" 26 | Jinja2 = "^3.1.2" 27 | tortoise-orm = {extras = ["asyncpg"], version = "^0.19.3"} 28 | pure-protobuf = "^3.0.0a5" 29 | 30 | [build-system] 31 | requires = ["poetry-core"] 32 | build-backend = "poetry.core.masonry.api" 33 | --------------------------------------------------------------------------------