Skip to content

Commit c349ae1

Browse files
committed
0.0.12
Signed-off-by: RF-Tar-Railt <3165388245@qq.com>
1 parent 0e8c687 commit c349ae1

30 files changed

Lines changed: 601 additions & 270 deletions

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pip install --upgrade arclet-edoves
3535
- [x] `Scene`: 对IO统一的生命周期管理, 间接支持多账号
3636
+ 杂项
3737
- [x] `NetworkClient`: 对网络端的抽象处理
38+
- [x] `Filter`: 对事件内容的限制操作
3839

3940
+ 实现支持
4041
- [x] `Edoves for mirai-api-http` : 对 [ `mirai-api-http` ](https://github.com/project-mirai/mirai-api-http) 的支持.

arclet/edoves/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@
22
if not TYPE_CHECKING:
33
import arclet.edoves.builtin.event.network
44
import arclet.edoves.builtin.event.message
5+
import arclet.edoves.builtin.event.notice
6+
7+
edoves_version = (0, 0, 12)

arclet/edoves/builtin/behavior.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,59 @@
11
from ..main.monomer import BaseMonoBehavior
2-
from ..main.protocol import NetworkProtocol
2+
from ..main.protocol import NetworkProtocol, MonomerProtocol
33
from .medium import Message
44

55

66
class MessageBehavior(BaseMonoBehavior):
7-
protocol: NetworkProtocol
7+
n_protocol: NetworkProtocol
8+
m_protocol: MonomerProtocol
89

910
def activate(self):
10-
self.protocol = self.io.metadata.protocol.scene.network_protocol
11+
self.n_protocol = self.io.metadata.protocol.scene.network_protocol
12+
self.m_protocol = self.io.metadata.protocol
1113

1214
async def revoke(self, medium: Message, target: int = None):
13-
self.protocol.set_medium(
15+
await self.m_protocol.set_medium(
1416
{
1517
"target": target if target else medium.content.find("Source").id
1618
}
1719
)
18-
await self.protocol.medium_transport("message_revoke")
20+
await self.n_protocol.medium_transport("message_revoke")
1921

2022
async def nudge(self, target: str, **rest):
21-
self.protocol.set_medium(
23+
await self.m_protocol.set_medium(
2224
{
2325
"target": target,
2426
"rest": rest
2527
}
2628
)
27-
await self.protocol.medium_transport("nudge_send")
29+
await self.n_protocol.medium_transport("nudge_send")
2830

2931
async def send_with(self, medium: Message, reply: bool = False, nudge: bool = False, **rest):
3032
if nudge:
31-
self.protocol.set_medium(
33+
await self.m_protocol.set_medium(
3234
{
3335
"target": medium.purveyor.metadata.identifier,
3436
"rest": rest
3537
}
3638
)
37-
await self.protocol.medium_transport("nudge_send")
39+
await self.n_protocol.medium_transport("nudge_send")
3840

39-
self.protocol.set_medium(
41+
await self.m_protocol.set_medium(
4042
{
4143
"target": medium.purveyor.metadata.identifier,
4244
"reply": reply,
4345
"content": medium.content.replace_type("Text", "Plain").to_sendable(),
4446
"rest": rest
4547
}
4648
)
47-
resp_data = await self.protocol.medium_transport("message_send")
49+
resp_data = await self.n_protocol.medium_transport("message_send")
4850
return resp_data.get('messageId')
4951

5052

5153
class MonoMetaBehavior(BaseMonoBehavior):
52-
protocol: NetworkProtocol
54+
n_protocol: NetworkProtocol
55+
m_protocol: MonomerProtocol
5356

5457
def activate(self):
55-
self.protocol = self.io.metadata.protocol.scene.network_protocol
58+
self.n_protocol = self.io.metadata.protocol.scene.network_protocol
59+
self.m_protocol = self.io.metadata.protocol

arclet/edoves/builtin/chatlog.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ def log_message(module: BaseModule, message: Message, purveyor: Monomer):
1212
edoves.logger.log(
1313
module.metadata.log_level,
1414
module.metadata.group_message_log_format.format(
15-
group_name=list(purveyor.parents.values())[0].metadata.name,
16-
group_id=list(purveyor.parents.values())[0].metadata.identifier,
15+
group_name=purveyor.current_group.metadata.name,
16+
group_id=purveyor.current_group.metadata.identifier,
1717
member_id=purveyor.metadata.identifier,
1818
member_name=purveyor.metadata.name,
1919
bot_id=edoves.self.metadata.identifier,
@@ -36,7 +36,7 @@ class ChatLogData(ModuleMetaComponent):
3636
identifier: str = EDOVES_DEFAULT
3737
log_level: str = "INFO"
3838
group_message_log_format: str = (
39-
"{bot_id}: [{group_name}({group_id})] {member_name}({member_id}) -> {message_string}" )
39+
"{bot_id}: [{group_name}({group_id})] {member_name}({member_id}) -> {message_string}")
4040
friend_message_log_format: str = "{bot_id}: [{friend_name}({friend_id})] -> {message_string}"
4141
other_client_message_log_format: str = "{bot_id}: [{platform_name}({platform_id})] -> {message_string}"
4242

arclet/edoves/builtin/client.py

Lines changed: 78 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,80 @@
11
from contextlib import asynccontextmanager
2-
from typing import Union, Dict, Any
3-
4-
from aiohttp import ClientSession, ClientWebSocketResponse
2+
from typing import Union, Dict, Any, Optional
3+
import json
4+
from aiohttp import ClientSession, ClientWebSocketResponse, ClientResponse, WSMessage
55
from yarl import URL
66

7-
from ..main.network import NetworkClient, HTTP_METHODS, NetworkResponse
7+
from ..main.network import NetworkClient, HTTP_METHODS, NetworkResponse, NetworkConnection
8+
9+
10+
class AiohttpResponse(NetworkResponse):
11+
response: ClientResponse
12+
13+
def __init__(self, response: ClientResponse):
14+
self.response = response
15+
16+
@property
17+
def url(self) -> URL:
18+
return self.response.url
19+
20+
@property
21+
def status(self) -> int:
22+
return self.response.status
23+
24+
def raise_for_status(self):
25+
self.response.raise_for_status()
26+
27+
async def read_json(self) -> dict:
28+
return await self.response.json()
29+
30+
async def read(self) -> bytes:
31+
return await self.response.read()
32+
33+
async def cookies(self) -> Dict[str, str]:
34+
return {k: str(v) for k, v in self.response.cookies.items()}
35+
36+
async def headers(self) -> Dict[str, str]:
37+
return {k: str(v) for k, v in self.response.headers.items()}
38+
39+
async def close(self):
40+
self.response.close()
41+
42+
43+
class AiohttpWSConnection(NetworkConnection):
44+
45+
async def accept(self) -> None:
46+
pass
47+
48+
def status(self) -> int:
49+
pass
50+
51+
def raise_for_code(self):
52+
pass
53+
54+
response: ClientWebSocketResponse
55+
56+
def __init__(self, response: ClientWebSocketResponse):
57+
self.response = response
58+
59+
async def send(self, data: Union[bytes, str, dict]) -> None:
60+
if isinstance(data, str):
61+
return await self.response.send_str(data)
62+
if isinstance(data, bytes):
63+
return await self.response.send_bytes(data)
64+
if isinstance(data, dict):
65+
return await self.response.send_str(json.dumps(data))
66+
67+
async def receive(self, timeout: Optional[float] = None) -> WSMessage:
68+
return await self.response.receive(timeout)
69+
70+
async def ping(self) -> None:
71+
return await self.response.ping()
72+
73+
async def pong(self) -> None:
74+
return await self.response.pong()
75+
76+
async def close(self, code: int = 1000, message: bytes = b'') -> None:
77+
await self.response.close(code=code, message=message)
878

979

1080
class AioHttpClient(NetworkClient):
@@ -26,7 +96,7 @@ async def ensure_network(
2696
**kwargs: Any
2797
):
2898
resp: ClientWebSocketResponse = await self.session.ws_connect(url, timeout=timeout, **kwargs).__aenter__()
29-
yield NetworkResponse(get_connection=lambda: resp)
99+
yield AiohttpWSConnection(resp)
30100

31101
@asynccontextmanager
32102
async def request(
@@ -40,10 +110,8 @@ async def request(
40110
async with self.session.request(
41111
method, url, **{"headers": headers, "data": data, **kwargs}
42112
) as resp:
43-
async def _read():
44-
return await resp.read()
45113

46-
yield NetworkResponse(get_content=_read)
114+
yield AiohttpResponse(resp)
47115

48116
@asynccontextmanager
49117
async def get(
@@ -55,15 +123,7 @@ async def get(
55123
async with self.session.get(
56124
url, **{"headers": headers, **kwargs}
57125
) as resp:
58-
resp.raise_for_status()
59-
60-
async def _read():
61-
return await resp.read()
62-
63-
async def _json():
64-
return await resp.json()
65-
66-
yield NetworkResponse(get_content=_read, get_json=_json)
126+
yield AiohttpResponse(resp)
67127

68128
@asynccontextmanager
69129
async def post(
@@ -75,15 +135,7 @@ async def post(
75135
async with self.session.post(
76136
url, **{"headers": headers, "data": data, **kwargs}
77137
) as resp:
78-
resp.raise_for_status()
79-
80-
async def _read():
81-
return await resp.read()
82-
83-
async def _json():
84-
return await resp.json()
85-
86-
yield NetworkResponse(get_content=_read, get_json=_json)
138+
yield AiohttpResponse(resp)
87139

88140
@asynccontextmanager
89141
async def put(

arclet/edoves/builtin/commander.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ def __init__(self, protocol: TMProtocol):
6868
for k, v in self.local_storage[self.__class__].items():
6969
self.get_component(CommandParsers).parsers.setdefault(k, v)
7070

71-
@self.behavior.add_handler(MessageReceived)
72-
async def command_handler(message: Message, module: Commander):
71+
@self.behavior.add_handlers(MessageReceived)
72+
async def command_message_handler(message: Message, module: Commander):
7373
for cmd, psr in self.command_parsers.parsers.items():
7474
result = psr.alconna.analyse_message(message.content)
7575
if result.matched:

arclet/edoves/builtin/event/network.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@
44

55
class DockerOperate(EdovesBasicEvent):
66
medium: JsonMedium
7+
8+
9+
class DockerStart(EdovesBasicEvent):
10+
medium: JsonMedium

arclet/edoves/builtin/event/notice.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,18 @@
22
from ..medium import Notice
33

44

5-
class NoticeSelf(EdovesBasicEvent):
5+
class NoticeMe(EdovesBasicEvent):
66
medium: Notice
77

88

9-
class MonomerStatusChanged(EdovesBasicEvent):
9+
class MonomerMetadataUpdate(EdovesBasicEvent):
1010
action: str
1111
medium: Notice
1212

1313

14-
class MonomerMetadataChanged(EdovesBasicEvent):
15-
action: str
16-
medium: Notice
17-
18-
19-
class RelationCreate(EdovesBasicEvent):
14+
class RelationshipSolution(EdovesBasicEvent):
2015
medium: Notice
2116

2217

23-
class RelationDestroy(EdovesBasicEvent):
18+
class RelationshipDissolution(EdovesBasicEvent):
2419
medium: Notice

arclet/edoves/builtin/filter.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from typing import List, Any
2+
3+
from ..utilles.event_filter import EventFilter, EdovesBasicEvent
4+
5+
6+
class MonomerTagLimit(EventFilter):
7+
tags: List[str]
8+
9+
def __init__(self, *monomer_tag: str):
10+
self.tags = list(monomer_tag)
11+
12+
def judge(self, event: EdovesBasicEvent) -> bool:
13+
if len(self.tags) > 1:
14+
return event.medium.purveyor.compare(*self.tags)
15+
return event.medium.purveyor.prime_tag == self.tags[0]
16+
17+
18+
class MonomerMetaLimit(EventFilter):
19+
path: List[str]
20+
21+
def __init__(self, meta_name: str, value: Any):
22+
self.path = meta_name.split('.')
23+
if len(self.path) == 1:
24+
self.path.insert(0, '')
25+
self.value = value
26+
27+
def judge(self, event: EdovesBasicEvent) -> bool:
28+
if self.path[0] == '':
29+
return event.medium.purveyor.__getattribute__(self.path[1]) == self.value
30+
if self.path[0] == 'metadata':
31+
return event.medium.purveyor.metadata.__getitem__(self.path[1]) == self.value
32+
if self.path[0] == 'behavior':
33+
return event.medium.purveyor.behavior.__getitem__(self.path[1]) == self.value

arclet/edoves/builtin/mah/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@
1111
class MAHConfig(TemplateConfig):
1212
protocol: Type[MAHProtocol] = MAHProtocol
1313
server_docker: Type[MAHServerDocker] = MAHServerDocker
14+
modules_path = "./modules/mah"

0 commit comments

Comments
 (0)