mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-09-28 16:20:56 +08:00
feat(nickname): 删除昵称系统相关功能 (#2114)
删除了昵称系统的完整实现,包括: - 移除 nickname.py 插件文件及其所有功能代码 - 从 FriendUser 和 GroupInfoUser 模型中删除 nickname 字段 - 移除相关的数据库配置 - 更新 GroupManager 中的操作者名称获取逻辑 - 简化平台处理的数据源代码
This commit is contained in:
@@ -1,285 +0,0 @@
|
|||||||
import random
|
|
||||||
|
|
||||||
from nonebot.adapters import Bot
|
|
||||||
from nonebot.plugin import PluginMetadata
|
|
||||||
from nonebot.rule import to_me
|
|
||||||
from nonebot_plugin_alconna import (
|
|
||||||
Alconna,
|
|
||||||
Args,
|
|
||||||
Arparma,
|
|
||||||
CommandMeta,
|
|
||||||
Option,
|
|
||||||
on_alconna,
|
|
||||||
store_true,
|
|
||||||
)
|
|
||||||
from nonebot_plugin_uninfo import Uninfo
|
|
||||||
|
|
||||||
from zhenxun.configs.config import BotConfig, Config
|
|
||||||
from zhenxun.configs.utils import Command, PluginExtraData, RegisterConfig
|
|
||||||
from zhenxun.models.ban_console import BanConsole
|
|
||||||
from zhenxun.models.friend_user import FriendUser
|
|
||||||
from zhenxun.models.group_member_info import GroupInfoUser
|
|
||||||
from zhenxun.services.log import logger
|
|
||||||
from zhenxun.utils.depends import UserName
|
|
||||||
from zhenxun.utils.enum import PluginType
|
|
||||||
from zhenxun.utils.message import MessageUtils
|
|
||||||
from zhenxun.utils.platform import PlatformUtils
|
|
||||||
|
|
||||||
__plugin_meta__ = PluginMetadata(
|
|
||||||
name="昵称系统",
|
|
||||||
description="区区昵称,才不想叫呢!",
|
|
||||||
usage=f"""
|
|
||||||
个人昵称,将替换{BotConfig.self_nickname}称呼你的名称,群聊 与 私聊 昵称相互独立,
|
|
||||||
全局昵称设置将更改您目前所有群聊中及私聊的昵称
|
|
||||||
指令:
|
|
||||||
以后叫我 [昵称]: 设置当前群聊/私聊的昵称
|
|
||||||
全局昵称设置 [昵称]: 设置当前所有群聊和私聊的昵称
|
|
||||||
{BotConfig.self_nickname}我是谁
|
|
||||||
""".strip(),
|
|
||||||
extra=PluginExtraData(
|
|
||||||
author="HibiKier",
|
|
||||||
version="0.1",
|
|
||||||
plugin_type=PluginType.NORMAL,
|
|
||||||
menu_type="其他",
|
|
||||||
commands=[
|
|
||||||
Command(command="以后叫我 [昵称]"),
|
|
||||||
Command(command="全局昵称设置 [昵称]"),
|
|
||||||
Command(command=f"{BotConfig.self_nickname}我是谁"),
|
|
||||||
],
|
|
||||||
configs=[
|
|
||||||
RegisterConfig(
|
|
||||||
key="BLACK_WORD",
|
|
||||||
value=["爸", "爹", "爷", "父"],
|
|
||||||
help="昵称所屏蔽的关键词,已设置的昵称会被替换为 *,"
|
|
||||||
"未设置的昵称会在设置时提示",
|
|
||||||
default_value=None,
|
|
||||||
type=list[str],
|
|
||||||
)
|
|
||||||
],
|
|
||||||
).to_dict(),
|
|
||||||
)
|
|
||||||
|
|
||||||
_nickname_matcher = on_alconna(
|
|
||||||
Alconna(
|
|
||||||
"re:(?:以后)?(?:叫我|请叫我|称呼我)",
|
|
||||||
Args["name?", str],
|
|
||||||
meta=CommandMeta(compact=True),
|
|
||||||
),
|
|
||||||
rule=to_me(),
|
|
||||||
priority=5,
|
|
||||||
block=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
_global_nickname_matcher = on_alconna(
|
|
||||||
Alconna("设置全局昵称", Args["name?", str], meta=CommandMeta(compact=True)),
|
|
||||||
rule=to_me(),
|
|
||||||
priority=5,
|
|
||||||
block=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
_matcher = on_alconna(
|
|
||||||
Alconna(
|
|
||||||
"nickname",
|
|
||||||
Option("--name", action=store_true, help_text="用户昵称"),
|
|
||||||
Option("--cancel", action=store_true, help_text="取消昵称"),
|
|
||||||
),
|
|
||||||
rule=to_me(),
|
|
||||||
priority=5,
|
|
||||||
block=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
_matcher.shortcut(
|
|
||||||
"我(是谁|叫什么)",
|
|
||||||
command="nickname",
|
|
||||||
arguments=["--name"],
|
|
||||||
prefix=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
_matcher.shortcut(
|
|
||||||
"取消昵称",
|
|
||||||
command="nickname",
|
|
||||||
arguments=["--cancel"],
|
|
||||||
prefix=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
CALL_NAME = [
|
|
||||||
"好啦好啦,我知道啦,{},以后就这么叫你吧",
|
|
||||||
f"嗯嗯,{BotConfig.self_nickname}" + "记住你的昵称了哦,{}",
|
|
||||||
"好突然,突然要叫你昵称什么的...{}..",
|
|
||||||
f"{BotConfig.self_nickname}" + "会好好记住{}的,放心吧",
|
|
||||||
"好..好.,那窝以后就叫你{}了.",
|
|
||||||
]
|
|
||||||
|
|
||||||
REMIND = [
|
|
||||||
"我肯定记得你啊,你是{}啊",
|
|
||||||
"我不会忘记你的,你也不要忘记我!{}",
|
|
||||||
f"哼哼,{BotConfig.self_nickname}" + "记忆力可是很好的,{}",
|
|
||||||
"嗯?你是失忆了嘛...{}..",
|
|
||||||
f"不要小看{BotConfig.self_nickname}" + "的记忆力啊!笨蛋{}!QAQ",
|
|
||||||
"哎?{}..怎么了吗..突然这样问..",
|
|
||||||
]
|
|
||||||
|
|
||||||
CANCEL = [
|
|
||||||
f"呜..{BotConfig.self_nickname}" + "睡一觉就会忘记的..和梦一样..{}",
|
|
||||||
"窝知道了..{}..",
|
|
||||||
f"是{BotConfig.self_nickname}" + "哪里做的不好嘛..好吧..晚安{}",
|
|
||||||
"呃,{},下次我绝对绝对绝对不会再忘记你!",
|
|
||||||
"可..可恶!{}!太可恶了!呜",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
async def CheckNickname(
|
|
||||||
bot: Bot,
|
|
||||||
session: Uninfo,
|
|
||||||
params: Arparma,
|
|
||||||
):
|
|
||||||
"""
|
|
||||||
检查名称是否合法
|
|
||||||
"""
|
|
||||||
black_word = Config.get_config("nickname", "BLACK_WORD")
|
|
||||||
name = params.query("name")
|
|
||||||
logger.debug(f"昵称检查: {name}", "昵称设置", session=session)
|
|
||||||
if not name:
|
|
||||||
await MessageUtils.build_message("叫你空白?叫你虚空?叫你无名??").finish(
|
|
||||||
at_sender=True
|
|
||||||
)
|
|
||||||
if session.user.id in bot.config.superusers:
|
|
||||||
logger.debug(
|
|
||||||
f"超级用户设置昵称, 跳过合法检测: {name}", "昵称设置", session=session
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
if len(name) > 20:
|
|
||||||
await MessageUtils.build_message("昵称可不能超过20个字!").finish(
|
|
||||||
at_sender=True
|
|
||||||
)
|
|
||||||
if name in bot.config.nickname:
|
|
||||||
await MessageUtils.build_message("笨蛋!休想占用我的名字! ").finish(
|
|
||||||
at_sender=True
|
|
||||||
)
|
|
||||||
if black_word:
|
|
||||||
for x in name:
|
|
||||||
if x in black_word:
|
|
||||||
logger.debug("昵称设置禁止字符: [{x}]", "昵称设置", session=session)
|
|
||||||
await MessageUtils.build_message(f"字符 [{x}] 为禁止字符!").finish(
|
|
||||||
at_sender=True
|
|
||||||
)
|
|
||||||
for word in black_word:
|
|
||||||
if word in name:
|
|
||||||
logger.debug(
|
|
||||||
"昵称设置禁止字符: [{word}]", "昵称设置", session=session
|
|
||||||
)
|
|
||||||
await MessageUtils.build_message(
|
|
||||||
f"字符 [{word}] 为禁止字符!"
|
|
||||||
).finish(at_sender=True)
|
|
||||||
return name
|
|
||||||
|
|
||||||
|
|
||||||
@_nickname_matcher.handle()
|
|
||||||
async def _(
|
|
||||||
bot: Bot,
|
|
||||||
session: Uninfo,
|
|
||||||
name_: Arparma,
|
|
||||||
uname: str = UserName(),
|
|
||||||
):
|
|
||||||
name = await CheckNickname(bot, session, name_)
|
|
||||||
if len(name) < 5 and random.random() < 0.3:
|
|
||||||
name = "~".join(name)
|
|
||||||
group_id = None
|
|
||||||
if session.group:
|
|
||||||
group_id = session.group.parent.id if session.group.parent else session.group.id
|
|
||||||
if group_id:
|
|
||||||
await GroupInfoUser.set_user_nickname(
|
|
||||||
session.user.id,
|
|
||||||
group_id,
|
|
||||||
name,
|
|
||||||
uname,
|
|
||||||
PlatformUtils.get_platform(session),
|
|
||||||
)
|
|
||||||
logger.info(f"设置群昵称成功: {name}", "昵称设置", session=session)
|
|
||||||
else:
|
|
||||||
await FriendUser.set_user_nickname(
|
|
||||||
session.user.id,
|
|
||||||
name,
|
|
||||||
uname,
|
|
||||||
PlatformUtils.get_platform(session),
|
|
||||||
)
|
|
||||||
logger.info(f"设置私聊昵称成功: {name}", "昵称设置", session=session)
|
|
||||||
await MessageUtils.build_message(random.choice(CALL_NAME).format(name)).finish(
|
|
||||||
reply_to=True
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@_global_nickname_matcher.handle()
|
|
||||||
async def _(
|
|
||||||
bot: Bot,
|
|
||||||
session: Uninfo,
|
|
||||||
name_: Arparma,
|
|
||||||
nickname: str = UserName(),
|
|
||||||
):
|
|
||||||
name = await CheckNickname(bot, session, name_)
|
|
||||||
await FriendUser.set_user_nickname(
|
|
||||||
session.user.id,
|
|
||||||
name,
|
|
||||||
nickname,
|
|
||||||
PlatformUtils.get_platform(session),
|
|
||||||
)
|
|
||||||
await GroupInfoUser.filter(user_id=session.user.id).update(nickname=name)
|
|
||||||
logger.info(f"设置全局昵称成功: {name}", "设置全局昵称", session=session)
|
|
||||||
await MessageUtils.build_message(random.choice(CALL_NAME).format(name)).finish(
|
|
||||||
reply_to=True
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@_matcher.assign("name")
|
|
||||||
async def _(session: Uninfo, uname: str = UserName()):
|
|
||||||
group_id = None
|
|
||||||
if session.group:
|
|
||||||
group_id = session.group.parent.id if session.group.parent else session.group.id
|
|
||||||
if group_id:
|
|
||||||
nickname = await GroupInfoUser.get_user_nickname(session.user.id, group_id)
|
|
||||||
else:
|
|
||||||
nickname = await FriendUser.get_user_nickname(session.user.id)
|
|
||||||
if nickname:
|
|
||||||
await MessageUtils.build_message(random.choice(REMIND).format(nickname)).finish(
|
|
||||||
reply_to=True
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
card = uname
|
|
||||||
await MessageUtils.build_message(
|
|
||||||
random.choice(
|
|
||||||
[
|
|
||||||
"没..没有昵称嘛,{}",
|
|
||||||
"啊,你是{}啊,我想叫你的昵称!",
|
|
||||||
"是{}啊,有什么事吗?",
|
|
||||||
"你是{}?",
|
|
||||||
]
|
|
||||||
).format(card)
|
|
||||||
).finish(reply_to=True)
|
|
||||||
|
|
||||||
|
|
||||||
@_matcher.assign("cancel")
|
|
||||||
async def _(bot: Bot, session: Uninfo):
|
|
||||||
group_id = None
|
|
||||||
if session.group:
|
|
||||||
group_id = session.group.parent.id if session.group.parent else session.group.id
|
|
||||||
if group_id:
|
|
||||||
nickname = await GroupInfoUser.get_user_nickname(session.user.id, group_id)
|
|
||||||
else:
|
|
||||||
nickname = await FriendUser.get_user_nickname(session.user.id)
|
|
||||||
if nickname:
|
|
||||||
await MessageUtils.build_message(random.choice(CANCEL).format(nickname)).send(
|
|
||||||
reply_to=True
|
|
||||||
)
|
|
||||||
if group_id:
|
|
||||||
await GroupInfoUser.set_user_nickname(session.user.id, group_id, "")
|
|
||||||
else:
|
|
||||||
await FriendUser.set_user_nickname(session.user.id, "")
|
|
||||||
await BanConsole.ban(
|
|
||||||
session.user.id, group_id, 9, "用户昵称违规", 60, bot.self_id
|
|
||||||
)
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
await MessageUtils.build_message("你在做梦吗?你没有昵称啊").finish(
|
|
||||||
reply_to=True
|
|
||||||
)
|
|
||||||
@@ -40,9 +40,7 @@ _REFRESH_TASKS: set[asyncio.Task] = set()
|
|||||||
|
|
||||||
|
|
||||||
def _normalize_platform(platform: str | set[str] | None) -> str | None:
|
def _normalize_platform(platform: str | set[str] | None) -> str | None:
|
||||||
if isinstance(platform, set):
|
return next(iter(platform), None) if isinstance(platform, set) else platform
|
||||||
return next(iter(platform), None)
|
|
||||||
return platform
|
|
||||||
|
|
||||||
|
|
||||||
async def _safe_get_group_member_info(bot: Bot, group_id: str, user_id: str) -> dict:
|
async def _safe_get_group_member_info(bot: Bot, group_id: str, user_id: str) -> dict:
|
||||||
@@ -409,12 +407,11 @@ class GroupManager:
|
|||||||
operator_user = await GroupInfoUser.get_or_none(
|
operator_user = await GroupInfoUser.get_or_none(
|
||||||
user_id=operator_id, group_id=group_id
|
user_id=operator_id, group_id=group_id
|
||||||
)
|
)
|
||||||
if operator_user:
|
operator_name = (
|
||||||
operator_name = (
|
(operator_user.user_name or operator_id)
|
||||||
operator_user.nickname or operator_user.user_name or operator_id
|
if operator_user
|
||||||
)
|
else operator_id
|
||||||
else:
|
)
|
||||||
operator_name = operator_id
|
|
||||||
else:
|
else:
|
||||||
operator_name = ""
|
operator_name = ""
|
||||||
return f"{user_name} 被 {operator_name} 送走了."
|
return f"{user_name} 被 {operator_name} 送走了."
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from tortoise import fields
|
from tortoise import fields
|
||||||
|
|
||||||
from zhenxun.configs.config import Config
|
|
||||||
from zhenxun.services.db_context import Model
|
from zhenxun.services.db_context import Model
|
||||||
|
|
||||||
|
|
||||||
@@ -11,8 +10,6 @@ class FriendUser(Model):
|
|||||||
"""用户id"""
|
"""用户id"""
|
||||||
user_name = fields.CharField(max_length=255, default="", description="用户名称")
|
user_name = fields.CharField(max_length=255, default="", description="用户名称")
|
||||||
"""用户名称"""
|
"""用户名称"""
|
||||||
nickname = fields.CharField(max_length=255, null=True, description="用户自定义昵称")
|
|
||||||
"""私聊下自定义昵称"""
|
|
||||||
platform = fields.CharField(255, null=True, description="平台")
|
platform = fields.CharField(255, null=True, description="平台")
|
||||||
"""平台"""
|
"""平台"""
|
||||||
|
|
||||||
@@ -31,53 +28,6 @@ class FriendUser(Model):
|
|||||||
return user.user_name
|
return user.user_name
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
@classmethod
|
|
||||||
async def get_user_nickname(cls, user_id: str) -> str:
|
|
||||||
"""获取用户昵称
|
|
||||||
|
|
||||||
参数:
|
|
||||||
user_id: 用户id
|
|
||||||
"""
|
|
||||||
if user := await cls.get_or_none(user_id=user_id):
|
|
||||||
if user.nickname:
|
|
||||||
_tmp = ""
|
|
||||||
if black_word := Config.get_config("nickname", "BLACK_WORD"):
|
|
||||||
for x in user.nickname:
|
|
||||||
_tmp += "*" if x in black_word else x
|
|
||||||
return _tmp
|
|
||||||
return ""
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
async def set_user_nickname(
|
|
||||||
cls,
|
|
||||||
user_id: str,
|
|
||||||
nickname: str,
|
|
||||||
uname: str | None = None,
|
|
||||||
platform: str | None = None,
|
|
||||||
):
|
|
||||||
"""设置用户昵称
|
|
||||||
|
|
||||||
参数:
|
|
||||||
user_id: 用户id
|
|
||||||
nickname: 昵称
|
|
||||||
uname: 用户昵称
|
|
||||||
platform: 平台
|
|
||||||
"""
|
|
||||||
defaults = {"nickname": nickname}
|
|
||||||
if uname is not None:
|
|
||||||
defaults["user_name"] = uname
|
|
||||||
if platform is not None:
|
|
||||||
defaults["platform"] = platform
|
|
||||||
await cls.update_or_create(
|
|
||||||
user_id=user_id,
|
|
||||||
defaults=defaults,
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _run_script(cls):
|
def _run_script(cls):
|
||||||
return [
|
return ["ALTER TABLE friend_users DROP COLUMN nickname;"]
|
||||||
"ALTER TABLE friend_users "
|
|
||||||
"ALTER COLUMN user_id TYPE character varying(255);",
|
|
||||||
"ALTER TABLE friend_users "
|
|
||||||
"ADD COLUMN platform character varying(255) default 'qq';",
|
|
||||||
]
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
from tortoise import fields
|
from tortoise import fields
|
||||||
|
|
||||||
from zhenxun.configs.config import Config
|
|
||||||
from zhenxun.services.db_context import Model
|
from zhenxun.services.db_context import Model
|
||||||
|
|
||||||
|
|
||||||
@@ -15,8 +14,6 @@ class GroupInfoUser(Model):
|
|||||||
"""群聊id"""
|
"""群聊id"""
|
||||||
user_join_time = fields.DatetimeField(null=True)
|
user_join_time = fields.DatetimeField(null=True)
|
||||||
"""用户入群时间"""
|
"""用户入群时间"""
|
||||||
nickname = fields.CharField(255, null=True)
|
|
||||||
"""群聊昵称"""
|
|
||||||
uid = fields.BigIntField(null=True)
|
uid = fields.BigIntField(null=True)
|
||||||
"""用户uid"""
|
"""用户uid"""
|
||||||
platform = fields.CharField(255, null=True, description="平台")
|
platform = fields.CharField(255, null=True, description="平台")
|
||||||
@@ -28,7 +25,7 @@ class GroupInfoUser(Model):
|
|||||||
unique_together = ("user_id", "group_id")
|
unique_together = ("user_id", "group_id")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def get_all_uid(cls, group_id: str) -> set[int]:
|
async def get_all_uid(cls, group_id: str) -> set[str]:
|
||||||
"""获取该群所有用户id
|
"""获取该群所有用户id
|
||||||
|
|
||||||
参数:
|
参数:
|
||||||
@@ -39,78 +36,16 @@ class GroupInfoUser(Model):
|
|||||||
) # type: ignore
|
) # type: ignore
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def set_user_nickname(
|
async def get_user_all_group(cls, user_id: str) -> list[str]:
|
||||||
cls,
|
|
||||||
user_id: str,
|
|
||||||
group_id: str,
|
|
||||||
nickname: str,
|
|
||||||
uname: str | None = None,
|
|
||||||
platform: str | None = None,
|
|
||||||
):
|
|
||||||
"""设置群员在该群内的昵称
|
|
||||||
|
|
||||||
参数:
|
|
||||||
user_id: 用户id
|
|
||||||
group_id: 群号
|
|
||||||
nickname: 昵称
|
|
||||||
uname: 用户昵称
|
|
||||||
platform: 平台
|
|
||||||
"""
|
|
||||||
defaults = {"nickname": nickname}
|
|
||||||
if uname is not None:
|
|
||||||
defaults["user_name"] = uname
|
|
||||||
if platform is not None:
|
|
||||||
defaults["platform"] = platform
|
|
||||||
await cls.update_or_create(
|
|
||||||
user_id=user_id,
|
|
||||||
group_id=group_id,
|
|
||||||
defaults=defaults,
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
async def get_user_all_group(cls, user_id: str) -> list[int]:
|
|
||||||
"""获取该用户所在的所有群聊
|
"""获取该用户所在的所有群聊
|
||||||
|
|
||||||
参数:
|
参数:
|
||||||
user_id: 用户id
|
user_id: 用户id
|
||||||
"""
|
"""
|
||||||
return list(
|
return list(
|
||||||
await cls.filter(user_id=str(user_id)).values_list("group_id", flat=True)
|
await cls.filter(user_id=user_id).values_list("group_id", flat=True)
|
||||||
) # type: ignore
|
) # type: ignore
|
||||||
|
|
||||||
@classmethod
|
|
||||||
async def get_user_nickname(cls, user_id: str, group_id: str) -> str:
|
|
||||||
"""获取用户在该群的昵称
|
|
||||||
|
|
||||||
参数:
|
|
||||||
user_id: 用户id
|
|
||||||
group_id: 群号
|
|
||||||
"""
|
|
||||||
if user := await cls.get_or_none(user_id=user_id, group_id=group_id):
|
|
||||||
if user.nickname:
|
|
||||||
nickname = ""
|
|
||||||
if black_word := Config.get_config("nickname", "BLACK_WORD"):
|
|
||||||
for x in user.nickname:
|
|
||||||
nickname += "*" if x in black_word else x
|
|
||||||
return nickname
|
|
||||||
return user.nickname
|
|
||||||
return ""
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def _run_script(cls):
|
async def _run_script(cls):
|
||||||
return [
|
return ["ALTER TABLE group_info_users DROP COLUMN nickname;"]
|
||||||
# 允许 user_join_time 为空
|
|
||||||
"alter table group_info_users alter user_join_time drop not null;",
|
|
||||||
"ALTER TABLE group_info_users "
|
|
||||||
"ALTER COLUMN user_join_time TYPE timestamp with time zone "
|
|
||||||
"USING user_join_time::timestamp with time zone;",
|
|
||||||
# 将user_id改为user_id
|
|
||||||
"ALTER TABLE group_info_users RENAME COLUMN user_qq TO user_id;",
|
|
||||||
"ALTER TABLE group_info_users "
|
|
||||||
"ALTER COLUMN user_id TYPE character varying(255);",
|
|
||||||
# 将user_id字段类型改为character varying(255)
|
|
||||||
"ALTER TABLE group_info_users "
|
|
||||||
"ALTER COLUMN group_id TYPE character varying(255);",
|
|
||||||
"ALTER TABLE group_info_users "
|
|
||||||
"ADD COLUMN platform character varying(255) default 'qq';",
|
|
||||||
]
|
|
||||||
|
|||||||
Reference in New Issue
Block a user