|
| 1 | +from typing import Literal, Optional |
| 2 | + |
| 3 | +from pydantic import BaseModel, Field, field_validator |
| 4 | + |
| 5 | +from ..enums import ChannelType, MessageType |
| 6 | +from .message import BaseMessage |
| 7 | + |
| 8 | + |
| 9 | +class ViberAction(BaseModel): |
| 10 | + url: str |
| 11 | + text: str = Field(..., max_length=30) |
| 12 | + |
| 13 | + |
| 14 | +class ViberOptions(BaseModel): |
| 15 | + category: Literal['transaction', 'promotion'] = None |
| 16 | + ttl: Optional[int] = Field(None, ge=30, le=259200) |
| 17 | + type: Optional[Literal['string', 'template']] = None |
| 18 | + |
| 19 | + |
| 20 | +class BaseViber(BaseMessage): |
| 21 | + from_: str = Field(..., min_length=1, max_length=50, serialization_alias='from') |
| 22 | + viber_service: Optional[ViberOptions] = None |
| 23 | + channel: ChannelType = ChannelType.VIBER |
| 24 | + |
| 25 | + |
| 26 | +class ViberTextOptions(ViberOptions): |
| 27 | + action: Optional[ViberAction] = None |
| 28 | + |
| 29 | + |
| 30 | +class ViberText(BaseViber): |
| 31 | + text: str = Field(..., max_length=1000) |
| 32 | + viber_service: Optional[ViberTextOptions] = None |
| 33 | + message_type: MessageType = MessageType.TEXT |
| 34 | + |
| 35 | + |
| 36 | +class ViberImageResource(BaseModel): |
| 37 | + url: str |
| 38 | + caption: Optional[str] = None |
| 39 | + |
| 40 | + |
| 41 | +class ViberImageOptions(ViberOptions): |
| 42 | + action: Optional[ViberAction] = None |
| 43 | + |
| 44 | + |
| 45 | +class ViberImage(BaseViber): |
| 46 | + image: ViberImageResource |
| 47 | + viber_service: Optional[ViberImageOptions] = None |
| 48 | + message_type: MessageType = MessageType.IMAGE |
| 49 | + |
| 50 | + |
| 51 | +class ViberVideoResource(BaseModel): |
| 52 | + url: str |
| 53 | + thumb_url: str = Field(..., max_length=1000) |
| 54 | + caption: Optional[str] = Field(None, max_length=1000) |
| 55 | + |
| 56 | + |
| 57 | +class ViberVideoOptions(ViberOptions): |
| 58 | + duration: str |
| 59 | + file_size: str |
| 60 | + |
| 61 | + @field_validator('duration') |
| 62 | + @classmethod |
| 63 | + def validate_duration(cls, value): |
| 64 | + value_int = int(value) |
| 65 | + if not 1 <= value_int <= 600: |
| 66 | + raise ValueError('"Duration" must be a number between 1 and 600.') |
| 67 | + return value |
| 68 | + |
| 69 | + @field_validator('file_size') |
| 70 | + @classmethod |
| 71 | + def validate_file_size(cls, value): |
| 72 | + value_int = int(value) |
| 73 | + if not 1 <= value_int <= 200: |
| 74 | + raise ValueError('"File size" must be a number between 1 and 200.') |
| 75 | + return value |
| 76 | + |
| 77 | + |
| 78 | +class ViberVideo(BaseViber): |
| 79 | + video: ViberVideoResource |
| 80 | + viber_service: Optional[ViberVideoOptions] = None |
| 81 | + message_type: MessageType = MessageType.VIDEO |
| 82 | + |
| 83 | + |
| 84 | +class ViberFileResource(BaseModel): |
| 85 | + url: str |
| 86 | + name: Optional[str] = Field(None, max_length=25) |
| 87 | + |
| 88 | + |
| 89 | +class ViberFileOptions(ViberOptions): |
| 90 | + pass |
| 91 | + |
| 92 | + |
| 93 | +class ViberFile(BaseViber): |
| 94 | + file: ViberFileResource |
| 95 | + viber_service: Optional[ViberFileOptions] = None |
| 96 | + message_type: MessageType = MessageType.FILE |
0 commit comments