Skip to content

Commit 6145618

Browse files
committed
✨ adapter Bilibili Live
1 parent 99adeb0 commit 6145618

File tree

9 files changed

+251
-52
lines changed

9 files changed

+251
-52
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
test:
1515
strategy:
1616
matrix:
17-
py_ver: ['3.9', '3.10', '3.11', '3.12']
17+
py_ver: ['3.10', '3.11', '3.12', '3.13']
1818
runs-on: ubuntu-latest
1919
steps:
2020
- uses: actions/checkout@v5

README.md

Lines changed: 51 additions & 50 deletions
Large diffs are not rendered by default.

pdm.lock

Lines changed: 86 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ dev = [
214214
"nonebot-adapter-milky>=1.0.0",
215215
"nonebot-adapter-efchat>=0.1.9.post2",
216216
"pytest-asyncio==0.26.0",
217+
"nonebot-adapter-bilibili-live>=0.2.4",
217218
]
218219
test = [
219220
"nonebug>=0.4.3",
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from nonebot_plugin_alconna.uniseg.constraint import SupportAdapter
2+
from nonebot_plugin_alconna.uniseg.loader import BaseLoader
3+
4+
5+
class Loader(BaseLoader):
6+
def get_adapter(self) -> SupportAdapter:
7+
return SupportAdapter.bililive
8+
9+
def get_builder(self):
10+
from .builder import BiliLiveMessageBuilder
11+
12+
return BiliLiveMessageBuilder()
13+
14+
def get_exporter(self):
15+
from .exporter import BiliLiveMessageExporter
16+
17+
return BiliLiveMessageExporter()
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from nonebot.adapters.bilibili_live.message import TextSegment, AtSegment, EmoticonSegment
2+
3+
from nonebot_plugin_alconna.uniseg.builder import MessageBuilder, build
4+
from nonebot_plugin_alconna.uniseg.constraint import SupportAdapter
5+
from nonebot_plugin_alconna.uniseg.segment import At, Text, Emoji
6+
7+
8+
class BiliLiveMessageBuilder(MessageBuilder):
9+
@classmethod
10+
def get_adapter(cls) -> SupportAdapter:
11+
return SupportAdapter.bililive
12+
13+
@build("text")
14+
def text(self, seg: TextSegment):
15+
return Text(seg.data["text"])
16+
17+
@build("at")
18+
def at(self, seg: AtSegment):
19+
return At("user", str(seg.user_id), seg.data.get("name"))
20+
21+
@build("emoticon")
22+
def emoticon(self, seg: EmoticonSegment):
23+
return Emoji(seg.data["emoji"], seg.data.get("descript"))
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from typing import Union
2+
3+
from nonebot.adapters import Bot, Event
4+
from nonebot.adapters.bilibili_live.event import MessageEvent, DanmakuEvent, SuperChatEvent
5+
from nonebot.adapters.bilibili_live.message import Message, MessageSegment
6+
from nonebot.adapters.bilibili_live.bot import WebBot
7+
8+
from nonebot_plugin_alconna.uniseg.constraint import SupportScope
9+
from nonebot_plugin_alconna.uniseg.exporter import MessageExporter, SupportAdapter, Target, export
10+
from nonebot_plugin_alconna.uniseg.segment import At, Emoji, Text, Reply
11+
12+
13+
class BiliLiveMessageExporter(MessageExporter[Message]):
14+
def get_message_type(self):
15+
return Message
16+
17+
@classmethod
18+
def get_adapter(cls) -> SupportAdapter:
19+
return SupportAdapter.bililive
20+
21+
def get_target(self, event: Event, bot: Union[Bot, None] = None) -> Target:
22+
23+
if isinstance(event, MessageEvent):
24+
return Target(
25+
str(event.room_id),
26+
adapter=self.get_adapter(),
27+
self_id=bot.self_id if bot else None,
28+
scope=SupportScope.bililive,
29+
)
30+
raise NotImplementedError
31+
32+
def get_message_id(self, event: Event) -> str:
33+
if isinstance(event, DanmakuEvent):
34+
return event.msg_id or f"{event.room_id}:{hash(event.content)}"
35+
if isinstance(event, SuperChatEvent):
36+
return str(event.msg_id or event.id)
37+
raise NotImplementedError
38+
39+
@export
40+
async def text(self, seg: Text, bot: Union[Bot, None]) -> "MessageSegment":
41+
return MessageSegment.text(seg.text)
42+
43+
@export
44+
async def at(self, seg: At, bot: Union[Bot, None]) -> "MessageSegment":
45+
return MessageSegment.at(seg.target, seg.display)
46+
47+
@export
48+
async def emoji(self, seg: Emoji, bot: Union[Bot, None]) -> "MessageSegment":
49+
return MessageSegment.emoticon(seg.id)
50+
51+
@export
52+
async def reply(self, seg: Reply, bot: Union[Bot, None]) -> "MessageSegment":
53+
return MessageSegment.at(seg.id)
54+
55+
async def send_to(self, target: Union[Target, Event], bot: Bot, message: Message, **kwargs):
56+
if isinstance(target, Target):
57+
assert isinstance(bot, WebBot), "BiliLive currently only supports WebBot for sending messages."
58+
reply_mid = message["at"][-1].data.get("uid", 0) if message["at"] else 0
59+
msg = "".join(str(seg) for seg in message)
60+
return await bot.send_danmaku(room_id=int(target.id), msg=msg, reply_mid=reply_mid, **kwargs)
61+
return await bot.send(target, message=message, **kwargs) # type: ignore

src/nonebot_plugin_alconna/uniseg/constraint.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
class SupportAdapter(str, Enum):
1212
"""支持的适配器"""
1313

14+
bililive = "bilibili Live"
1415
console = "Console"
1516
ding = "Ding"
1617
discord = "Discord"
@@ -69,6 +70,8 @@ class SupportScope(str, Enum):
6970
"""Tailchat平台"""
7071
efchat = "EFChat"
7172
"""EFChat平台"""
73+
bililive = "BiliLive"
74+
"""Bilibili直播平台"""
7275

7376
onebot12_other = "Onebot12"
7477
"""ob12 的其他平台"""
@@ -114,6 +117,7 @@ def ensure_satori(platform: str):
114117
class SupportAdapterModule(str, Enum):
115118
"""支持的适配器的模块路径"""
116119

120+
bililive = "nonebot.adapters.bilibili_live"
117121
console = "nonebot.adapters.console"
118122
ding = "nonebot.adapters.ding"
119123
discord = "nonebot.adapters.discord"

src/nonebot_plugin_alconna/uniseg/target.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,3 +508,10 @@ async def select_efchat(target: "Target", bot: Bot):
508508
if target.channel:
509509
return False
510510
return bot.adapter.get_name() == SupportAdapter.efchat
511+
512+
513+
@_register(SupportScope.bililive)
514+
async def select_bililive(target: "Target", bot: Bot):
515+
if target.channel or target.private:
516+
return False
517+
return bot.adapter.get_name() == SupportAdapter.bililive

0 commit comments

Comments
 (0)