Skip to content

Commit

Permalink
feat: add cts_login and cts_logout system events (#188)
Browse files Browse the repository at this point in the history
  • Loading branch information
rrrrs09 committed Sep 20, 2021
1 parent 7218332 commit bd9a99d
Show file tree
Hide file tree
Showing 11 changed files with 151 additions and 8 deletions.
50 changes: 49 additions & 1 deletion botx/bots/mixins/collecting/system_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from botx.models.enums import SystemEvents


class SystemEventsHandlerMixin:
class SystemEventsHandlerMixin: # noqa: WPS214
"""Mixin that defines handler decorator."""

collector: Collector
Expand Down Expand Up @@ -164,3 +164,51 @@ def left_from_chat(
dependencies=dependencies,
dependency_overrides_provider=dependency_overrides_provider,
)

def cts_login(
self,
handler: Optional[Callable] = None,
*,
dependencies: Optional[Sequence[Depends]] = None,
dependency_overrides_provider: Any = None,
) -> Callable:
"""Register handler for `cts_login` event.
Arguments:
handler: callable that will be used for executing handler.
dependencies: sequence of dependencies that should be executed before
handler.
dependency_overrides_provider: mock of callable for handler.
Returns:
Passed in `handler` callable.
"""
return self.collector.cts_login(
handler=handler,
dependencies=dependencies,
dependency_overrides_provider=dependency_overrides_provider,
)

def cts_logout(
self,
handler: Optional[Callable] = None,
*,
dependencies: Optional[Sequence[Depends]] = None,
dependency_overrides_provider: Any = None,
) -> Callable:
"""Register handler for `cts_logout` event.
Arguments:
handler: callable that will be used for executing handler.
dependencies: sequence of dependencies that should be executed before
handler.
dependency_overrides_provider: mock of callable for handler.
Returns:
Passed in `handler` callable.
"""
return self.collector.cts_logout(
handler=handler,
dependencies=dependencies,
dependency_overrides_provider=dependency_overrides_provider,
)
54 changes: 53 additions & 1 deletion botx/collecting/collectors/mixins/system_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from typing_extensions import Protocol # type: ignore # noqa: WPS433, WPS440, F401


class SystemEventsHandlerMixin:
class SystemEventsHandlerMixin: # noqa: WPS214
"""Mixin that defines system events handler decorator."""

def system_event( # noqa: WPS211
Expand Down Expand Up @@ -209,3 +209,55 @@ def internal_bot_notification(
dependencies=dependencies,
dependency_overrides_provider=dependency_overrides_provider,
)

def cts_login(
self,
handler: Optional[Callable] = None,
*,
dependencies: Optional[Sequence[Depends]] = None,
dependency_overrides_provider: Any = None,
) -> Callable:
"""Register handler for `cts_login` event.
Arguments:
handler: callable that will be used for executing handler.
dependencies: sequence of dependencies that should be executed before
handler.
dependency_overrides_provider: mock of callable for handler.
Returns:
Passed in `handler` callable.
"""
return self.system_event(
handler=handler,
event=SystemEvents.cts_login,
name=SystemEvents.cts_login.value,
dependencies=dependencies,
dependency_overrides_provider=dependency_overrides_provider,
)

def cts_logout(
self,
handler: Optional[Callable] = None,
*,
dependencies: Optional[Sequence[Depends]] = None,
dependency_overrides_provider: Any = None,
) -> Callable:
"""Register handler for `cts_logout` event.
Arguments:
handler: callable that will be used for executing handler.
dependencies: sequence of dependencies that should be executed before
handler.
dependency_overrides_provider: mock of callable for handler.
Returns:
Passed in `handler` callable.
"""
return self.system_event(
handler=handler,
event=SystemEvents.cts_logout,
name=SystemEvents.cts_logout.value,
dependencies=dependencies,
dependency_overrides_provider=dependency_overrides_provider,
)
3 changes: 2 additions & 1 deletion botx/middlewares/ns.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,8 +174,9 @@ def get_chain_key_by_message(message: Message) -> Tuple[str, UUID, UUID, UUID]:
RuntimeError: raised if key for chain can not be built.
"""
# key is a tuple of (host, bot_id, chat_id, user_huid)
if message.user_huid is None:
if not (message.user_huid and message.group_chat_id):
raise RuntimeError("key for chain can be obtained only for messages from users")

return message.host, message.bot_id, message.group_chat_id, message.user_huid


Expand Down
6 changes: 6 additions & 0 deletions botx/models/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ class SystemEvents(Enum):
#: `system:internal_bot_notification` event
internal_bot_notification = "system:internal_bot_notification"

#: `system:cts_login` event.
cts_login = "system:cts_login"

#: `system:cts_logout` event.
cts_logout = "system:cts_logout"

#: `file_transfer` message.
file_transfer = "file_transfer"

Expand Down
22 changes: 22 additions & 0 deletions botx/models/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,26 @@ class InternalBotNotificationEvent(BotXBaseModel):
opts: Dict[str, Any]


class CTSLoginEvent(BotXBaseModel):
"""Shape for `system:cts_login` event data."""

#: huid of user which logged into CTS.
user_huid: UUID

#: CTS id.
cts_id: UUID


class CTSLogoutEvent(BotXBaseModel):
"""Shape for `system:cts_logout` event data."""

#: huid of user which logged out from CTS.
user_huid: UUID

#: CTS id.
cts_id: UUID


# dict for validating shape for different events
EVENTS_SHAPE_MAP: Mapping[SystemEvents, Type[BotXBaseModel]] = MappingProxyType(
{
Expand All @@ -68,5 +88,7 @@ class InternalBotNotificationEvent(BotXBaseModel):
SystemEvents.deleted_from_chat: DeletedFromChatEvent,
SystemEvents.left_from_chat: LeftFromChatEvent,
SystemEvents.internal_bot_notification: InternalBotNotificationEvent,
SystemEvents.cts_login: CTSLoginEvent,
SystemEvents.cts_logout: CTSLogoutEvent,
},
)
6 changes: 4 additions & 2 deletions botx/models/messages/incoming_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
events.DeletedFromChatEvent,
events.LeftFromChatEvent,
events.InternalBotNotificationEvent,
events.CTSLoginEvent,
events.CTSLogoutEvent,
Dict[str, Any],
]

Expand Down Expand Up @@ -83,10 +85,10 @@ class Sender(BaseModel):
user_huid: Optional[UUID]

#: chat id.
group_chat_id: UUID
group_chat_id: Optional[UUID]

#: type of chat.
chat_type: ChatTypes
chat_type: Optional[ChatTypes]

#: AD login of user.
ad_login: Optional[str]
Expand Down
4 changes: 2 additions & 2 deletions botx/models/messages/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ class Message:
ad_domain: Optional[str] = _user_proxy_property()

#: ID of chat from which message was received.
group_chat_id: UUID = _user_proxy_property()
group_chat_id: Optional[UUID] = _user_proxy_property()

#: type of chat.
chat_type: ChatTypes = _user_proxy_property()
chat_type: Optional[ChatTypes] = _user_proxy_property()

#: host of CTS from which message was received.
host: str = _user_proxy_property()
Expand Down
1 change: 1 addition & 0 deletions botx/testing/building/entites.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ def forward(
ValueError: raise if conflict of requirement arguments.
"""
if message and not forward:
assert message.group_chat_id is not None
forward = Forward(
group_chat_id=message.group_chat_id,
sender_huid=message.user_huid or uuid.uuid4(),
Expand Down
7 changes: 7 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
## 0.25.0 (Sep 17, 2021)

### Added

* `cts_login` and `cts_logout` system events.


## 0.24.0 (Sep 14, 2021)

### Removed
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "botx"
version = "0.24.0"
version = "0.25.0"
description = "A little python framework for building bots for eXpress"
license = "MIT"
authors = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ def test_registration_handler_for_several_system_events(
SystemEvents.deleted_from_chat,
SystemEvents.left_from_chat,
SystemEvents.internal_bot_notification,
SystemEvents.cts_login,
SystemEvents.cts_logout,
}
collector = collector_cls()
collector.system_event(
Expand All @@ -35,6 +37,8 @@ def test_registration_handler_for_several_system_events(
SystemEvents.chat_created,
SystemEvents.file_transfer,
SystemEvents.left_from_chat,
SystemEvents.cts_login,
SystemEvents.cts_logout,
],
)
def test_defining_system_handler_in_collector_as_decorator(
Expand Down

1 comment on commit bd9a99d

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎉 Published on https://pybotx.netlify.app as production
🚀 Deployed on https://61482ecaa3ea2d4fd90c87b1--pybotx.netlify.app

Please sign in to comment.