2. 支持临时使用其他语言模型回复(如 /bing hello) #79 perf: 😊1. 优化代码结构,降低耦合度 2. 启动前检查依赖库安装情况 fix: 🤔修复bing模型死锁(正忙)的问题
63 lines
3.2 KiB
Python
63 lines
3.2 KiB
Python
import io
|
||
import botpy
|
||
from PIL import Image
|
||
import re
|
||
import asyncio
|
||
import requests
|
||
from cores.qqbot.personality import personalities
|
||
|
||
|
||
class QQChan():
|
||
|
||
def run_bot(self, botclient, appid, token):
|
||
intents = botpy.Intents(public_guild_messages=True, direct_message=True)
|
||
self.client = botclient
|
||
self.client.run(appid=appid, token=token)
|
||
|
||
def send_qq_msg(self, message, res, image_mode=False, msg_ref = None):
|
||
print("[System-Info] 回复QQ频道消息中..."+res)
|
||
if not image_mode:
|
||
try:
|
||
if msg_ref is not None:
|
||
reply_res = asyncio.run_coroutine_threadsafe(message.reply(content=res, message_reference = msg_ref), self.client.loop)
|
||
else:
|
||
reply_res = asyncio.run_coroutine_threadsafe(message.reply(content=res), self.client.loop)
|
||
reply_res.result()
|
||
except BaseException as e:
|
||
# 分割过长的消息
|
||
if "msg over length" in str(e):
|
||
split_res = []
|
||
split_res.append(res[:len(res)//2])
|
||
split_res.append(res[len(res)//2:])
|
||
for i in split_res:
|
||
if msg_ref is not None:
|
||
reply_res = asyncio.run_coroutine_threadsafe(message.reply(content=i, message_reference = msg_ref), self.client.loop)
|
||
else:
|
||
reply_res = asyncio.run_coroutine_threadsafe(message.reply(content=i), self.client.loop)
|
||
reply_res.result()
|
||
else:
|
||
# 发送qq信息
|
||
try:
|
||
# 防止被qq频道过滤消息
|
||
res = res.replace(".", " . ")
|
||
asyncio.run_coroutine_threadsafe(message.reply(content=res), self.client.loop).result()
|
||
# 发送信息
|
||
except BaseException as e:
|
||
print("QQ频道API错误: \n"+str(e))
|
||
res = str.join(" ", res)
|
||
try:
|
||
asyncio.run_coroutine_threadsafe(message.reply(content=res), self.client.loop).result()
|
||
except BaseException as e:
|
||
# 如果还是不行则报出错误
|
||
res = re.sub(r'(https|http)?:\/\/(\w|\.|\/|\?|\=|\&|\%)*\b', '[被隐藏的链接]', str(e), flags=re.MULTILINE)
|
||
res = res.replace(".", "·")
|
||
asyncio.run_coroutine_threadsafe(message.reply(content=res), self.client.loop).result()
|
||
# send(message, f"QQ频道API错误:{str(e)}\n下面是格式化后的回答:\n{f_res}")
|
||
else:
|
||
pic_res = requests.get(str(res), stream=True)
|
||
if pic_res.status_code == 200:
|
||
# 将二进制数据转换成图片对象
|
||
image = Image.open(io.BytesIO(pic_res.content))
|
||
# 保存图片到本地
|
||
image.save('tmp_image.jpg')
|
||
asyncio.run_coroutine_threadsafe(message.reply(file_image='tmp_image.jpg', content=""), self.client.loop) |