Add per-chat bot message cooldown overrides
This commit is contained in:
+35
-2
@@ -26,6 +26,9 @@ class BotIOLayer:
|
|||||||
self.query_topic_map = self._parse_topic_map(
|
self.query_topic_map = self._parse_topic_map(
|
||||||
os.getenv("TELEGRAM_QUERY_TOPIC_MAP")
|
os.getenv("TELEGRAM_QUERY_TOPIC_MAP")
|
||||||
)
|
)
|
||||||
|
self.message_cooldown_map = self._parse_int_map(
|
||||||
|
os.getenv("POLYWEATHER_BOT_MESSAGE_COOLDOWN_BY_CHAT")
|
||||||
|
)
|
||||||
self.query_topic_chat_id = str(
|
self.query_topic_chat_id = str(
|
||||||
os.getenv("TELEGRAM_QUERY_TOPIC_CHAT_ID") or ""
|
os.getenv("TELEGRAM_QUERY_TOPIC_CHAT_ID") or ""
|
||||||
).strip()
|
).strip()
|
||||||
@@ -67,6 +70,34 @@ class BotIOLayer:
|
|||||||
out[chat_id] = topic_id
|
out[chat_id] = topic_id
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _parse_int_map(raw: Optional[str]) -> Dict[str, int]:
|
||||||
|
"""
|
||||||
|
Parse env maps like:
|
||||||
|
- "-1003586303099:10,-1003539418691:20"
|
||||||
|
- Supports comma/semicolon/newline separators.
|
||||||
|
"""
|
||||||
|
out: Dict[str, int] = {}
|
||||||
|
if not raw:
|
||||||
|
return out
|
||||||
|
normalized = str(raw).replace("\r", ",").replace("\n", ",").replace(";", ",")
|
||||||
|
for part in normalized.split(","):
|
||||||
|
row = part.strip()
|
||||||
|
if not row or ":" not in row:
|
||||||
|
continue
|
||||||
|
key, value_raw = row.split(":", 1)
|
||||||
|
key = str(key or "").strip()
|
||||||
|
value = BotIOLayer._safe_int(value_raw, default=-1)
|
||||||
|
if key and value >= 0:
|
||||||
|
out[key] = value
|
||||||
|
return out
|
||||||
|
|
||||||
|
def _resolve_message_cooldown(self, chat_id: Any) -> int:
|
||||||
|
chat_key = str(chat_id).strip() if chat_id is not None else ""
|
||||||
|
if chat_key and chat_key in self.message_cooldown_map:
|
||||||
|
return self.message_cooldown_map[chat_key]
|
||||||
|
return MESSAGE_COOLDOWN_SEC
|
||||||
|
|
||||||
def _resolve_query_target(
|
def _resolve_query_target(
|
||||||
self,
|
self,
|
||||||
source_chat_id: Any,
|
source_chat_id: Any,
|
||||||
@@ -214,15 +245,17 @@ class BotIOLayer:
|
|||||||
|
|
||||||
user = message.from_user
|
user = message.from_user
|
||||||
username = self.display_name(user)
|
username = self.display_name(user)
|
||||||
|
cooldown_sec = self._resolve_message_cooldown(getattr(chat, "id", None))
|
||||||
preview = text.strip().replace("\n", " ")
|
preview = text.strip().replace("\n", " ")
|
||||||
if len(preview) > 80:
|
if len(preview) > 80:
|
||||||
preview = preview[:77] + "..."
|
preview = preview[:77] + "..."
|
||||||
logger.info(
|
logger.info(
|
||||||
"group text received chat_id={} thread_id={} user_id={} text_len={} preview={!r}",
|
"group text received chat_id={} thread_id={} user_id={} text_len={} cooldown_sec={} preview={!r}",
|
||||||
getattr(chat, "id", None),
|
getattr(chat, "id", None),
|
||||||
getattr(message, "message_thread_id", None),
|
getattr(message, "message_thread_id", None),
|
||||||
getattr(user, "id", None),
|
getattr(user, "id", None),
|
||||||
len(text.strip()),
|
len(text.strip()),
|
||||||
|
cooldown_sec,
|
||||||
preview,
|
preview,
|
||||||
)
|
)
|
||||||
self.db.upsert_user(user.id, username)
|
self.db.upsert_user(user.id, username)
|
||||||
@@ -231,7 +264,7 @@ class BotIOLayer:
|
|||||||
user.id,
|
user.id,
|
||||||
text=text,
|
text=text,
|
||||||
points_to_add=MESSAGE_POINTS,
|
points_to_add=MESSAGE_POINTS,
|
||||||
cooldown_sec=MESSAGE_COOLDOWN_SEC,
|
cooldown_sec=cooldown_sec,
|
||||||
daily_cap=MESSAGE_DAILY_CAP,
|
daily_cap=MESSAGE_DAILY_CAP,
|
||||||
min_text_length=MESSAGE_MIN_LENGTH,
|
min_text_length=MESSAGE_MIN_LENGTH,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -18,5 +18,7 @@ MESSAGE_POINTS = _env_int("POLYWEATHER_BOT_MESSAGE_POINTS", 4, min_value=1)
|
|||||||
MESSAGE_DAILY_CAP = _env_int("POLYWEATHER_BOT_MESSAGE_DAILY_CAP", 40, min_value=1)
|
MESSAGE_DAILY_CAP = _env_int("POLYWEATHER_BOT_MESSAGE_DAILY_CAP", 40, min_value=1)
|
||||||
MESSAGE_MIN_LENGTH = _env_int("POLYWEATHER_BOT_MESSAGE_MIN_LENGTH", 3, min_value=1)
|
MESSAGE_MIN_LENGTH = _env_int("POLYWEATHER_BOT_MESSAGE_MIN_LENGTH", 3, min_value=1)
|
||||||
MESSAGE_COOLDOWN_SEC = _env_int("POLYWEATHER_BOT_MESSAGE_COOLDOWN_SEC", 30, min_value=0)
|
MESSAGE_COOLDOWN_SEC = _env_int("POLYWEATHER_BOT_MESSAGE_COOLDOWN_SEC", 30, min_value=0)
|
||||||
|
# Optional per-chat override map, parsed in BotIOLayer:
|
||||||
|
# POLYWEATHER_BOT_MESSAGE_COOLDOWN_BY_CHAT="-1003586303099:10,-1003539418691:20"
|
||||||
CITY_QUERY_COST = _env_int("POLYWEATHER_BOT_CITY_QUERY_COST", 2, min_value=0)
|
CITY_QUERY_COST = _env_int("POLYWEATHER_BOT_CITY_QUERY_COST", 2, min_value=0)
|
||||||
DEB_QUERY_COST = _env_int("POLYWEATHER_BOT_DEB_QUERY_COST", 2, min_value=0)
|
DEB_QUERY_COST = _env_int("POLYWEATHER_BOT_DEB_QUERY_COST", 2, min_value=0)
|
||||||
|
|||||||
Reference in New Issue
Block a user