satori-python-adapter-onebot11 0.3.0__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (16) hide show
  1. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/.mina/adapter_onebot11.toml +1 -1
  2. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/PKG-INFO +2 -2
  3. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/README.md +1 -1
  4. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/pyproject.toml +1 -1
  5. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/api.py +12 -12
  6. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/events/notice.py +19 -10
  7. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/forward.py +8 -1
  8. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/reverse.py +17 -5
  9. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/LICENSE +0 -0
  10. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/__init__.py +0 -0
  11. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/events/__init__.py +0 -0
  12. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/events/base.py +0 -0
  13. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/events/message.py +0 -0
  14. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/events/request.py +0 -0
  15. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/message.py +0 -0
  16. {satori_python_adapter_onebot11-0.3.0 → satori_python_adapter_onebot11-0.3.2}/src/satori/adapters/onebot11/utils.py +0 -0
@@ -3,7 +3,7 @@ raw-dependencies = ["satori-python-server >= 0.18.0"]
3
3
 
4
4
  [project]
5
5
  name = "satori-python-adapter-onebot11"
6
- version = "0.3.0"
6
+ version = "0.3.2"
7
7
  authors = [
8
8
  {name = "RF-Tar-Railt", email = "rf_tar_railt@qq.com"}
9
9
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: satori-python-adapter-onebot11
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Satori Protocol SDK for python, adapter for OneBot 11
5
5
  Home-page: https://github.com/RF-Tar-Railt/satori-python
6
6
  Author-Email: RF-Tar-Railt <rf_tar_railt@qq.com>
@@ -76,7 +76,7 @@ pip install satori-python-server
76
76
  | OneBot V11 | `pip install satori-python-adapter-onebot11` | satori.adapters.onebot11.forward, satori.adapters.onebot11.reverse |
77
77
  | Console | `pip install satori-python-adapter-console` | satori.adapters.console |
78
78
  | Milky | `pip install satori-python-adapter-milky` | satori.adapters.milky.main, satori.adapters.milky.webhook |
79
- | QQ | `pip install satori-python-adapter-qq` | satori.adapters.milky.main, satori.adapters.milky.websocket |
79
+ | QQ | `pip install satori-python-adapter-qq` | satori.adapters.qq.main, satori.adapters.qq.websocket |
80
80
 
81
81
  ### 社区适配器
82
82
 
@@ -54,7 +54,7 @@ pip install satori-python-server
54
54
  | OneBot V11 | `pip install satori-python-adapter-onebot11` | satori.adapters.onebot11.forward, satori.adapters.onebot11.reverse |
55
55
  | Console | `pip install satori-python-adapter-console` | satori.adapters.console |
56
56
  | Milky | `pip install satori-python-adapter-milky` | satori.adapters.milky.main, satori.adapters.milky.webhook |
57
- | QQ | `pip install satori-python-adapter-qq` | satori.adapters.milky.main, satori.adapters.milky.websocket |
57
+ | QQ | `pip install satori-python-adapter-qq` | satori.adapters.qq.main, satori.adapters.qq.websocket |
58
58
 
59
59
  ### 社区适配器
60
60
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "satori-python-adapter-onebot11"
3
- version = "0.3.0"
3
+ version = "0.3.2"
4
4
  authors = [
5
5
  { name = "RF-Tar-Railt", email = "rf_tar_railt@qq.com" },
6
6
  ]
@@ -223,18 +223,18 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
223
223
  @adapter.route(Api.CHANNEL_LIST)
224
224
  async def channel_list(request: Request[ChannelListParam]):
225
225
  net = net_getter(request.self_id)
226
- result: list[dict] = await net.call_api("get_group_list", {}) # type: ignore
227
- return PageResult(
228
- [
229
- Channel(
230
- str(item["group_id"]),
231
- ChannelType.TEXT,
232
- item["group_name"],
233
- GROUP_AVATAR_URL.format(group=item["group_id"]),
234
- )
235
- for item in result
236
- ]
237
- )
226
+ result = await net.call_api("get_group_info", {"group_id": int(request.params["guild_id"])})
227
+ if not result:
228
+ raise RuntimeError(f"Failed to get group {request.params['guild_id']}")
229
+ channels = [
230
+ Channel(
231
+ str(result["group_id"]),
232
+ ChannelType.TEXT,
233
+ result["group_name"],
234
+ GROUP_AVATAR_URL.format(group=result["group_id"]),
235
+ )
236
+ ]
237
+ return PageResult(channels)
238
238
 
239
239
  @adapter.route(Api.GUILD_LIST)
240
240
  async def guild_list(request: Request[GuildListParam]):
@@ -89,16 +89,6 @@
89
89
  # scene=group,
90
90
  # )
91
91
  #
92
- # @m.entity(OneBot11Capability.event_callback, raw_event="notice.friend_add")
93
- # async def friend_add(self, raw_event: dict):
94
- # self_id = raw_event["self_id"]
95
- # account = self.connection.accounts.get(self_id)
96
- # if account is None:
97
- # logger.warning(f"Unknown account {self_id} received message {raw_event}")
98
- # return
99
- # friend = Selector().land("qq").friend(str(raw_event["user_id"]))
100
- # context = Context(account, friend, friend, friend, account.route)
101
- # return DirectSessionCreated(context)
102
92
  #
103
93
  # @m.entity(OneBot11Capability.event_callback, raw_event="notice.notify.poke")
104
94
  # async def nudge_received(self, raw_event: dict):
@@ -351,3 +341,22 @@ async def group_increase(login: Login, net: OneBotNetwork, raw: dict):
351
341
  operator=operator,
352
342
  role=Role("MEMBER", "群成员"),
353
343
  )
344
+
345
+
346
+ @register_event("notice.friend_add")
347
+ async def friend_add(login: Login, net: OneBotNetwork, raw: dict):
348
+ user_info = await net.call_api("get_stranger_info", {"user_id": raw["user_id"]})
349
+ user = User(
350
+ str(raw["user_id"]),
351
+ user_info["nickname"],
352
+ user_info.get("card"),
353
+ USER_AVATAR_URL.format(uin=raw["user_id"]),
354
+ )
355
+ channel = Channel(f"private:{raw['user_id']}", ChannelType.DIRECT, user_info["nickname"])
356
+ return Event(
357
+ EventType.FRIEND_ADDED,
358
+ datetime.now(),
359
+ login=login,
360
+ user=user,
361
+ channel=channel,
362
+ )
@@ -34,9 +34,11 @@ class OneBot11ForwardAdapter(BaseAdapter):
34
34
  self,
35
35
  endpoint: str | URL,
36
36
  access_token: str | None = None,
37
+ timeout: float = 60,
37
38
  ):
38
39
  super().__init__()
39
40
  self.endpoint = URL(endpoint)
41
+ self.timeout = timeout
40
42
  self.access_token = access_token
41
43
  self.close_signal = asyncio.Event()
42
44
  self.response_waiters: dict[str, asyncio.Future] = {}
@@ -154,6 +156,7 @@ class OneBot11ForwardAdapter(BaseAdapter):
154
156
  if (access_token := self.access_token) is not None
155
157
  else None
156
158
  ),
159
+ timeout=self.timeout,
157
160
  )
158
161
  try:
159
162
  self.connection = await ctx.__aenter__()
@@ -187,6 +190,8 @@ class OneBot11ForwardAdapter(BaseAdapter):
187
190
  for login in self.logins.values():
188
191
  login.status = LoginStatus.OFFLINE
189
192
  await self.server.post(Event(EventType.LOGIN_REMOVED, datetime.now(), login))
193
+ for fut in self.response_waiters.values():
194
+ fut.cancel()
190
195
  await asyncio.sleep(1)
191
196
  return
192
197
  if close_task in done:
@@ -195,6 +200,8 @@ class OneBot11ForwardAdapter(BaseAdapter):
195
200
  for login in self.logins.values():
196
201
  login.status = LoginStatus.RECONNECT
197
202
  await self.server.post(Event(EventType.LOGIN_UPDATED, datetime.now(), login))
203
+ for fut in self.response_waiters.values():
204
+ fut.cancel()
198
205
  await asyncio.sleep(5)
199
206
  logger.info(f"{self} Reconnecting...")
200
207
  continue
@@ -229,7 +236,7 @@ class OneBot11ForwardAdapter(BaseAdapter):
229
236
 
230
237
  try:
231
238
  await self.connection.send_str(encode({"action": action, "params": params or {}, "echo": echo}))
232
- result = await future
239
+ result = await asyncio.wait_for(future, timeout=self.timeout)
233
240
  finally:
234
241
  del self.response_waiters[echo]
235
242
 
@@ -31,10 +31,17 @@ class _Connection:
31
31
  self.response_waiters: dict[str, asyncio.Future] = {}
32
32
 
33
33
  async def message_receive(self):
34
- async for msg in self.ws.iter_text():
35
- yield self, decode(msg)
36
- else:
37
- self.close_signal.set()
34
+
35
+ while True:
36
+ message = await self.ws.receive()
37
+
38
+ if message["type"] == "websocket.disconnect":
39
+ break
40
+ yield self, decode(message["text"])
41
+ # async for msg in self.ws.iter_text():
42
+ # yield self, decode(msg)
43
+ # else:
44
+ self.close_signal.set()
38
45
 
39
46
  async def message_handle(self):
40
47
  async for connection, data in self.message_receive():
@@ -116,7 +123,7 @@ class _Connection:
116
123
 
117
124
  try:
118
125
  await self.ws.send_text(encode({"action": action, "params": params or {}, "echo": echo}))
119
- result = await future
126
+ result = await asyncio.wait_for(future, timeout=self.adapter.timeout)
120
127
  finally:
121
128
  del self.response_waiters[echo]
122
129
 
@@ -134,12 +141,14 @@ class OneBot11ReverseAdapter(BaseAdapter):
134
141
  path: str = "onebot/v11",
135
142
  endpoint: str = "ws",
136
143
  access_token: str | None = None,
144
+ timeout: int = 60,
137
145
  ):
138
146
  super().__init__()
139
147
  self.endpoint = URL(prefix) / path / endpoint
140
148
  self.access_token = access_token
141
149
  self.logins: dict[str, Login] = {}
142
150
  self.connections: dict[str, _Connection] = {}
151
+ self.timeout = timeout
143
152
 
144
153
  apply(self, lambda _: self.connections[_], lambda _: self.logins[_])
145
154
 
@@ -180,6 +189,9 @@ class OneBot11ReverseAdapter(BaseAdapter):
180
189
  finally:
181
190
  del self.connections[account_id]
182
191
  logger.info(f"Websocket {ws} closed")
192
+ if connection.response_waiters:
193
+ for future in connection.response_waiters.values():
194
+ future.cancel()
183
195
  self.logins[account_id].status = LoginStatus.OFFLINE
184
196
  await self.server.post(Event(EventType.LOGIN_REMOVED, datetime.now(), self.logins[account_id]))
185
197
  await asyncio.sleep(1)