Skip to content

Commit

Permalink
Merge pull request #86 from AmiyaBot/dev
Browse files Browse the repository at this point in the history
update 完善群bot适配器
  • Loading branch information
vivien8261 authored Jan 10, 2024
2 parents 62719d5 + 4a43bd7 commit df92f24
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 8 deletions.
2 changes: 1 addition & 1 deletion amiyabot/adapters/tencent/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class TencentSandboxBotInstance(QQGuildSandboxBotInstance):
'"{name}" is deprecated and will be removed in future versions. '
'Please using "from amiyabot.adapters.tencent.qqGuild import {new_name}"'
)
print('\n==== Warning ===============================================')
print('\n==== AmiyaBot Warning ======================================')
print(notice.format(name=TencentBotInstance.__name__, new_name=QQGuildBotInstance.__name__))
print(notice.format(name=TencentSandboxBotInstance.__name__, new_name=QQGuildSandboxBotInstance.__name__))
print('============================================================\n')
19 changes: 16 additions & 3 deletions amiyabot/adapters/tencent/qqGroup/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@
from amiyabot.adapters.tencent.qqGuild import QQGuildBotInstance

from .api import QQGroupAPI, log
from .builder import QQGroupMessageCallback, QQGroupChainBuilder, QQGroupChainBuilderOptions, build_message_send
from .builder import (
QQGroupMessageCallback,
QQGroupChainBuilder,
QQGroupChainBuilderOptions,
SeqService,
build_message_send,
)
from .package import package_qq_group_message
from ... import HANDLER_TYPE

Expand All @@ -32,6 +38,7 @@ def __init__(self, appid: str, token: str, client_secret: str, default_chain_bui

self.__access_token_api = QQGroupAPI(self.appid, self.token, client_secret)
self.__default_chain_builder = default_chain_builder
self.__seq_service = SeqService()

def __str__(self):
return 'QQGroup'
Expand All @@ -48,13 +55,19 @@ async def start(self, private: bool, handler: HANDLER_TYPE):
if hasattr(self.__default_chain_builder, 'start'):
self.__default_chain_builder.start()

asyncio.create_task(self.__seq_service.run())

await super().start(private, handler)

async def close(self):
await self.__seq_service.stop()
await super().close()

async def send_chain_message(self, chain: Chain, is_sync: bool = False):
if chain.use_default_builder:
if not isinstance(chain.builder, QQGroupChainBuilder):
chain.builder = self.__default_chain_builder

payloads = await build_message_send(self.api, chain)
payloads = await build_message_send(self.api, chain, self.__seq_service)
res = []

for payload in payloads:
Expand Down
31 changes: 27 additions & 4 deletions amiyabot/adapters/tencent/qqGroup/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,28 @@
from .api import QQGroupAPI, log


class SeqService:
def __init__(self):
self.seq_rec = {}
self.alive = True

def msg_req(self, msg_id: str):
if msg_id not in self.seq_rec:
self.seq_rec[msg_id] = {'last': time.time(), 'seq': 0}

self.seq_rec[msg_id]['seq'] += 1

return self.seq_rec[msg_id]['seq']

async def run(self):
while self.alive:
await asyncio.sleep(1)
self.seq_rec = {m_id: item for m_id, item in self.seq_rec.items() if time.time() - item['last'] < 30}

async def stop(self):
self.alive = False


@dataclass
class GroupPayload:
content: str = ''
Expand Down Expand Up @@ -104,11 +126,12 @@ async def get_message(self):
...


async def build_message_send(api: QQGroupAPI, chain: Chain, custom_chain: Optional[CHAIN_LIST] = None):
chain_list = custom_chain or chain.chain
async def build_message_send(api: QQGroupAPI, chain: Chain, seq_service: SeqService):
chain_list = chain.chain
msg_id = chain.data.message_id

payload_list: List[GroupPayload] = []
payload = GroupPayload(msg_id=chain.data.message_id)
payload = GroupPayload(msg_id=msg_id, msg_seq=seq_service.msg_req(msg_id))

async def insert_media(url: str, file_type: int = 1):
nonlocal payload
Expand All @@ -127,7 +150,7 @@ async def insert_media(url: str, file_type: int = 1):
payload.media = {'file_info': file_info}

payload_list.append(payload)
payload = GroupPayload(msg_id=chain.data.message_id)
payload = GroupPayload(msg_id=msg_id, msg_seq=seq_service.msg_req(msg_id))
else:
log.warning('file upload fail.')

Expand Down
5 changes: 5 additions & 0 deletions amiyabot/adapters/tencent/qqGroup/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ async def package_qq_group_message(instance: BotAdapterProtocol, event: str, mes
data.channel_openid = message['group_openid']
data.message_id = message['id']

if 'attachments' in message:
for item in message['attachments']:
if item['content_type'].startswith('image'):
data.image.append(item['url'])

if 'content' in message:
data = text_convert(data, message['content'].strip(), message['content'])

Expand Down

0 comments on commit df92f24

Please sign in to comment.