From 6d49f66bf6f63397c40b93a2a46d813a3a6e0d5d Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Wed, 30 Oct 2024 12:00:25 -0300 Subject: [PATCH] adjusts in package --- README.md | 2 +- .../lib/evolution/models}/__init__.py | 0 .../lib/evolution}/models/call.py | 0 .../lib/evolution}/models/chat.py | 0 .../lib/evolution}/models/group.py | 0 .../lib/evolution}/models/instance.py | 0 .../lib/evolution}/models/label.py | 0 .../lib/evolution}/models/message.py | 0 .../lib/evolution}/models/presence.py | 0 .../lib/evolution}/models/profile.py | 0 build/lib/evolution/services/__init__.py | 0 .../lib/evolution}/services/call.py | 0 .../lib/evolution}/services/chat.py | 0 .../lib/evolution}/services/group.py | 0 .../lib/evolution}/services/instance.py | 0 .../services/instance_operations.py | 0 .../lib/evolution}/services/label.py | 0 .../lib/evolution}/services/message.py | 0 .../lib/evolution}/services/profile.py | 0 build/lib/evolutionapi/__init__.py | 0 .../lib/evolutionapi}/client.py | 0 .../lib/evolutionapi}/exceptions.py | 0 build/lib/evolutionapi/models/__init__.py | 0 build/lib/evolutionapi/models/call.py | 16 ++ build/lib/evolutionapi/models/chat.py | 93 +++++++ build/lib/evolutionapi/models/group.py | 39 +++ build/lib/evolutionapi/models/instance.py | 59 ++++ build/lib/evolutionapi/models/label.py | 21 ++ build/lib/evolutionapi/models/message.py | 254 ++++++++++++++++++ build/lib/evolutionapi/models/presence.py | 9 + build/lib/evolutionapi/models/profile.py | 60 +++++ build/lib/evolutionapi/services/__init__.py | 0 build/lib/evolutionapi/services/call.py | 13 + build/lib/evolutionapi/services/chat.py | 69 +++++ build/lib/evolutionapi/services/group.py | 117 ++++++++ build/lib/evolutionapi/services/instance.py | 9 + .../services/instance_operations.py | 28 ++ build/lib/evolutionapi/services/label.py | 19 ++ build/lib/evolutionapi/services/message.py | 111 ++++++++ build/lib/evolutionapi/services/profile.py | 60 +++++ dist/evolution-client-0.0.1.tar.gz | Bin 3021 -> 0 bytes dist/evolution_client-0.0.1-py3-none-any.whl | Bin 2671 -> 0 bytes dist/evolutionapi-0.0.3-py3-none-any.whl | Bin 0 -> 22864 bytes dist/evolutionapi-0.0.3.tar.gz | Bin 0 -> 9110 bytes evolution/__pycache__/client.cpython-310.pyc | Bin 3024 -> 0 bytes .../__pycache__/message.cpython-310.pyc | Bin 3105 -> 0 bytes evolution_client.egg-info/SOURCES.txt | 10 - evolution_client.egg-info/top_level.txt | 1 - .../PKG-INFO | 4 +- evolutionapi.egg-info/SOURCES.txt | 28 ++ .../dependency_links.txt | 0 .../requires.txt | 0 evolutionapi.egg-info/top_level.txt | 1 + evolutionapi/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin .../__pycache__/client.cpython-310.pyc | Bin 0 -> 3403 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin evolutionapi/client.py | 81 ++++++ evolutionapi/exceptions.py | 11 + evolutionapi/models/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 172 bytes .../models/__pycache__/call.cpython-310.pyc | Bin 0 -> 1071 bytes .../models/__pycache__/chat.cpython-310.pyc | Bin 0 -> 3851 bytes .../models/__pycache__/group.cpython-310.pyc | Bin 0 -> 1835 bytes .../__pycache__/instance.cpython-310.pyc | Bin .../models/__pycache__/label.cpython-310.pyc | Bin 0 -> 1208 bytes .../__pycache__/message.cpython-310.pyc | Bin .../__pycache__/presence.cpython-310.pyc | Bin .../__pycache__/profile.cpython-310.pyc | Bin 0 -> 2351 bytes evolutionapi/models/call.py | 16 ++ evolutionapi/models/chat.py | 93 +++++++ evolutionapi/models/group.py | 39 +++ evolutionapi/models/instance.py | 59 ++++ evolutionapi/models/label.py | 21 ++ evolutionapi/models/message.py | 254 ++++++++++++++++++ evolutionapi/models/presence.py | 9 + evolutionapi/models/profile.py | 60 +++++ evolutionapi/services/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 174 bytes .../services/__pycache__/call.cpython-310.pyc | Bin 0 -> 831 bytes .../services/__pycache__/chat.cpython-310.pyc | Bin 0 -> 2729 bytes .../__pycache__/group.cpython-310.pyc | Bin 0 -> 3757 bytes .../__pycache__/instance.cpython-310.pyc | Bin .../instance_operations.cpython-310.pyc | Bin .../__pycache__/label.cpython-310.pyc | Bin 0 -> 1058 bytes .../__pycache__/message.cpython-310.pyc | Bin 0 -> 3094 bytes .../__pycache__/profile.cpython-310.pyc | Bin 0 -> 2314 bytes evolutionapi/services/call.py | 13 + evolutionapi/services/chat.py | 69 +++++ evolutionapi/services/group.py | 117 ++++++++ evolutionapi/services/instance.py | 9 + evolutionapi/services/instance_operations.py | 28 ++ evolutionapi/services/label.py | 19 ++ evolutionapi/services/message.py | 111 ++++++++ evolutionapi/services/profile.py | 60 +++++ publish.sh | 12 + setup.py | 6 +- test_evolution.py | 6 +- 98 files changed, 2097 insertions(+), 19 deletions(-) rename {evolution => build/lib/evolution/models}/__init__.py (100%) rename {evolution => build/lib/evolution}/models/call.py (100%) rename {evolution => build/lib/evolution}/models/chat.py (100%) rename {evolution => build/lib/evolution}/models/group.py (100%) rename {evolution => build/lib/evolution}/models/instance.py (100%) rename {evolution => build/lib/evolution}/models/label.py (100%) rename {evolution => build/lib/evolution}/models/message.py (100%) rename {evolution => build/lib/evolution}/models/presence.py (100%) rename {evolution => build/lib/evolution}/models/profile.py (100%) create mode 100644 build/lib/evolution/services/__init__.py rename {evolution => build/lib/evolution}/services/call.py (100%) rename {evolution => build/lib/evolution}/services/chat.py (100%) rename {evolution => build/lib/evolution}/services/group.py (100%) rename {evolution => build/lib/evolution}/services/instance.py (100%) rename {evolution => build/lib/evolution}/services/instance_operations.py (100%) rename {evolution => build/lib/evolution}/services/label.py (100%) rename {evolution => build/lib/evolution}/services/message.py (100%) rename {evolution => build/lib/evolution}/services/profile.py (100%) create mode 100644 build/lib/evolutionapi/__init__.py rename {evolution => build/lib/evolutionapi}/client.py (100%) rename {evolution => build/lib/evolutionapi}/exceptions.py (100%) create mode 100644 build/lib/evolutionapi/models/__init__.py create mode 100644 build/lib/evolutionapi/models/call.py create mode 100644 build/lib/evolutionapi/models/chat.py create mode 100644 build/lib/evolutionapi/models/group.py create mode 100644 build/lib/evolutionapi/models/instance.py create mode 100644 build/lib/evolutionapi/models/label.py create mode 100644 build/lib/evolutionapi/models/message.py create mode 100644 build/lib/evolutionapi/models/presence.py create mode 100644 build/lib/evolutionapi/models/profile.py create mode 100644 build/lib/evolutionapi/services/__init__.py create mode 100644 build/lib/evolutionapi/services/call.py create mode 100644 build/lib/evolutionapi/services/chat.py create mode 100644 build/lib/evolutionapi/services/group.py create mode 100644 build/lib/evolutionapi/services/instance.py create mode 100644 build/lib/evolutionapi/services/instance_operations.py create mode 100644 build/lib/evolutionapi/services/label.py create mode 100644 build/lib/evolutionapi/services/message.py create mode 100644 build/lib/evolutionapi/services/profile.py delete mode 100644 dist/evolution-client-0.0.1.tar.gz delete mode 100644 dist/evolution_client-0.0.1-py3-none-any.whl create mode 100644 dist/evolutionapi-0.0.3-py3-none-any.whl create mode 100644 dist/evolutionapi-0.0.3.tar.gz delete mode 100644 evolution/__pycache__/client.cpython-310.pyc delete mode 100644 evolution/services/__pycache__/message.cpython-310.pyc delete mode 100644 evolution_client.egg-info/SOURCES.txt delete mode 100644 evolution_client.egg-info/top_level.txt rename {evolution_client.egg-info => evolutionapi.egg-info}/PKG-INFO (85%) create mode 100644 evolutionapi.egg-info/SOURCES.txt rename {evolution_client.egg-info => evolutionapi.egg-info}/dependency_links.txt (100%) rename {evolution_client.egg-info => evolutionapi.egg-info}/requires.txt (100%) create mode 100644 evolutionapi.egg-info/top_level.txt create mode 100644 evolutionapi/__init__.py rename {evolution => evolutionapi}/__pycache__/__init__.cpython-310.pyc (100%) create mode 100644 evolutionapi/__pycache__/client.cpython-310.pyc rename {evolution => evolutionapi}/__pycache__/exceptions.cpython-310.pyc (100%) create mode 100644 evolutionapi/client.py create mode 100644 evolutionapi/exceptions.py create mode 100644 evolutionapi/models/__init__.py create mode 100644 evolutionapi/models/__pycache__/__init__.cpython-310.pyc create mode 100644 evolutionapi/models/__pycache__/call.cpython-310.pyc create mode 100644 evolutionapi/models/__pycache__/chat.cpython-310.pyc create mode 100644 evolutionapi/models/__pycache__/group.cpython-310.pyc rename {evolution => evolutionapi}/models/__pycache__/instance.cpython-310.pyc (100%) create mode 100644 evolutionapi/models/__pycache__/label.cpython-310.pyc rename {evolution => evolutionapi}/models/__pycache__/message.cpython-310.pyc (100%) rename {evolution => evolutionapi}/models/__pycache__/presence.cpython-310.pyc (100%) create mode 100644 evolutionapi/models/__pycache__/profile.cpython-310.pyc create mode 100644 evolutionapi/models/call.py create mode 100644 evolutionapi/models/chat.py create mode 100644 evolutionapi/models/group.py create mode 100644 evolutionapi/models/instance.py create mode 100644 evolutionapi/models/label.py create mode 100644 evolutionapi/models/message.py create mode 100644 evolutionapi/models/presence.py create mode 100644 evolutionapi/models/profile.py create mode 100644 evolutionapi/services/__init__.py create mode 100644 evolutionapi/services/__pycache__/__init__.cpython-310.pyc create mode 100644 evolutionapi/services/__pycache__/call.cpython-310.pyc create mode 100644 evolutionapi/services/__pycache__/chat.cpython-310.pyc create mode 100644 evolutionapi/services/__pycache__/group.cpython-310.pyc rename {evolution => evolutionapi}/services/__pycache__/instance.cpython-310.pyc (100%) rename {evolution => evolutionapi}/services/__pycache__/instance_operations.cpython-310.pyc (100%) create mode 100644 evolutionapi/services/__pycache__/label.cpython-310.pyc create mode 100644 evolutionapi/services/__pycache__/message.cpython-310.pyc create mode 100644 evolutionapi/services/__pycache__/profile.cpython-310.pyc create mode 100644 evolutionapi/services/call.py create mode 100644 evolutionapi/services/chat.py create mode 100644 evolutionapi/services/group.py create mode 100644 evolutionapi/services/instance.py create mode 100644 evolutionapi/services/instance_operations.py create mode 100644 evolutionapi/services/label.py create mode 100644 evolutionapi/services/message.py create mode 100644 evolutionapi/services/profile.py create mode 100755 publish.sh diff --git a/README.md b/README.md index 10d0089..6068b81 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Client Python para interagir com a API Evolution. ## Instalação ```bash -pip install evolution-client +pip install evolution ``` ## Uso Básico diff --git a/evolution/__init__.py b/build/lib/evolution/models/__init__.py similarity index 100% rename from evolution/__init__.py rename to build/lib/evolution/models/__init__.py diff --git a/evolution/models/call.py b/build/lib/evolution/models/call.py similarity index 100% rename from evolution/models/call.py rename to build/lib/evolution/models/call.py diff --git a/evolution/models/chat.py b/build/lib/evolution/models/chat.py similarity index 100% rename from evolution/models/chat.py rename to build/lib/evolution/models/chat.py diff --git a/evolution/models/group.py b/build/lib/evolution/models/group.py similarity index 100% rename from evolution/models/group.py rename to build/lib/evolution/models/group.py diff --git a/evolution/models/instance.py b/build/lib/evolution/models/instance.py similarity index 100% rename from evolution/models/instance.py rename to build/lib/evolution/models/instance.py diff --git a/evolution/models/label.py b/build/lib/evolution/models/label.py similarity index 100% rename from evolution/models/label.py rename to build/lib/evolution/models/label.py diff --git a/evolution/models/message.py b/build/lib/evolution/models/message.py similarity index 100% rename from evolution/models/message.py rename to build/lib/evolution/models/message.py diff --git a/evolution/models/presence.py b/build/lib/evolution/models/presence.py similarity index 100% rename from evolution/models/presence.py rename to build/lib/evolution/models/presence.py diff --git a/evolution/models/profile.py b/build/lib/evolution/models/profile.py similarity index 100% rename from evolution/models/profile.py rename to build/lib/evolution/models/profile.py diff --git a/build/lib/evolution/services/__init__.py b/build/lib/evolution/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/evolution/services/call.py b/build/lib/evolution/services/call.py similarity index 100% rename from evolution/services/call.py rename to build/lib/evolution/services/call.py diff --git a/evolution/services/chat.py b/build/lib/evolution/services/chat.py similarity index 100% rename from evolution/services/chat.py rename to build/lib/evolution/services/chat.py diff --git a/evolution/services/group.py b/build/lib/evolution/services/group.py similarity index 100% rename from evolution/services/group.py rename to build/lib/evolution/services/group.py diff --git a/evolution/services/instance.py b/build/lib/evolution/services/instance.py similarity index 100% rename from evolution/services/instance.py rename to build/lib/evolution/services/instance.py diff --git a/evolution/services/instance_operations.py b/build/lib/evolution/services/instance_operations.py similarity index 100% rename from evolution/services/instance_operations.py rename to build/lib/evolution/services/instance_operations.py diff --git a/evolution/services/label.py b/build/lib/evolution/services/label.py similarity index 100% rename from evolution/services/label.py rename to build/lib/evolution/services/label.py diff --git a/evolution/services/message.py b/build/lib/evolution/services/message.py similarity index 100% rename from evolution/services/message.py rename to build/lib/evolution/services/message.py diff --git a/evolution/services/profile.py b/build/lib/evolution/services/profile.py similarity index 100% rename from evolution/services/profile.py rename to build/lib/evolution/services/profile.py diff --git a/build/lib/evolutionapi/__init__.py b/build/lib/evolutionapi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/evolution/client.py b/build/lib/evolutionapi/client.py similarity index 100% rename from evolution/client.py rename to build/lib/evolutionapi/client.py diff --git a/evolution/exceptions.py b/build/lib/evolutionapi/exceptions.py similarity index 100% rename from evolution/exceptions.py rename to build/lib/evolutionapi/exceptions.py diff --git a/build/lib/evolutionapi/models/__init__.py b/build/lib/evolutionapi/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/build/lib/evolutionapi/models/call.py b/build/lib/evolutionapi/models/call.py new file mode 100644 index 0000000..991463b --- /dev/null +++ b/build/lib/evolutionapi/models/call.py @@ -0,0 +1,16 @@ +class BaseCall: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class FakeCall(BaseCall): + def __init__( + self, + number: str, + isVideo: bool, + callDuration: int + ): + super().__init__( + number=number, + isVideo=isVideo, + callDuration=callDuration + ) \ No newline at end of file diff --git a/build/lib/evolutionapi/models/chat.py b/build/lib/evolutionapi/models/chat.py new file mode 100644 index 0000000..4e985b3 --- /dev/null +++ b/build/lib/evolutionapi/models/chat.py @@ -0,0 +1,93 @@ +from typing import List, Optional, Dict, Any + +class BaseChat: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class CheckIsWhatsappNumber(BaseChat): + def __init__( + self, + numbers: List[str] + ): + super().__init__( + numbers=numbers + ) + +class MessageKey: + def __init__( + self, + remote_jid: str, + from_me: bool, + id: str, + participant: Optional[str] = None + ): + self.remoteJid = remote_jid + self.fromMe = from_me + self.id = id + self.participant = participant + +class ReadMessage: + def __init__( + self, + remote_jid: str, + from_me: bool, + id: str + ): + self.remoteJid = remote_jid + self.fromMe = from_me + self.id = id + +class ArchiveChat: + def __init__( + self, + last_message: Dict[str, Any], + chat: str, + archive: bool + ): + self.lastMessage = last_message + self.chat = chat + self.archive = archive + +class UnreadChat: + def __init__( + self, + last_message: Dict[str, Any], + chat: str + ): + self.lastMessage = last_message + self.chat = chat + +class ProfilePicture: + def __init__(self, number: str): + self.number = number + +class MediaMessage: + def __init__( + self, + message: Dict[str, Any], + convert_to_mp4: bool = False + ): + self.message = message + self.convertToMp4 = convert_to_mp4 + +class UpdateMessage: + def __init__( + self, + number: str, + key: Dict[str, Any], + text: str + ): + self.number = number + self.key = key + self.text = text + +class Presence: + def __init__( + self, + number: str, + delay: int, + presence: str + ): + self.number = number + self.delay = delay + self.presence = presence \ No newline at end of file diff --git a/build/lib/evolutionapi/models/group.py b/build/lib/evolutionapi/models/group.py new file mode 100644 index 0000000..5a21460 --- /dev/null +++ b/build/lib/evolutionapi/models/group.py @@ -0,0 +1,39 @@ +from typing import List, Optional, Literal +from dataclasses import dataclass + +@dataclass +class CreateGroup: + subject: str + participants: List[str] + description: Optional[str] = None + +@dataclass +class GroupPicture: + image: str + +@dataclass +class GroupSubject: + subject: str + +@dataclass +class GroupDescription: + description: str + +@dataclass +class GroupInvite: + groupJid: str + description: str + numbers: List[str] + +@dataclass +class UpdateParticipant: + action: Literal["add", "remove", "promote", "demote"] + participants: List[str] + +@dataclass +class UpdateSetting: + action: Literal["announcement", "not_announcement", "locked", "unlocked"] + +@dataclass +class ToggleEphemeral: + expiration: int \ No newline at end of file diff --git a/build/lib/evolutionapi/models/instance.py b/build/lib/evolutionapi/models/instance.py new file mode 100644 index 0000000..102debc --- /dev/null +++ b/build/lib/evolutionapi/models/instance.py @@ -0,0 +1,59 @@ +from typing import Optional, List, Dict + +class WebhookConfig: + def __init__(self, url: str = None, byEvents: bool = False, base64: bool = True, + headers: Dict = None, events: List[str] = None): + self.url = url + self.byEvents = byEvents + self.base64 = base64 + self.headers = headers + self.events = events + +class EventsConfig: + def __init__(self, enabled: bool = True, events: List[str] = None): + self.enabled = enabled + self.events = events + +class ChatwootConfig: + def __init__(self, accountId: str = None, token: str = None, url: str = None, + signMsg: bool = True, reopenConversation: bool = True, + conversationPending: bool = False, importContacts: bool = True, + nameInbox: str = "evolution", mergeBrazilContacts: bool = True, + importMessages: bool = True, daysLimitImportMessages: int = 3, + organization: str = "Evolution Bot", + logo: str = "https://evolution-api.com/files/evolution-api-favicon.png"): + self.chatwootAccountId = accountId + self.chatwootToken = token + self.chatwootUrl = url + self.chatwootSignMsg = signMsg + self.chatwootReopenConversation = reopenConversation + self.chatwootConversationPending = conversationPending + self.chatwootImportContacts = importContacts + self.chatwootNameInbox = nameInbox + self.chatwootMergeBrazilContacts = mergeBrazilContacts + self.chatwootImportMessages = importMessages + self.chatwootDaysLimitImportMessages = daysLimitImportMessages + self.chatwootOrganization = organization + self.chatwootLogo = logo + +class InstanceConfig: + def __init__( + self, + instanceName: str, + integration: str = None, + token: str = None, + number: str = None, + qrcode: bool = None, + rejectCall: bool = None, + msgCall: str = None, + groupsIgnore: bool = None, + alwaysOnline: bool = None, + readMessages: bool = None, + readStatus: bool = None, + syncFullHistory: bool = None + ): + self.__dict__['instanceName'] = instanceName + + for key, value in locals().items(): + if key != 'self' and key != 'instanceName' and value is not None: + self.__dict__[key] = value \ No newline at end of file diff --git a/build/lib/evolutionapi/models/label.py b/build/lib/evolutionapi/models/label.py new file mode 100644 index 0000000..cc59334 --- /dev/null +++ b/build/lib/evolutionapi/models/label.py @@ -0,0 +1,21 @@ +from typing import Literal + +class BaseLabel: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class HandleLabel(BaseLabel): + def __init__( + self, + number: str, + label_id: str, + action: Literal["add", "remove"] + ): + if action not in ["add", "remove"]: + raise ValueError("action deve ser 'add' ou 'remove'") + + super().__init__( + number=number, + labelId=label_id, + action=action + ) \ No newline at end of file diff --git a/build/lib/evolutionapi/models/message.py b/build/lib/evolutionapi/models/message.py new file mode 100644 index 0000000..739460f --- /dev/null +++ b/build/lib/evolutionapi/models/message.py @@ -0,0 +1,254 @@ +from enum import Enum +from typing import List, Optional, Union +from dataclasses import dataclass + +class MediaType(Enum): + IMAGE = "image" + VIDEO = "video" + DOCUMENT = "document" + +class StatusType(Enum): + TEXT = "text" + IMAGE = "image" + VIDEO = "video" + AUDIO = "audio" + +class FontType(Enum): + SERIF = 1 + NORICAN_REGULAR = 2 + BRYNDAN_WRITE = 3 + BEBASNEUE_REGULAR = 4 + OSWALD_HEAVY = 5 + +class BaseMessage: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class QuotedMessage(BaseMessage): + def __init__(self, key: dict, message: Optional[dict] = None): + super().__init__(key=key, message=message) + +class TextMessage(BaseMessage): + def __init__( + self, + number: str, + text: str, + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None, + linkPreview: Optional[bool] = None, + mentionsEveryOne: Optional[bool] = None, + mentioned: Optional[List[str]] = None + ): + super().__init__( + number=number, + text=text, + delay=delay, + quoted=quoted.__dict__ if quoted else None, + linkPreview=linkPreview, + mentionsEveryOne=mentionsEveryOne, + mentioned=mentioned + ) + +class MediaMessage(BaseMessage): + def __init__( + self, + number: str, + mediatype: str, + mimetype: str, + caption: str, + media: str, + fileName: str, + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None, + mentionsEveryOne: Optional[bool] = None, + mentioned: Optional[List[str]] = None + ): + super().__init__( + number=number, + mediatype=mediatype, + mimetype=mimetype, + caption=caption, + media=media, + fileName=fileName, + delay=delay, + quoted=quoted.__dict__ if quoted else None, + mentionsEveryOne=mentionsEveryOne, + mentioned=mentioned + ) + +class StatusMessage(BaseMessage): + def __init__( + self, + type: StatusType, + content: str, + caption: Optional[str] = None, + backgroundColor: Optional[str] = None, + font: Optional[FontType] = None, + allContacts: bool = False, + statusJidList: Optional[List[str]] = None + ): + super().__init__( + type=type.value, + content=content, + caption=caption, + backgroundColor=backgroundColor, + font=font.value if font else None, + allContacts=allContacts, + statusJidList=statusJidList + ) + +class LocationMessage(BaseMessage): + def __init__( + self, + number: str, + name: str, + address: str, + latitude: float, + longitude: float, + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None + ): + super().__init__( + number=number, + name=name, + address=address, + latitude=latitude, + longitude=longitude, + delay=delay, + quoted=quoted.__dict__ if quoted else None + ) + +class Contact(BaseMessage): + def __init__( + self, + fullName: str, + wuid: str, + phoneNumber: str, + organization: Optional[str] = None, + email: Optional[str] = None, + url: Optional[str] = None + ): + super().__init__( + fullName=fullName, + wuid=wuid, + phoneNumber=phoneNumber, + organization=organization, + email=email, + url=url + ) + +class ContactMessage(BaseMessage): + def __init__(self, number: str, contact: List[Contact]): + super().__init__( + number=number, + contact=[c.__dict__ for c in contact] + ) + +class ReactionMessage(BaseMessage): + def __init__(self, key: dict, reaction: str): + super().__init__(key=key, reaction=reaction) + +class PollMessage(BaseMessage): + def __init__( + self, + number: str, + name: str, + selectableCount: int, + values: List[str], + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None + ): + super().__init__( + number=number, + name=name, + selectableCount=selectableCount, + values=values, + delay=delay, + quoted=quoted.__dict__ if quoted else None + ) + +class ListRow(BaseMessage): + def __init__(self, title: str, description: str, rowId: str): + super().__init__( + title=title, + description=description, + rowId=rowId + ) + +class ListSection(BaseMessage): + def __init__(self, title: str, rows: List[ListRow]): + super().__init__( + title=title, + rows=[r.__dict__ for r in rows] + ) + +class ListMessage(BaseMessage): + def __init__( + self, + number: str, + title: str, + description: str, + buttonText: str, + footerText: str, + sections: List[ListSection], + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None + ): + super().__init__( + number=number, + title=title, + description=description, + buttonText=buttonText, + footerText=footerText, + sections=[s.__dict__ for s in sections], + delay=delay, + quoted=quoted.__dict__ if quoted else None + ) + +class Button(BaseMessage): + def __init__( + self, + type: str, + displayText: str, + id: Optional[str] = None, + copyCode: Optional[str] = None, + url: Optional[str] = None, + phoneNumber: Optional[str] = None, + currency: Optional[str] = None, + name: Optional[str] = None, + keyType: Optional[str] = None, + key: Optional[str] = None + ): + super().__init__( + type=type, + displayText=displayText, + id=id, + copyCode=copyCode, + url=url, + phoneNumber=phoneNumber, + currency=currency, + name=name, + keyType=keyType, + key=key + ) + +class ButtonMessage(BaseMessage): + def __init__( + self, + number: str, + title: str, + description: str, + footer: str, + buttons: List[Button], + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None + ): + super().__init__( + number=number, + title=title, + description=description, + footer=footer, + buttons=[b.__dict__ for b in buttons], + delay=delay, + quoted=quoted.__dict__ if quoted else None + ) \ No newline at end of file diff --git a/build/lib/evolutionapi/models/presence.py b/build/lib/evolutionapi/models/presence.py new file mode 100644 index 0000000..d245b57 --- /dev/null +++ b/build/lib/evolutionapi/models/presence.py @@ -0,0 +1,9 @@ +from enum import Enum + +class PresenceStatus(Enum): + AVAILABLE = "available" + UNAVAILABLE = "unavailable" + +class PresenceConfig: + def __init__(self, presence: PresenceStatus): + self.presence = presence.value \ No newline at end of file diff --git a/build/lib/evolutionapi/models/profile.py b/build/lib/evolutionapi/models/profile.py new file mode 100644 index 0000000..39441b3 --- /dev/null +++ b/build/lib/evolutionapi/models/profile.py @@ -0,0 +1,60 @@ +from typing import Literal + +class BaseProfile: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class FetchProfile(BaseProfile): + def __init__( + self, + number: str, + ): + super().__init__( + number=number, + ) + +class ProfileName(BaseProfile): + def __init__( + self, + name: str, + ): + super().__init__( + name=name, + ) + +class ProfileStatus(BaseProfile): + def __init__( + self, + status: str, + ): + super().__init__( + status=status, + ) + +class ProfilePicture(BaseProfile): + def __init__( + self, + picture: str, + ): + super().__init__( + picture=picture, + ) + +class PrivacySettings(BaseProfile): + def __init__( + self, + readreceipts: Literal["all", "none"], + profile: Literal["all", "contacts", "contact_blacklist", "none"], + status: Literal["all", "contacts", "contact_blacklist", "none"], + online: Literal["all", "match_last_seen"], + last: Literal["all", "contacts", "contact_blacklist", "none"], + groupadd: Literal["all", "contacts", "contact_blacklist"], + ): + super().__init__( + readreceipts=readreceipts, + profile=profile, + status=status, + online=online, + last=last, + groupadd=groupadd, + ) \ No newline at end of file diff --git a/build/lib/evolutionapi/services/__init__.py b/build/lib/evolutionapi/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/build/lib/evolutionapi/services/call.py b/build/lib/evolutionapi/services/call.py new file mode 100644 index 0000000..4e1b2bd --- /dev/null +++ b/build/lib/evolutionapi/services/call.py @@ -0,0 +1,13 @@ +from typing import Union, BinaryIO +from ..models.call import * + +class CallService: + def __init__(self, client): + self.client = client + + def fake_call(self, instance_id: str, data: FakeCall, instance_token: str): + return self.client.post( + f'call/offer/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/build/lib/evolutionapi/services/chat.py b/build/lib/evolutionapi/services/chat.py new file mode 100644 index 0000000..b2af456 --- /dev/null +++ b/build/lib/evolutionapi/services/chat.py @@ -0,0 +1,69 @@ +from typing import Union, BinaryIO +from ..models.chat import * + +class ChatService: + def __init__(self, client): + self.client = client + + def check_is_whatsapp_numbers(self, instance_id: str, data: CheckIsWhatsappNumber, instance_token: str): + return self.client.post( + f'chat/checkIsWhatsappNumber/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def mark_message_as_read(self, instance_id: str, messages: List[ReadMessage], instance_token: str): + return self.client.post( + f'chat/markMessageAsRead/{instance_id}', + data={"readMessages": [m.__dict__ for m in messages]}, + instance_token=instance_token + ) + + def archive_chat(self, instance_id: str, data: ArchiveChat, instance_token: str): + return self.client.post( + f'chat/archiveChat/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def mark_chat_unread(self, instance_id: str, data: UnreadChat, instance_token: str): + return self.client.post( + f'chat/markChatUnread/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def delete_message_for_everyone(self, instance_id: str, data: MessageKey, instance_token: str): + return self.client.delete( + f'chat/deleteMessageForEveryone/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def fetch_profile_picture_url(self, instance_id: str, data: ProfilePicture, instance_token: str): + return self.client.post( + f'chat/fetchProfilePictureUrl/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def get_base64_from_media_message(self, instance_id: str, data: MediaMessage, instance_token: str): + return self.client.post( + f'chat/getBase64FromMediaMessage/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_message(self, instance_id: str, data: UpdateMessage, instance_token: str): + return self.client.post( + f'chat/updateMessage/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def send_presence(self, instance_id: str, data: Presence, instance_token: str): + return self.client.post( + f'chat/sendPresence/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/build/lib/evolutionapi/services/group.py b/build/lib/evolutionapi/services/group.py new file mode 100644 index 0000000..6bfbcfe --- /dev/null +++ b/build/lib/evolutionapi/services/group.py @@ -0,0 +1,117 @@ +from typing import Optional +from ..models.group import * + +class GroupService: + def __init__(self, client): + self.client = client + + def create_group(self, instance_id: str, data: CreateGroup, instance_token: str): + return self.client.post( + f'group/create/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_group_picture(self, instance_id: str, group_jid: str, data: GroupPicture, instance_token: str): + return self.client.post( + f'group/updateGroupPicture/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def update_group_subject(self, instance_id: str, group_jid: str, data: GroupSubject, instance_token: str): + return self.client.post( + f'group/updateGroupSubject/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def update_group_description(self, instance_id: str, group_jid: str, data: GroupDescription, instance_token: str): + return self.client.post( + f'group/updateGroupDescription/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def get_invite_code(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.get( + f'group/inviteCode/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) + + def revoke_invite_code(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.post( + f'group/revokeInviteCode/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) + + def send_invite(self, instance_id: str, data: GroupInvite, instance_token: str): + return self.client.post( + f'group/sendInvite/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def get_invite_info(self, instance_id: str, invite_code: str, instance_token: str): + return self.client.get( + f'group/inviteInfo/{instance_id}', + params={'inviteCode': invite_code}, + instance_token=instance_token + ) + + def get_group_info(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.get( + f'group/findGroupInfos/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) + + def fetch_all_groups(self, instance_id: str, instance_token: str, get_participants: bool = False): + return self.client.get( + f'group/fetchAllGroups/{instance_id}', + params={'getParticipants': get_participants}, + instance_token=instance_token + ) + + def get_participants(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.get( + f'group/participants/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) + + def update_participant(self, instance_id: str, group_jid: str, data: UpdateParticipant, instance_token: str): + return self.client.post( + f'group/updateParticipant/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def update_setting(self, instance_id: str, group_jid: str, data: UpdateSetting, instance_token: str): + return self.client.post( + f'group/updateSetting/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def toggle_ephemeral(self, instance_id: str, group_jid: str, data: ToggleEphemeral, instance_token: str): + return self.client.post( + f'group/toggleEphemeral/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def leave_group(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.delete( + f'group/leaveGroup/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) \ No newline at end of file diff --git a/build/lib/evolutionapi/services/instance.py b/build/lib/evolutionapi/services/instance.py new file mode 100644 index 0000000..099c8bb --- /dev/null +++ b/build/lib/evolutionapi/services/instance.py @@ -0,0 +1,9 @@ +class InstanceService: + def __init__(self, client): + self.client = client + + def fetch_instances(self): + return self.client.get('instance/fetchInstances') + + def create_instance(self, config): + return self.client.post('instance/create', data=config.__dict__) \ No newline at end of file diff --git a/build/lib/evolutionapi/services/instance_operations.py b/build/lib/evolutionapi/services/instance_operations.py new file mode 100644 index 0000000..c59016f --- /dev/null +++ b/build/lib/evolutionapi/services/instance_operations.py @@ -0,0 +1,28 @@ +from ..models.presence import PresenceStatus, PresenceConfig + +class InstanceOperationsService: + def __init__(self, client): + self.client = client + + def connect(self, instance_id: str, instance_token: str): + return self.client.get(f'instance/connect/{instance_id}', instance_token) + + def restart(self, instance_id: str, instance_token: str): + return self.client.post(f'instance/restart/{instance_id}', instance_token=instance_token) + + def set_presence(self, instance_id: str, presence: PresenceStatus, instance_token: str): + config = PresenceConfig(presence) + return self.client.post( + f'instance/setPresence/{instance_id}', + data=config.__dict__, + instance_token=instance_token + ) + + def get_connection_state(self, instance_id: str, instance_token: str): + return self.client.get(f'instance/connectionState/{instance_id}', instance_token) + + def logout(self, instance_id: str, instance_token: str): + return self.client.delete(f'instance/logout/{instance_id}', instance_token) + + def delete(self, instance_id: str, instance_token: str): + return self.client.delete(f'instance/delete/{instance_id}', instance_token) diff --git a/build/lib/evolutionapi/services/label.py b/build/lib/evolutionapi/services/label.py new file mode 100644 index 0000000..ed87c91 --- /dev/null +++ b/build/lib/evolutionapi/services/label.py @@ -0,0 +1,19 @@ +from typing import Union, BinaryIO +from ..models.label import * + +class LabelService: + def __init__(self, client): + self.client = client + + def find_labels(self, instance_id: str, instance_token: str): + return self.client.get( + f'label/findLabels/{instance_id}', + instance_token=instance_token + ) + + def handle_label(self, instance_id: str, data: HandleLabel, instance_token: str): + return self.client.post( + f'label/handleLabel/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/build/lib/evolutionapi/services/message.py b/build/lib/evolutionapi/services/message.py new file mode 100644 index 0000000..02bd3c4 --- /dev/null +++ b/build/lib/evolutionapi/services/message.py @@ -0,0 +1,111 @@ +from typing import Union, BinaryIO +from ..models.message import * + +class MessageService: + def __init__(self, client): + self.client = client + + def send_text(self, instance_id: str, message: TextMessage, instance_token: str): + return self.client.post( + f'message/sendText/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_media(self, instance_id: str, message: MediaMessage, instance_token: str, file: BinaryIO = None): + payload = { + 'data': message.__dict__, + 'instance_token': instance_token + } + + if file: + payload['files'] = {'file': file} + + return self.client.post( + f'message/sendMedia/{instance_id}', + **payload + ) + + def send_ptv(self, instance_id: str, message: dict, instance_token: str, file: BinaryIO = None): + payload = { + 'data': message, + 'instance_token': instance_token + } + + if file: + payload['files'] = {'file': file} + + return self.client.post( + f'message/sendPtv/{instance_id}', + **payload + ) + + def send_whatsapp_audio(self, instance_id: str, message: dict, instance_token: str, file: BinaryIO = None): + payload = { + 'data': message, + 'instance_token': instance_token + } + + if file: + payload['files'] = {'file': file} + + return self.client.post( + f'message/sendWhatsAppAudio/{instance_id}', + **payload + ) + + def send_status(self, instance_id: str, message: StatusMessage, instance_token: str): + return self.client.post( + f'message/sendStatus/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_sticker(self, instance_id: str, message: dict, instance_token: str): + return self.client.post( + f'message/sendSticker/{instance_id}', + data=message, + instance_token=instance_token + ) + + def send_location(self, instance_id: str, message: LocationMessage, instance_token: str): + return self.client.post( + f'message/sendLocation/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_contact(self, instance_id: str, message: ContactMessage, instance_token: str): + return self.client.post( + f'message/sendContact/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_reaction(self, instance_id: str, message: ReactionMessage, instance_token: str): + return self.client.post( + f'message/sendReaction/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_poll(self, instance_id: str, message: PollMessage, instance_token: str): + return self.client.post( + f'message/sendPoll/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_list(self, instance_id: str, message: ListMessage, instance_token: str): + return self.client.post( + f'message/sendList/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_buttons(self, instance_id: str, message: ButtonMessage, instance_token: str): + return self.client.post( + f'message/sendButtons/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/build/lib/evolutionapi/services/profile.py b/build/lib/evolutionapi/services/profile.py new file mode 100644 index 0000000..b0da8ab --- /dev/null +++ b/build/lib/evolutionapi/services/profile.py @@ -0,0 +1,60 @@ +from typing import Union, BinaryIO +from ..models.profile import * + +class ProfileService: + def __init__(self, client): + self.client = client + + def fetch_business_profile(self, instance_id: str, data: FetchProfile, instance_token: str): + return self.client.post( + f'chat/fetchBusinessProfile/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def fetch_profile(self, instance_id: str, data: FetchProfile, instance_token: str): + return self.client.post( + f'chat/fetchProfile/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_profile_name(self, instance_id: str, data: ProfileName, instance_token: str): + return self.client.post( + f'chat/updateProfileName/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_profile_status(self, instance_id: str, data: ProfileStatus, instance_token: str): + return self.client.post( + f'chat/updateProfileStatus/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_profile_picture(self, instance_id: str, data: ProfilePicture, instance_token: str): + return self.client.post( + f'chat/updateProfilePicture/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def remove_profile_picture(self, instance_id: str, instance_token: str): + return self.client.delete( + f'chat/removeProfilePicture/{instance_id}', + instance_token=instance_token + ) + + def fetch_privacy_settings(self, instance_id: str, instance_token: str): + return self.client.get( + f'chat/fetchPrivacySettings/{instance_id}', + instance_token=instance_token + ) + + def update_privacy_settings(self, instance_id: str, data: PrivacySettings, instance_token: str): + return self.client.post( + f'chat/updatePrivacySettings/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/dist/evolution-client-0.0.1.tar.gz b/dist/evolution-client-0.0.1.tar.gz deleted file mode 100644 index 002f8697e62af80bad7e854f8e82e2ec9e0cd345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3021 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 P{2lNg6Xk^-0H6Q>_9hr2 diff --git a/dist/evolution_client-0.0.1-py3-none-any.whl b/dist/evolution_client-0.0.1-py3-none-any.whl deleted file mode 100644 index 1ec7836cbdb9a5b17ccc8fb28ef62745af5f3729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2671 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 literal 0 HcmV?d00001 diff --git a/evolution/__pycache__/client.cpython-310.pyc b/evolution/__pycache__/client.cpython-310.pyc deleted file mode 100644 index 78aea453153d0d50d70601e54b08c8ecdaf7e699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3024 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 literal 0 HcmV?d00001 diff --git a/evolutionapi/models/__pycache__/call.cpython-310.pyc b/evolutionapi/models/__pycache__/call.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..499d3b41d432d04be81fb1cc80793e9957ada553 GIT binary patch literal 1071 zcmZuw&2G~`5Z)ihHEB`^R6X`ki9$LXvVuU-|T#oyxFW1knx+HqwkcEUl`mM4}x7#vjgS> zkwnr<&>0(G#3YA^D>CB)D!l{JuElWgfiQ@6LCq!@Mc^J8Fi9o5Bm*uvXq@tQl>6HCsXAIJ5{|0JU)_HB|sik9$_|E*^50CSa3S~4-q{*}Jqs~uMT$)gg z^Rz0HJQH!6sH_Z&^YR!jEWbxZ5{`1IQWM7TzD{v&>s^_|Wt@+S9=2!@W}8f2E@sdX zBFU0ch)y@nA<6VQs|;u`5CRJbVg0I*QK@V#Db>idne~iHht@y+8tEgm>R{M;&eDUm9- z4IJ`br6c4d#s(IGJ}#3R`4%`OnUNEU{7<>0Klt4ev3{HD=WwoHpuweu!PZPwDDB?d z_VhZQJiK#5?Gph@5E&!Hd@ODlI3;up{>^-!QT)|!C#}UBmTb2Jy@7R~qIm|!a#L#S z9p-szd6Jb5-8Sz~VwI)~BsY6}lOtNUz{95+tP&7FWb7~F?3Q_3f81%m%^WE%_#cTj O=+0^HEt%XPo8CWvOySr7 literal 0 HcmV?d00001 diff --git a/evolutionapi/models/__pycache__/chat.cpython-310.pyc b/evolutionapi/models/__pycache__/chat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bb786db07fe8688b32661165bfa64fa5d9d4dab GIT binary patch literal 3851 zcmb7HTXPge6rS$6>@^Dk!o^Zl6m`8MsCY*VLSX?CDS@(TOKWPF?j@7#jqXV_spSc( zc=E|VfRFg%|LIqseCACq`kkK4?1tSfby9t{PhU=Vf9LCSI{mr1s)J8`a_r{sCCB-L zl=07lvW%jCgAk5j9jD7$tjk-x>$cpk*YcS2l_R)t?>fT0!&^QyPx#P$>ECf%0rWtW zpqJ2Ff>st4XccH>XjM^zR)bc7Ru^;7=Ac!fHN+lhd!W^z?G^LT=AqT0?GyWGz_J@y;c2YTPrut(ZoPe;mp(iar1# zofZ>Liwh?BU8m&=7gjw}{xZ_?>}r(841@BIX8I_XQ1nrVp|j@PXW85#yU%}h&N+A3 zuZ#gh*l|~OO?NSafWDefPhjAO+V}i6yUmAOI2%myAsg~v_$_|bdB9d4z=q+ACk$IR zY*Upn(Tcw=Ev@#ua!Ev+iO~Jt(iPQTlX0q-9VnERz4U(m9 zU&xMLigCWh!Ir6>5&$dicL%5GbefKN)Y(3sW3U*8NiRvmaPd^9A4eU1dT}%Z8!U$* z83;oYYz#z{O5-P~?CK^ro|c`q3D$p%)J;9wzp7&inwQxnP_k9o_WZ=EE98$b>_uIP zC8}YF?Qe9bUJt`t8&N0gQTt(KYzYe%t)l`6!d}xlWv9+;%LFf|mp=U(#E2KtmEIAj z&F?vFa0L9XxBPqXV=J&sSvb2Ye*i%6PWo&b=rvC%sy07 z=Z>?+hG5XoIcNAvlc~e#1A4yR7)WIg*5qm)jkf0jGnEkjjkFHK?8Nq*1OS~{(}4qz zv+Cd5N2hMD@MyE7=oY925(i1p9*wKhY*{n6vrsHMoqREi>~l2OE_(7YMp?Xg3vOGUWCXYt}uiOE^+mwCp`Qjphy>xmu*1tTY+GJx?-xArPk3+c}Z@q zn5vT9ek#MYM3_=r^}AtL8V;p4h*X-y$sp>bG4VP7s7|Lli=v;0z*TcXXUHMh(1qkf z57MQ(tLQ`^UL{-RA`Az#%4MluMvpp1-G1hi7pdVT5=GY-4-40j|13s9DPRGsvhDq& z0~H?07M^em?bmoW`u&a~_RJ$e zR&QX$*1%M+_Z0X_NnI7Ej$PQvKdKiz zrR|LKbi`1ume6NGYq}XZ3wzT5Jc-c{Y0rUAcYd^u5r>_!$gmGV@*7eIG^BH6UhY z@HL(&>Y0F!j<}4XDSVH!vdwL7!#huSfXg=xJSo~qM_xf@-%!#7Swfr0XE|V+VtWSI z2r8yNKx>}6s6Gv#&(UtvKj1mEd)YCF{AX!q88#CbLj4pOCM3(wKBlN;0uW;8GRm%N zii}jEj8t4zR|en{J$L<9c1_Esep!kn+PPTgO)0;ljkw?2lqwC=e%KwHoXIft9+u56 zDOVq%Zt6QTuk|kvPUh629`!MaDIxC+wUhg|7shuph8jDsPVAmM3Ys6HV;My^Aiy2Z zds486`X<22Q^YQ?@)QBMvbZ*$DuSJuHh0}V4D&EVOfc@c+%jG&e@g#TAhT3bpJApV zzvcnVlB#H(2GT{EVguO0UAq`VX==Jv_72(*Hj`za!uAD}B6?9`sM=hM=taFVK~xmI zkVVT^l+>~pOM5`$<7pmknet$#^?zV<8V1!DWOXNJT5O8eY1mw+DHfagd>do1Oih)> zO?v6L5pR@vvGeV5p5YU93*VD{E3VxvXV n8XP-FL1t4vmHk_AnqjPc{2X=~e6QE2H0ByL{8bvL@2mX-(a5uk literal 0 HcmV?d00001 diff --git a/evolutionapi/models/__pycache__/group.cpython-310.pyc b/evolutionapi/models/__pycache__/group.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75420b348b861ec948945c2773d1e5037253d941 GIT binary patch literal 1835 zcmah}O>Y}F5GD89(#n=yB~8;Fk{}JRIYdCuZV@0Yf)s{gzzquMvS5~kyyQ)gyl$%v(90ggD26gh9^4cp0N#Nhk&`vrZA9hblhP_Js*JlmDXb_eVN8LWuYW!`Phptvz$mulk}bVgO!+F1{1_-J z|0@P_?--~9;rOE;pbyuFZv0FuVbycp_MMAO|N4z8tV=tgZCR9^XslVdu~eqeCB>E{ zF3Iyo)GE*2D9`Iw_7%?4Jb&AZ>f?%Utab-^E}Evb0!f)X*HA>J_t0SE@0mWpIhub@ z=I3p#=2Bdg(zMO|RJRz4nX8Mo>hXZQs7lq?d3R~gVZ$01T{(v+RAuHXr17M?)Daws z>M#kI5lg(3&p4qwbNJylY`vL7=|P@+mr{mK%fj|rxv;FoN-f@p8U?DyXi_v2H2Y}Q z%!b(%u_G|}hYuLqh@~DOJ0sGEux)+!*-#rD1GvyLuv_my78JlO+=1R_&z};vA2&6o z68+B|U&5)#MbjPV?YzT0hSi%{C53`2*9!GPk-?xyisnUg0S(|1s_4(9q>xO6imok6bYYljp*+1AAJ(OM9Sty>@#NdWLy6sT>DI$dP(r>syYgPw>L$!i<6uVLReFboPGl?B8Q+fD2) ztX{9nh8VpJftw6u&Xl!fvjQS1_Hy48s)jCfQ|N2z?llrsZSk9uF6ofgc5Zw>QanrOwDMcKp0*6MCP{J8i6+$3DR1s1o4iRW^z1!BUW2d`zP^0uh zD)q#PKhPfgm-fnuzkn!WX5EjVveB+)yz}Pm%)DfCb2S3%^Rvg>PZ%LT(3xHyIL~35 zHXM>jnvg#2QA%DD$s|7_l22HVf#=BzcooGayvL=#L0Z+HfFUhvtLt&DbeKfwPcL9B zvoC_7NRLX=W0FdCL?8!;9G;zd5gN4~ZmJ}rQ&@ynV84THmf;waU2;N8@R**kQ}U8b z=qWr^5=g|m|G+sQu(pj$cnk?X&3y8#461@gM)kr0x^OSxHMr3pZ)IFcXMP!@dHJnh;Pyk)T}{ zV!sHJ@*UXlu=ODmg^gXmN{*2lg0Rjt+5u)t3 z>oT?<4Kt61A5fn$ioe?VXmP4JS8{4q^=$~%ckoz%!*Y{rjrw!+cJ6{EQb}@2<)-=& zLmcT{uyAe$GX(_b82iIGJNLb%-x_aGJ$`;Lh|}#dHMZB?{7)-3SS{7HhJStI!%-*m HY|;A*e8mY| literal 0 HcmV?d00001 diff --git a/evolution/models/__pycache__/message.cpython-310.pyc b/evolutionapi/models/__pycache__/message.cpython-310.pyc similarity index 100% rename from evolution/models/__pycache__/message.cpython-310.pyc rename to evolutionapi/models/__pycache__/message.cpython-310.pyc diff --git a/evolution/models/__pycache__/presence.cpython-310.pyc b/evolutionapi/models/__pycache__/presence.cpython-310.pyc similarity index 100% rename from evolution/models/__pycache__/presence.cpython-310.pyc rename to evolutionapi/models/__pycache__/presence.cpython-310.pyc diff --git a/evolutionapi/models/__pycache__/profile.cpython-310.pyc b/evolutionapi/models/__pycache__/profile.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df8d17c682c56073e9efd3463edcbb1df28488b7 GIT binary patch literal 2351 zcma)8OK;mo5Z+xe^fk+$h8>O;!Ch7lA+duSmT@J(nyFx-_*noL#3TglR*3Vt2=wY)d=|= z!D4d(+=oXeAOsOKCSy9Jlzc}76V4MNoD()=fLu`nRFmw)89IQur~|HB>;m>g18~FQ z8sMgA0d85$0k=g5aL3}hSlK1r)jz-{=~7ewAc3k={Va)f*P6LCX>4hp6L00ltj7j_qO6R3}U_AyVwNB^n4$6_`cyqCW2g=8r;EH zcbRduj7Nqa{uHP^eZfL`UK086Lph!0IFzOR&=Pec(~V*l+v(qaui_ z8MO+E7OYsWp(%wIfRDx@kF=>Bc_~J47Teh!5En5boe_IVMi46y#qFW{6fSdEvk}w& zR_5XUG-M1`e+F=W#>KmOrH9l8Zn6IO0D9_{ zg_RrZfIZN~#Ug!6=pE=x))x%Td8>C(k==5I()%!BUGg5TK=fKFovDT0Jje@exVG=> z(D@K;EYh(9OX$3f3oV_EOUAB22*cKDw1g17me9)7#tvj~p`@v2Rp&aCKE6uH4lJQ$ zsai_6E}Odsr;or0GEtTjqL(;fl3>#V5Q}Lm*d}~*q$6B-*QRd{?>b;_iW~55Zjw>k zrg%%VFQs_LtnR4jCtWu8aLo;GbI1EFLnqb$cF=LB&KVVx%Ey{fWyU3C}EV!SX- z@&L-SxiRhe591&_j3Y?BF04@K8pG2hjuHv^Zg;JY11Ks!EwVs} zu4C7!&r!h_AVN&cS;Ic&r~{A2*q;@gl9f*BmbH>Y>EY8a6{H$hpTa8j847z-Ut+J1 z;vNbcwDl?n|9|C@tH}^&nItP@#{Pm;6RrPmBJcY6?gphF3sgnU;_PN z8Dn|kjJ@Cv`v+>`-@L~D;+&oH`o^CMR}Q+K;rVd}_gN`NXW3$A%Yd>0hp}c?FBr5H d1ifp#t?DDRjsFw$3WzpYVQcPM1Aps{{{W3q!ju32 literal 0 HcmV?d00001 diff --git a/evolutionapi/models/call.py b/evolutionapi/models/call.py new file mode 100644 index 0000000..991463b --- /dev/null +++ b/evolutionapi/models/call.py @@ -0,0 +1,16 @@ +class BaseCall: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class FakeCall(BaseCall): + def __init__( + self, + number: str, + isVideo: bool, + callDuration: int + ): + super().__init__( + number=number, + isVideo=isVideo, + callDuration=callDuration + ) \ No newline at end of file diff --git a/evolutionapi/models/chat.py b/evolutionapi/models/chat.py new file mode 100644 index 0000000..4e985b3 --- /dev/null +++ b/evolutionapi/models/chat.py @@ -0,0 +1,93 @@ +from typing import List, Optional, Dict, Any + +class BaseChat: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class CheckIsWhatsappNumber(BaseChat): + def __init__( + self, + numbers: List[str] + ): + super().__init__( + numbers=numbers + ) + +class MessageKey: + def __init__( + self, + remote_jid: str, + from_me: bool, + id: str, + participant: Optional[str] = None + ): + self.remoteJid = remote_jid + self.fromMe = from_me + self.id = id + self.participant = participant + +class ReadMessage: + def __init__( + self, + remote_jid: str, + from_me: bool, + id: str + ): + self.remoteJid = remote_jid + self.fromMe = from_me + self.id = id + +class ArchiveChat: + def __init__( + self, + last_message: Dict[str, Any], + chat: str, + archive: bool + ): + self.lastMessage = last_message + self.chat = chat + self.archive = archive + +class UnreadChat: + def __init__( + self, + last_message: Dict[str, Any], + chat: str + ): + self.lastMessage = last_message + self.chat = chat + +class ProfilePicture: + def __init__(self, number: str): + self.number = number + +class MediaMessage: + def __init__( + self, + message: Dict[str, Any], + convert_to_mp4: bool = False + ): + self.message = message + self.convertToMp4 = convert_to_mp4 + +class UpdateMessage: + def __init__( + self, + number: str, + key: Dict[str, Any], + text: str + ): + self.number = number + self.key = key + self.text = text + +class Presence: + def __init__( + self, + number: str, + delay: int, + presence: str + ): + self.number = number + self.delay = delay + self.presence = presence \ No newline at end of file diff --git a/evolutionapi/models/group.py b/evolutionapi/models/group.py new file mode 100644 index 0000000..5a21460 --- /dev/null +++ b/evolutionapi/models/group.py @@ -0,0 +1,39 @@ +from typing import List, Optional, Literal +from dataclasses import dataclass + +@dataclass +class CreateGroup: + subject: str + participants: List[str] + description: Optional[str] = None + +@dataclass +class GroupPicture: + image: str + +@dataclass +class GroupSubject: + subject: str + +@dataclass +class GroupDescription: + description: str + +@dataclass +class GroupInvite: + groupJid: str + description: str + numbers: List[str] + +@dataclass +class UpdateParticipant: + action: Literal["add", "remove", "promote", "demote"] + participants: List[str] + +@dataclass +class UpdateSetting: + action: Literal["announcement", "not_announcement", "locked", "unlocked"] + +@dataclass +class ToggleEphemeral: + expiration: int \ No newline at end of file diff --git a/evolutionapi/models/instance.py b/evolutionapi/models/instance.py new file mode 100644 index 0000000..102debc --- /dev/null +++ b/evolutionapi/models/instance.py @@ -0,0 +1,59 @@ +from typing import Optional, List, Dict + +class WebhookConfig: + def __init__(self, url: str = None, byEvents: bool = False, base64: bool = True, + headers: Dict = None, events: List[str] = None): + self.url = url + self.byEvents = byEvents + self.base64 = base64 + self.headers = headers + self.events = events + +class EventsConfig: + def __init__(self, enabled: bool = True, events: List[str] = None): + self.enabled = enabled + self.events = events + +class ChatwootConfig: + def __init__(self, accountId: str = None, token: str = None, url: str = None, + signMsg: bool = True, reopenConversation: bool = True, + conversationPending: bool = False, importContacts: bool = True, + nameInbox: str = "evolution", mergeBrazilContacts: bool = True, + importMessages: bool = True, daysLimitImportMessages: int = 3, + organization: str = "Evolution Bot", + logo: str = "https://evolution-api.com/files/evolution-api-favicon.png"): + self.chatwootAccountId = accountId + self.chatwootToken = token + self.chatwootUrl = url + self.chatwootSignMsg = signMsg + self.chatwootReopenConversation = reopenConversation + self.chatwootConversationPending = conversationPending + self.chatwootImportContacts = importContacts + self.chatwootNameInbox = nameInbox + self.chatwootMergeBrazilContacts = mergeBrazilContacts + self.chatwootImportMessages = importMessages + self.chatwootDaysLimitImportMessages = daysLimitImportMessages + self.chatwootOrganization = organization + self.chatwootLogo = logo + +class InstanceConfig: + def __init__( + self, + instanceName: str, + integration: str = None, + token: str = None, + number: str = None, + qrcode: bool = None, + rejectCall: bool = None, + msgCall: str = None, + groupsIgnore: bool = None, + alwaysOnline: bool = None, + readMessages: bool = None, + readStatus: bool = None, + syncFullHistory: bool = None + ): + self.__dict__['instanceName'] = instanceName + + for key, value in locals().items(): + if key != 'self' and key != 'instanceName' and value is not None: + self.__dict__[key] = value \ No newline at end of file diff --git a/evolutionapi/models/label.py b/evolutionapi/models/label.py new file mode 100644 index 0000000..cc59334 --- /dev/null +++ b/evolutionapi/models/label.py @@ -0,0 +1,21 @@ +from typing import Literal + +class BaseLabel: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class HandleLabel(BaseLabel): + def __init__( + self, + number: str, + label_id: str, + action: Literal["add", "remove"] + ): + if action not in ["add", "remove"]: + raise ValueError("action deve ser 'add' ou 'remove'") + + super().__init__( + number=number, + labelId=label_id, + action=action + ) \ No newline at end of file diff --git a/evolutionapi/models/message.py b/evolutionapi/models/message.py new file mode 100644 index 0000000..739460f --- /dev/null +++ b/evolutionapi/models/message.py @@ -0,0 +1,254 @@ +from enum import Enum +from typing import List, Optional, Union +from dataclasses import dataclass + +class MediaType(Enum): + IMAGE = "image" + VIDEO = "video" + DOCUMENT = "document" + +class StatusType(Enum): + TEXT = "text" + IMAGE = "image" + VIDEO = "video" + AUDIO = "audio" + +class FontType(Enum): + SERIF = 1 + NORICAN_REGULAR = 2 + BRYNDAN_WRITE = 3 + BEBASNEUE_REGULAR = 4 + OSWALD_HEAVY = 5 + +class BaseMessage: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class QuotedMessage(BaseMessage): + def __init__(self, key: dict, message: Optional[dict] = None): + super().__init__(key=key, message=message) + +class TextMessage(BaseMessage): + def __init__( + self, + number: str, + text: str, + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None, + linkPreview: Optional[bool] = None, + mentionsEveryOne: Optional[bool] = None, + mentioned: Optional[List[str]] = None + ): + super().__init__( + number=number, + text=text, + delay=delay, + quoted=quoted.__dict__ if quoted else None, + linkPreview=linkPreview, + mentionsEveryOne=mentionsEveryOne, + mentioned=mentioned + ) + +class MediaMessage(BaseMessage): + def __init__( + self, + number: str, + mediatype: str, + mimetype: str, + caption: str, + media: str, + fileName: str, + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None, + mentionsEveryOne: Optional[bool] = None, + mentioned: Optional[List[str]] = None + ): + super().__init__( + number=number, + mediatype=mediatype, + mimetype=mimetype, + caption=caption, + media=media, + fileName=fileName, + delay=delay, + quoted=quoted.__dict__ if quoted else None, + mentionsEveryOne=mentionsEveryOne, + mentioned=mentioned + ) + +class StatusMessage(BaseMessage): + def __init__( + self, + type: StatusType, + content: str, + caption: Optional[str] = None, + backgroundColor: Optional[str] = None, + font: Optional[FontType] = None, + allContacts: bool = False, + statusJidList: Optional[List[str]] = None + ): + super().__init__( + type=type.value, + content=content, + caption=caption, + backgroundColor=backgroundColor, + font=font.value if font else None, + allContacts=allContacts, + statusJidList=statusJidList + ) + +class LocationMessage(BaseMessage): + def __init__( + self, + number: str, + name: str, + address: str, + latitude: float, + longitude: float, + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None + ): + super().__init__( + number=number, + name=name, + address=address, + latitude=latitude, + longitude=longitude, + delay=delay, + quoted=quoted.__dict__ if quoted else None + ) + +class Contact(BaseMessage): + def __init__( + self, + fullName: str, + wuid: str, + phoneNumber: str, + organization: Optional[str] = None, + email: Optional[str] = None, + url: Optional[str] = None + ): + super().__init__( + fullName=fullName, + wuid=wuid, + phoneNumber=phoneNumber, + organization=organization, + email=email, + url=url + ) + +class ContactMessage(BaseMessage): + def __init__(self, number: str, contact: List[Contact]): + super().__init__( + number=number, + contact=[c.__dict__ for c in contact] + ) + +class ReactionMessage(BaseMessage): + def __init__(self, key: dict, reaction: str): + super().__init__(key=key, reaction=reaction) + +class PollMessage(BaseMessage): + def __init__( + self, + number: str, + name: str, + selectableCount: int, + values: List[str], + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None + ): + super().__init__( + number=number, + name=name, + selectableCount=selectableCount, + values=values, + delay=delay, + quoted=quoted.__dict__ if quoted else None + ) + +class ListRow(BaseMessage): + def __init__(self, title: str, description: str, rowId: str): + super().__init__( + title=title, + description=description, + rowId=rowId + ) + +class ListSection(BaseMessage): + def __init__(self, title: str, rows: List[ListRow]): + super().__init__( + title=title, + rows=[r.__dict__ for r in rows] + ) + +class ListMessage(BaseMessage): + def __init__( + self, + number: str, + title: str, + description: str, + buttonText: str, + footerText: str, + sections: List[ListSection], + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None + ): + super().__init__( + number=number, + title=title, + description=description, + buttonText=buttonText, + footerText=footerText, + sections=[s.__dict__ for s in sections], + delay=delay, + quoted=quoted.__dict__ if quoted else None + ) + +class Button(BaseMessage): + def __init__( + self, + type: str, + displayText: str, + id: Optional[str] = None, + copyCode: Optional[str] = None, + url: Optional[str] = None, + phoneNumber: Optional[str] = None, + currency: Optional[str] = None, + name: Optional[str] = None, + keyType: Optional[str] = None, + key: Optional[str] = None + ): + super().__init__( + type=type, + displayText=displayText, + id=id, + copyCode=copyCode, + url=url, + phoneNumber=phoneNumber, + currency=currency, + name=name, + keyType=keyType, + key=key + ) + +class ButtonMessage(BaseMessage): + def __init__( + self, + number: str, + title: str, + description: str, + footer: str, + buttons: List[Button], + delay: Optional[int] = None, + quoted: Optional[QuotedMessage] = None + ): + super().__init__( + number=number, + title=title, + description=description, + footer=footer, + buttons=[b.__dict__ for b in buttons], + delay=delay, + quoted=quoted.__dict__ if quoted else None + ) \ No newline at end of file diff --git a/evolutionapi/models/presence.py b/evolutionapi/models/presence.py new file mode 100644 index 0000000..d245b57 --- /dev/null +++ b/evolutionapi/models/presence.py @@ -0,0 +1,9 @@ +from enum import Enum + +class PresenceStatus(Enum): + AVAILABLE = "available" + UNAVAILABLE = "unavailable" + +class PresenceConfig: + def __init__(self, presence: PresenceStatus): + self.presence = presence.value \ No newline at end of file diff --git a/evolutionapi/models/profile.py b/evolutionapi/models/profile.py new file mode 100644 index 0000000..39441b3 --- /dev/null +++ b/evolutionapi/models/profile.py @@ -0,0 +1,60 @@ +from typing import Literal + +class BaseProfile: + def __init__(self, **kwargs): + self.__dict__.update({k: v for k, v in kwargs.items() if v is not None}) + +class FetchProfile(BaseProfile): + def __init__( + self, + number: str, + ): + super().__init__( + number=number, + ) + +class ProfileName(BaseProfile): + def __init__( + self, + name: str, + ): + super().__init__( + name=name, + ) + +class ProfileStatus(BaseProfile): + def __init__( + self, + status: str, + ): + super().__init__( + status=status, + ) + +class ProfilePicture(BaseProfile): + def __init__( + self, + picture: str, + ): + super().__init__( + picture=picture, + ) + +class PrivacySettings(BaseProfile): + def __init__( + self, + readreceipts: Literal["all", "none"], + profile: Literal["all", "contacts", "contact_blacklist", "none"], + status: Literal["all", "contacts", "contact_blacklist", "none"], + online: Literal["all", "match_last_seen"], + last: Literal["all", "contacts", "contact_blacklist", "none"], + groupadd: Literal["all", "contacts", "contact_blacklist"], + ): + super().__init__( + readreceipts=readreceipts, + profile=profile, + status=status, + online=online, + last=last, + groupadd=groupadd, + ) \ No newline at end of file diff --git a/evolutionapi/services/__init__.py b/evolutionapi/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/evolutionapi/services/__pycache__/__init__.cpython-310.pyc b/evolutionapi/services/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7282ee23abd762897c404c2ced7989bc3f6814f9 GIT binary patch literal 174 zcmd1j<>g`kf_!(SbP)X*L?8o3AjbiSi&=m~3PUi1CZpdd9opP=3F7e*2X(_JMqd$175Nv z&-hYgf-?{hl))$VmVtzD&mjCJG6~TQO9l^!XNmCP=gQQTk6)WAx7&9g9t6d?=a&T` z`V!&c3bpH{S;m270yv00%K`|r1gS#^wVX!~!C)`52x9Ct^yBNiEN`^km_irS;3(vi zUZXmiwB;>RI0&Zk8PbS~(&(x|qSEPdZU>0@#q1Ctf8VEf^-`yhZw$D)N~ytl?htT_=PQ%C109zZ$ZfjX`dBGbnMSFQ$PlX$-#zUypB@2zY%15} zRiTvuFClMoe|`!z^}VhNiTOt%pNe)!8Cep?PIU{odcPly=+N&SV^LwqRGJ(5YM?B_| z3m*O3J?oEoLe7!_wW;!@R?3f*TGp^G$v;!-%Q`O)Z|s;F1g^0@euG`8mVHcY=ri>U z5wUcOXd#ZAn8o}e=wh=Z^ii{2nd;Wk@-1C$KgO22bWfLbh%LB7l_=_A0 JKf=OK#D9$jz5W0I literal 0 HcmV?d00001 diff --git a/evolutionapi/services/__pycache__/chat.cpython-310.pyc b/evolutionapi/services/__pycache__/chat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c96137d10aa97417829de557d3adeaac86a06462 GIT binary patch literal 2729 zcmai0OK%%D5MJ)C9@fjUEI;Fd*eoe|?R_ZZ z%7p~=6!+Le&qaTL|I!|M=_%*j3KZxJmr~Y-9nn}W_3g~?<2OUnQMFn!p#ApbLH{9) z{=pyFX2Fj=c;qAKn8Ao|1f)v>vuhHAnauL7AB}GeX0zOd!E&$7uFdjCMyv1!?2VS0 zox3X|e9FLcD{#rJPa#7ROPxoDAXdHAshkNg`tZgdGVx+WvcyfC^Jv$)M{o?|&~ z_wp>y3Kw=auh1ed@Ztu{uD&d=5`0LU2nUIM=L40r{9gr^X`W_Es5Z9L6?}-A~TpD5lUjH7nPojXgnRD(j8HMdb5uI{3 zmTi6>`NJ4eK~wMcU=*K#!3=i>UR$PgWZMO9+k;V3q|^(&n9>}QK~^O)Zf2NoPYsf? z7s}WPT~0lg*vyHYq&9=%=!}Q14gS-HV+@L`e7gzV#5grh2_qBor}39LF;C5j#mwI= zShdv|-$6z|i@Rqp#MNS}Ew(7&`r5lt%C z&5V^~X@@!|8!A5aB>hFtKtnZ!MCZ3?lP5)D6O-is8$Zm-aI0rh47ij|pUYd9FF%36 zSC@}Fi`f^(#Qe&5O*{fpZQw6jcxnWBfR) z1QMfq&D4<;Np0`=k?Z(!7Y5S+qON9A=@J;NmCex_04kx^DKu}2zlda}>8Ypbxj&E8 zt@#ib4vTI{DeVaN#5?C0uB}LmB_!9x4)YU zafoWpV^LQUp(7nChr2T-TUjR8&E~VYr`Ry=^O);Gdmf3e&$$>yAy0X=^bX9YW~!iW z6zfiEFsqebBq-ORKAtiDG|Tus9`ng>De^rYyC-le_B@{-!r3qs{8;$&B;8PMbddVd zLF!0{!vAc>^vZc~tNnbQA1I!E9zSy=|MKy35d{aFd5#u*9@V?xNna{g+5=zE7o4Xm ze=(!m$_o2lpZS!R73JXoPW@?J%%fRLt*5-6%y?~Pd0jP{Po$xUNFK67!QtiVqP%^} zR?!#|n_BP9Xl!I@T(Rl2*70Hqoq$uClqd}%HuP~^q4d?z@zXD&46zbR#v)nSzvj((iH{H~P6ZQc@4Y+N)CkX3f&ZW3wJq^bD;h6c^x literal 0 HcmV?d00001 diff --git a/evolutionapi/services/__pycache__/group.cpython-310.pyc b/evolutionapi/services/__pycache__/group.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..addc901a4418ee3ab02e4231efdf6b57d31d991a GIT binary patch literal 3757 zcma)9OHDAsW#G?Txal5Q9`M6;k;_JJgAJptQ%{gRIh4GwXGn`cdcx z?=?YCpL)oWFAH9t!=3!DDhgE&RiYefL?zm#0_JpT5QA1og&IdDG0E7aacFX?#W`b~ zW07$(0US%>jOUyxsR3s~;#6}^olF9!R&c}~Q=|dZ`T%vB%m8(gQw=(m__RV+FDr+01JV!38c5FhI7>O_A=v`Xa={TeACbpET_I24$ew1kT^4oX1Io^Qk9v4s{R^M*-hn&8 zZ0V^z#erl1J#`O`+4KURhG|>NjD!Y9%mkThh2hEmvuB?~XVfO{xlfWPwD(zbO1(6( z>3I}%FgqNfZO0es2?!K)H}>sBz)9?51h*YuWR~Ojp`SWV1<@d^3AH;fW8dyeWK};* zQaALdxyLw2FS-EWy%KPL)%Ys6F*hZa7b)>sWxSRIyYorfSZ;wVWGG4VY>d~L8X6sh7;2=g$BWgHk;O&D~z zbqwJRhTK#w)lfCn{I9!Ma#ohk#<`Mn>Jtwg>0kJaXTlv@hljFb1YGmgo(}FAM87h? zJ!7xCDBSDB5I4%V+y^f@jM|ySS+9I@t!HNJGWRTz{As`j*A>atCJ-b(`Xu=~Cw372 zIL8d4WQxwQb z$+-cAkv_3?Fon1m1a1b6=pB7IfSzrjlz`3Pd#SL8xD2Gpj8K+=Zlf4}L%VAwc()}- zBb)?v>^ym76B-hM&t_OKB5h~!X#h_ZMRPRYAb%c~ZmR@D62ZnS^awI2 z@_i8StrI)Lcq&Gz+&GMMpatQ7d zZ-y{`8iC?gOh?5ce9_9u^rGf^~2+P z;hM~MON7p^1*URJmZk2-(-e5p==eCGKgK8Yj50U47ovtxa%f-cq`*|pqd~d5^C<6k z0d>#CBqC)|-itGn(150NX#G~XrbzD?QSo+CZhw*pjI=M>t2noX?iqEQY{GHQBGL)) zx#l>(b=*L37>;I{o}?_R?(jKq7w1$qhh#BO=R*_23h&R@Vr*a!kksHB(kGtruk;r1 z7=GNcDi;uao;^YGr?`BEJmYN?10V=2Qj!vQ(LPHrid+SHfEmaHYKX*I{hUkm;V+LFcP_u58grWY|JHN#0g it3eoPkZkiT<08ZM%B*K1+~2`3LM6e;wFVo`X#WGLfqaVq literal 0 HcmV?d00001 diff --git a/evolution/services/__pycache__/instance.cpython-310.pyc b/evolutionapi/services/__pycache__/instance.cpython-310.pyc similarity index 100% rename from evolution/services/__pycache__/instance.cpython-310.pyc rename to evolutionapi/services/__pycache__/instance.cpython-310.pyc diff --git a/evolution/services/__pycache__/instance_operations.cpython-310.pyc b/evolutionapi/services/__pycache__/instance_operations.cpython-310.pyc similarity index 100% rename from evolution/services/__pycache__/instance_operations.cpython-310.pyc rename to evolutionapi/services/__pycache__/instance_operations.cpython-310.pyc diff --git a/evolutionapi/services/__pycache__/label.cpython-310.pyc b/evolutionapi/services/__pycache__/label.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fea0ce2cabdd0150e75220e32d4f78798363909b GIT binary patch literal 1058 zcmZ8g&2H2%5VoCcHr?GqDFQ){+|omHM-{5z07z&-DqM20LdI>qWSzxMEA47;^vV+; zB(A)Yublb{NFZh$ZAm-QOvaP>`M!zMY;TVk%8#c{PLBm+zv$4H2oFc7ZXXRW;5D1` zg3m=EI0FGu9ld8S8N@KSWH9(5iWrh(mJP2kpJl=iJ{a8?pFY>7w9D6TuW$;>xaa#7 zW%MP%!x5@GM59>2ffWKch)Y&P5UChq6`$ZFNG{`I5F$gBglGaOY+-Z=Bb+|=lQ-o@ zRUa#Rp(|C<%#Dyw`U2Gv`88iNiQKS`PZ3#C)moVrvByr;Cw7QAKbhUa$M0!=*34B7 z<%I^W~ypkt}dGTyhWz6tIik8_6!rQqtZ$iFnbt zmUa!g!d+)^kI!}TZBmo2Ye(x2whWhrSjEKa&+73FUj6K8meMp+&XtsYB;~w;^P2pL zl%LPbx_e{C*wsg_we~J~<5&NA*!x6+?p)8%vMv23w5G7+l%;$(+Dk%onhku?E*ILI mTDnS>E`p!na8lg-vZo320qaaRWdSoMG`dWd96ZnV6ln_q3l##B&C{u1oS7j>Kn8tOcbM4$< z1}ofXU4z}1cmZ*?!i(ocR$}EFy}L5$D^2xPSQYxpxqUUZ3VjthVpT?3W9ty9CedUp zh`+%$0bP~on&fV=Z9vy0x*^dz+W~Y_qFWN(WqW{bOSCT02HOX8N20qDZL&Ln?n$&E z(Yx#(p!=){ejmiOXFLq83x3AMm1A=oea;iA+;RJt(Y1hdZyvLz2-P;B3T7O!-*_jag)u0XLXgGKrtT4dg)}5Bi((gFezkjVU9|p(CBC4=`ieQ<#=! zd`=xQ(*K~pP{>&Ch;?{d>_HRj7$zKUOk41bGskMTRI!aT)GfB485_9?C&Ls1>)Q1# zHlKbe$*7M5qLm?zqbZR4TTQP}LjfoLQ556ta4*k^pCvC`R$>ih!s6MS)^!$H z(I9N6^|gtC>eyh_Ppye^q6*eDa6iYcU1)}lJT)n4p^6aSoL}72OM7cponyb|Ldr`_ z%ad1;@)Gh11W0yFT(wHNYWMS%Cj5m`Cx&fLOM2?t7VeFTDT+sfDDu6fOFAuz zZ&Gq^q9V5_Buf;4)@tH`>REkmnsLcA`#u}EcwaHiZwHo}_J|5lV>OIKT*mWR7QNU( zxRM-K8Kh!t+>+q{hhtjY$LB+QuBMw)Mtl!D-p7vBY!PN%A0S$j%OL|lOsH9DX6Q$V zma#}O(9*&!b`;i*W9w5~P_&04couhk3hevLxH x?6maQh^_<2yAb#pB{2QC1}<_pJnpAoTnRHTSX_LN`uzobZ<7#1uR+8OPmuHh^bUOzUVF;fw*oCXLoQ{BmZKFoT7Ek-`_1gkGHJIP1V-=m(fJ35kiYR| zb(rw-1|Ine1S5<_WK2hNY>W&_n8D1*{F(efn8j+>gw=jGMi#SA$)Nrb^vS@;YQMx` z5@*iaF!sgl$DckLh|`R|3Q%Kp*zocO9{CptPDYfGk-;c4uF1$`CbyWyYplktGn?70 zer=8H3hJ;OKIAFL zm+W4Anq8s3onKLzYneNNqML}V$?H`JriIyyCBtf!ZPpL)DlP}kv9J3_A13~-zcc*w{m3S zIWFB^cliwOU4h?!ENY1tqC*_oGkf*o*R6N$Lp#?P4r-aLW+@!Mz>k%{UdTESB#-2A aT71`X%}twR&g&u_-%{KOx7>rBy2k(0p*_F= literal 0 HcmV?d00001 diff --git a/evolutionapi/services/call.py b/evolutionapi/services/call.py new file mode 100644 index 0000000..4e1b2bd --- /dev/null +++ b/evolutionapi/services/call.py @@ -0,0 +1,13 @@ +from typing import Union, BinaryIO +from ..models.call import * + +class CallService: + def __init__(self, client): + self.client = client + + def fake_call(self, instance_id: str, data: FakeCall, instance_token: str): + return self.client.post( + f'call/offer/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/evolutionapi/services/chat.py b/evolutionapi/services/chat.py new file mode 100644 index 0000000..b2af456 --- /dev/null +++ b/evolutionapi/services/chat.py @@ -0,0 +1,69 @@ +from typing import Union, BinaryIO +from ..models.chat import * + +class ChatService: + def __init__(self, client): + self.client = client + + def check_is_whatsapp_numbers(self, instance_id: str, data: CheckIsWhatsappNumber, instance_token: str): + return self.client.post( + f'chat/checkIsWhatsappNumber/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def mark_message_as_read(self, instance_id: str, messages: List[ReadMessage], instance_token: str): + return self.client.post( + f'chat/markMessageAsRead/{instance_id}', + data={"readMessages": [m.__dict__ for m in messages]}, + instance_token=instance_token + ) + + def archive_chat(self, instance_id: str, data: ArchiveChat, instance_token: str): + return self.client.post( + f'chat/archiveChat/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def mark_chat_unread(self, instance_id: str, data: UnreadChat, instance_token: str): + return self.client.post( + f'chat/markChatUnread/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def delete_message_for_everyone(self, instance_id: str, data: MessageKey, instance_token: str): + return self.client.delete( + f'chat/deleteMessageForEveryone/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def fetch_profile_picture_url(self, instance_id: str, data: ProfilePicture, instance_token: str): + return self.client.post( + f'chat/fetchProfilePictureUrl/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def get_base64_from_media_message(self, instance_id: str, data: MediaMessage, instance_token: str): + return self.client.post( + f'chat/getBase64FromMediaMessage/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_message(self, instance_id: str, data: UpdateMessage, instance_token: str): + return self.client.post( + f'chat/updateMessage/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def send_presence(self, instance_id: str, data: Presence, instance_token: str): + return self.client.post( + f'chat/sendPresence/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/evolutionapi/services/group.py b/evolutionapi/services/group.py new file mode 100644 index 0000000..6bfbcfe --- /dev/null +++ b/evolutionapi/services/group.py @@ -0,0 +1,117 @@ +from typing import Optional +from ..models.group import * + +class GroupService: + def __init__(self, client): + self.client = client + + def create_group(self, instance_id: str, data: CreateGroup, instance_token: str): + return self.client.post( + f'group/create/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_group_picture(self, instance_id: str, group_jid: str, data: GroupPicture, instance_token: str): + return self.client.post( + f'group/updateGroupPicture/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def update_group_subject(self, instance_id: str, group_jid: str, data: GroupSubject, instance_token: str): + return self.client.post( + f'group/updateGroupSubject/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def update_group_description(self, instance_id: str, group_jid: str, data: GroupDescription, instance_token: str): + return self.client.post( + f'group/updateGroupDescription/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def get_invite_code(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.get( + f'group/inviteCode/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) + + def revoke_invite_code(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.post( + f'group/revokeInviteCode/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) + + def send_invite(self, instance_id: str, data: GroupInvite, instance_token: str): + return self.client.post( + f'group/sendInvite/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def get_invite_info(self, instance_id: str, invite_code: str, instance_token: str): + return self.client.get( + f'group/inviteInfo/{instance_id}', + params={'inviteCode': invite_code}, + instance_token=instance_token + ) + + def get_group_info(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.get( + f'group/findGroupInfos/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) + + def fetch_all_groups(self, instance_id: str, instance_token: str, get_participants: bool = False): + return self.client.get( + f'group/fetchAllGroups/{instance_id}', + params={'getParticipants': get_participants}, + instance_token=instance_token + ) + + def get_participants(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.get( + f'group/participants/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) + + def update_participant(self, instance_id: str, group_jid: str, data: UpdateParticipant, instance_token: str): + return self.client.post( + f'group/updateParticipant/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def update_setting(self, instance_id: str, group_jid: str, data: UpdateSetting, instance_token: str): + return self.client.post( + f'group/updateSetting/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def toggle_ephemeral(self, instance_id: str, group_jid: str, data: ToggleEphemeral, instance_token: str): + return self.client.post( + f'group/toggleEphemeral/{instance_id}', + params={'groupJid': group_jid}, + data=data.__dict__, + instance_token=instance_token + ) + + def leave_group(self, instance_id: str, group_jid: str, instance_token: str): + return self.client.delete( + f'group/leaveGroup/{instance_id}', + params={'groupJid': group_jid}, + instance_token=instance_token + ) \ No newline at end of file diff --git a/evolutionapi/services/instance.py b/evolutionapi/services/instance.py new file mode 100644 index 0000000..099c8bb --- /dev/null +++ b/evolutionapi/services/instance.py @@ -0,0 +1,9 @@ +class InstanceService: + def __init__(self, client): + self.client = client + + def fetch_instances(self): + return self.client.get('instance/fetchInstances') + + def create_instance(self, config): + return self.client.post('instance/create', data=config.__dict__) \ No newline at end of file diff --git a/evolutionapi/services/instance_operations.py b/evolutionapi/services/instance_operations.py new file mode 100644 index 0000000..c59016f --- /dev/null +++ b/evolutionapi/services/instance_operations.py @@ -0,0 +1,28 @@ +from ..models.presence import PresenceStatus, PresenceConfig + +class InstanceOperationsService: + def __init__(self, client): + self.client = client + + def connect(self, instance_id: str, instance_token: str): + return self.client.get(f'instance/connect/{instance_id}', instance_token) + + def restart(self, instance_id: str, instance_token: str): + return self.client.post(f'instance/restart/{instance_id}', instance_token=instance_token) + + def set_presence(self, instance_id: str, presence: PresenceStatus, instance_token: str): + config = PresenceConfig(presence) + return self.client.post( + f'instance/setPresence/{instance_id}', + data=config.__dict__, + instance_token=instance_token + ) + + def get_connection_state(self, instance_id: str, instance_token: str): + return self.client.get(f'instance/connectionState/{instance_id}', instance_token) + + def logout(self, instance_id: str, instance_token: str): + return self.client.delete(f'instance/logout/{instance_id}', instance_token) + + def delete(self, instance_id: str, instance_token: str): + return self.client.delete(f'instance/delete/{instance_id}', instance_token) diff --git a/evolutionapi/services/label.py b/evolutionapi/services/label.py new file mode 100644 index 0000000..ed87c91 --- /dev/null +++ b/evolutionapi/services/label.py @@ -0,0 +1,19 @@ +from typing import Union, BinaryIO +from ..models.label import * + +class LabelService: + def __init__(self, client): + self.client = client + + def find_labels(self, instance_id: str, instance_token: str): + return self.client.get( + f'label/findLabels/{instance_id}', + instance_token=instance_token + ) + + def handle_label(self, instance_id: str, data: HandleLabel, instance_token: str): + return self.client.post( + f'label/handleLabel/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/evolutionapi/services/message.py b/evolutionapi/services/message.py new file mode 100644 index 0000000..02bd3c4 --- /dev/null +++ b/evolutionapi/services/message.py @@ -0,0 +1,111 @@ +from typing import Union, BinaryIO +from ..models.message import * + +class MessageService: + def __init__(self, client): + self.client = client + + def send_text(self, instance_id: str, message: TextMessage, instance_token: str): + return self.client.post( + f'message/sendText/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_media(self, instance_id: str, message: MediaMessage, instance_token: str, file: BinaryIO = None): + payload = { + 'data': message.__dict__, + 'instance_token': instance_token + } + + if file: + payload['files'] = {'file': file} + + return self.client.post( + f'message/sendMedia/{instance_id}', + **payload + ) + + def send_ptv(self, instance_id: str, message: dict, instance_token: str, file: BinaryIO = None): + payload = { + 'data': message, + 'instance_token': instance_token + } + + if file: + payload['files'] = {'file': file} + + return self.client.post( + f'message/sendPtv/{instance_id}', + **payload + ) + + def send_whatsapp_audio(self, instance_id: str, message: dict, instance_token: str, file: BinaryIO = None): + payload = { + 'data': message, + 'instance_token': instance_token + } + + if file: + payload['files'] = {'file': file} + + return self.client.post( + f'message/sendWhatsAppAudio/{instance_id}', + **payload + ) + + def send_status(self, instance_id: str, message: StatusMessage, instance_token: str): + return self.client.post( + f'message/sendStatus/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_sticker(self, instance_id: str, message: dict, instance_token: str): + return self.client.post( + f'message/sendSticker/{instance_id}', + data=message, + instance_token=instance_token + ) + + def send_location(self, instance_id: str, message: LocationMessage, instance_token: str): + return self.client.post( + f'message/sendLocation/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_contact(self, instance_id: str, message: ContactMessage, instance_token: str): + return self.client.post( + f'message/sendContact/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_reaction(self, instance_id: str, message: ReactionMessage, instance_token: str): + return self.client.post( + f'message/sendReaction/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_poll(self, instance_id: str, message: PollMessage, instance_token: str): + return self.client.post( + f'message/sendPoll/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_list(self, instance_id: str, message: ListMessage, instance_token: str): + return self.client.post( + f'message/sendList/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) + + def send_buttons(self, instance_id: str, message: ButtonMessage, instance_token: str): + return self.client.post( + f'message/sendButtons/{instance_id}', + data=message.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/evolutionapi/services/profile.py b/evolutionapi/services/profile.py new file mode 100644 index 0000000..b0da8ab --- /dev/null +++ b/evolutionapi/services/profile.py @@ -0,0 +1,60 @@ +from typing import Union, BinaryIO +from ..models.profile import * + +class ProfileService: + def __init__(self, client): + self.client = client + + def fetch_business_profile(self, instance_id: str, data: FetchProfile, instance_token: str): + return self.client.post( + f'chat/fetchBusinessProfile/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def fetch_profile(self, instance_id: str, data: FetchProfile, instance_token: str): + return self.client.post( + f'chat/fetchProfile/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_profile_name(self, instance_id: str, data: ProfileName, instance_token: str): + return self.client.post( + f'chat/updateProfileName/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_profile_status(self, instance_id: str, data: ProfileStatus, instance_token: str): + return self.client.post( + f'chat/updateProfileStatus/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def update_profile_picture(self, instance_id: str, data: ProfilePicture, instance_token: str): + return self.client.post( + f'chat/updateProfilePicture/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) + + def remove_profile_picture(self, instance_id: str, instance_token: str): + return self.client.delete( + f'chat/removeProfilePicture/{instance_id}', + instance_token=instance_token + ) + + def fetch_privacy_settings(self, instance_id: str, instance_token: str): + return self.client.get( + f'chat/fetchPrivacySettings/{instance_id}', + instance_token=instance_token + ) + + def update_privacy_settings(self, instance_id: str, data: PrivacySettings, instance_token: str): + return self.client.post( + f'chat/updatePrivacySettings/{instance_id}', + data=data.__dict__, + instance_token=instance_token + ) \ No newline at end of file diff --git a/publish.sh b/publish.sh new file mode 100755 index 0000000..daca7fb --- /dev/null +++ b/publish.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# Limpa diretório dist anterior se existir +rm -rf dist/* + +# Gera os arquivos de distribuição +python setup.py sdist bdist_wheel + +# Faz upload para o PyPI +twine upload dist/* + +echo "Pacote publicado com sucesso!" diff --git a/setup.py b/setup.py index 4608884..d0322c8 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,14 @@ from setuptools import setup, find_packages setup( - name='evolution-client', - version='0.0.1', + name='evolutionapi', + version='0.0.3', description='Client Python para a API Evolution', author='Davidson Gomes', author_email='contato@agenciadgcode.com', packages=find_packages(), + package_data={'': ['*']}, + include_package_data=True, install_requires=[ 'requests>=2.25.1', ], diff --git a/test_evolution.py b/test_evolution.py index ffe3377..6d52708 100644 --- a/test_evolution.py +++ b/test_evolution.py @@ -1,6 +1,6 @@ -from evolution.client import EvolutionClient -from evolution.models.instance import InstanceConfig -from evolution.models.message import TextMessage, MediaMessage, MediaType +from evolutionapi.client import EvolutionClient +from evolutionapi.models.instance import InstanceConfig +from evolutionapi.models.message import TextMessage, MediaMessage, MediaType print("Iniciando cliente")