79 lines
3.1 KiB
Python
79 lines
3.1 KiB
Python
import asyncio
|
|
from .willing_manager import BaseWillingManager
|
|
|
|
class ClassicalWillingManager(BaseWillingManager):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self._decay_task: asyncio.Task = None
|
|
|
|
async def _decay_reply_willing(self):
|
|
"""定期衰减回复意愿"""
|
|
while True:
|
|
await asyncio.sleep(1)
|
|
for chat_id in self.chat_reply_willing:
|
|
self.chat_reply_willing[chat_id] = max(0, self.chat_reply_willing[chat_id] * 0.9)
|
|
|
|
async def async_task_starter(self):
|
|
if self._decay_task is None:
|
|
self._decay_task = asyncio.create_task(self._decay_reply_willing())
|
|
|
|
async def get_reply_probability(self, message_id):
|
|
willing_info = self.ongoing_messages[message_id]
|
|
chat_id = willing_info.chat_id
|
|
current_willing = self.chat_reply_willing.get(chat_id, 0)
|
|
|
|
interested_rate = willing_info.interested_rate * self.global_config.response_interested_rate_amplifier
|
|
|
|
if interested_rate > 0.4:
|
|
current_willing += interested_rate - 0.3
|
|
|
|
if willing_info.is_mentioned_bot and current_willing < 1.0:
|
|
current_willing += 1
|
|
elif willing_info.is_mentioned_bot:
|
|
current_willing += 0.05
|
|
|
|
is_emoji_not_reply = False
|
|
if willing_info.is_emoji:
|
|
if self.global_config.emoji_response_penalty != 0:
|
|
current_willing *= self.global_config.emoji_response_penalty
|
|
else:
|
|
is_emoji_not_reply = True
|
|
|
|
self.chat_reply_willing[chat_id] = min(current_willing, 3.0)
|
|
|
|
reply_probability = min(max((current_willing - 0.5), 0.01) * self.global_config.response_willing_amplifier * 2, 1)
|
|
|
|
# 检查群组权限(如果是群聊)
|
|
if willing_info.group_info and willing_info.group_info.group_id in self.global_config.talk_frequency_down_groups:
|
|
reply_probability = reply_probability / self.global_config.down_frequency_rate
|
|
|
|
if is_emoji_not_reply:
|
|
reply_probability = 0
|
|
|
|
return reply_probability
|
|
|
|
async def before_generate_reply_handle(self, message_id):
|
|
chat_id = self.ongoing_messages[message_id].chat_id
|
|
current_willing = self.chat_reply_willing.get(chat_id, 0)
|
|
self.chat_reply_willing[chat_id] = max(0, current_willing - 1.8)
|
|
|
|
async def after_generate_reply_handle(self, message_id):
|
|
chat_id = self.ongoing_messages[message_id].chat_id
|
|
current_willing = self.chat_reply_willing.get(chat_id, 0)
|
|
if current_willing < 1:
|
|
self.chat_reply_willing[chat_id] = min(1, current_willing + 0.4)
|
|
|
|
async def bombing_buffer_message_handle(self, message_id):
|
|
return await super().bombing_buffer_message_handle(message_id)
|
|
|
|
async def not_reply_handle(self, message_id):
|
|
return await super().not_reply_handle(message_id)
|
|
|
|
async def get_variable_parameters(self):
|
|
return await super().get_variable_parameters()
|
|
|
|
async def set_variable_parameters(self, parameters):
|
|
return await super().set_variable_parameters(parameters)
|
|
|
|
|