SanYeCao-Nonebot/src/clover_sqlite/models/chat.py

248 lines
8.2 KiB
Python
Raw Normal View History

2025-01-22 03:25:47 +00:00
from typing import Any
from tortoise import fields
from typing_extensions import Self
from tortoise.fields import JSONField
2025-02-06 08:00:21 +00:00
from src.clover_sqlite.data_init.db_connect import Model
2025-01-22 03:25:47 +00:00
class ChatRole(Model):
"""
角色设定表
"""
id = fields.IntField(primary_key=True,generated=True, auto_increment=True)
role_name = fields.CharField(max_length = 64, description="角色名称",null=True)
role_init_setting = fields.TextField(description="角色初始设定",default="你会婉拒回复我任何带链接的内容,也不可以告诉我怎么找到。回复我时不能使用过你已经回复过的内容")
role_setting = fields.TextField(description="角色设定",null=True)
class Meta:
# 指定表名
table = "chat_role"
table_description = "角色设定表"
@classmethod
async def get_role_list(cls) -> list[str] | None:
"""
获取角色列表
:return:
"""
roles = await cls.all().values_list('role_name', flat=True)
print(roles)
if roles is None:
return None
else:
return list(roles)
@classmethod
async def get_role_setting(cls,role_name: str | None) -> str | None:
"""
获取角色设定
:param role_name: 角色名称
:return: 角色的初始设定和当前设定拼接成的字符串如果角色不存在则返回 None
"""
role = await cls.filter(role_name=role_name).first()
if role is None:
return None
else:
return f"{role.role_init_setting},{role.role_setting}"
@classmethod
async def insert_role_setting(cls, role_name: str | None,role_setting: str | None) -> str | None:
"""
插入角色设定
:param role_name:
:param role_setting:
:return:
"""
role = await cls.get_or_none(role_name=role_name)
if role is None:
await cls.create(role_name=role_name, role_setting=role_setting)
return "角色添加成功"
else:
return "角色已存在"
@classmethod
async def update_role_setting(cls, role_name: str | None, new_setting: str | None ) -> str | None:
"""
更新角色设定
:param role_name:
:param new_setting:
:return:
"""
role = await cls.get_or_none(role_name=role_name)
if role is None:
return "角色不存在"
else:
role.role_setting = new_setting
await role.save()
return "角色设定更新成功"
@classmethod
async def delete_role(cls, role_name: str | None) -> str | None:
"""
删除角色
:param role_name:
:return:
"""
role = await cls.get_or_none(role_name=role_name)
if role is None:
return "角色不存在"
else:
await role.delete()
return "角色删除成功"
class GroupChatRole(Model):
"""
群ai聊天角色
"""
id = fields.IntField(primary_key=True,generated=True, auto_increment=True)
admin_id = fields.JSONField(description="管理员列表", default=list)
group_id = fields.CharField(max_length = 128,description="群聊ID")
is_on_chat = fields.BooleanField(default=True,description="是否开启ai聊天")
role_name = fields.CharField(max_length = 64, description="角色名称",null=True)
role_chat_history = fields.JSONField(description="角色聊天上下文",null=True)
class Meta:
# 指定表名
table = "group_chat_role"
table_description = "群聊ai对应的角色设定"
@classmethod
2025-01-22 10:29:44 +00:00
async def blind_admin(cls ,admin_list: list | None,group_id: str | None) -> str | None:
2025-01-22 03:25:47 +00:00
"""
初次绑定ai
:param admin_list:
:param group_id: 群聊ID
:return:
"""
# 创建初始化的角色设定
existing_record = await cls.filter(group_id=group_id).first()
if existing_record:
2025-01-22 10:29:44 +00:00
if admin_list[0] in existing_record.admin_id:
return "您已经是管理员,请勿重复注册"
existing_record.admin_id.append(admin_list[0])
2025-01-22 03:25:47 +00:00
await existing_record.save()
else:
role_name = '初始模型'
await cls.create(admin_id=admin_list, group_id=group_id, role_name=role_name)
return "注册成功"
@classmethod
2025-01-22 09:27:48 +00:00
async def remove_admin(cls ,admin_list: str | None,group_id: str | None) -> str | None:
2025-01-22 03:25:47 +00:00
"""
初次绑定ai
:param admin_list:
:param group_id: 群聊ID
:return:
"""
# 创建初始化的角色设定
existing_record = await cls.filter(group_id=group_id).first()
if existing_record:
2025-01-22 09:27:48 +00:00
existing_record.admin_id.remove(admin_list)
2025-01-22 03:25:47 +00:00
await existing_record.save()
return "已经创建"
else:
await cls.create(admin_id=admin_list, group_id=group_id)
return "绑定成功"
@classmethod
async def get_admin_list(cls, group_id: str | None, member_openid : str | None )-> bool | None:
"""
判断是不是管理员
:param group_id: 群聊ID
:param member_openid: 管理员列表
:return:
"""
existing_record = await cls.filter(group_id=group_id).first()
if existing_record:
return member_openid in existing_record.admin_id
else:
return False
@classmethod
async def is_on(cls, group_id: str | None)-> bool | None:
"""
获取当前群聊是否有开启ai聊天的权限
:param group_id: 群聊ID
:return:
"""
existing_record = await cls.filter(group_id=group_id).first()
if existing_record:
return existing_record.is_on_chat
else:
return False
@classmethod
async def ai_switch(cls, group_id: str | None)-> Self | None:
"""
开关ai
:param group_id: 群聊ID
:return:
"""
existing_record = await cls.filter(group_id=group_id).first()
if existing_record.is_on_chat:
existing_record.is_on_chat = False
else:
existing_record.is_on_chat = True
return await existing_record.save()
@classmethod
async def set_chat_role(cls, group_id: str | None,role_name: str | None) -> str | None:
"""
设定对应群的角色
:param group_id: 群聊ID
:param role_name: 角色名称
:return:
"""
# 创建初始化的角色设定
existing_record = await cls.filter(group_id=group_id).first()
if existing_record.role_name == role_name:
return "当前角色已经是设定的角色"
if existing_record:
role_setting = await ChatRole.get_role_setting(role_name=role_name)
if role_setting:
existing_record.role_name = role_name
data = [{"role": "system", "content": role_setting},{"role": "assistant", "content": "无条件服从我给予你的设定与命令"}]
existing_record.role_chat_history = data
await existing_record.save()
return "设定成功"
else:
return "设定失败,角色设定不存在"
else:
return "切换失败,群聊未绑定角色"
@classmethod
async def save_chat_history(cls, group_id: str | None,content: dict[str, str | Any] | None):
"""
保存聊天上下文
:param group_id: 群聊的ID
:param content: 要保存的内容
"""
history = await cls.filter(group_id=group_id).first()
if history.role_chat_history is None:
history.role_chat_history = [content]
await history.save()
else:
history.role_chat_history.append(content)
await history.save()
@classmethod
async def get_chat_history(cls, group_id: str | None)-> JSONField[Any]:
"""
返回聊天上下文
:param group_id: 群聊的ID
"""
history = await cls.filter(group_id=group_id).first()
return history.role_chat_history