satori-python-adapter-onebot11 0.3.3__tar.gz → 0.4.1__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.3 → satori_python_adapter_onebot11-0.4.1}/.mina/adapter_onebot11.toml +2 -2
  2. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/PKG-INFO +9 -9
  3. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/README.md +7 -7
  4. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/pyproject.toml +2 -2
  5. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/api.py +39 -21
  6. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/events/message.py +9 -4
  7. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/events/notice.py +25 -12
  8. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/message.py +9 -2
  9. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/LICENSE +0 -0
  10. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/__init__.py +0 -0
  11. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/events/__init__.py +0 -0
  12. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/events/base.py +0 -0
  13. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/events/request.py +0 -0
  14. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/forward.py +0 -0
  15. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/reverse.py +0 -0
  16. {satori_python_adapter_onebot11-0.3.3 → satori_python_adapter_onebot11-0.4.1}/src/satori/adapters/onebot11/utils.py +0 -0
@@ -1,9 +1,9 @@
1
1
  includes = ["src/satori/adapters/onebot11"]
2
- raw-dependencies = ["satori-python-server >= 0.18.0"]
2
+ raw-dependencies = ["satori-python-server<1.4.0,>= 1.3.0"]
3
3
 
4
4
  [project]
5
5
  name = "satori-python-adapter-onebot11"
6
- version = "0.3.3"
6
+ version = "0.4.1"
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.3
3
+ Version: 0.4.1
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>
@@ -17,7 +17,7 @@ Classifier: Operating System :: OS Independent
17
17
  Project-URL: Homepage, https://github.com/RF-Tar-Railt/satori-python
18
18
  Project-URL: Repository, https://github.com/RF-Tar-Railt/satori-python
19
19
  Requires-Python: <4.0,>=3.10
20
- Requires-Dist: satori-python-server>=0.18.0
20
+ Requires-Dist: satori-python-server<1.4.0,>=1.3.0
21
21
  Description-Content-Type: text/markdown
22
22
 
23
23
  # satori-python
@@ -70,13 +70,13 @@ pip install satori-python-server
70
70
 
71
71
  ### 官方适配器
72
72
 
73
- | 适配器 | 安装 | 路径 |
74
- |------------|----------------------------------------------|--------------------------------------------------------------------|
75
- | Satori | `pip install satori-python-adapter-satori` | satori.adapters.satori |
76
- | OneBot V11 | `pip install satori-python-adapter-onebot11` | satori.adapters.onebot11.forward, satori.adapters.onebot11.reverse |
77
- | Console | `pip install satori-python-adapter-console` | satori.adapters.console |
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.qq.main, satori.adapters.qq.websocket |
73
+ | 适配器 | 安装 | 路径 |
74
+ |------------|----------------------------------------------|--------------------------------------------------------------------------------------|
75
+ | Satori | `pip install satori-python-adapter-satori` | satori.adapters.satori |
76
+ | OneBot V11 | `pip install satori-python-adapter-onebot11` | satori.adapters.onebot11.forward, satori.adapters.onebot11.reverse |
77
+ | Console | `pip install satori-python-adapter-console` | satori.adapters.console |
78
+ | Milky | `pip install satori-python-adapter-milky` | satori.adapters.milky.main, satori.adapters.milky.webhook, satori.adapters.milky.sse |
79
+ | QQ | `pip install satori-python-adapter-qq` | satori.adapters.qq.main, satori.adapters.qq.websocket |
80
80
 
81
81
  ### 社区适配器
82
82
 
@@ -48,13 +48,13 @@ pip install satori-python-server
48
48
 
49
49
  ### 官方适配器
50
50
 
51
- | 适配器 | 安装 | 路径 |
52
- |------------|----------------------------------------------|--------------------------------------------------------------------|
53
- | Satori | `pip install satori-python-adapter-satori` | satori.adapters.satori |
54
- | OneBot V11 | `pip install satori-python-adapter-onebot11` | satori.adapters.onebot11.forward, satori.adapters.onebot11.reverse |
55
- | Console | `pip install satori-python-adapter-console` | satori.adapters.console |
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.qq.main, satori.adapters.qq.websocket |
51
+ | 适配器 | 安装 | 路径 |
52
+ |------------|----------------------------------------------|--------------------------------------------------------------------------------------|
53
+ | Satori | `pip install satori-python-adapter-satori` | satori.adapters.satori |
54
+ | OneBot V11 | `pip install satori-python-adapter-onebot11` | satori.adapters.onebot11.forward, satori.adapters.onebot11.reverse |
55
+ | Console | `pip install satori-python-adapter-console` | satori.adapters.console |
56
+ | Milky | `pip install satori-python-adapter-milky` | satori.adapters.milky.main, satori.adapters.milky.webhook, satori.adapters.milky.sse |
57
+ | QQ | `pip install satori-python-adapter-qq` | satori.adapters.qq.main, satori.adapters.qq.websocket |
58
58
 
59
59
  ### 社区适配器
60
60
 
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "satori-python-adapter-onebot11"
3
- version = "0.3.3"
3
+ version = "0.4.1"
4
4
  authors = [
5
5
  { name = "RF-Tar-Railt", email = "rf_tar_railt@qq.com" },
6
6
  ]
7
7
  dependencies = [
8
- "satori-python-server >= 0.18.0",
8
+ "satori-python-server<1.4.0,>= 1.3.0",
9
9
  ]
10
10
  description = "Satori Protocol SDK for python, adapter for OneBot 11"
11
11
  readme = "README.md"
@@ -5,13 +5,13 @@ from satori import Api
5
5
  from satori.model import (
6
6
  Channel,
7
7
  ChannelType,
8
+ Friend,
8
9
  Guild,
9
10
  Login,
10
11
  Member,
11
12
  MessageObject,
12
13
  PageDequeResult,
13
14
  PageResult,
14
- Role,
15
15
  User,
16
16
  )
17
17
  from satori.server import Adapter, Request
@@ -35,11 +35,11 @@ from satori.server.route import (
35
35
  ReactionCreateParam,
36
36
  ReactionDeleteParam,
37
37
  UserChannelCreateParam,
38
- UserGetParam,
38
+ UserOpParam,
39
39
  )
40
40
 
41
41
  from .message import OneBot11MessageEncoder, decode
42
- from .utils import GROUP_AVATAR_URL, USER_AVATAR_URL, OneBotNetwork
42
+ from .utils import GROUP_AVATAR_URL, ROLE_MAPPING, USER_AVATAR_URL, OneBotNetwork
43
43
 
44
44
 
45
45
  def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_getter: Callable[[str], Login]):
@@ -355,7 +355,7 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
355
355
  {
356
356
  "group_id": int(request.params["guild_id"]),
357
357
  "user_id": int(request.params["user_id"]),
358
- "enable": request.params["role_id"] == "ADMINISTRATOR",
358
+ "enable": request.params["role_id"] == "admin",
359
359
  },
360
360
  )
361
361
  return
@@ -368,17 +368,17 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
368
368
  {
369
369
  "group_id": int(request.params["guild_id"]),
370
370
  "user_id": int(request.params["user_id"]),
371
- "enable": request.params["role_id"] != "ADMINISTRATOR",
371
+ "enable": request.params["role_id"] != "admin",
372
372
  },
373
373
  )
374
374
  return
375
375
 
376
376
  @adapter.route(Api.GUILD_ROLE_LIST)
377
377
  async def guild_role_list(request: Request[GuildXXXListParam]):
378
- return PageResult([Role("ADMINISTRATOR", "admin"), Role("MEMBER", "member"), Role("OWNER", "owner")])
378
+ return PageResult(list(ROLE_MAPPING.values()))
379
379
 
380
380
  @adapter.route(Api.USER_GET)
381
- async def user_get(request: Request[UserGetParam]):
381
+ async def user_get(request: Request[UserOpParam]):
382
382
  net = net_getter(request.self_id)
383
383
  result = await net.call_api("get_stranger_info", {"user_id": int(request.params["user_id"])})
384
384
  if not result:
@@ -396,11 +396,13 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
396
396
  result: list[dict] = await net.call_api("get_friend_list", {}) # type: ignore
397
397
  return PageResult(
398
398
  [
399
- User(
400
- str(item["user_id"]),
401
- item["nickname"],
399
+ Friend(
400
+ User(
401
+ str(item["user_id"]),
402
+ item["nickname"],
403
+ USER_AVATAR_URL.format(uin=item["user_id"]),
404
+ ),
402
405
  item.get("remark"),
403
- USER_AVATAR_URL.format(uin=item["user_id"]),
404
406
  )
405
407
  for item in result
406
408
  ]
@@ -457,7 +459,7 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
457
459
  "set_msg_emoji_like",
458
460
  {
459
461
  "message_id": int(request.params["message_id"]),
460
- "emoji": request.params["emoji"],
462
+ "emoji": request.params["emoji_id"],
461
463
  },
462
464
  )
463
465
  elif app_name == "Lagrange.OneBot" and not channel_id.startswith("private:"):
@@ -466,7 +468,7 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
466
468
  {
467
469
  "group_id": int(channel_id),
468
470
  "message_id": int(request.params["message_id"]),
469
- "code": request.params["emoji"],
471
+ "code": request.params["emoji_id"],
470
472
  "is_add": True,
471
473
  },
472
474
  )
@@ -475,18 +477,26 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
475
477
  "set_msg_emoji_like",
476
478
  {
477
479
  "message_id": int(request.params["message_id"]),
478
- "emoji_id": request.params["emoji"],
480
+ "emoji_id": request.params["emoji_id"],
479
481
  "set": True,
480
482
  },
481
483
  )
482
484
  elif app_name == "ws-plugin" and not channel_id.startswith("private:"):
483
- emj_type = 1 if int(request.params["emoji"]) < 5000 else 2
485
+ emoji_id = request.params["emoji_id"]
486
+ if ":" in emoji_id:
487
+ # custom emoji, format: {type}:{id}
488
+ emj_type_str, emj_id_str = emoji_id.split(":", 1)
489
+ emj_type = int(emj_type_str)
490
+ emj_id = int(emj_id_str)
491
+ else:
492
+ emj_id = int(emoji_id)
493
+ emj_type = 1 if emj_id < 5000 else 2
484
494
  await net.call_api(
485
495
  "set_reaction",
486
496
  {
487
497
  "group_id": int(channel_id),
488
498
  "message_seq": int(request.params["message_id"]),
489
- "code": request.params["emoji"],
499
+ "code": emj_id,
490
500
  "is_add": True,
491
501
  "type": emj_type,
492
502
  },
@@ -504,7 +514,7 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
504
514
  "unset_msg_emoji_like",
505
515
  {
506
516
  "message_id": int(request.params["message_id"]),
507
- "emoji": request.params["emoji"],
517
+ "emoji": request.params["emoji_id"],
508
518
  },
509
519
  )
510
520
  elif app_name == "Lagrange.OneBot" and not channel_id.startswith("private:"):
@@ -513,7 +523,7 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
513
523
  {
514
524
  "group_id": int(channel_id),
515
525
  "message_id": int(request.params["message_id"]),
516
- "code": request.params["emoji"],
526
+ "code": request.params["emoji_id"],
517
527
  "is_add": False,
518
528
  },
519
529
  )
@@ -522,18 +532,26 @@ def apply(adapter: Adapter, net_getter: Callable[[str], OneBotNetwork], login_ge
522
532
  "set_msg_emoji_like",
523
533
  {
524
534
  "message_id": int(request.params["message_id"]),
525
- "emoji": request.params["emoji"],
535
+ "emoji": request.params["emoji_id"],
526
536
  "set": False,
527
537
  },
528
538
  )
529
539
  elif app_name == "ws-plugin" and not channel_id.startswith("private:"):
530
- emj_type = 1 if int(request.params["emoji"]) < 5000 else 2
540
+ emoji_id = request.params["emoji_id"]
541
+ if ":" in emoji_id:
542
+ # custom emoji, format: {type}:{id}
543
+ emj_type_str, emj_id_str = emoji_id.split(":", 1)
544
+ emj_type = int(emj_type_str)
545
+ emj_id = int(emj_id_str)
546
+ else:
547
+ emj_id = int(emoji_id)
548
+ emj_type = 1 if emj_id < 5000 else 2
531
549
  await net.call_api(
532
550
  "set_reaction",
533
551
  {
534
552
  "group_id": int(channel_id),
535
553
  "message_seq": int(request.params["message_id"]),
536
- "code": request.params["emoji"],
554
+ "code": emj_id,
537
555
  "is_add": False,
538
556
  "type": emj_type,
539
557
  },
@@ -80,7 +80,9 @@ async def group(login: Login, net: OneBotNetwork, raw: dict):
80
80
  member_info = await net.call_api(
81
81
  "get_group_member_info", {"group_id": raw["group_id"], "user_id": sender["user_id"]}
82
82
  )
83
- member = Member(user, member_info["card"], USER_AVATAR_URL.format(uin=sender["user_id"]))
83
+ member = Member(
84
+ user, member_info["card"], USER_AVATAR_URL.format(uin=sender["user_id"]), roles=[ROLE_MAPPING[sender["role"]]]
85
+ )
84
86
  guild = Guild(
85
87
  str(raw["group_id"]), group_info.get("group_name"), avatar=GROUP_AVATAR_URL.format(group=raw["group_id"])
86
88
  )
@@ -93,7 +95,6 @@ async def group(login: Login, net: OneBotNetwork, raw: dict):
93
95
  guild=guild,
94
96
  channel=channel,
95
97
  member=member,
96
- role=ROLE_MAPPING[sender["role"]],
97
98
  message=MessageObject(str(raw["message_id"]), await decode(raw["message"], net)),
98
99
  )
99
100
 
@@ -111,7 +112,12 @@ async def group_message_recall(login: Login, net: OneBotNetwork, raw: dict):
111
112
  member_info.get("card"),
112
113
  USER_AVATAR_URL.format(uin=raw["user_id"]),
113
114
  )
114
- member = Member(user, member_info.get("card"), USER_AVATAR_URL.format(uin=raw["user_id"]))
115
+ member = Member(
116
+ user,
117
+ member_info.get("card"),
118
+ USER_AVATAR_URL.format(uin=raw["user_id"]),
119
+ roles=[ROLE_MAPPING[member_info["role"]]],
120
+ )
115
121
  guild = Guild(
116
122
  str(raw["group_id"]), group_info.get("group_name"), avatar=GROUP_AVATAR_URL.format(group=raw["group_id"])
117
123
  )
@@ -131,6 +137,5 @@ async def group_message_recall(login: Login, net: OneBotNetwork, raw: dict):
131
137
  channel=channel,
132
138
  member=member,
133
139
  operator=operator,
134
- role=ROLE_MAPPING[member_info["role"]],
135
140
  message=MessageObject(str(raw["message_id"]), ""),
136
141
  )
@@ -179,8 +179,12 @@ async def group_admin_set(login: Login, net: OneBotNetwork, raw: dict):
179
179
  )
180
180
  channel = Channel(str(raw["group_id"]), ChannelType.TEXT, group_info.get("group_name"))
181
181
  user = User(str(raw["user_id"]), member_info["nickname"], avatar=USER_AVATAR_URL.format(uin=raw["user_id"]))
182
- member = Member(user, member_info.get("card"), avatar=USER_AVATAR_URL.format(uin=raw["user_id"]))
183
- role = Role("ADMINISTRATOR", "管理员")
182
+ member = Member(
183
+ user,
184
+ member_info.get("card"),
185
+ avatar=USER_AVATAR_URL.format(uin=raw["user_id"]),
186
+ roles=[Role("ADMINISTRATOR", "管理员")],
187
+ )
184
188
  return Event(
185
189
  EventType.GUILD_MEMBER_UPDATED,
186
190
  datetime.now(),
@@ -189,7 +193,6 @@ async def group_admin_set(login: Login, net: OneBotNetwork, raw: dict):
189
193
  member=member,
190
194
  guild=guild,
191
195
  channel=channel,
192
- role=role,
193
196
  )
194
197
 
195
198
 
@@ -202,8 +205,12 @@ async def group_admin_unset(login: Login, net: OneBotNetwork, raw: dict):
202
205
  )
203
206
  channel = Channel(str(raw["group_id"]), ChannelType.TEXT, group_info.get("group_name"))
204
207
  user = User(str(raw["user_id"]), member_info["nickname"], avatar=USER_AVATAR_URL.format(uin=raw["user_id"]))
205
- member = Member(user, member_info.get("card"), avatar=USER_AVATAR_URL.format(uin=raw["user_id"]))
206
- role = Role("MEMBER", "群成员")
208
+ member = Member(
209
+ user,
210
+ member_info.get("card"),
211
+ avatar=USER_AVATAR_URL.format(uin=raw["user_id"]),
212
+ roles=[Role("MEMBER", "群成员")],
213
+ )
207
214
  return Event(
208
215
  EventType.GUILD_MEMBER_UPDATED,
209
216
  datetime.now(),
@@ -212,7 +219,6 @@ async def group_admin_unset(login: Login, net: OneBotNetwork, raw: dict):
212
219
  member=member,
213
220
  guild=guild,
214
221
  channel=channel,
215
- role=role,
216
222
  )
217
223
 
218
224
 
@@ -267,7 +273,10 @@ async def member_kick_me(login: Login, net: OneBotNetwork, raw: dict):
267
273
  "get_group_member_info", {"group_id": raw["group_id"], "user_id": raw["operator_id"]}
268
274
  )
269
275
  member = Member(
270
- login.user, member_info.get("card", member_info["nickname"]), USER_AVATAR_URL.format(uin=raw["user_id"])
276
+ login.user,
277
+ member_info.get("card", member_info["nickname"]),
278
+ USER_AVATAR_URL.format(uin=raw["user_id"]),
279
+ roles=[ROLE_MAPPING[member_info["role"]]],
271
280
  )
272
281
  guild = Guild(
273
282
  str(raw["group_id"]), group_info.get("group_name"), avatar=GROUP_AVATAR_URL.format(group=raw["group_id"])
@@ -288,7 +297,6 @@ async def member_kick_me(login: Login, net: OneBotNetwork, raw: dict):
288
297
  guild=guild,
289
298
  channel=channel,
290
299
  operator=operator,
291
- role=ROLE_MAPPING[member_info["role"]],
292
300
  )
293
301
 
294
302
 
@@ -303,10 +311,11 @@ async def group_increase(login: Login, net: OneBotNetwork, raw: dict):
303
311
  datetime.now(),
304
312
  login=login,
305
313
  user=login.user,
306
- member=Member(login.user, avatar=USER_AVATAR_URL.format(uin=login.user.id)),
314
+ member=Member(
315
+ login.user, avatar=USER_AVATAR_URL.format(uin=login.user.id), roles=[Role("MEMBER", "群成员")]
316
+ ),
307
317
  guild=guild,
308
318
  channel=channel,
309
- role=Role("MEMBER", "群成员"),
310
319
  )
311
320
  group_info = await net.call_api("get_group_info", {"group_id": raw["group_id"]})
312
321
  member_info = await net.call_api("get_group_member_info", {"group_id": raw["group_id"], "user_id": raw["user_id"]})
@@ -319,7 +328,12 @@ async def group_increase(login: Login, net: OneBotNetwork, raw: dict):
319
328
  member_info.get("card"),
320
329
  USER_AVATAR_URL.format(uin=raw["user_id"]),
321
330
  )
322
- member = Member(user, member_info.get("card"), USER_AVATAR_URL.format(uin=raw["user_id"]))
331
+ member = Member(
332
+ user,
333
+ member_info.get("card"),
334
+ USER_AVATAR_URL.format(uin=raw["user_id"]),
335
+ roles=[ROLE_MAPPING[member_info["role"]]],
336
+ )
323
337
  guild = Guild(
324
338
  str(raw["group_id"]), group_info.get("group_name"), avatar=GROUP_AVATAR_URL.format(group=raw["group_id"])
325
339
  )
@@ -339,7 +353,6 @@ async def group_increase(login: Login, net: OneBotNetwork, raw: dict):
339
353
  guild=guild,
340
354
  channel=channel,
341
355
  operator=operator,
342
- role=Role("MEMBER", "群成员"),
343
356
  )
344
357
 
345
358
 
@@ -226,8 +226,13 @@ class OneBot11MessageEncoder:
226
226
  case "sharp":
227
227
  if "id" in attrs:
228
228
  self.children.append({"type": "text", "data": {"text": attrs["id"]}})
229
- case "onebot:face":
230
- self.children.append({"type": "face", "data": {"id": int(attrs["id"])}})
229
+ case "onebot:face" | "emoji":
230
+ if ":" in attrs["id"]:
231
+ _, emj_id_str = attrs["id"].split(":", 1)
232
+ emj_id = int(emj_id_str)
233
+ else:
234
+ emj_id = int(attrs["id"])
235
+ self.children.append({"type": "face", "data": {"id": emj_id}})
231
236
  case "a":
232
237
  await self.render(_children)
233
238
  if "href" in attrs:
@@ -317,6 +322,8 @@ async def _decode(content: list[MessageSegment], net: OneBotNetwork) -> list[Ele
317
322
  result.append(E.at_all())
318
323
  else:
319
324
  result.append(E.at(str(qq), name=seg_data.get("name")))
325
+ case "face":
326
+ result.append(E.emoji(str(seg_data["id"])))
320
327
  case "image":
321
328
  result.append(E.image(seg_data.get("url") or seg_data.get("file")))
322
329
  case "record":