wazzapi 0.1.2__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {wazzapi-0.1.2 → wazzapi-0.2.0}/PKG-INFO +1 -1
- {wazzapi-0.1.2 → wazzapi-0.2.0}/pyproject.toml +1 -1
- {wazzapi-0.1.2 → wazzapi-0.2.0}/tests/smoke_test.py +1 -1
- wazzapi-0.2.0/tests/test_groups.py +285 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/__init__.py +1 -1
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/client.py +2 -1
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/models/__init__.py +3 -1
- wazzapi-0.2.0/wazzapi/models/groups.py +165 -0
- wazzapi-0.2.0/wazzapi/resources/__init__.py +6 -0
- wazzapi-0.2.0/wazzapi/resources/groups.py +266 -0
- wazzapi-0.1.2/wazzapi/resources/__init__.py +0 -5
- {wazzapi-0.1.2 → wazzapi-0.2.0}/.gitignore +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/README.md +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/examples/create_template.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/examples/list_contacts.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/examples/preview_template.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/examples/send_message.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/examples/verify_webhook.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/tests/test_client.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/tests/test_media.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/tests/test_resources.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/tests/test_webhooks.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/errors.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/media.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/models/base.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/models/contacts.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/models/media.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/models/messages.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/models/templates.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/models/webhooks.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/py.typed +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/resources/base.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/resources/contacts.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/resources/messages.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/resources/templates.py +0 -0
- {wazzapi-0.1.2 → wazzapi-0.2.0}/wazzapi/webhooks.py +0 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from collections.abc import Callable
|
|
5
|
+
|
|
6
|
+
import httpx
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
from wazzapi import WazzapiClient, models
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pytest.mark.parametrize(
|
|
13
|
+
("call_factory", "expected_method", "expected_path", "expected_response_type", "response_json"),
|
|
14
|
+
[
|
|
15
|
+
(
|
|
16
|
+
lambda client: client.groups.list(session_name="main", limit=25),
|
|
17
|
+
"GET",
|
|
18
|
+
"/api/v1/groups",
|
|
19
|
+
models.GroupListResponse,
|
|
20
|
+
{"groups": [], "total": 0},
|
|
21
|
+
),
|
|
22
|
+
(
|
|
23
|
+
lambda client: client.groups.get("123@g.us", session_name="main"),
|
|
24
|
+
"GET",
|
|
25
|
+
"/api/v1/groups/123@g.us",
|
|
26
|
+
models.GroupDetailResponse,
|
|
27
|
+
{"id": "123@g.us", "name": "Test Group"},
|
|
28
|
+
),
|
|
29
|
+
(
|
|
30
|
+
lambda client: client.groups.get_participants("123@g.us", session_name="main"),
|
|
31
|
+
"GET",
|
|
32
|
+
"/api/v1/groups/123@g.us/participants",
|
|
33
|
+
models.GroupParticipantsResponse,
|
|
34
|
+
{"participants": [{"id": "6281234567890@s.whatsapp.net", "is_admin": True}]},
|
|
35
|
+
),
|
|
36
|
+
(
|
|
37
|
+
lambda client: client.groups.create({"session_name": "main", "name": "New Group", "participants": ["6281234567890"]}),
|
|
38
|
+
"POST",
|
|
39
|
+
"/api/v1/groups/create",
|
|
40
|
+
models.CreateGroupResponseModel,
|
|
41
|
+
{"success": True, "jid": "456@g.us", "name": "New Group"},
|
|
42
|
+
),
|
|
43
|
+
(
|
|
44
|
+
lambda client: client.groups.send_text({"session_name": "main", "group_jid": "123@g.us", "text": "hello"}),
|
|
45
|
+
"POST",
|
|
46
|
+
"/api/v1/groups/send",
|
|
47
|
+
models.SendGroupResponse,
|
|
48
|
+
{"success": True, "message_id": "msg_1", "status": "queued"},
|
|
49
|
+
),
|
|
50
|
+
(
|
|
51
|
+
lambda client: client.groups.send_media({
|
|
52
|
+
"session_name": "main",
|
|
53
|
+
"group_jid": "123@g.us",
|
|
54
|
+
"media_url": "https://example.com/img.jpg",
|
|
55
|
+
"media_type": "image",
|
|
56
|
+
}),
|
|
57
|
+
"POST",
|
|
58
|
+
"/api/v1/groups/send/media",
|
|
59
|
+
models.SendGroupResponse,
|
|
60
|
+
{"success": True, "message_id": "msg_2", "status": "queued"},
|
|
61
|
+
),
|
|
62
|
+
(
|
|
63
|
+
lambda client: client.groups.update_participants({
|
|
64
|
+
"session_name": "main",
|
|
65
|
+
"group_jid": "123@g.us",
|
|
66
|
+
"action": "promote",
|
|
67
|
+
"participants": ["6281234567890@s.whatsapp.net"],
|
|
68
|
+
}),
|
|
69
|
+
"POST",
|
|
70
|
+
"/api/v1/groups/participants",
|
|
71
|
+
models.GroupOperationResponseModel,
|
|
72
|
+
{"success": True, "details": "done"},
|
|
73
|
+
),
|
|
74
|
+
(
|
|
75
|
+
lambda client: client.groups.add_participant("123@g.us", session_name="main", participant_jid="6281234567890@s.whatsapp.net"),
|
|
76
|
+
"POST",
|
|
77
|
+
"/api/v1/groups/123@g.us/participants/add",
|
|
78
|
+
models.GroupOperationResponseModel,
|
|
79
|
+
{"success": True, "details": "added"},
|
|
80
|
+
),
|
|
81
|
+
(
|
|
82
|
+
lambda client: client.groups.remove_participant("123@g.us", session_name="main", participant_jid="6281234567890@s.whatsapp.net"),
|
|
83
|
+
"POST",
|
|
84
|
+
"/api/v1/groups/123@g.us/participants/remove",
|
|
85
|
+
models.GroupOperationResponseModel,
|
|
86
|
+
{"success": True, "details": "removed"},
|
|
87
|
+
),
|
|
88
|
+
(
|
|
89
|
+
lambda client: client.groups.get_invite_link("123@g.us", session_name="main"),
|
|
90
|
+
"POST",
|
|
91
|
+
"/api/v1/groups/123@g.us/invite-link",
|
|
92
|
+
models.GroupInviteLinkResponseModel,
|
|
93
|
+
{"success": True, "invite_link": "https://chat.whatsapp.com/abc"},
|
|
94
|
+
),
|
|
95
|
+
(
|
|
96
|
+
lambda client: client.groups.get_invite_info({"session_name": "main", "invite_link": "https://chat.whatsapp.com/abc"}),
|
|
97
|
+
"POST",
|
|
98
|
+
"/api/v1/groups/invite-info",
|
|
99
|
+
models.GroupInviteInfoResponseModel,
|
|
100
|
+
{"success": True, "jid": "789@g.us", "name": "Invited Group"},
|
|
101
|
+
),
|
|
102
|
+
(
|
|
103
|
+
lambda client: client.groups.join({"session_name": "main", "invite_link": "https://chat.whatsapp.com/abc"}),
|
|
104
|
+
"POST",
|
|
105
|
+
"/api/v1/groups/join",
|
|
106
|
+
models.GroupOperationResponseModel,
|
|
107
|
+
{"success": True, "details": "joined"},
|
|
108
|
+
),
|
|
109
|
+
(
|
|
110
|
+
lambda client: client.groups.leave("123@g.us", session_name="main"),
|
|
111
|
+
"POST",
|
|
112
|
+
"/api/v1/groups/123@g.us/leave",
|
|
113
|
+
models.GroupOperationResponseModel,
|
|
114
|
+
{"success": True, "details": "left"},
|
|
115
|
+
),
|
|
116
|
+
(
|
|
117
|
+
lambda client: client.groups.set_name("123@g.us", {"session_name": "main", "name": "Renamed"}),
|
|
118
|
+
"POST",
|
|
119
|
+
"/api/v1/groups/123@g.us/name",
|
|
120
|
+
models.GroupOperationResponseModel,
|
|
121
|
+
{"success": True, "details": "name updated"},
|
|
122
|
+
),
|
|
123
|
+
(
|
|
124
|
+
lambda client: client.groups.set_topic("123@g.us", {"session_name": "main", "topic": "new topic"}),
|
|
125
|
+
"POST",
|
|
126
|
+
"/api/v1/groups/123@g.us/topic",
|
|
127
|
+
models.GroupOperationResponseModel,
|
|
128
|
+
{"success": True, "details": "topic updated"},
|
|
129
|
+
),
|
|
130
|
+
(
|
|
131
|
+
lambda client: client.groups.set_photo("123@g.us", {"session_name": "main", "image_data_uri": "data:image/png;base64,abc"}),
|
|
132
|
+
"POST",
|
|
133
|
+
"/api/v1/groups/123@g.us/photo",
|
|
134
|
+
models.GroupOperationResponseModel,
|
|
135
|
+
{"success": True, "details": "photo updated"},
|
|
136
|
+
),
|
|
137
|
+
(
|
|
138
|
+
lambda client: client.groups.set_announce("123@g.us", {"session_name": "main", "announce": True}),
|
|
139
|
+
"POST",
|
|
140
|
+
"/api/v1/groups/123@g.us/announce",
|
|
141
|
+
models.GroupOperationResponseModel,
|
|
142
|
+
{"success": True, "details": "announce set"},
|
|
143
|
+
),
|
|
144
|
+
(
|
|
145
|
+
lambda client: client.groups.set_locked("123@g.us", {"session_name": "main", "locked": True}),
|
|
146
|
+
"POST",
|
|
147
|
+
"/api/v1/groups/123@g.us/locked",
|
|
148
|
+
models.GroupOperationResponseModel,
|
|
149
|
+
{"success": True, "details": "locked set"},
|
|
150
|
+
),
|
|
151
|
+
(
|
|
152
|
+
lambda client: client.groups.set_ephemeral("123@g.us", {"session_name": "main", "duration": "24h"}),
|
|
153
|
+
"POST",
|
|
154
|
+
"/api/v1/groups/123@g.us/ephemeral",
|
|
155
|
+
models.GroupOperationResponseModel,
|
|
156
|
+
{"success": True, "details": "ephemeral set"},
|
|
157
|
+
),
|
|
158
|
+
],
|
|
159
|
+
)
|
|
160
|
+
def test_groups_methods_hit_expected_routes(
|
|
161
|
+
call_factory: Callable[[WazzapiClient], object],
|
|
162
|
+
expected_method: str,
|
|
163
|
+
expected_path: str,
|
|
164
|
+
expected_response_type: type[object],
|
|
165
|
+
response_json: dict[str, object],
|
|
166
|
+
) -> None:
|
|
167
|
+
seen: dict[str, object] = {}
|
|
168
|
+
|
|
169
|
+
def handler(request: httpx.Request) -> httpx.Response:
|
|
170
|
+
seen["method"] = request.method
|
|
171
|
+
seen["path"] = request.url.path
|
|
172
|
+
seen["query"] = dict(request.url.params)
|
|
173
|
+
seen["body"] = json.loads(request.content.decode("utf-8")) if request.content else None
|
|
174
|
+
status_code = 201 if request.method == "POST" else 200
|
|
175
|
+
return httpx.Response(status_code, json=response_json)
|
|
176
|
+
|
|
177
|
+
transport = httpx.MockTransport(handler)
|
|
178
|
+
with WazzapiClient(base_url="https://api.example.com", transport=transport) as client:
|
|
179
|
+
result = call_factory(client)
|
|
180
|
+
|
|
181
|
+
assert seen["method"] == expected_method
|
|
182
|
+
assert seen["path"] == expected_path
|
|
183
|
+
assert isinstance(result, expected_response_type)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def test_groups_remove_photo_returns_operation_response() -> None:
|
|
187
|
+
seen: dict[str, object] = {}
|
|
188
|
+
|
|
189
|
+
def handler(request: httpx.Request) -> httpx.Response:
|
|
190
|
+
seen["method"] = request.method
|
|
191
|
+
seen["path"] = request.url.path
|
|
192
|
+
seen["query"] = dict(request.url.params)
|
|
193
|
+
return httpx.Response(
|
|
194
|
+
200,
|
|
195
|
+
json={"success": True, "details": "photo removed"},
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
transport = httpx.MockTransport(handler)
|
|
199
|
+
with WazzapiClient(base_url="https://api.example.com", transport=transport) as client:
|
|
200
|
+
result = client.groups.remove_photo("123@g.us", session_name="main")
|
|
201
|
+
|
|
202
|
+
assert seen["method"] == "DELETE"
|
|
203
|
+
assert seen["path"] == "/api/v1/groups/123@g.us/photo"
|
|
204
|
+
assert seen["query"] == {"session_name": "main"}
|
|
205
|
+
assert isinstance(result, models.GroupOperationResponseModel)
|
|
206
|
+
assert result.success is True
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def test_groups_list_sends_query_params() -> None:
|
|
210
|
+
seen: dict[str, object] = {}
|
|
211
|
+
|
|
212
|
+
def handler(request: httpx.Request) -> httpx.Response:
|
|
213
|
+
seen["query"] = dict(request.url.params)
|
|
214
|
+
return httpx.Response(200, json={"groups": [], "total": 0})
|
|
215
|
+
|
|
216
|
+
transport = httpx.MockTransport(handler)
|
|
217
|
+
with WazzapiClient(base_url="https://api.example.com", transport=transport) as client:
|
|
218
|
+
client.groups.list(session_name="main", limit=10, offset=5)
|
|
219
|
+
|
|
220
|
+
assert seen["query"] == {"session_name": "main", "limit": "10", "offset": "5"}
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def test_groups_get_sends_session_name_query() -> None:
|
|
224
|
+
seen: dict[str, object] = {}
|
|
225
|
+
|
|
226
|
+
def handler(request: httpx.Request) -> httpx.Response:
|
|
227
|
+
seen["query"] = dict(request.url.params)
|
|
228
|
+
return httpx.Response(200, json={"id": "123@g.us", "name": "Test"})
|
|
229
|
+
|
|
230
|
+
transport = httpx.MockTransport(handler)
|
|
231
|
+
with WazzapiClient(base_url="https://api.example.com", transport=transport) as client:
|
|
232
|
+
client.groups.get("123@g.us", session_name="main")
|
|
233
|
+
|
|
234
|
+
assert seen["query"] == {"session_name": "main"}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def test_groups_add_participant_sends_query_params() -> None:
|
|
238
|
+
seen: dict[str, object] = {}
|
|
239
|
+
|
|
240
|
+
def handler(request: httpx.Request) -> httpx.Response:
|
|
241
|
+
seen["query"] = dict(request.url.params)
|
|
242
|
+
return httpx.Response(200, json={"success": True, "details": "added"})
|
|
243
|
+
|
|
244
|
+
transport = httpx.MockTransport(handler)
|
|
245
|
+
with WazzapiClient(base_url="https://api.example.com", transport=transport) as client:
|
|
246
|
+
client.groups.add_participant(
|
|
247
|
+
"123@g.us",
|
|
248
|
+
session_name="main",
|
|
249
|
+
participant_jid="6281234567890@s.whatsapp.net",
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
assert seen["query"] == {
|
|
253
|
+
"session_name": "main",
|
|
254
|
+
"participant_jid": "6281234567890@s.whatsapp.net",
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def test_groups_models_are_importable() -> None:
|
|
259
|
+
from wazzapi.models import (
|
|
260
|
+
CreateGroupRequest,
|
|
261
|
+
CreateGroupResponseModel,
|
|
262
|
+
GroupDetailResponse,
|
|
263
|
+
GroupInviteInfoResponseModel,
|
|
264
|
+
GroupInviteLinkResponseModel,
|
|
265
|
+
GroupListItem,
|
|
266
|
+
GroupListResponse,
|
|
267
|
+
GroupOperationResponseModel,
|
|
268
|
+
GroupParticipantItem,
|
|
269
|
+
GroupParticipantsResponse,
|
|
270
|
+
InviteInfoRequest,
|
|
271
|
+
JoinGroupRequest,
|
|
272
|
+
SendGroupMediaRequest,
|
|
273
|
+
SendGroupResponse,
|
|
274
|
+
SendGroupTextRequest,
|
|
275
|
+
SetGroupAnnounceRequest,
|
|
276
|
+
SetGroupEphemeralRequest,
|
|
277
|
+
SetGroupLockedRequest,
|
|
278
|
+
SetGroupNameRequest,
|
|
279
|
+
SetGroupPhotoRequest,
|
|
280
|
+
SetGroupTopicRequest,
|
|
281
|
+
UpdateParticipantsRequest,
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
assert GroupListItem is not None
|
|
285
|
+
assert CreateGroupResponseModel is not None
|
|
@@ -7,7 +7,7 @@ import httpx
|
|
|
7
7
|
from pydantic import BaseModel, TypeAdapter
|
|
8
8
|
|
|
9
9
|
from .errors import WazzapiAPIError
|
|
10
|
-
from .resources import ContactsResource, MessagesResource, TemplatesResource
|
|
10
|
+
from .resources import ContactsResource, GroupsResource, MessagesResource, TemplatesResource
|
|
11
11
|
|
|
12
12
|
DEFAULT_BASE_URL = "https://api.wazzapi.com"
|
|
13
13
|
|
|
@@ -39,6 +39,7 @@ class WazzapiClient:
|
|
|
39
39
|
)
|
|
40
40
|
|
|
41
41
|
self.contacts = ContactsResource(self)
|
|
42
|
+
self.groups = GroupsResource(self)
|
|
42
43
|
self.messages = MessagesResource(self)
|
|
43
44
|
self.templates = TemplatesResource(self)
|
|
44
45
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
from .base import WazzapiModel
|
|
2
2
|
from .contacts import *
|
|
3
3
|
from .contacts import __all__ as contacts_all
|
|
4
|
+
from .groups import *
|
|
5
|
+
from .groups import __all__ as groups_all
|
|
4
6
|
from .media import *
|
|
5
7
|
from .media import __all__ as media_all
|
|
6
8
|
from .messages import *
|
|
@@ -10,4 +12,4 @@ from .templates import __all__ as templates_all
|
|
|
10
12
|
from .webhooks import *
|
|
11
13
|
from .webhooks import __all__ as webhooks_all
|
|
12
14
|
|
|
13
|
-
__all__ = ["WazzapiModel", *contacts_all, *media_all, *messages_all, *templates_all, *webhooks_all]
|
|
15
|
+
__all__ = ["WazzapiModel", *contacts_all, *groups_all, *media_all, *messages_all, *templates_all, *webhooks_all]
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from .base import WazzapiModel
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class GroupListItem(WazzapiModel):
|
|
10
|
+
id: str
|
|
11
|
+
name: str
|
|
12
|
+
description: str | None = None
|
|
13
|
+
owner: str | None = None
|
|
14
|
+
participants_count: int = 0
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class GroupListResponse(WazzapiModel):
|
|
18
|
+
groups: list[GroupListItem]
|
|
19
|
+
total: int
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class GroupDetailResponse(WazzapiModel):
|
|
23
|
+
id: str
|
|
24
|
+
name: str
|
|
25
|
+
description: str | None = None
|
|
26
|
+
owner: str | None = None
|
|
27
|
+
participants_count: int = 0
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class GroupParticipantItem(WazzapiModel):
|
|
31
|
+
id: str
|
|
32
|
+
is_admin: bool = False
|
|
33
|
+
is_super_admin: bool = False
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class GroupParticipantsResponse(WazzapiModel):
|
|
37
|
+
participants: list[GroupParticipantItem]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class GroupOperationResponseModel(WazzapiModel):
|
|
41
|
+
success: bool
|
|
42
|
+
details: str
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class CreateGroupRequest(WazzapiModel):
|
|
46
|
+
session_name: str
|
|
47
|
+
name: str
|
|
48
|
+
participants: list[str]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class CreateGroupResponseModel(WazzapiModel):
|
|
52
|
+
success: bool
|
|
53
|
+
jid: str
|
|
54
|
+
name: str
|
|
55
|
+
owner_jid: str | None = None
|
|
56
|
+
group_created: str | None = None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class SendGroupTextRequest(WazzapiModel):
|
|
60
|
+
session_name: str
|
|
61
|
+
group_jid: str
|
|
62
|
+
text: str
|
|
63
|
+
message_id: str | None = None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class SendGroupMediaRequest(WazzapiModel):
|
|
67
|
+
session_name: str
|
|
68
|
+
group_jid: str
|
|
69
|
+
media_url: str
|
|
70
|
+
media_type: str
|
|
71
|
+
caption: str | None = None
|
|
72
|
+
filename: str | None = None
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class SendGroupResponse(WazzapiModel):
|
|
76
|
+
success: bool
|
|
77
|
+
message_id: str
|
|
78
|
+
status: str
|
|
79
|
+
run_id: str | None = None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class UpdateParticipantsRequest(WazzapiModel):
|
|
83
|
+
session_name: str
|
|
84
|
+
group_jid: str
|
|
85
|
+
action: str
|
|
86
|
+
participants: list[str]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class GroupInviteLinkResponseModel(WazzapiModel):
|
|
90
|
+
success: bool
|
|
91
|
+
invite_link: str
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class GroupInviteInfoResponseModel(WazzapiModel):
|
|
95
|
+
success: bool
|
|
96
|
+
jid: str
|
|
97
|
+
name: str
|
|
98
|
+
participants: int = 0
|
|
99
|
+
owner_jid: str | None = None
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class InviteInfoRequest(WazzapiModel):
|
|
103
|
+
session_name: str
|
|
104
|
+
invite_link: str
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class JoinGroupRequest(WazzapiModel):
|
|
108
|
+
session_name: str
|
|
109
|
+
invite_link: str
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class SetGroupNameRequest(WazzapiModel):
|
|
113
|
+
session_name: str
|
|
114
|
+
name: str
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class SetGroupTopicRequest(WazzapiModel):
|
|
118
|
+
session_name: str
|
|
119
|
+
topic: str
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class SetGroupPhotoRequest(WazzapiModel):
|
|
123
|
+
session_name: str
|
|
124
|
+
image_data_uri: str
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class SetGroupAnnounceRequest(WazzapiModel):
|
|
128
|
+
session_name: str
|
|
129
|
+
announce: bool
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class SetGroupLockedRequest(WazzapiModel):
|
|
133
|
+
session_name: str
|
|
134
|
+
locked: bool
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class SetGroupEphemeralRequest(WazzapiModel):
|
|
138
|
+
session_name: str
|
|
139
|
+
duration: str
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
__all__ = [
|
|
143
|
+
"CreateGroupRequest",
|
|
144
|
+
"CreateGroupResponseModel",
|
|
145
|
+
"GroupDetailResponse",
|
|
146
|
+
"GroupInviteInfoResponseModel",
|
|
147
|
+
"GroupInviteLinkResponseModel",
|
|
148
|
+
"GroupListItem",
|
|
149
|
+
"GroupListResponse",
|
|
150
|
+
"GroupOperationResponseModel",
|
|
151
|
+
"GroupParticipantItem",
|
|
152
|
+
"GroupParticipantsResponse",
|
|
153
|
+
"InviteInfoRequest",
|
|
154
|
+
"JoinGroupRequest",
|
|
155
|
+
"SendGroupMediaRequest",
|
|
156
|
+
"SendGroupResponse",
|
|
157
|
+
"SendGroupTextRequest",
|
|
158
|
+
"SetGroupAnnounceRequest",
|
|
159
|
+
"SetGroupEphemeralRequest",
|
|
160
|
+
"SetGroupLockedRequest",
|
|
161
|
+
"SetGroupNameRequest",
|
|
162
|
+
"SetGroupPhotoRequest",
|
|
163
|
+
"SetGroupTopicRequest",
|
|
164
|
+
"UpdateParticipantsRequest",
|
|
165
|
+
]
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from .. import models
|
|
6
|
+
from .base import BaseResource
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class GroupsResource(BaseResource):
|
|
10
|
+
def list(
|
|
11
|
+
self,
|
|
12
|
+
*,
|
|
13
|
+
session_name: str,
|
|
14
|
+
limit: int | None = None,
|
|
15
|
+
offset: int | None = None,
|
|
16
|
+
) -> models.GroupListResponse:
|
|
17
|
+
return self._client._request(
|
|
18
|
+
"GET",
|
|
19
|
+
"/api/v1/groups",
|
|
20
|
+
params={
|
|
21
|
+
"session_name": session_name,
|
|
22
|
+
"limit": limit,
|
|
23
|
+
"offset": offset,
|
|
24
|
+
},
|
|
25
|
+
response_model=models.GroupListResponse,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def get(
|
|
29
|
+
self,
|
|
30
|
+
group_jid: str,
|
|
31
|
+
*,
|
|
32
|
+
session_name: str,
|
|
33
|
+
) -> models.GroupDetailResponse:
|
|
34
|
+
return self._client._request(
|
|
35
|
+
"GET",
|
|
36
|
+
f"/api/v1/groups/{group_jid}",
|
|
37
|
+
params={"session_name": session_name},
|
|
38
|
+
response_model=models.GroupDetailResponse,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
def get_participants(
|
|
42
|
+
self,
|
|
43
|
+
group_jid: str,
|
|
44
|
+
*,
|
|
45
|
+
session_name: str,
|
|
46
|
+
) -> models.GroupParticipantsResponse:
|
|
47
|
+
return self._client._request(
|
|
48
|
+
"GET",
|
|
49
|
+
f"/api/v1/groups/{group_jid}/participants",
|
|
50
|
+
params={"session_name": session_name},
|
|
51
|
+
response_model=models.GroupParticipantsResponse,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def create(
|
|
55
|
+
self,
|
|
56
|
+
payload: models.CreateGroupRequest | dict[str, Any],
|
|
57
|
+
) -> models.CreateGroupResponseModel:
|
|
58
|
+
return self._client._request(
|
|
59
|
+
"POST",
|
|
60
|
+
"/api/v1/groups/create",
|
|
61
|
+
json_body=payload,
|
|
62
|
+
response_model=models.CreateGroupResponseModel,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
def send_text(
|
|
66
|
+
self,
|
|
67
|
+
payload: models.SendGroupTextRequest | dict[str, Any],
|
|
68
|
+
) -> models.SendGroupResponse:
|
|
69
|
+
return self._client._request(
|
|
70
|
+
"POST",
|
|
71
|
+
"/api/v1/groups/send",
|
|
72
|
+
json_body=payload,
|
|
73
|
+
response_model=models.SendGroupResponse,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def send_media(
|
|
77
|
+
self,
|
|
78
|
+
payload: models.SendGroupMediaRequest | dict[str, Any],
|
|
79
|
+
) -> models.SendGroupResponse:
|
|
80
|
+
return self._client._request(
|
|
81
|
+
"POST",
|
|
82
|
+
"/api/v1/groups/send/media",
|
|
83
|
+
json_body=payload,
|
|
84
|
+
response_model=models.SendGroupResponse,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
def update_participants(
|
|
88
|
+
self,
|
|
89
|
+
payload: models.UpdateParticipantsRequest | dict[str, Any],
|
|
90
|
+
) -> models.GroupOperationResponseModel:
|
|
91
|
+
return self._client._request(
|
|
92
|
+
"POST",
|
|
93
|
+
"/api/v1/groups/participants",
|
|
94
|
+
json_body=payload,
|
|
95
|
+
response_model=models.GroupOperationResponseModel,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
def add_participant(
|
|
99
|
+
self,
|
|
100
|
+
group_jid: str,
|
|
101
|
+
*,
|
|
102
|
+
session_name: str,
|
|
103
|
+
participant_jid: str,
|
|
104
|
+
) -> models.GroupOperationResponseModel:
|
|
105
|
+
return self._client._request(
|
|
106
|
+
"POST",
|
|
107
|
+
f"/api/v1/groups/{group_jid}/participants/add",
|
|
108
|
+
params={
|
|
109
|
+
"session_name": session_name,
|
|
110
|
+
"participant_jid": participant_jid,
|
|
111
|
+
},
|
|
112
|
+
response_model=models.GroupOperationResponseModel,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
def remove_participant(
|
|
116
|
+
self,
|
|
117
|
+
group_jid: str,
|
|
118
|
+
*,
|
|
119
|
+
session_name: str,
|
|
120
|
+
participant_jid: str,
|
|
121
|
+
) -> models.GroupOperationResponseModel:
|
|
122
|
+
return self._client._request(
|
|
123
|
+
"POST",
|
|
124
|
+
f"/api/v1/groups/{group_jid}/participants/remove",
|
|
125
|
+
params={
|
|
126
|
+
"session_name": session_name,
|
|
127
|
+
"participant_jid": participant_jid,
|
|
128
|
+
},
|
|
129
|
+
response_model=models.GroupOperationResponseModel,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
def get_invite_link(
|
|
133
|
+
self,
|
|
134
|
+
group_jid: str,
|
|
135
|
+
*,
|
|
136
|
+
session_name: str,
|
|
137
|
+
) -> models.GroupInviteLinkResponseModel:
|
|
138
|
+
return self._client._request(
|
|
139
|
+
"POST",
|
|
140
|
+
f"/api/v1/groups/{group_jid}/invite-link",
|
|
141
|
+
params={"session_name": session_name},
|
|
142
|
+
response_model=models.GroupInviteLinkResponseModel,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
def get_invite_info(
|
|
146
|
+
self,
|
|
147
|
+
payload: models.InviteInfoRequest | dict[str, Any],
|
|
148
|
+
) -> models.GroupInviteInfoResponseModel:
|
|
149
|
+
return self._client._request(
|
|
150
|
+
"POST",
|
|
151
|
+
"/api/v1/groups/invite-info",
|
|
152
|
+
json_body=payload,
|
|
153
|
+
response_model=models.GroupInviteInfoResponseModel,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
def join(
|
|
157
|
+
self,
|
|
158
|
+
payload: models.JoinGroupRequest | dict[str, Any],
|
|
159
|
+
) -> models.GroupOperationResponseModel:
|
|
160
|
+
return self._client._request(
|
|
161
|
+
"POST",
|
|
162
|
+
"/api/v1/groups/join",
|
|
163
|
+
json_body=payload,
|
|
164
|
+
response_model=models.GroupOperationResponseModel,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
def leave(
|
|
168
|
+
self,
|
|
169
|
+
group_jid: str,
|
|
170
|
+
*,
|
|
171
|
+
session_name: str,
|
|
172
|
+
) -> models.GroupOperationResponseModel:
|
|
173
|
+
return self._client._request(
|
|
174
|
+
"POST",
|
|
175
|
+
f"/api/v1/groups/{group_jid}/leave",
|
|
176
|
+
params={"session_name": session_name},
|
|
177
|
+
response_model=models.GroupOperationResponseModel,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
def set_name(
|
|
181
|
+
self,
|
|
182
|
+
group_jid: str,
|
|
183
|
+
payload: models.SetGroupNameRequest | dict[str, Any],
|
|
184
|
+
) -> models.GroupOperationResponseModel:
|
|
185
|
+
return self._client._request(
|
|
186
|
+
"POST",
|
|
187
|
+
f"/api/v1/groups/{group_jid}/name",
|
|
188
|
+
json_body=payload,
|
|
189
|
+
response_model=models.GroupOperationResponseModel,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
def set_topic(
|
|
193
|
+
self,
|
|
194
|
+
group_jid: str,
|
|
195
|
+
payload: models.SetGroupTopicRequest | dict[str, Any],
|
|
196
|
+
) -> models.GroupOperationResponseModel:
|
|
197
|
+
return self._client._request(
|
|
198
|
+
"POST",
|
|
199
|
+
f"/api/v1/groups/{group_jid}/topic",
|
|
200
|
+
json_body=payload,
|
|
201
|
+
response_model=models.GroupOperationResponseModel,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
def set_photo(
|
|
205
|
+
self,
|
|
206
|
+
group_jid: str,
|
|
207
|
+
payload: models.SetGroupPhotoRequest | dict[str, Any],
|
|
208
|
+
) -> models.GroupOperationResponseModel:
|
|
209
|
+
return self._client._request(
|
|
210
|
+
"POST",
|
|
211
|
+
f"/api/v1/groups/{group_jid}/photo",
|
|
212
|
+
json_body=payload,
|
|
213
|
+
response_model=models.GroupOperationResponseModel,
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
def remove_photo(
|
|
217
|
+
self,
|
|
218
|
+
group_jid: str,
|
|
219
|
+
*,
|
|
220
|
+
session_name: str,
|
|
221
|
+
) -> models.GroupOperationResponseModel:
|
|
222
|
+
return self._client._request(
|
|
223
|
+
"DELETE",
|
|
224
|
+
f"/api/v1/groups/{group_jid}/photo",
|
|
225
|
+
params={"session_name": session_name},
|
|
226
|
+
response_model=models.GroupOperationResponseModel,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
def set_announce(
|
|
230
|
+
self,
|
|
231
|
+
group_jid: str,
|
|
232
|
+
payload: models.SetGroupAnnounceRequest | dict[str, Any],
|
|
233
|
+
) -> models.GroupOperationResponseModel:
|
|
234
|
+
return self._client._request(
|
|
235
|
+
"POST",
|
|
236
|
+
f"/api/v1/groups/{group_jid}/announce",
|
|
237
|
+
json_body=payload,
|
|
238
|
+
response_model=models.GroupOperationResponseModel,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
def set_locked(
|
|
242
|
+
self,
|
|
243
|
+
group_jid: str,
|
|
244
|
+
payload: models.SetGroupLockedRequest | dict[str, Any],
|
|
245
|
+
) -> models.GroupOperationResponseModel:
|
|
246
|
+
return self._client._request(
|
|
247
|
+
"POST",
|
|
248
|
+
f"/api/v1/groups/{group_jid}/locked",
|
|
249
|
+
json_body=payload,
|
|
250
|
+
response_model=models.GroupOperationResponseModel,
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
def set_ephemeral(
|
|
254
|
+
self,
|
|
255
|
+
group_jid: str,
|
|
256
|
+
payload: models.SetGroupEphemeralRequest | dict[str, Any],
|
|
257
|
+
) -> models.GroupOperationResponseModel:
|
|
258
|
+
return self._client._request(
|
|
259
|
+
"POST",
|
|
260
|
+
f"/api/v1/groups/{group_jid}/ephemeral",
|
|
261
|
+
json_body=payload,
|
|
262
|
+
response_model=models.GroupOperationResponseModel,
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
__all__ = ["GroupsResource"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|