@@ -0,0 +1,36 @@
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class ChatMapping:
|
||||
max_chat_id: int
|
||||
tg_chat_id: int
|
||||
tg_thread_id: int
|
||||
display_name: str
|
||||
is_dm: bool
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class MaxIncomingMessage:
|
||||
max_chat_id: int
|
||||
max_message_id: int
|
||||
text: str
|
||||
sender_id: int | None
|
||||
sender_name: str | None
|
||||
is_dm: bool
|
||||
chat_title: str
|
||||
reply_to_max_message_id: int | None
|
||||
media: list[dict]
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class TgIncomingMessage:
|
||||
tg_chat_id: int
|
||||
tg_message_id: int
|
||||
tg_thread_id: int | None
|
||||
text: str
|
||||
author_name: str
|
||||
author_username: str | None
|
||||
is_bot: bool
|
||||
reply_to_tg_message_id: int | None
|
||||
media: list[dict]
|
||||
@@ -0,0 +1,77 @@
|
||||
from enum import Enum
|
||||
from typing import Any
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class TaskKind(str, Enum):
|
||||
SEND_TO_TG = "send_to_tg"
|
||||
SET_REACTION = "set_reaction"
|
||||
NOTIFY_FALLBACK = "notify_fallback"
|
||||
SEND_TO_MAX = "send_to_max"
|
||||
|
||||
|
||||
class MediaItem(BaseModel):
|
||||
kind: str
|
||||
url: str | None = None
|
||||
file_id: str | None = None
|
||||
file_name: str | None = None
|
||||
mime_type: str | None = None
|
||||
caption: str | None = None
|
||||
local_path: str | None = None
|
||||
max_chat_id: int | None = None
|
||||
max_message_id: int | None = None
|
||||
max_file_id: int | None = None
|
||||
max_video_id: int | None = None
|
||||
|
||||
|
||||
class Max2TgTask(BaseModel):
|
||||
kind: TaskKind = TaskKind.SEND_TO_TG
|
||||
max_chat_id: int
|
||||
max_message_id: int
|
||||
text: str
|
||||
sender_name: str | None = None
|
||||
is_dm: bool = False
|
||||
chat_title: str
|
||||
needs_new_topic: bool = False
|
||||
reply_to_tg_message_id: int | None = None
|
||||
media: list[MediaItem] = Field(default_factory=list)
|
||||
|
||||
|
||||
class SetReactionTask(BaseModel):
|
||||
kind: TaskKind = TaskKind.SET_REACTION
|
||||
tg_chat_id: int
|
||||
tg_message_id: int
|
||||
tg_thread_id: int | None = None
|
||||
emoji: str = "🦄"
|
||||
|
||||
|
||||
class NotifyFallbackTask(BaseModel):
|
||||
kind: TaskKind = TaskKind.NOTIFY_FALLBACK
|
||||
title: str
|
||||
details: str
|
||||
|
||||
|
||||
class Tg2MaxTask(BaseModel):
|
||||
kind: TaskKind = TaskKind.SEND_TO_MAX
|
||||
max_chat_id: int
|
||||
text: str
|
||||
tg_chat_id: int
|
||||
tg_message_id: int
|
||||
tg_thread_id: int | None = None
|
||||
reply_to_max_message_id: int | None = None
|
||||
media: list[MediaItem] = Field(default_factory=list)
|
||||
|
||||
|
||||
def parse_queue_payload(data: str) -> Max2TgTask | SetReactionTask | NotifyFallbackTask | Tg2MaxTask:
|
||||
raw: dict[str, Any] = __import__("json").loads(data)
|
||||
kind = TaskKind(raw.get("kind", TaskKind.SEND_TO_TG))
|
||||
if kind == TaskKind.SEND_TO_TG:
|
||||
return Max2TgTask.model_validate(raw)
|
||||
if kind == TaskKind.SET_REACTION:
|
||||
return SetReactionTask.model_validate(raw)
|
||||
if kind == TaskKind.NOTIFY_FALLBACK:
|
||||
return NotifyFallbackTask.model_validate(raw)
|
||||
if kind == TaskKind.SEND_TO_MAX:
|
||||
return Tg2MaxTask.model_validate(raw)
|
||||
raise ValueError(f"Unknown task kind: {kind}")
|
||||
Reference in New Issue
Block a user