59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
import asyncio
|
|
|
|
|
|
async def natural_send_message(
|
|
text, send, start_typing, stop_typing, skip_thinking=False
|
|
):
|
|
"""
|
|
Parses and sends messages with natural delays based on message length.
|
|
|
|
Args:
|
|
chat_session: The active chat session.
|
|
ts: Timestamp of the message.
|
|
c: The context or object with `.send()`, `.start_typing()`,
|
|
and `.stop_typing()` methods.
|
|
text: A string containing multiple messages separated by double newlines (`\n\n`).
|
|
|
|
Behavior:
|
|
- Short messages are sent quickly with minimal delay.
|
|
- Longer messages include a "thinking" pause before typing.
|
|
- Typing indicator (`c.start_typing() / c.stop_typing()`) is used dynamically.
|
|
"""
|
|
|
|
parts = text.split("\n\n") # Split into separate messages
|
|
|
|
ids = []
|
|
|
|
for index, message in enumerate(parts):
|
|
message = message.strip()
|
|
if not message:
|
|
continue
|
|
|
|
# Compute natural "thinking" delay based on message length
|
|
base_delay = 0.8 # Minimum delay
|
|
length_factor = len(message) / 25
|
|
# ~50 chars ≈ +1s processing
|
|
# ~25 chars ≈ +1s processing
|
|
natural_delay = min(base_delay + length_factor, 10) # Cap at 10s max
|
|
|
|
# Decide when to start thinking *before* typing
|
|
if not skip_thinking:
|
|
if natural_delay > 3.5: # Only delay if response is long
|
|
await asyncio.sleep(
|
|
natural_delay - 3.5
|
|
) # "Thinking" pause before typing
|
|
|
|
# Start typing
|
|
await start_typing()
|
|
await asyncio.sleep(natural_delay) # Finish remaining delay
|
|
await stop_typing()
|
|
|
|
# Send the message
|
|
result = await send(message)
|
|
ids.append(result)
|
|
|
|
# Optional: Small buffer between messages to prevent rapid-fire responses
|
|
await asyncio.sleep(0.5)
|
|
|
|
return ids
|