支持file字段的Message

This commit is contained in:
Wuyi无疑 2023-03-22 23:15:16 +08:00
parent a337ee3c7b
commit bb341cae07
3 changed files with 103 additions and 25 deletions

View File

@ -8,11 +8,12 @@ from nonebot.internal.adapter import Event
from nonebot import get_driver, on_message, on_fullmatch from nonebot import get_driver, on_message, on_fullmatch
from .client import GsClient from .client import GsClient
from .auto_install import install from .auto_install import start, install
from .models import Message, MessageReceive from .models import Message, MessageReceive
get_message = on_message(priority=999) get_message = on_message(priority=999)
install_core = on_fullmatch('gs一键安装', permission=SUPERUSER, block=True) install_core = on_fullmatch('gs一键安装', permission=SUPERUSER, block=True)
start_core = on_fullmatch('启动core', permission=SUPERUSER, block=True)
connect_core = on_fullmatch( connect_core = on_fullmatch(
('连接core', '链接core'), permission=SUPERUSER, block=True ('连接core', '链接core'), permission=SUPERUSER, block=True
) )
@ -135,11 +136,16 @@ async def send_install_msg(matcher: Matcher):
@connect_core.handle() @connect_core.handle()
async def send_start_msg(matcher: Matcher): async def send_connect_msg(matcher: Matcher):
await connect() await connect()
await matcher.send('链接成功!') await matcher.send('链接成功!')
@start_core.handle()
async def send_start_msg(matcher: Matcher):
await matcher.send(await start())
@driver.on_bot_connect @driver.on_bot_connect
async def start_client(): async def start_client():
if gsclient is None: if gsclient is None:

View File

@ -1,5 +1,7 @@
import os
import base64 import base64
import asyncio import asyncio
from pathlib import Path
from typing import Any, Dict, List, Union, Optional from typing import Any, Dict, List, Union, Optional
import websockets.client import websockets.client
@ -65,6 +67,7 @@ class GsClient:
content = '' content = ''
image: Optional[str] = None image: Optional[str] = None
node = [] node = []
file = ''
if msg.content: if msg.content:
for _c in msg.content: for _c in msg.content:
if _c.data: if _c.data:
@ -77,6 +80,8 @@ class GsClient:
getattr(logger, _type)(_c.data) getattr(logger, _type)(_c.data)
elif _c.type == 'node': elif _c.type == 'node':
node = _c.data node = _c.data
elif _c.type == 'file':
file = _c.data
else: else:
pass pass
@ -88,13 +93,14 @@ class GsClient:
content, content,
image, image,
node, node,
file,
msg.target_id, msg.target_id,
msg.target_type, msg.target_type,
) )
# ntchat # ntchat
elif msg.bot_id == 'ntchat': elif msg.bot_id == 'ntchat':
await ntchat_send( await ntchat_send(
bot, content, image, node, msg.target_id bot, content, image, file, node, msg.target_id
) )
# 频道 # 频道
elif msg.bot_id == 'qqguild': elif msg.bot_id == 'qqguild':
@ -112,6 +118,7 @@ class GsClient:
bot, bot,
content, content,
image, image,
file,
node, node,
msg.target_id, msg.target_id,
) )
@ -120,6 +127,7 @@ class GsClient:
bot, bot,
content, content,
image, image,
file,
node, node,
msg.target_id, msg.target_id,
msg.target_type, msg.target_type,
@ -157,11 +165,23 @@ def to_json(msg: str, name: str, uin: int):
} }
def store_file(path: Path, file: str):
file_content = base64.b64decode(file).decode()
with open(path, 'w') as f:
f.write(file_content)
def del_file(path: Path):
if path.exists():
os.remove(path)
async def onebot_send( async def onebot_send(
bot: Bot, bot: Bot,
content: Optional[str], content: Optional[str],
image: Optional[str], image: Optional[str],
node: Optional[List[Dict]], node: Optional[List[Dict]],
file: Optional[str],
target_id: Optional[str], target_id: Optional[str],
target_type: Optional[str], target_type: Optional[str],
): ):
@ -169,18 +189,39 @@ async def onebot_send(
result_image = f'[CQ:image,file={image}]' if image else '' result_image = f'[CQ:image,file={image}]' if image else ''
content = content if content else '' content = content if content else ''
result_msg = content + result_image result_msg = content + result_image
if target_type == 'group':
await bot.call_api( if file:
'send_group_msg', file_name, file_content = file.split('|')
group_id=target_id, path = Path(__file__).resolve().parent / file_name
message=result_msg, store_file(path, file_content)
) if target_type == 'group':
await bot.call_api(
'upload_group_file',
file=str(path.absolute()),
name=file_name,
group_id=target_id,
)
else:
await bot.call_api(
'upload_private_file',
file=str(path.absolute()),
name=file_name,
user_id=target_id,
)
del_file(path)
else: else:
await bot.call_api( if target_type == 'group':
'send_private_msg', await bot.call_api(
user_id=target_id, 'send_group_msg',
message=result_msg, group_id=target_id,
) message=result_msg,
)
else:
await bot.call_api(
'send_private_msg',
user_id=target_id,
message=result_msg,
)
async def _send_node(messages): async def _send_node(messages):
if target_type == 'group': if target_type == 'group':
@ -259,6 +300,7 @@ async def ntchat_send(
bot: Bot, bot: Bot,
content: Optional[str], content: Optional[str],
image: Optional[str], image: Optional[str],
file: Optional[str],
node: Optional[List[Dict]], node: Optional[List[Dict]],
target_id: Optional[str], target_id: Optional[str],
): ):
@ -275,6 +317,16 @@ async def ntchat_send(
to_wxid=target_id, to_wxid=target_id,
file_path=image, file_path=image,
) )
if file:
file_name, file_content = file.split('|')
path = Path(__file__).resolve().parent / file_name
store_file(path, file_content)
await bot.call_api(
'send_file',
to_wxid=target_id,
file_path=str(path.absolute()),
)
del_file(path)
if node: if node:
for _msg in node: for _msg in node:
@ -290,6 +342,7 @@ async def kaiheila_send(
bot: Bot, bot: Bot,
content: Optional[str], content: Optional[str],
image: Optional[str], image: Optional[str],
file: Optional[str],
node: Optional[List[Dict]], node: Optional[List[Dict]],
target_id: Optional[str], target_id: Optional[str],
target_type: Optional[str], target_type: Optional[str],
@ -302,6 +355,14 @@ async def kaiheila_send(
url = await bot.upload_file(img_bytes, 'GSUID-TEMP') # type:ignore url = await bot.upload_file(img_bytes, 'GSUID-TEMP') # type:ignore
result['type'] = 2 result['type'] = 2
result['content'] = url result['content'] = url
elif file:
file_name, file_content = file.split('|')
path = Path(__file__).resolve().parent / file_name
store_file(path, file_content)
with open(path, 'rb') as f:
doc = f.read()
url = await bot.upload_file(doc, file_name) # type:ignore
result['content'] = url
else: else:
result['content'] = content result['content'] = content
@ -327,6 +388,7 @@ async def telegram_send(
bot: Bot, bot: Bot,
content: Optional[str], content: Optional[str],
image: Optional[str], image: Optional[str],
file: Optional[str],
node: Optional[List[Dict]], node: Optional[List[Dict]],
target_id: Optional[str], target_id: Optional[str],
): ):
@ -337,10 +399,20 @@ async def telegram_send(
result['photo'] = img_bytes result['photo'] = img_bytes
if content: if content:
result['text'] = content result['text'] = content
if file:
file_name, file_content = file.split('|')
path = Path(__file__).resolve().parent / file_name
store_file(path, file_content)
with open(path, 'rb') as f:
doc = f.read()
result['document'] = doc
if content: if content:
await bot.call_api('send_message', chat_id=target_id, **result) await bot.call_api('send_message', chat_id=target_id, **result)
if image: if image:
await bot.call_api('send_photo', chat_id=target_id, **result) await bot.call_api('send_photo', chat_id=target_id, **result)
if file:
await bot.call_api('send_document', chat_id=target_id, **result)
if node: if node:
for _msg in node: for _msg in node:

22
poetry.lock generated
View File

@ -89,19 +89,19 @@ files = [
[[package]] [[package]]
name = "filelock" name = "filelock"
version = "3.9.0" version = "3.10.0"
description = "A platform independent file lock." description = "A platform independent file lock."
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"}, {file = "filelock-3.10.0-py3-none-any.whl", hash = "sha256:e90b34656470756edf8b19656785c5fea73afa1953f3e1b0d645cef11cab3182"},
{file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"}, {file = "filelock-3.10.0.tar.gz", hash = "sha256:3199fd0d3faea8b911be52b663dfccceb84c95949dd13179aa21436d1a79c4ce"},
] ]
[package.extras] [package.extras]
docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"]
testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"] testing = ["covdefaults (>=2.3)", "coverage (>=7.2.1)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"]
[[package]] [[package]]
name = "flake8" name = "flake8"
@ -152,14 +152,14 @@ gitdb = ">=4.0.1,<5"
[[package]] [[package]]
name = "identify" name = "identify"
version = "2.5.20" version = "2.5.21"
description = "File identification library for Python" description = "File identification library for Python"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "identify-2.5.20-py2.py3-none-any.whl", hash = "sha256:5dfef8a745ca4f2c95f27e9db74cb4c8b6d9916383988e8791f3595868f78a33"}, {file = "identify-2.5.21-py2.py3-none-any.whl", hash = "sha256:69edcaffa8e91ae0f77d397af60f148b6b45a8044b2cc6d99cafa5b04793ff00"},
{file = "identify-2.5.20.tar.gz", hash = "sha256:c8b288552bc5f05a08aff09af2f58e6976bf8ac87beb38498a0e3d98ba64eb18"}, {file = "identify-2.5.21.tar.gz", hash = "sha256:7671a05ef9cfaf8ff63b15d45a91a1147a03aaccb2976d4e9bd047cbbc508471"},
] ]
[package.extras] [package.extras]
@ -875,14 +875,14 @@ typing-extensions = ">=3.7.4"
[[package]] [[package]]
name = "virtualenv" name = "virtualenv"
version = "20.20.0" version = "20.21.0"
description = "Virtual Python Environment builder" description = "Virtual Python Environment builder"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "virtualenv-20.20.0-py3-none-any.whl", hash = "sha256:3c22fa5a7c7aa106ced59934d2c20a2ecb7f49b4130b8bf444178a16b880fa45"}, {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"},
{file = "virtualenv-20.20.0.tar.gz", hash = "sha256:a8a4b8ca1e28f864b7514a253f98c1d62b64e31e77325ba279248c65fb4fcef4"}, {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"},
] ]
[package.dependencies] [package.dependencies]