Skip to content

Commit a2d0efb

Browse files
Merge pull request #23 from DanialErfanian/new-events-subscription
Use new events subscription API
2 parents 43185ea + e7f12bc commit a2d0efb

File tree

6 files changed

+123
-37
lines changed

6 files changed

+123
-37
lines changed

kenar/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from .addon import *
22
from .app import ClientConfig, Client
3+
from .asset import *
34
from .chatmessage import *
5+
from .events import *
46
from .finder import *
57
from .icons import *
68
from .image import *
79
from .oauth import *
810
from .widgets import *
9-
from .asset import *

kenar/app.py

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,14 @@
3030
GetColorsResponse,
3131
)
3232
from kenar.chatmessage import (
33-
SetNotifyChatPostConversationsRequest,
3433
SendMessageV2Request,
3534
SendMessageV2Response,
36-
SetNotifyChatPostConversationsResponse,
35+
ChatBotSendMessageRequest,
36+
ChatBotSendMessageResponse,
37+
)
38+
from kenar.events import (
39+
RegisterEventSubscriptionRequest,
40+
RegisterEventSubscriptionResponse,
3741
)
3842
from kenar.finder import (
3943
SearchPostRequest,
@@ -64,41 +68,45 @@ class ChatService:
6468
def __init__(self, client: httpx.Client):
6569
self._client = client
6670

67-
def set_notify_chat_post_conversations(
71+
def send_message(
6872
self,
6973
access_token: str,
70-
data: SetNotifyChatPostConversationsRequest,
74+
data: SendMessageV2Request,
7175
max_retry=3,
7276
retry_delay=1,
73-
) -> SetNotifyChatPostConversationsResponse:
77+
) -> SendMessageV2Response:
7478
@retry(max_retries=max_retry, delay=retry_delay)
7579
def send_request():
7680
return self._client.post(
77-
url="/v1/open-platform/notify/chat/post-conversations",
81+
url="/v2/open-platform/chat/conversation",
7882
content=data.json(),
7983
headers={ACCESS_TOKEN_HEADER_NAME: access_token},
8084
)
8185

82-
send_request()
83-
return SetNotifyChatPostConversationsResponse()
86+
rsp = send_request()
87+
return SendMessageV2Response(**rsp.json())
8488

85-
def send_message(
89+
def send_chatbot_message(
8690
self,
87-
access_token: str,
88-
data: SendMessageV2Request,
91+
data: ChatBotSendMessageRequest,
8992
max_retry=3,
9093
retry_delay=1,
9194
) -> SendMessageV2Response:
9295
@retry(max_retries=max_retry, delay=retry_delay)
9396
def send_request():
94-
return self._client.post(
95-
url="/v2/open-platform/chat/conversation",
96-
content=data.json(),
97-
headers={ACCESS_TOKEN_HEADER_NAME: access_token},
98-
)
97+
if data.user_id:
98+
return self._client.post(
99+
url=f"/experimental/open-platform/chat/bot/users/{data.user_id}/messages",
100+
content=data.json(),
101+
)
102+
else:
103+
return self._client.post(
104+
url=f"/experimental/open-platform/chat/bot/conversations/{data.conversation_id}/messages",
105+
content=data.json(),
106+
)
99107

100108
rsp = send_request()
101-
return SendMessageV2Response(**rsp.json())
109+
return ChatBotSendMessageResponse(**rsp.json())
102110

103111

104112
class FinderService:
@@ -174,6 +182,29 @@ def send_request():
174182
return GetUserPostsResponse(**rsp.json())
175183

176184

185+
class EventsService:
186+
def __init__(self, client: httpx.Client):
187+
self._client = client
188+
189+
def register_event_subscription(
190+
self,
191+
access_token: str,
192+
data: RegisterEventSubscriptionRequest,
193+
max_retry=3,
194+
retry_delay=1,
195+
) -> RegisterEventSubscriptionResponse:
196+
@retry(max_retries=max_retry, delay=retry_delay)
197+
def send_request():
198+
return self._client.post(
199+
url="/v1/open-platform/events/subscriptions",
200+
content=data.json(),
201+
headers={ACCESS_TOKEN_HEADER_NAME: access_token},
202+
)
203+
204+
send_request()
205+
return RegisterEventSubscriptionResponse()
206+
207+
177208
class AddonService:
178209
def __init__(self, client: httpx.Client):
179210
self._client = client
@@ -526,13 +557,18 @@ def __init__(self, conf: ClientConfig):
526557
)
527558
self._finder = FinderService(self._client)
528559
self._chat = ChatService(self._client)
560+
self._events = EventsService(self._client)
529561
self._addon = AddonService(self._client)
530562
self._asset = AssetService(self._client)
531563

532564
@property
533565
def chat(self):
534566
return self._chat
535567

568+
@property
569+
def events(self):
570+
return self._events
571+
536572
@chat.setter
537573
def chat(self, service: ChatService):
538574
if not isinstance(service, ChatService):

kenar/chatmessage.py

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from enum import Enum
2-
from typing import Optional
2+
from typing import Optional, List
33

4-
from pydantic import BaseModel
4+
from pydantic import BaseModel, Field
5+
6+
from kenar.icons import IconName
7+
from kenar.widgets.action import Action
58

69

710
class BotButton(BaseModel):
@@ -19,16 +22,6 @@ class ButtonData(BaseModel):
1922
action: Action
2023

2124

22-
class SetNotifyChatPostConversationsRequest(BaseModel):
23-
post_token: str
24-
endpoint: str
25-
identification_key: str
26-
27-
28-
class SetNotifyChatPostConversationsResponse(BaseModel):
29-
pass
30-
31-
3225
class SendMessageV2Request(BaseModel):
3326
user_id: str
3427
peer_id: str
@@ -53,3 +46,29 @@ class PostConversationsNotificationRegisterPayload(BaseModel):
5346
class PostConversationsNotificationPayload(BaseModel):
5447
registration_payload: PostConversationsNotificationRegisterPayload
5548
identification_key: str
49+
50+
51+
class ChatButton(BaseModel):
52+
action: Action
53+
caption: str
54+
icon: IconName
55+
56+
57+
class ChatButtonRow(BaseModel):
58+
buttons: List[ChatButton] = Field(default_factory=list)
59+
60+
61+
class ChatButtonGrid(BaseModel):
62+
rows: List[ChatButtonRow] = Field(default_factory=list)
63+
64+
65+
class ChatBotSendMessageRequest(BaseModel):
66+
conversation_id: Optional[str] = None
67+
user_id: Optional[str] = None
68+
text_message: str
69+
media_token: Optional[str] = None
70+
buttons: Optional[ChatButtonGrid] = None
71+
72+
73+
class ChatBotSendMessageResponse(BaseModel):
74+
pass

kenar/events.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from dataclasses import field
2+
from enum import Enum
3+
from typing import Any, Dict
4+
from typing import Optional
5+
6+
from pydantic import BaseModel
7+
8+
9+
class RegisterEventSubscriptionRequest(BaseModel):
10+
class EventType(Enum):
11+
UNKNOWN = 'UNKNOWN'
12+
NEW_MESSAGE_ON_POST = 'NEW_MESSAGE_ON_POST'
13+
14+
event_type: EventType
15+
event_resource_id: Optional[str] = field(default="")
16+
metadata: Optional[Dict[str, Any]] = field(default=None)
17+
18+
19+
class RegisterEventSubscriptionResponse(BaseModel):
20+
pass

kenar/widgets/action.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from typing import Dict
1+
from typing import Dict, Optional
2+
3+
from pydantic import BaseModel
24

35

46
def get_action(link: str) -> Dict:
@@ -15,3 +17,12 @@ def get_action(link: str) -> Dict:
1517

1618
def get_link_from_action(action: Dict) -> str:
1719
return action.get("open_direct_link", "")
20+
21+
22+
class OpenServerLink(BaseModel):
23+
data: dict
24+
25+
26+
class Action(BaseModel):
27+
open_direct_link: Optional[str] = None
28+
open_server_link: Optional[OpenServerLink] = None

samples/sample_chat.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from kenar import (
22
SendMessageV2Request,
33
BotButton,
4-
SetNotifyChatPostConversationsRequest,
4+
RegisterEventSubscriptionRequest,
55
)
66
from samples.sample_app import app
77

@@ -33,11 +33,10 @@
3333
access_token="ACCESS_TOKEN_HERE",
3434
)
3535

36-
app.chat.set_notify_chat_post_conversations(
37-
data=SetNotifyChatPostConversationsRequest(
38-
post_token="gZ6QmeWD",
39-
endpoint="https://test2.com",
40-
identification_key="thest-identification-key",
36+
app.events.register_event_subscription(
37+
data=RegisterEventSubscriptionRequest(
38+
event_type=RegisterEventSubscriptionRequest.EventType.NEW_MESSAGE_ON_POST,
39+
event_resource_id="gZ6QmeWD",
4140
),
4241
access_token="ACCESS_TOKEN_HERE",
4342
)

0 commit comments

Comments
 (0)