Remove union operator for Python <3.10 compatibility
This commit is contained in:
parent
b1e922a0fd
commit
db41292be7
|
@ -22,7 +22,7 @@ with any other potential backend.
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING, cast, Awaitable, Callable, Type
|
from typing import TYPE_CHECKING, cast, Awaitable, Callable, Type, Optional, Union
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import urllib.request
|
import urllib.request
|
||||||
|
@ -116,7 +116,7 @@ class Client:
|
||||||
http: ClientSession
|
http: ClientSession
|
||||||
log: TraceLogger
|
log: TraceLogger
|
||||||
|
|
||||||
def __init__(self, user: User, log: TraceLogger | None = None):
|
def __init__(self, user: User, log: Optional[TraceLogger] = None):
|
||||||
"""Create a per-user client object for user-specific client functionality."""
|
"""Create a per-user client object for user-specific client functionality."""
|
||||||
self.user = user
|
self.user = user
|
||||||
|
|
||||||
|
@ -149,8 +149,8 @@ class Client:
|
||||||
|
|
||||||
def get(
|
def get(
|
||||||
self,
|
self,
|
||||||
url: str | URL,
|
url: Union[str, URL],
|
||||||
headers: dict[str, str] | None = None,
|
headers: Optional[dict[str, str]] = None,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
) -> _RequestContextManager:
|
) -> _RequestContextManager:
|
||||||
# TODO Is auth ever needed?
|
# TODO Is auth ever needed?
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
"""Custom wrapper classes around types defined by the KakaoTalk API."""
|
"""Custom wrapper classes around types defined by the KakaoTalk API."""
|
||||||
|
|
||||||
|
from typing import Optional, Union
|
||||||
|
|
||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
|
|
||||||
from mautrix.types import SerializableAttrs
|
from mautrix.types import SerializableAttrs
|
||||||
|
@ -24,12 +26,12 @@ from ..types.openlink.open_channel_info import OpenChannelInfo
|
||||||
from ..types.user.channel_user_info import NormalChannelUserInfo, OpenChannelUserInfo
|
from ..types.user.channel_user_info import NormalChannelUserInfo, OpenChannelUserInfo
|
||||||
|
|
||||||
|
|
||||||
ChannelInfoUnion = NormalChannelInfo | OpenChannelInfo
|
ChannelInfoUnion = Union[NormalChannelInfo, OpenChannelInfo]
|
||||||
UserInfoUnion = NormalChannelUserInfo | OpenChannelUserInfo
|
UserInfoUnion = Union[NormalChannelUserInfo, OpenChannelUserInfo]
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class PortalChannelInfo(SerializableAttrs):
|
class PortalChannelInfo(SerializableAttrs):
|
||||||
name: str
|
name: str
|
||||||
#participants: list[PuppetUserInfo]
|
#participants: list[PuppetUserInfo]
|
||||||
# TODO Image
|
# TODO Image
|
||||||
channel_info: ChannelInfoUnion | None = None # Should be set manually by caller
|
channel_info: Optional[ChannelInfoUnion] = None # Should be set manually by caller
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
from typing import Optional, Union
|
||||||
|
|
||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
|
|
||||||
from mautrix.types import SerializableAttrs, JSON
|
from mautrix.types import SerializableAttrs, JSON
|
||||||
|
@ -34,9 +36,9 @@ class ProfileFeed(SerializableAttrs):
|
||||||
downloadId: str
|
downloadId: str
|
||||||
contents: list[ProfileFeedObject]
|
contents: list[ProfileFeedObject]
|
||||||
url: str
|
url: str
|
||||||
serviceUrl: str | None = None # NOTE Made optional
|
serviceUrl: Optional[str] = None # NOTE Made optional
|
||||||
webUrl: str
|
webUrl: str
|
||||||
serviceWebUrl: str | None = None # NOTE Made optional
|
serviceWebUrl: Optional[str] = None # NOTE Made optional
|
||||||
updatedAt: int
|
updatedAt: int
|
||||||
cursor: int
|
cursor: int
|
||||||
feedMessage: str
|
feedMessage: str
|
||||||
|
@ -99,7 +101,7 @@ class ProfileStruct(SerializableAttrs):
|
||||||
screenToken: int
|
screenToken: int
|
||||||
# NEW
|
# NEW
|
||||||
nickname: str
|
nickname: str
|
||||||
userId: int | str | Long # NOTE Should confirm this
|
userId: Union[int, str, Long] # NOTE Should confirm this
|
||||||
suspended: bool
|
suspended: bool
|
||||||
meBadge: bool
|
meBadge: bool
|
||||||
# TODO feeds = {feeds: list, last: bool}
|
# TODO feeds = {feeds: list, last: bool}
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
|
|
||||||
from mautrix.types import SerializableAttrs
|
from mautrix.types import SerializableAttrs
|
||||||
|
@ -24,4 +26,4 @@ from ..bson import Long
|
||||||
class MentionStruct(SerializableAttrs):
|
class MentionStruct(SerializableAttrs):
|
||||||
at: list[int]
|
at: list[int]
|
||||||
len: int
|
len: int
|
||||||
user_id: Long | int
|
user_id: Union[Long, int]
|
||||||
|
|
|
@ -31,7 +31,7 @@ class KnownChannelType(str, Enum):
|
||||||
return str in [KnownChannelType.DirectChat, KnownChannelType.OD]
|
return str in [KnownChannelType.DirectChat, KnownChannelType.OD]
|
||||||
|
|
||||||
|
|
||||||
ChannelType = KnownChannelType | str # Substitute for ChannelType = "name1" | ... | "nameN" | str
|
ChannelType = Union[KnownChannelType, str] # Substitute for ChannelType = "name1" | ... | "nameN" | str
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
from typing import Optional, Union
|
||||||
|
|
||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
from enum import Enum, IntEnum
|
from enum import Enum, IntEnum
|
||||||
|
|
||||||
|
@ -35,7 +37,7 @@ class KnownChannelMetaType(IntEnum):
|
||||||
OPEN_CHANNEL_CHAT = 13
|
OPEN_CHANNEL_CHAT = 13
|
||||||
BOT = 14
|
BOT = 14
|
||||||
|
|
||||||
ChannelMetaType = KnownChannelMetaType | int
|
ChannelMetaType = Union[KnownChannelMetaType, int]
|
||||||
|
|
||||||
|
|
||||||
class ChannelClientMetaType(str, Enum):
|
class ChannelClientMetaType(str, Enum):
|
||||||
|
@ -53,20 +55,20 @@ class ChannelClientMetaType(str, Enum):
|
||||||
class ChannelMetaStruct(SerializableAttrs):
|
class ChannelMetaStruct(SerializableAttrs):
|
||||||
type: ChannelMetaType
|
type: ChannelMetaType
|
||||||
revision: Long
|
revision: Long
|
||||||
authorId: Long | None = None
|
authorId: Optional[Long] = None
|
||||||
content: str
|
content: str
|
||||||
updatedAt: int
|
updatedAt: int
|
||||||
|
|
||||||
|
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
class ChannelClientMetaStruct(SerializableAttrs):
|
class ChannelClientMetaStruct(SerializableAttrs):
|
||||||
name: str | None = None
|
name: Optional[str] = None
|
||||||
image_path: str | None = None
|
image_path: Optional[str] = None
|
||||||
favourite: bool | None = None
|
favourite: Optional[bool] = None
|
||||||
push_sound: bool | None = None
|
push_sound: Optional[bool] = None
|
||||||
chat_hide: bool | None = None
|
chat_hide: Optional[bool] = None
|
||||||
fullImageUrl: str | None = None
|
fullImageUrl: Optional[str] = None
|
||||||
imageUrl: str | None = None
|
imageUrl: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -88,7 +90,7 @@ class TvMetaContent(SerializableAttrs):
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
class TvLiveMetaContent(SerializableAttrs):
|
class TvLiveMetaContent(SerializableAttrs):
|
||||||
url: str
|
url: str
|
||||||
live: str | None = 'on'
|
live: Optional[str] = 'on'
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -96,7 +98,7 @@ class LiveTalkInfoOnMetaContent(SerializableAttrs):
|
||||||
liveon: bool
|
liveon: bool
|
||||||
title: str
|
title: str
|
||||||
startTime: int
|
startTime: int
|
||||||
userId: int | Long
|
userId: Union[int, Long]
|
||||||
csIP: str
|
csIP: str
|
||||||
csIP6: str
|
csIP6: str
|
||||||
csPort: int
|
csPort: int
|
||||||
|
@ -106,17 +108,17 @@ class LiveTalkInfoOnMetaContent(SerializableAttrs):
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
class LiveTalkInfoOffMetaContent(SerializableAttrs):
|
class LiveTalkInfoOffMetaContent(SerializableAttrs):
|
||||||
"""Substitute for LiveTalkInfoOffMetaContent extends Partial<LiveTalkInfoOffMetaContent>"""
|
"""Substitute for LiveTalkInfoOffMetaContent extends Partial<LiveTalkInfoOffMetaContent>"""
|
||||||
liveon: bool
|
liveon: bool = False
|
||||||
title: str | None = None
|
title: Optional[str] = None
|
||||||
startTime: int | None = None
|
startTime: Optional[int] = None
|
||||||
userId: int | Long | None
|
userId: Union[int, Long, None] = None
|
||||||
csIP: str | None = None
|
csIP: Optional[str] = None
|
||||||
csIP6: str | None = None
|
csIP6: Optional[str] = None
|
||||||
csPort: int | None = None
|
csPort: Optional[int] = None
|
||||||
callId: str | None = None
|
callId: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
LiveTalkInfoMetaContent = LiveTalkInfoOnMetaContent | LiveTalkInfoOffMetaContent;
|
LiveTalkInfoMetaContent = Union[LiveTalkInfoOnMetaContent, LiveTalkInfoOffMetaContent]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -147,10 +149,10 @@ BotDelCommandStruct = BotCommandStruct
|
||||||
|
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
class BotMetaContent(SerializableAttrs):
|
class BotMetaContent(SerializableAttrs):
|
||||||
add: list[BotAddCommandStruct] | None = None
|
add: Optional[list[BotAddCommandStruct]] = None
|
||||||
update: list[BotAddCommandStruct] | None = None
|
update: Optional[list[BotAddCommandStruct]] = None
|
||||||
full: list[BotAddCommandStruct] | None = None
|
full: Optional[list[BotAddCommandStruct]] = None
|
||||||
delete: list[BotDelCommandStruct] | None = field(json="del", default=None)
|
delete: Optional[list[BotDelCommandStruct]] = field(json="del", default=None)
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
from typing import Optional, Union
|
||||||
|
|
||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
|
|
||||||
from mautrix.types import SerializableAttrs
|
from mautrix.types import SerializableAttrs
|
||||||
|
@ -29,9 +31,9 @@ class ChatTypeComponent(SerializableAttrs):
|
||||||
|
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
class Chat(ChatTypeComponent):
|
class Chat(ChatTypeComponent):
|
||||||
text: str | None = None
|
text: Optional[str] = None
|
||||||
attachment: Attachment | None = None
|
attachment: Optional[Attachment] = None
|
||||||
supplement: dict | None = None
|
supplement: Optional[dict] = None
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -57,7 +59,7 @@ class ChatLogLinked(ChatLogged):
|
||||||
class ChatWritten(Chat):
|
class ChatWritten(Chat):
|
||||||
sender: ChannelUser
|
sender: ChannelUser
|
||||||
sendAt: int
|
sendAt: int
|
||||||
messageId: int | Long
|
messageId: Union[int, Long]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -73,7 +75,7 @@ class TypedChatlog(Chatlog, TypedChat):
|
||||||
|
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
class ChatOptions(SerializableAttrs):
|
class ChatOptions(SerializableAttrs):
|
||||||
shout: bool | None = None
|
shout: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,7 +56,7 @@ class KnownChatType(IntEnum):
|
||||||
OPEN_VOTE = 97
|
OPEN_VOTE = 97
|
||||||
OPEN_POST = 98
|
OPEN_POST = 98
|
||||||
|
|
||||||
ChatType = KnownChatType | int
|
ChatType = Union[KnownChatType, int]
|
||||||
|
|
||||||
|
|
||||||
DELETED_MESSAGE_OFFSET = 16384;
|
DELETED_MESSAGE_OFFSET = 16384;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
from typing import NewType
|
from typing import NewType, Union
|
||||||
|
|
||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ from ..channel.channel_info import ChannelLoginData, NormalChannelData
|
||||||
from ..openlink.open_channel_info import OpenChannelData
|
from ..openlink.open_channel_info import OpenChannelData
|
||||||
|
|
||||||
|
|
||||||
ChannelLoginDataItem = NewType("ChannelLoginDataItem", ChannelLoginData[NormalChannelData | OpenChannelData])
|
ChannelLoginDataItem = NewType("ChannelLoginDataItem", ChannelLoginData[Union[NormalChannelData, OpenChannelData]])
|
||||||
|
|
||||||
@deserializer(ChannelLoginDataItem)
|
@deserializer(ChannelLoginDataItem)
|
||||||
def deserialize_channel_login_data_item(data: JSON) -> ChannelLoginDataItem:
|
def deserialize_channel_login_data_item(data: JSON) -> ChannelLoginDataItem:
|
||||||
|
@ -41,7 +41,7 @@ setattr(ChannelLoginDataItem, "deserialize", deserialize_channel_login_data_item
|
||||||
@dataclass
|
@dataclass
|
||||||
class LoginResult(SerializableAttrs):
|
class LoginResult(SerializableAttrs):
|
||||||
"""Return value of TalkClient.login"""
|
"""Return value of TalkClient.login"""
|
||||||
channelList: list[ChannelLoginDataItem]
|
channelList: list[ChannelLoginDataItem]
|
||||||
userId: Long
|
userId: Long
|
||||||
lastChannelId: Long
|
lastChannelId: Long
|
||||||
lastTokenId: Long
|
lastTokenId: Long
|
||||||
|
|
|
@ -21,7 +21,7 @@ from .open_link_user_info import *
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING, Optional, Union
|
||||||
|
|
||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
|
@ -56,7 +56,7 @@ class KnownLinkPrivilegeMask(IntEnum):
|
||||||
NON_SPECIAL_LINK = 512
|
NON_SPECIAL_LINK = 512
|
||||||
USE_BOT = 1024
|
USE_BOT = 1024
|
||||||
|
|
||||||
LinkPrivilegeMask = KnownLinkPrivilegeMask | int | Long;
|
LinkPrivilegeMask = Union[KnownLinkPrivilegeMask, int, Long]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -67,8 +67,8 @@ class OpenPrivilegeComponent(SerializableAttrs):
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
class OpenLinkSettings(SerializableAttrs):
|
class OpenLinkSettings(SerializableAttrs):
|
||||||
linkName: str
|
linkName: str
|
||||||
linkCoverURL: str | None = None
|
linkCoverURL: Optional[str] = None
|
||||||
description: str | None = None
|
description: Optional[str] = None
|
||||||
searchable: bool
|
searchable: bool
|
||||||
activated: bool
|
activated: bool
|
||||||
|
|
||||||
|
@ -109,12 +109,12 @@ class InformedOpenLink(SerializableAttrs):
|
||||||
|
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
class OpenLinkUpdateTemplate(SerializableAttrs):
|
class OpenLinkUpdateTemplate(SerializableAttrs):
|
||||||
passcode: str | None = None
|
passcode: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
@dataclass(kw_only=True)
|
@dataclass(kw_only=True)
|
||||||
class OpenLinkCreateTemplate(SerializableAttrs):
|
class OpenLinkCreateTemplate(SerializableAttrs):
|
||||||
mainProfileOnly: bool | None = None
|
mainProfileOnly: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU Affero General Public License
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
from typing import Generic, Type, TypeVar
|
from typing import Generic, Type, TypeVar, Union
|
||||||
|
|
||||||
from attr import dataclass
|
from attr import dataclass
|
||||||
from enum import IntEnum
|
from enum import IntEnum
|
||||||
|
@ -66,12 +66,12 @@ class KnownDataStatusCode(IntEnum):
|
||||||
UPDATE_REQUIRED = -999
|
UPDATE_REQUIRED = -999
|
||||||
SERVER_UNDER_MAINTENANCE = -9797
|
SERVER_UNDER_MAINTENANCE = -9797
|
||||||
|
|
||||||
DataStatusCode = KnownDataStatusCode | int
|
DataStatusCode = Union[KnownDataStatusCode, int]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ResponseState(SerializableAttrs):
|
class ResponseState(SerializableAttrs):
|
||||||
status: DataStatusCode | KnownAuthStatusCode # NOTE Added KnownAuthStatusCode
|
status: Union[DataStatusCode, KnownAuthStatusCode] # NOTE Added KnownAuthStatusCode
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -96,7 +96,7 @@ class CommandResultDoneValue(RootCommandResult, Generic[ResultType]):
|
||||||
|
|
||||||
def deserialize_result(
|
def deserialize_result(
|
||||||
result_type: Type[ResultType], data: JSON
|
result_type: Type[ResultType], data: JSON
|
||||||
) -> CommandResultDoneValue[ResultType] | RootCommandResult:
|
) -> Union[CommandResultDoneValue[ResultType], RootCommandResult]:
|
||||||
"""Returns equivalent of CommandResult<T>. Does no consistency checking on success & result properties."""
|
"""Returns equivalent of CommandResult<T>. Does no consistency checking on success & result properties."""
|
||||||
if "result" in data:
|
if "result" in data:
|
||||||
# TODO Allow arbitrary result object?
|
# TODO Allow arbitrary result object?
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING, Union
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from mautrix.bridge import BaseMatrixHandler
|
from mautrix.bridge import BaseMatrixHandler
|
||||||
|
@ -249,7 +249,7 @@ class MatrixHandler(BaseMatrixHandler):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
async def handle_ephemeral_event(
|
async def handle_ephemeral_event(
|
||||||
self, evt: ReceiptEvent | PresenceEvent | TypingEvent
|
self, evt: Union[ReceiptEvent, PresenceEvent, TypingEvent]
|
||||||
) -> None:
|
) -> None:
|
||||||
if evt.type == EventType.TYPING:
|
if evt.type == EventType.TYPING:
|
||||||
await self.handle_typing(evt.room_id, evt.content.user_ids)
|
await self.handle_typing(evt.room_id, evt.content.user_ids)
|
||||||
|
|
Loading…
Reference in New Issue