1
0
forked from bot/app

优先从内存读取用户信息

This commit is contained in:
2024-04-17 17:45:32 +08:00
parent c4db4dc6a6
commit 0e02af59ca
8 changed files with 158 additions and 57 deletions

View File

@ -36,7 +36,7 @@ def load_from_yaml(file: str) -> dict:
return conf
def get_config(key: str, bot: T_Bot = None, default=None):
def get_config(key: str, *, bot: T_Bot = None, default=None):
"""获取配置项优先级bot > config > db > yaml"""
if bot is None:
bot_config = {}
@ -59,6 +59,15 @@ def get_config(key: str, bot: T_Bot = None, default=None):
def init_conf(conf: dict) -> dict:
"""
初始化配置文件,确保配置文件中的必要字段存在,且不会冲突
Args:
conf:
Returns:
"""
# 若command_start中无""则添加必要命令头开启alconna_use_command_start防止冲突
if "" not in conf.get("command_start", []):
conf["alconna_use_command_start"] = True
return conf

View File

@ -9,7 +9,7 @@ from typing import Any
import nonebot
from .config import config
from .config import config, get_config
from .data_manager import User, user_db
_language_data = {
@ -18,6 +18,10 @@ _language_data = {
}
}
_user_lang = {
"user_id": "zh-CN"
}
def load_from_lang(file_path: str, lang_code: str = None):
"""
@ -101,8 +105,11 @@ def load_from_dict(data: dict, lang_code: str):
class Language:
def __init__(self, lang_code: str = None, fallback_lang_code: str = "zh-CN"):
# 三重fallback
# 用户语言 > 默认语言/系统语言 > zh-CN
def __init__(self, lang_code: str = None, fallback_lang_code: str = None):
self.lang_code = lang_code
if self.lang_code is None:
self.lang_code = get_default_lang_code()
@ -112,7 +119,7 @@ class Language:
def get(self, item: str, *args, **kwargs) -> str | Any:
"""
获取当前语言文本
获取当前语言文本kwargs中的default参数为默认文本
Args:
item: 文本键
*args: 格式化参数
@ -123,44 +130,44 @@ class Language:
"""
default = kwargs.pop("default", None)
fallback = (self.lang_code, self.fallback_lang_code, "zh-CN")
try:
if self.lang_code in _language_data and item in _language_data[self.lang_code]:
return _language_data[self.lang_code][item].format(*args, **kwargs)
nonebot.logger.debug(f"Language text not found: {self.lang_code}.{item}")
if self.fallback_lang_code in _language_data and item in _language_data[self.fallback_lang_code]:
return _language_data[self.fallback_lang_code][item].format(*args, **kwargs)
nonebot.logger.debug(f"Language text not found in fallback language: {self.fallback_lang_code}.{item}")
return default or item
except Exception as e:
nonebot.logger.error(f"Failed to get language text or format: {e}")
return default or item
for lang_code in fallback:
if lang_code in _language_data and item in _language_data[lang_code]:
trans: str = _language_data[lang_code][item]
try:
return trans.format(*args, **kwargs)
except Exception as e:
nonebot.logger.warning(f"Failed to format language data: {e}")
return trans
return default or item
def get_many(self, *args) -> dict[str, str]:
"""
获取多个文本
Args:
*args: 文本键
Returns:
dict: 文本字典
"""
d = {}
for item in args:
d[item] = self.get(item)
return d
def change_user_lang(user_id: str, lang_code: str):
"""
修改用户的语言
"""
user = user_db.first(User(), "user_id = ?", user_id, default=User(user_id=user_id))
user.profile["lang"] = lang_code
user_db.update(user, "user_id = ?", user_id)
def get_user_lang(user_id: str) -> Language:
"""
获取用户的语言代码
获取用户的语言实例,优先从内存中获取
"""
user = user_db.first(User(), "user_id = ?", user_id, default=User(
user_id=user_id,
username="Unknown"
))
return Language(user.profile.get("lang", get_default_lang_code()))
if user_id in _user_lang:
return Language(_user_lang[user_id])
else:
user = user_db.first(
User(), "user_id = ?", user_id, default=User(
user_id=user_id,
username="Unknown"
)
)
lang_code = user.profile.get("lang", get_default_lang_code())
_user_lang[user_id] = lang_code
return Language(lang_code)
def get_system_lang_code() -> str:
@ -172,11 +179,11 @@ def get_system_lang_code() -> str:
def get_default_lang_code() -> str:
"""
获取默认语言代码
获取默认语言代码,若没有设置则使用系统语言
Returns:
"""
return config.get("default_language", get_system_lang_code())
return get_config("default_language", default=get_system_lang_code())
def get_all_lang() -> dict[str, str]:

View File

@ -110,3 +110,4 @@ async def url2image(
type=type,
quality=quality
)

View File

@ -9,7 +9,7 @@ from ..base.config import get_config
from ..base.ly_typing import T_Bot
def markdown_escape(text: str) -> str:
def escape_md(text: str) -> str:
"""
转义Markdown特殊字符
Args:
@ -27,57 +27,62 @@ def markdown_escape(text: str) -> str:
def escape_decorator(func):
def wrapper(text: str):
return func(markdown_escape(text))
return func(escape_md(text))
return wrapper
def compile_md(comps: list[str]) -> str:
"""
编译Markdown文本
Args:
comps: list[str]: 组件列表
Returns:
str: 编译后文本
"""
print("".join(comps))
return "".join(comps)
class MarkdownComponent:
@staticmethod
@escape_decorator
def heading(text: str, level: int = 1) -> str:
"""标题"""
assert 1 <= level <= 6, "标题级别应在 1-6 之间"
return f"{'#' * level} {text}"
return f"{'#' * level} {text}\n"
@staticmethod
@escape_decorator
def bold(text: str) -> str:
"""粗体"""
return f"**{text}**"
@staticmethod
@escape_decorator
def italic(text: str) -> str:
"""斜体"""
return f"*{text}*"
@staticmethod
@escape_decorator
def strike(text: str) -> str:
"""删除线"""
return f"~~{text}~~"
@staticmethod
@escape_decorator
def code(text: str) -> str:
"""行内代码"""
return f"`{text}`"
@staticmethod
@escape_decorator
def code_block(text: str, language: str = "") -> str:
"""代码块"""
return f"```{language}\n{text}\n```"
return f"```{language}\n{text}\n```\n"
@staticmethod
@escape_decorator
def quote(text: str) -> str:
"""引用"""
return f"> {text}"
return f"> {text}\n"
@staticmethod
@escape_decorator
def link(text: str, url: str, symbol: bool = True) -> str:
"""
链接
@ -87,10 +92,9 @@ class MarkdownComponent:
url: 链接地址
symbol: 是否显示链接图标, mqqapi请使用False
"""
return f"[{'🔗' if symbol else ''}{text}]({quote(url)})"
return f"[{'🔗' if symbol else ''}{text}]({url})"
@staticmethod
@escape_decorator
def image(url: str, *, size: tuple[int, int]) -> str:
"""
图片,本地图片不建议直接使用
@ -104,7 +108,6 @@ class MarkdownComponent:
return f"![image #{size[0]}px #{size[1]}px]({url})"
@staticmethod
@escape_decorator
async def auto_image(image: str | bytes, bot: T_Bot) -> str:
"""
自动获取图片大小
@ -143,7 +146,6 @@ class MarkdownComponent:
return MarkdownComponent.image(url, size=size)
@staticmethod
@escape_decorator
def table(data: list[list[any]]) -> str:
"""
表格
@ -160,6 +162,17 @@ class MarkdownComponent:
table += "|".join(map(str, row)) + "\n"
return table
@staticmethod
def paragraph(text: str) -> str:
"""
段落
Args:
text: 段落内容
Returns:
markdown格式的段落
"""
return f"{text}\n"
class Mqqapi:
@staticmethod