mirror of
https://github.com/RockChinQ/QChatGPT.git
synced 2024-11-16 03:32:33 +08:00
feat: 支持禁用某人或某群
This commit is contained in:
parent
0afc2d5903
commit
bf7487fafe
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -4,3 +4,4 @@ __pycache__/
|
||||||
database.db
|
database.db
|
||||||
qchatgpt.log
|
qchatgpt.log
|
||||||
config.py
|
config.py
|
||||||
|
banlist.py
|
11
banlist-template.py
Normal file
11
banlist-template.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# 禁用列表
|
||||||
|
# person为个人,其中的QQ号会被禁止与机器人进行私聊或群聊交互
|
||||||
|
# 示例: person = [2854196310, 1234567890, 9876543210]
|
||||||
|
# group为群组,其中的群号会被禁止与机器人进行交互
|
||||||
|
# 示例: group = [123456789, 987654321, 1234567890]
|
||||||
|
|
||||||
|
# 是否启用禁用列表
|
||||||
|
enable = True
|
||||||
|
|
||||||
|
person = [2854196310] # 2854196310是Q群管家机器人的QQ号,默认屏蔽以免出现循环
|
||||||
|
group = [204785790] # 204785790是本项目交流群的群号,默认屏蔽,避免在交流群测试机器人
|
4
main.py
4
main.py
|
@ -221,6 +221,10 @@ if __name__ == '__main__':
|
||||||
print('请先在config.py中填写配置')
|
print('请先在config.py中填写配置')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
# 检查是否有banlist.py,如果没有就把banlist-template.py复制一份
|
||||||
|
if not os.path.exists('banlist.py'):
|
||||||
|
shutil.copy('banlist-template.py', 'banlist.py')
|
||||||
|
|
||||||
if len(sys.argv) > 1 and sys.argv[1] == 'init_db':
|
if len(sys.argv) > 1 and sys.argv[1] == 'init_db':
|
||||||
init_db()
|
init_db()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
|
@ -55,11 +55,24 @@ class QQBotManager:
|
||||||
|
|
||||||
reply_filter = None
|
reply_filter = None
|
||||||
|
|
||||||
|
enable_banlist = False
|
||||||
|
|
||||||
|
ban_person = []
|
||||||
|
ban_group = []
|
||||||
|
|
||||||
def __init__(self, mirai_http_api_config: dict, timeout: int = 60, retry: int = 3, first_time_init=True):
|
def __init__(self, mirai_http_api_config: dict, timeout: int = 60, retry: int = 3, first_time_init=True):
|
||||||
|
|
||||||
self.timeout = timeout
|
self.timeout = timeout
|
||||||
self.retry = retry
|
self.retry = retry
|
||||||
|
|
||||||
|
# 加载禁用列表
|
||||||
|
if os.path.exists("banlist.py"):
|
||||||
|
import banlist
|
||||||
|
self.enable_banlist = banlist.enable
|
||||||
|
self.ban_person = banlist.person
|
||||||
|
self.ban_group = banlist.group
|
||||||
|
logging.info("加载禁用列表: person: {}, group: {}".format(self.ban_person, self.ban_group))
|
||||||
|
|
||||||
config = pkg.utils.context.get_config()
|
config = pkg.utils.context.get_config()
|
||||||
if os.path.exists("sensitive.json") \
|
if os.path.exists("sensitive.json") \
|
||||||
and config.sensitive_word_filter is not None \
|
and config.sensitive_word_filter is not None \
|
||||||
|
|
|
@ -100,12 +100,21 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str, mes
|
||||||
reply = []
|
reply = []
|
||||||
session_name = "{}_{}".format(launcher_type, launcher_id)
|
session_name = "{}_{}".format(launcher_type, launcher_id)
|
||||||
|
|
||||||
# 检查是否被禁言
|
# 检查发送方是否被禁用
|
||||||
if launcher_type == 'group':
|
if pkg.utils.context.get_qqbot_manager().enable_banlist:
|
||||||
result = mgr.bot.member_info(target=launcher_id, member_id=mgr.bot.qq).get()
|
if sender_id in pkg.utils.context.get_qqbot_manager().ban_person:
|
||||||
result = asyncio.run(result)
|
logging.info("根据禁用列表忽略用户{}的消息".format(sender_id))
|
||||||
if result.mute_time_remaining > 0:
|
return []
|
||||||
logging.info("机器人被禁言,跳过消息处理(group_{},剩余{}s)".format(launcher_id,
|
if launcher_type == 'group' and launcher_id in pkg.utils.context.get_qqbot_manager().ban_group:
|
||||||
|
logging.info("根据禁用列表忽略群{}的消息".format(launcher_id))
|
||||||
|
return []
|
||||||
|
|
||||||
|
# 检查是否被禁言
|
||||||
|
if launcher_type == 'group':
|
||||||
|
result = mgr.bot.member_info(target=launcher_id, member_id=mgr.bot.qq).get()
|
||||||
|
result = asyncio.run(result)
|
||||||
|
if result.mute_time_remaining > 0:
|
||||||
|
logging.info("机器人被禁言,跳过消息处理(group_{},剩余{}s)".format(launcher_id,
|
||||||
result.mute_time_remaining))
|
result.mute_time_remaining))
|
||||||
return reply
|
return reply
|
||||||
|
|
||||||
|
@ -229,11 +238,12 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str, mes
|
||||||
|
|
||||||
api_keys = pkg.utils.context.get_openai_manager().key_mgr.api_key
|
api_keys = pkg.utils.context.get_openai_manager().key_mgr.api_key
|
||||||
for key_name in api_keys:
|
for key_name in api_keys:
|
||||||
text_length = pkg.utils.context.get_openai_manager().audit_mgr\
|
text_length = pkg.utils.context.get_openai_manager().audit_mgr \
|
||||||
.get_text_length_of_key(api_keys[key_name])
|
.get_text_length_of_key(api_keys[key_name])
|
||||||
image_count = pkg.utils.context.get_openai_manager().audit_mgr\
|
image_count = pkg.utils.context.get_openai_manager().audit_mgr \
|
||||||
.get_image_count_of_key(api_keys[key_name])
|
.get_image_count_of_key(api_keys[key_name])
|
||||||
reply_str += "{}:\n - 文本长度:{}\n - 图片数量:{}\n".format(key_name, int(text_length), int(image_count))
|
reply_str += "{}:\n - 文本长度:{}\n - 图片数量:{}\n".format(key_name, int(text_length),
|
||||||
|
int(image_count))
|
||||||
|
|
||||||
reply = [reply_str]
|
reply = [reply_str]
|
||||||
elif cmd == 'draw':
|
elif cmd == 'draw':
|
||||||
|
@ -286,7 +296,7 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str, mes
|
||||||
params = [config_item] + params
|
params = [config_item] + params
|
||||||
reply = config_operation("cfg", params)
|
reply = config_operation("cfg", params)
|
||||||
else:
|
else:
|
||||||
reply = ["[bot]err:未知的指令或权限不足: "+cmd]
|
reply = ["[bot]err:未知的指令或权限不足: " + cmd]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
mgr.notify_admin("{}指令执行失败:{}".format(session_name, e))
|
mgr.notify_admin("{}指令执行失败:{}".format(session_name, e))
|
||||||
logging.exception(e)
|
logging.exception(e)
|
||||||
|
@ -313,8 +323,9 @@ def process_message(launcher_type: str, launcher_id: int, text_message: str, mes
|
||||||
switched, name = pkg.utils.context.get_openai_manager().key_mgr.auto_switch()
|
switched, name = pkg.utils.context.get_openai_manager().key_mgr.auto_switch()
|
||||||
|
|
||||||
if not switched:
|
if not switched:
|
||||||
mgr.notify_admin("API调用额度超限({}),无可用api_key,请向OpenAI账户充值或在config.py中更换api_key".format(
|
mgr.notify_admin(
|
||||||
current_tokens_amt))
|
"API调用额度超限({}),无可用api_key,请向OpenAI账户充值或在config.py中更换api_key".format(
|
||||||
|
current_tokens_amt))
|
||||||
reply = ["[bot]err:API调用额度超额,请联系作者,或等待修复"]
|
reply = ["[bot]err:API调用额度超额,请联系作者,或等待修复"]
|
||||||
else:
|
else:
|
||||||
openai.api_key = pkg.utils.context.get_openai_manager().key_mgr.get_using_key()
|
openai.api_key = pkg.utils.context.get_openai_manager().key_mgr.get_using_key()
|
||||||
|
|
|
@ -31,6 +31,7 @@ def reload_all(notify=True):
|
||||||
walk(pkg)
|
walk(pkg)
|
||||||
importlib.reload(__import__('config'))
|
importlib.reload(__import__('config'))
|
||||||
importlib.reload(__import__('main'))
|
importlib.reload(__import__('main'))
|
||||||
|
importlib.reload(__import__('banlist'))
|
||||||
pkg.utils.context.context = context
|
pkg.utils.context.context = context
|
||||||
|
|
||||||
# 执行启动流程
|
# 执行启动流程
|
||||||
|
|
Loading…
Reference in New Issue
Block a user