chore(lint): add mypy

This commit is contained in:
XYenon 2022-03-09 22:06:40 +08:00
parent 2c2ff9de1e
commit b07c89d06b
6 changed files with 116 additions and 210 deletions

View File

@ -15,3 +15,12 @@ repos:
rev: 5.10.1
hooks:
- id: isort
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v0.931
hooks:
- id: mypy
additional_dependencies:
- types-requests
- types-setuptools
- types-toml

View File

@ -17,6 +17,7 @@ from efb_qq_slave import BaseClient, QQMessengerChannel
from ehforwarderbot import Chat, Message, MsgType, Status, coordinator
from ehforwarderbot.chat import (
ChatMember,
GroupChat,
PrivateChat,
SelfChatMember,
SystemChatMember,
@ -26,7 +27,6 @@ from ehforwarderbot.exceptions import (
EFBMessageError,
EFBOperationNotSupported,
)
from ehforwarderbot.chat import GroupChat
from ehforwarderbot.message import MessageCommand, MessageCommands
from ehforwarderbot.status import MessageRemoval
from ehforwarderbot.types import ChatID, MessageID
@ -68,18 +68,15 @@ class GoCQHttp(BaseClient):
fallback=True,
)
_ = translator.gettext
ngettext = translator.ngettext
friend_list = []
friend_list: List[Dict] = []
friend_dict: Dict[int, dict] = {}
stranger_dict: Dict[int, dict] = {}
group_list = []
group_list: List[Dict] = []
group_dict: Dict[int, dict] = {}
group_member_dict: Dict[int, Dict[str, Any]] = {}
group_member_info_dict: Dict[Tuple[int, int], dict] = {}
discuss_list = []
extra_group_list = []
discuss_list: List[Dict] = []
extra_group_list: List[Dict] = []
repeat_counter = 0
update_repeat_counter = 0
event = threading.Event()
@ -106,7 +103,7 @@ class GoCQHttp(BaseClient):
self.msg_decorator = QQMsgProcessor(instance=self)
def forward_msgs_wrapper(msg_elements: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
fmt_msgs = []
fmt_msgs: List[Dict] = []
for msg in msg_elements:
from_user = self.get_user_info(msg["sender"]["user_id"])
header_text = {"data": {"text": f'{from_user["remark"]}{from_user["nickname"]}\n'}, "type": "text"}
@ -173,7 +170,8 @@ class GoCQHttp(BaseClient):
footer_msg = {"data": {"text": "合并转发消息结束"}, "type": "text"}
fmt_forward_msgs.insert(0, header_msg)
fmt_forward_msgs.append(footer_msg)
return message_elements_wrapper(context, fmt_forward_msgs, chat)
main_text, messages, _ = message_elements_wrapper(context, fmt_forward_msgs, chat)
return main_text, messages, []
else:
messages.extend(self.call_msg_decorator(msg_type, msg_data, chat))
return main_text, messages, at_list
@ -215,7 +213,7 @@ class GoCQHttp(BaseClient):
if "anonymous" not in context or context["anonymous"] is None:
if context["message_type"] == "group":
if context["sub_type"] == "notice":
context["event_description"] = self._("System Notification")
context["event_description"] = "System Notification"
context["uid_prefix"] = "group_notification"
author = chat.add_system_member(
name=context["event_description"],
@ -242,8 +240,11 @@ class GoCQHttp(BaseClient):
if not isinstance(messages[i], Message):
continue
efb_msg: Message = messages[i]
efb_msg.uid = f"{chat.uid.split('_')[-1]}_{coolq_msg_id}_{i}" if i > 0 else \
f"{chat.uid.split('_')[-1]}_{coolq_msg_id}"
efb_msg.uid = (
f"{chat.uid.split('_')[-1]}_{coolq_msg_id}_{i}"
if i > 0
else f"{chat.uid.split('_')[-1]}_{coolq_msg_id}"
)
efb_msg.chat = chat
efb_msg.author = author
# if qq_uid != '80000000':
@ -261,11 +262,11 @@ class GoCQHttp(BaseClient):
@self.coolq_bot.on_notice("group_increase")
def handle_group_increase_msg(context):
context["event_description"] = self._("\u2139 Group Member Increase Event")
context["event_description"] = "\u2139 Group Member Increase Event"
if (context["sub_type"]) == "invite":
text = self._("{nickname}({context[user_id]}) joined the group({group_name}) via invitation")
text = "{nickname}({context[user_id]}) joined the group({group_name}) via invitation"
else:
text = self._("{nickname}({context[user_id]}) joined the group({group_name})")
text = "{nickname}({context[user_id]}) joined the group({group_name})"
original_group = self.get_group_info(context["group_id"], False)
group_name = context["group_id"]
@ -282,19 +283,19 @@ class GoCQHttp(BaseClient):
@self.coolq_bot.on_notice("group_decrease")
def handle_group_decrease_msg(context):
context["event_description"] = self._("\u2139 Group Member Decrease Event")
context["event_description"] = "\u2139 Group Member Decrease Event"
original_group = self.get_group_info(context["group_id"], False)
group_name = context["group_id"]
if original_group is not None and "group_name" in original_group:
group_name = original_group["group_name"]
text = ""
if context["sub_type"] == "kick_me":
text = self._("You've been kicked from the group({})").format(group_name)
text = ("You've been kicked from the group({})").format(group_name)
else:
if context["sub_type"] == "leave":
text = self._("{nickname}({context[user_id]}) quited the group({group_name})")
text = "{nickname}({context[user_id]}) quited the group({group_name})"
else:
text = self._("{nickname}({context[user_id]}) was kicked from the group({group_name})")
text = "{nickname}({context[user_id]}) was kicked from the group({group_name})"
text = text.format(
nickname=self.get_stranger_info(context["user_id"])["nickname"],
context=context,
@ -305,11 +306,11 @@ class GoCQHttp(BaseClient):
@self.coolq_bot.on_notice("offline_file")
def handle_offline_file_upload_msg(context):
context["event_description"] = self._("\u2139 Offline File Upload Event")
context["event_description"] = "\u2139 Offline File Upload Event"
context["uid_prefix"] = "offline_file"
file_info_msg = self._("Filename: {file[name]}\n" "File size: {file[size]}").format(file=context["file"])
file_info_msg = ("Filename: {file[name]}\n" "File size: {file[size]}").format(file=context["file"])
user = self.get_user_info(context["user_id"])
text = self._("{remark}({nickname}) uploaded a file to you\n")
text = "{remark}({nickname}) uploaded a file to you\n"
text = text.format(remark=user["remark"], nickname=user["nickname"]) + file_info_msg
context["message"] = text
self.send_msg_to_master(context)
@ -321,19 +322,19 @@ class GoCQHttp(BaseClient):
@self.coolq_bot.on_notice("group_upload")
def handle_group_file_upload_msg(context):
context["event_description"] = self._("\u2139 Group File Upload Event")
context["event_description"] = "\u2139 Group File Upload Event"
context["uid_prefix"] = "group_upload"
original_group = self.get_group_info(context["group_id"], False)
group_name = context["group_id"]
if original_group is not None and "group_name" in original_group:
group_name = original_group["group_name"]
file_info_msg = self._("File ID: {file[id]}\n" "Filename: {file[name]}\n" "File size: {file[size]}").format(
file_info_msg = ("File ID: {file[id]}\n" "Filename: {file[name]}\n" "File size: {file[size]}").format(
file=context["file"]
)
member_info = self.get_user_info(context["user_id"], group_id=context["group_id"])["in_group_info"]
group_card = member_info["card"] if member_info["card"] != "" else member_info["nickname"]
text = self._("{member_card}({context[user_id]}) uploaded a file to group({group_name})\n")
text = "{member_card}({context[user_id]}) uploaded a file to group({group_name})\n"
text = text.format(member_card=group_card, context=context, group_name=group_name) + file_info_msg
context["message"] = text
self.send_efb_group_notice(context)
@ -349,9 +350,9 @@ class GoCQHttp(BaseClient):
@self.coolq_bot.on_notice("friend_add")
def handle_friend_add_msg(context):
context["event_description"] = self._("\u2139 New Friend Event")
context["event_description"] = "\u2139 New Friend Event"
context["uid_prefix"] = "friend_add"
text = self._("{nickname}({context[user_id]}) has become your friend!")
text = "{nickname}({context[user_id]}) has become your friend!"
text = text.format(
nickname=self.get_stranger_info(context["user_id"])["nickname"],
context=context,
@ -364,13 +365,10 @@ class GoCQHttp(BaseClient):
coolq_msg_id = context["message_id"]
chat = GroupChat(channel=self.channel, uid=f"group_{context['group_id']}")
efb_msg = Message(
chat=chat,
uid=MessageID(f"{chat.uid.split('_')[-1]}_{coolq_msg_id}")
efb_msg = Message(chat=chat, uid=MessageID(f"{chat.uid.split('_')[-1]}_{coolq_msg_id}"))
coordinator.send_status(
MessageRemoval(source_channel=self.channel, destination_channel=coordinator.master, message=efb_msg)
)
coordinator.send_status(MessageRemoval(source_channel=self.channel,
destination_channel=coordinator.master,
message=efb_msg))
@self.coolq_bot.on_notice("friend_recall")
def handle_friend_recall_msg(context):
@ -378,22 +376,19 @@ class GoCQHttp(BaseClient):
try:
chat: PrivateChat = self.chat_manager.build_efb_chat_as_private(context)
except:
except Exception:
return
efb_msg = Message(
chat=chat,
uid=MessageID(f"{chat.uid.split('_')[-1]}_{coolq_msg_id}")
efb_msg = Message(chat=chat, uid=MessageID(f"{chat.uid.split('_')[-1]}_{coolq_msg_id}"))
coordinator.send_status(
MessageRemoval(source_channel=self.channel, destination_channel=coordinator.master, message=efb_msg)
)
coordinator.send_status(MessageRemoval(source_channel=self.channel,
destination_channel=coordinator.master,
message=efb_msg))
@self.coolq_bot.on_request("friend") # Add friend request
def handle_add_friend_request(context):
self.logger.debug(repr(context))
context["event_description"] = self._("\u2139 New Friend Request")
context["event_description"] = "\u2139 New Friend Request"
context["uid_prefix"] = "friend_request"
text = self._(
text = (
"{nickname}({context[user_id]}) wants to be your friend!\n"
"Here is the verification comment:\n"
"{context[comment]}"
@ -405,12 +400,12 @@ class GoCQHttp(BaseClient):
context["message"] = text
commands = [
MessageCommand(
name=self._("Accept"),
name=("Accept"),
callable_name="process_friend_request",
kwargs={"result": "accept", "flag": context["flag"]},
),
MessageCommand(
name=self._("Decline"),
name=("Decline"),
callable_name="process_friend_request",
kwargs={"result": "decline", "flag": context["flag"]},
),
@ -422,7 +417,7 @@ class GoCQHttp(BaseClient):
def handle_group_request(context):
self.logger.debug(repr(context))
context["uid_prefix"] = "group_request"
context["group_name"] = self._("[Request]") + self.get_group_info(context["group_id"])["group_name"]
context["group_name"] = ("[Request]") + self.get_group_info(context["group_id"])["group_name"]
context["group_id_orig"] = context["group_id"]
context["group_id"] = str(context["group_id"]) + "_notification"
context["message_type"] = "group"
@ -455,7 +450,7 @@ class GoCQHttp(BaseClient):
msg.commands = MessageCommands(
[
MessageCommand(
name=self._("Accept"),
name=("Accept"),
callable_name="process_group_request",
kwargs={
"result": "accept",
@ -464,7 +459,7 @@ class GoCQHttp(BaseClient):
},
),
MessageCommand(
name=self._("Decline"),
name=("Decline"),
callable_name="process_group_request",
kwargs={
"result": "decline",
@ -493,8 +488,8 @@ class GoCQHttp(BaseClient):
cherrypy.engine.wait(states.EXITING)
@extra(
name=_("Restart CoolQ Client"),
desc=_(
name=("Restart CoolQ Client"),
desc=(
"Force CoolQ to restart\n"
"Usage: {function_name} [-l] [-c] [-e]\n"
" -l: Restart and clean log\n"
@ -516,7 +511,7 @@ class GoCQHttp(BaseClient):
elif each_param == "-e":
param_dict["clean_event"] = "true"
else:
return self._("Unknown parameter: {}.").format(param)
return ("Unknown parameter: {}.").format(param)
self.logger.debug(repr(param_dict))
self.coolq_api_query("_set_restart", **param_dict)
return "Done. Please wait for a while."
@ -525,8 +520,8 @@ class GoCQHttp(BaseClient):
raise NotImplementedError
@extra(
name=_("Check CoolQ Status"),
desc=_("Force efb-qq-slave to refresh status from CoolQ Client.\n" "Usage: {function_name}"),
name=("Check CoolQ Status"),
desc=("Force efb-qq-slave to refresh status from CoolQ Client.\n" "Usage: {function_name}"),
)
def login(self, param: str = ""):
self.check_status_periodically(None)
@ -577,7 +572,7 @@ class GoCQHttp(BaseClient):
try:
self.update_friend_list() # Force update friend list
except CoolQAPIFailureException:
self.deliver_alert_to_master(self._("Failed to retrieve the friend list.\n" "Only groups are shown."))
self.deliver_alert_to_master(("Failed to retrieve the friend list.\n" "Only groups are shown."))
return []
users = []
for current_user in self.friend_list:
@ -616,7 +611,7 @@ class GoCQHttp(BaseClient):
self.recall_message(uid_type[1])
except CoolQAPIFailureException:
raise EFBOperationNotSupported(
self._("Failed to recall the message!\n" "This message may have already expired.")
("Failed to recall the message!\n" "This message may have already expired.")
)
if msg.type in [MsgType.Text, MsgType.Link]:
@ -646,7 +641,7 @@ class GoCQHttp(BaseClient):
if not self.can_send_image:
self.check_features() # Force checking features
raise EFBOperationNotSupported(
self._("Unable to send image now. Please check your CoolQ version " "or retry later")
("Unable to send image now. Please check your CoolQ version " "or retry later")
)
if msg.type != MsgType.Sticker:
text += m.coolq_code_image_wrapper(msg.file, msg.path)
@ -673,7 +668,7 @@ class GoCQHttp(BaseClient):
if not self.can_send_voice:
self.check_features() # Force checking features
raise EFBOperationNotSupported(
self._(
(
"Unable to send voice now. Please check your CoolQ version "
" and install CoolQ audio library or retry later"
)
@ -710,7 +705,7 @@ class GoCQHttp(BaseClient):
try:
member_list = self.coolq_api_query("get_group_member_list", group_id=group_id, no_cache=no_cache)
except CoolQAPIFailureException as e:
self.deliver_alert_to_master(self._("Failed the get group member detail.") + "{}".format(e))
self.deliver_alert_to_master(("Failed the get group member detail.") + "{}".format(e))
return []
self.group_member_dict[group_id] = {
"members": member_list,
@ -722,15 +717,19 @@ class GoCQHttp(BaseClient):
user_id = int(user_id)
if no_cache or (not self.friend_list) or (user_id not in self.friend_dict):
self.update_friend_list()
friend = copy.deepcopy(self.friend_dict.get(user_id))
friend = self.friend_dict.get(user_id)
if friend:
user = friend
user = copy.deepcopy(friend)
user["is_friend"] = True
else:
user = copy.deepcopy(self.stranger_dict.get(user_id))
if no_cache or (user is None):
user = self.coolq_api_query("get_stranger_info", user_id=user_id)
self.stranger_dict[user_id] = copy.deepcopy(user)
if no_cache:
stranger = self.coolq_api_query("get_stranger_info", user_id=user_id)
self.stranger_dict[user_id] = stranger
stranger = self.stranger_dict.get(user_id)
if stranger is None:
stranger = self.coolq_api_query("get_stranger_info", user_id=user_id)
self.stranger_dict[user_id] = stranger
user = copy.deepcopy(stranger)
user["is_friend"] = False
if group_id is not None:
user["is_in_group"] = False
@ -773,12 +772,10 @@ class GoCQHttp(BaseClient):
func = getattr(self.coolq_bot, func_name)
res = func(**kwargs)
except RequestException as e:
raise CoolQDisconnectedException(
self._("Unable to connect to CoolQ Client!" "Error Message:\n{}").format(str(e))
)
raise CoolQDisconnectedException(("Unable to connect to CoolQ Client!" "Error Message:\n{}").format(str(e)))
except cqhttp.Error as ex:
api_ex = CoolQAPIFailureException(
self._("CoolQ HTTP API encountered an error!\n" "Status Code:{} " "Return Code:{}").format(
("CoolQ HTTP API encountered an error!\n" "Status Code:{} " "Return Code:{}").format(
ex.status_code, ex.retcode
)
)
@ -793,9 +790,9 @@ class GoCQHttp(BaseClient):
if res["good"] or res["online"]:
return True
else:
raise CoolQOfflineException(self._("CoolQ Client isn't working correctly!"))
raise CoolQOfflineException(("CoolQ Client isn't working correctly!"))
def coolq_api_query(self, func_name, **kwargs):
def coolq_api_query(self, func_name, **kwargs) -> Any:
"""# Do not call get_status too frequently
if self.check_running_status():
return self._coolq_api_wrapper(func_name, **kwargs)
@ -803,7 +800,7 @@ class GoCQHttp(BaseClient):
if self.is_logged_in and self.is_connected:
return self._coolq_api_wrapper(func_name, **kwargs)
elif self.repeat_counter < 3:
self.deliver_alert_to_master(self._("Your status is offline.\n" "You may try login with /0_login"))
self.deliver_alert_to_master(("Your status is offline.\n" "You may try login with /0_login"))
self.repeat_counter += 1
def check_status_periodically(self, t_event):
@ -815,7 +812,7 @@ class GoCQHttp(BaseClient):
except CoolQDisconnectedException as e:
if self.repeat_counter < 3:
self.deliver_alert_to_master(
self._(
(
"We're unable to communicate with CoolQ Client.\n"
"Please check the connection and credentials provided.\n"
"{}"
@ -828,7 +825,7 @@ class GoCQHttp(BaseClient):
except (CoolQOfflineException, CoolQAPIFailureException):
if self.repeat_counter < 3:
self.deliver_alert_to_master(
self._(
(
"CoolQ is running in abnormal status.\n"
"You may need to relogin your account "
"or have a check in CoolQ Client.\n"
@ -842,7 +839,7 @@ class GoCQHttp(BaseClient):
if not flag:
if self.repeat_counter < 3:
self.deliver_alert_to_master(
self._(
(
"We don't know why, but status check failed.\n"
"Please enable debug mode and consult the log "
"for more details."
@ -866,7 +863,7 @@ class GoCQHttp(BaseClient):
context = {
"message": message,
"uid_prefix": "alert",
"event_description": self._("CoolQ Alert"),
"event_description": ("CoolQ Alert"),
}
self.send_msg_to_master(context)
@ -901,7 +898,7 @@ class GoCQHttp(BaseClient):
if (ex.status_code) == 200 and (ex.retcode) == 104 and self.update_repeat_counter < 3:
self.send_cookie_expired_alarm()
if self.update_repeat_counter < 3:
self.deliver_alert_to_master(self._("Errors occurred when updating contacts: ") + (ex.message))
self.deliver_alert_to_master(("Errors occurred when updating contacts: ") + (ex.message))
self.update_repeat_counter += 1
else:
self.update_repeat_counter = 0
@ -968,12 +965,12 @@ class GoCQHttp(BaseClient):
def send_status(self, status: "Status"):
if isinstance(status, MessageRemoval):
if not isinstance(status.message.author, SelfChatMember):
raise EFBMessageError(self._("You can only recall your own messages."))
raise EFBMessageError(("You can only recall your own messages."))
try:
uid_type = status.message.uid.split("_")
self.recall_message(uid_type[1])
except CoolQAPIFailureException:
raise EFBMessageError(self._("Failed to recall the message. This message may have already expired."))
raise EFBMessageError(("Failed to recall the message. This message may have already expired."))
else:
raise EFBOperationNotSupported()
# todo
@ -983,7 +980,7 @@ class GoCQHttp(BaseClient):
def send_cookie_expired_alarm(self):
self.deliver_alert_to_master(
self._(
(
"Your cookie of CoolQ Client seems to be expired. "
"Although it will not affect the normal functioning of sending/receiving "
"messages, however, you may encounter issues like failing to retrieve "
@ -998,7 +995,7 @@ class GoCQHttp(BaseClient):
try:
self.coolq_api_query("set_friend_add_request", approve=res, flag=flag)
except CoolQAPIFailureException as e:
return self._("Failed to process request! Error Message:\n") + getattr(e, "message", repr(e))
return ("Failed to process request! Error Message:\n") + getattr(e, "message", repr(e))
return "Done"
def process_group_request(self, result, flag, sub_type):
@ -1006,13 +1003,13 @@ class GoCQHttp(BaseClient):
try:
self.coolq_api_query("set_group_add_request", approve=res, flag=flag, sub_type=sub_type)
except CoolQAPIFailureException as e:
return self._("Failed to process request! Error Message:\n") + getattr(e, "message", repr(e))
return ("Failed to process request! Error Message:\n") + getattr(e, "message", repr(e))
return "Done"
def async_download_file(self, context, download_url):
res = download_file(download_url)
if isinstance(res, str):
context["message"] = self._("[Download] ") + res
context["message"] = ("[Download] ") + res
self.send_efb_group_notice(context)
elif res is None:
pass
@ -1055,7 +1052,7 @@ class GoCQHttp(BaseClient):
if chat_type[0] == "private":
qq_uid = int(chat_type[1])
remark = self.get_friend_remark(qq_uid)
context = {"user_id": qq_uid}
context: Dict[str, Any] = {"user_id": qq_uid}
if remark is not None:
context["alias"] = remark
return self.chat_manager.build_efb_chat_as_private(context)

View File

@ -3,41 +3,44 @@ import html
import json
import logging
import sys
from typing import TYPE_CHECKING
import magic
from ehforwarderbot import Chat, Message, MsgType
from ehforwarderbot.message import LinkAttribute, LocationAttribute, Substitutions
from . import GoCQHttp
from .Utils import cq_get_image, download_file, download_voice
if TYPE_CHECKING:
from .GoCQHttp import GoCQHttp
class QQMsgProcessor:
inst: GoCQHttp
inst: "GoCQHttp"
logger: logging.Logger = logging.getLogger(__name__)
def __init__(self, instance: GoCQHttp):
def __init__(self, instance: "GoCQHttp"):
self.inst = instance
self._ = instance._
pass
def qq_image_wrapper(self, data, chat: Chat = None):
efb_msg = Message()
if "url" not in data:
efb_msg.type = MsgType.Text
efb_msg.text = self._("[Image Source missing]")
efb_msg.text = "[Image Source missing]"
return [efb_msg]
# flash picture
if "flash" == data.get("type", ""):
data["url"] = f'https://gchat.qpic.cn/gchatpic_new/1/1-1-' \
f'{data["file"].replace(".image", "").upper()}/0?term=3%27'
efb_msg.text = self._('Send a flash picture.')
data["url"] = (
f"https://gchat.qpic.cn/gchatpic_new/1/1-1-" f'{data["file"].replace(".image", "").upper()}/0?term=3%27'
)
efb_msg.text = "Send a flash picture."
efb_msg.file = cq_get_image(data["url"])
if efb_msg.file is None:
efb_msg.type = MsgType.Text
efb_msg.text = self._("[Download image failed, please check on your QQ client]")
efb_msg.text = "[Download image failed, please check on your QQ client]"
return [efb_msg]
efb_msg.type = MsgType.Image
@ -64,7 +67,7 @@ class QQMsgProcessor:
efb_msg.mime = mime
except Exception:
efb_msg.type = MsgType.Unsupported
efb_msg.text = self._("[Voice Message] Please check it on your QQ")
efb_msg.text = "[Voice Message] Please check it on your QQ"
logging.getLogger(__name__).exception("Failed to download voice")
return [efb_msg]
@ -90,7 +93,7 @@ class QQMsgProcessor:
return [efb_msg]
def qq_shake_wrapper(self, data, chat: Chat = None):
efb_msg = Message(type=MsgType.Text, text=self._("[Your friend shakes you!]"))
efb_msg = Message(type=MsgType.Text, text=("[Your friend shakes you!]"))
return [efb_msg]
def qq_contact_wrapper(self, data, chat: Chat = None):
@ -98,14 +101,14 @@ class QQMsgProcessor:
contact_type = data["type"]
efb_msg = Message(
type=MsgType.Text,
text=self._("Chat Recommendation Received\nID: {}\nType: {}").format(uid, contact_type),
text=("Chat Recommendation Received\nID: {}\nType: {}").format(uid, contact_type),
)
return [efb_msg]
def qq_bface_wrapper(self, data, chat: Chat = None):
efb_msg = Message(
type=MsgType.Unsupported,
text=self._("[Here comes the BigFace Emoji, please check it on your phone]"),
text=("[Here comes the BigFace Emoji, please check it on your phone]"),
)
return [efb_msg]
@ -114,11 +117,11 @@ class QQMsgProcessor:
pass
def qq_sign_wrapper(self, data, chat: Chat = None):
location = self._("at {}").format(data["location"]) if "location" in data else self._("at Unknown Place")
title = "" if "title" not in data else (self._("with title {}").format(data["title"]))
location = ("at {}").format(data["location"]) if "location" in data else ("at Unknown Place")
title = "" if "title" not in data else (("with title {}").format(data["title"]))
efb_msg = Message(
type=MsgType.Text,
text=self._("signed in {location} {title}").format(title=title, location=location),
text=("signed in {location} {title}").format(title=title, location=location),
)
return [efb_msg]
@ -126,7 +129,7 @@ class QQMsgProcessor:
efb_messages = list()
efb_msg = Message(
type=MsgType.Unsupported,
text=self._("[Here comes the Rich Text, dumping...] \n"),
text=("[Here comes the Rich Text, dumping...] \n"),
)
for key, value in data.items():
efb_msg.text += key + ": " + value + "\n"
@ -189,7 +192,7 @@ class QQMsgProcessor:
efb_msg.filename = data["filename"]
return efb_msg
def qq_group_broadcast_wrapper(self, data, chat: Chat = None):
def qq_group_broadcast_wrapper(self, data, chat: Chat):
try:
at_list = {}
content_data = json.loads(data["content"])
@ -215,9 +218,9 @@ class QQMsgProcessor:
else:
return self.qq_text_simple_wrapper(text, at_list)
except Exception:
return self.qq_group_broadcast_alternative_wrapper(data)
return self.qq_group_broadcast_alternative_wrapper(data, chat)
def qq_group_broadcast_alternative_wrapper(self, data, chat: Chat = None):
def qq_group_broadcast_alternative_wrapper(self, data, chat: Chat):
try:
at_list = {}
content_data = json.loads(data["content"])

View File

@ -2,6 +2,7 @@ import logging
import tempfile
import urllib.request
from gettext import translation
from typing import IO, Optional
from urllib.error import ContentTooShortError, HTTPError, URLError
import pilk
@ -648,7 +649,7 @@ _ = translator.gettext
ngettext = translator.ngettext
def cq_get_image(image_link: str) -> tempfile: # Download image from QQ
def cq_get_image(image_link: str) -> Optional[IO]: # Download image from QQ
file = tempfile.NamedTemporaryFile()
try:
urllib.request.urlretrieve(image_link, file.name)

106
pdm.lock
View File

@ -31,12 +31,6 @@ name = "certifi"
version = "2021.10.8"
summary = "Python package for providing Mozilla's CA Bundle."
[[package]]
name = "cfgv"
version = "3.3.1"
requires_python = ">=3.6.1"
summary = "Validate configuration and produce human readable error messages."
[[package]]
name = "charset-normalizer"
version = "2.0.11"
@ -99,11 +93,6 @@ dependencies = [
"requests",
]
[[package]]
name = "distlib"
version = "0.3.4"
summary = "Distribution utilities"
[[package]]
name = "efb-qq-slave"
version = "2.0.1.dev0"
@ -164,12 +153,6 @@ dependencies = [
"future",
]
[[package]]
name = "filelock"
version = "3.4.2"
requires_python = ">=3.7"
summary = "A platform independent file lock."
[[package]]
name = "flask"
version = "2.0.2"
@ -197,12 +180,6 @@ dependencies = [
"importlib-metadata; python_version < \"3.8\"",
]
[[package]]
name = "identify"
version = "2.4.8"
requires_python = ">=3.7"
summary = "File identification library for Python"
[[package]]
name = "idna"
version = "3.3"
@ -305,11 +282,6 @@ version = "8.12.0"
requires_python = ">=3.5"
summary = "More routines for operating on iterables, beyond itertools"
[[package]]
name = "nodeenv"
version = "1.6.0"
summary = "Node.js virtual environment builder"
[[package]]
name = "peewee"
version = "3.14.9"
@ -327,12 +299,6 @@ version = "9.0.1"
requires_python = ">=3.7"
summary = "Python Imaging Library (Fork)"
[[package]]
name = "platformdirs"
version = "2.4.1"
requires_python = ">=3.7"
summary = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
[[package]]
name = "portend"
version = "3.1.0"
@ -342,21 +308,6 @@ dependencies = [
"tempora>=1.8",
]
[[package]]
name = "pre-commit"
version = "2.17.0"
requires_python = ">=3.6.1"
summary = "A framework for managing and maintaining multi-language pre-commit hooks."
dependencies = [
"cfgv>=2.0.0",
"identify>=1.0.0",
"importlib-metadata; python_version < \"3.8\"",
"nodeenv>=0.11.1",
"pyyaml>=5.1",
"toml",
"virtualenv>=20.0.8",
]
[[package]]
name = "pydub"
version = "0.25.1"
@ -464,12 +415,6 @@ dependencies = [
"pytz",
]
[[package]]
name = "toml"
version = "0.10.2"
requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
summary = "Python Library for Tom's Obvious, Minimal Language"
[[package]]
name = "tornado"
version = "6.1"
@ -505,19 +450,6 @@ version = "1.26.8"
requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
summary = "HTTP library with thread-safe connection pooling, file post, and more."
[[package]]
name = "virtualenv"
version = "20.13.0"
requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
summary = "Virtual Python Environment builder"
dependencies = [
"distlib<1,>=0.3.1",
"filelock<4,>=3.2",
"importlib-metadata>=0.12; python_version < \"3.8\"",
"platformdirs<3,>=2",
"six<2,>=1.9.0",
]
[[package]]
name = "werkzeug"
version = "2.0.2"
@ -540,7 +472,7 @@ summary = "Backport of pathlib-compatible object wrapper for zip files"
[metadata]
lock_version = "3.1"
content_hash = "sha256:22cb2a81b3aaf8b67d35ab2bbd2582a15ef5e1f33f67d0c901b89de94f22d303"
content_hash = "sha256:978b5cbd8b5efd554ae429512f6909ca9e5be239ca11531f954c51c274b984cc"
[metadata.files]
"apscheduler 3.6.3" = [
@ -577,10 +509,6 @@ content_hash = "sha256:22cb2a81b3aaf8b67d35ab2bbd2582a15ef5e1f33f67d0c901b89de94
{file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
{file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
]
"cfgv 3.3.1" = [
{file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"},
{file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"},
]
"charset-normalizer 2.0.11" = [
{file = "charset_normalizer-2.0.11-py3-none-any.whl", hash = "sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45"},
{file = "charset-normalizer-2.0.11.tar.gz", hash = "sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c"},
@ -608,10 +536,6 @@ content_hash = "sha256:22cb2a81b3aaf8b67d35ab2bbd2582a15ef5e1f33f67d0c901b89de94
"cqhttp 1.3.1" = [
{file = "cqhttp-1.3.1.tar.gz", hash = "sha256:4cb0dae03872162df395ef49f3bb2ec69501cc0d686193dfb1b413097b062821"},
]
"distlib 0.3.4" = [
{file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"},
{file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"},
]
"efb-telegram-master 2.2.4" = [
{file = "efb_telegram_master-2.2.4-py3-none-any.whl", hash = "sha256:c4c523d79f3cb39e6a30a339807366514ba0d841acb90c2f322aba4b535fb74c"},
{file = "efb-telegram-master-2.2.4.tar.gz", hash = "sha256:ab40c9c97656921ce339194af91ba56cdb6680fea9a2ec5016649b6205919f44"},
@ -624,10 +548,6 @@ content_hash = "sha256:22cb2a81b3aaf8b67d35ab2bbd2582a15ef5e1f33f67d0c901b89de94
{file = "ffmpeg_python-0.2.0-py3-none-any.whl", hash = "sha256:ac441a0404e053f8b6a1113a77c0f452f1cfc62f6344a769475ffdc0f56c23c5"},
{file = "ffmpeg-python-0.2.0.tar.gz", hash = "sha256:65225db34627c578ef0e11c8b1eb528bb35e024752f6f10b78c011f6f64c4127"},
]
"filelock 3.4.2" = [
{file = "filelock-3.4.2-py3-none-any.whl", hash = "sha256:cf0fc6a2f8d26bd900f19bf33915ca70ba4dd8c56903eeb14e1e7a2fd7590146"},
{file = "filelock-3.4.2.tar.gz", hash = "sha256:38b4f4c989f9d06d44524df1b24bd19e167d851f19b50bf3e3559952dddc5b80"},
]
"flask 2.0.2" = [
{file = "Flask-2.0.2-py3-none-any.whl", hash = "sha256:cb90f62f1d8e4dc4621f52106613488b5ba826b2e1e10a33eac92f723093ab6a"},
{file = "Flask-2.0.2.tar.gz", hash = "sha256:7b2fb8e934ddd50731893bdcdb00fc8c0315916f9fcd50d22c7cc1a95ab634e2"},
@ -639,10 +559,6 @@ content_hash = "sha256:22cb2a81b3aaf8b67d35ab2bbd2582a15ef5e1f33f67d0c901b89de94
{file = "humanize-4.0.0-py3-none-any.whl", hash = "sha256:8d86333b8557dacffd4dce1dbe09c81c189e2caf7bb17a970b2212f0f58f10f2"},
{file = "humanize-4.0.0.tar.gz", hash = "sha256:ee1f872fdfc7d2ef4a28d4f80ddde9f96d36955b5d6b0dac4bdeb99502bddb00"},
]
"identify 2.4.8" = [
{file = "identify-2.4.8-py2.py3-none-any.whl", hash = "sha256:a55bdd671b6063eb837af938c250ec00bba6e610454265133b0d2db7ae718d0f"},
{file = "identify-2.4.8.tar.gz", hash = "sha256:97e839c1779f07011b84c92af183e1883d9745d532d83412cca1ca76d3808c1c"},
]
"idna 3.3" = [
{file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"},
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
@ -762,10 +678,6 @@ content_hash = "sha256:22cb2a81b3aaf8b67d35ab2bbd2582a15ef5e1f33f67d0c901b89de94
{file = "more_itertools-8.12.0-py3-none-any.whl", hash = "sha256:43e6dd9942dffd72661a2c4ef383ad7da1e6a3e968a927ad7a6083ab410a688b"},
{file = "more-itertools-8.12.0.tar.gz", hash = "sha256:7dc6ad46f05f545f900dd59e8dfb4e84a4827b97b3cfecb175ea0c7d247f6064"},
]
"nodeenv 1.6.0" = [
{file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"},
{file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"},
]
"peewee 3.14.9" = [
{file = "peewee-3.14.9.tar.gz", hash = "sha256:69c1b88dc89b184231cc1ce6df241075aca5cec43e89749cc4a63108f9ceea47"},
]
@ -814,18 +726,10 @@ content_hash = "sha256:22cb2a81b3aaf8b67d35ab2bbd2582a15ef5e1f33f67d0c901b89de94
{file = "Pillow-9.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70"},
{file = "Pillow-9.0.1.tar.gz", hash = "sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa"},
]
"platformdirs 2.4.1" = [
{file = "platformdirs-2.4.1-py3-none-any.whl", hash = "sha256:1d7385c7db91728b83efd0ca99a5afb296cab9d0ed8313a45ed8ba17967ecfca"},
{file = "platformdirs-2.4.1.tar.gz", hash = "sha256:440633ddfebcc36264232365d7840a970e75e1018d15b4327d11f91909045fda"},
]
"portend 3.1.0" = [
{file = "portend-3.1.0-py3-none-any.whl", hash = "sha256:9e735cee3a5c1961f09e3f3ba6dc498198c2d70b473d98d0d1504b8d1e7a3d61"},
{file = "portend-3.1.0.tar.gz", hash = "sha256:239e3116045ea823f6df87d6168107ad75ccc0590e37242af0cc1e98c5d224e4"},
]
"pre-commit 2.17.0" = [
{file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"},
{file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"},
]
"pydub 0.25.1" = [
{file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"},
{file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"},
@ -945,10 +849,6 @@ content_hash = "sha256:22cb2a81b3aaf8b67d35ab2bbd2582a15ef5e1f33f67d0c901b89de94
{file = "tempora-5.0.1-py3-none-any.whl", hash = "sha256:fbca6a229af666ea4ea8b2f9f80ac9a074f7cf53a97987855b1d15b6e93fd63b"},
{file = "tempora-5.0.1.tar.gz", hash = "sha256:cba0f197a64883bf3e73657efbc0324d5bf17179e7769b1385b4d75d26cd9127"},
]
"toml 0.10.2" = [
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
]
"tornado 6.1" = [
{file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"},
{file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"},
@ -1008,10 +908,6 @@ content_hash = "sha256:22cb2a81b3aaf8b67d35ab2bbd2582a15ef5e1f33f67d0c901b89de94
{file = "urllib3-1.26.8-py2.py3-none-any.whl", hash = "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed"},
{file = "urllib3-1.26.8.tar.gz", hash = "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c"},
]
"virtualenv 20.13.0" = [
{file = "virtualenv-20.13.0-py2.py3-none-any.whl", hash = "sha256:339f16c4a86b44240ba7223d0f93a7887c3ca04b5f9c8129da7958447d079b09"},
{file = "virtualenv-20.13.0.tar.gz", hash = "sha256:d8458cf8d59d0ea495ad9b34c2599487f8a7772d796f9910858376d1600dd2dd"},
]
"werkzeug 2.0.2" = [
{file = "Werkzeug-2.0.2-py3-none-any.whl", hash = "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f"},
{file = "Werkzeug-2.0.2.tar.gz", hash = "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a"},

View File

@ -56,7 +56,7 @@ build-backend = "pdm.pep517.api"
version = { from = "efb_qq_plugin_go_cqhttp/__init__.py" }
[tool.pdm.dev-dependencies]
dev = ["pre-commit", "efb-telegram-master~=2.2.4"]
dev = ["efb-telegram-master~=2.2.4"]
[tool.black]
line-length = 120