Beispiel #1
0
 async def sync_matrix_members(self) -> None:
     resp = await self.main_intent.get_room_joined_memberships(self.mxid)
     members = resp["joined"]
     for mxid, info in members.items():
         member = Member(membership=Membership.JOIN)
         if "display_name" in info:
             member.displayname = info["display_name"]
         if "avatar_url" in info:
             member.avatar_url = info["avatar_url"]
         self.az.state_store.set_member(self.mxid, mxid, member)
Beispiel #2
0
 async def set_membership(self, room_id: RoomID, user_id: UserID,
                          membership: Membership) -> None:
     try:
         room_members = self.members[room_id]
     except KeyError:
         self.members[room_id] = {user_id: Member(membership=membership)}
         return
     try:
         room_members[user_id].membership = membership
     except (KeyError, TypeError):
         room_id[user_id] = Member(membership=membership)
Beispiel #3
0
    async def get_joined_members(self,
                                 room_id: RoomID) -> Dict[UserID, Member]:
        """
        Get a user ID -> member info map for a room. The current user must be in the room for it to
        work, unless it is an Application Service in which case any of the AS's users must be in the
        room. This API is primarily for Application Services and should be faster to respond than
        `/members`_ as it can be implemented more efficiently on the server.
        See also: `/joined_members API reference`_

        Args:
            room_id: The ID of the room to get the members of.

        Returns:
            A dictionary from user IDs to Member info objects.

        .. _/joined_members API reference:
            https://matrix.org/docs/spec/client_server/r0.5.0#get-matrix-client-r0-rooms-roomid-joined-members
        .. _/members:
            https://matrix.org/docs/spec/client_server/r0.5.0#get-matrix-client-r0-rooms-roomid-members
        """
        content = await self.api.request(Method.GET,
                                         Path.rooms[room_id].joined_members)
        try:
            return {
                user_id: Member(membership=Membership.JOIN,
                                displayname=member.get("display_name", ""),
                                avatar_url=member.get("avatar_url", ""))
                for user_id, member in content["joined"].items()
            }
        except KeyError:
            raise MatrixResponseError("`joined` not in response.")
        except SerializerError as e:
            raise MatrixResponseError(
                "Invalid member objects in response") from e
Beispiel #4
0
 async def get_member(self, room_id: RoomID, user_id: UserID) -> Optional[Member]:
     res = await self.db.fetchrow("SELECT membership, displayname, avatar_url "
                                  "FROM mx_user_profile WHERE room_id=$1 AND user_id=$2",
                                  room_id, user_id)
     if res is None:
         return None
     return Member(membership=Membership.deserialize(res["membership"]),
                   displayname=res["displayname"], avatar_url=res["avatar_url"])
 def set_membership(self, room_id: RoomID, user_id: UserID,
                    membership: Membership) -> None:
     if not room_id:
         raise ValueError("room_id is empty")
     elif not user_id:
         raise ValueError("user_id is empty")
     elif not membership:
         raise ValueError("membership is empty")
     self.set_member(room_id, user_id, Member(membership=membership))
Beispiel #6
0
 async def set_member(
         self, room_id: RoomID, user_id: UserID,
         member: Union[Member, MemberStateEventContent]) -> None:
     if not isinstance(member, Member):
         member = Member(membership=member.membership,
                         avatar_url=member.avatar_url,
                         displayname=member.displayname)
     try:
         self.members[room_id][user_id] = member
     except KeyError:
         self.members[room_id] = {user_id: member}
Beispiel #7
0
 async def set_members(
         self, room_id: RoomID,
         members: Dict[UserID, Union[Member,
                                     MemberStateEventContent]]) -> None:
     self.members[room_id] = {
         user_id: (member if isinstance(member, Member) else Member(
             membership=member.membership,
             avatar_url=member.avatar_url,
             displayname=member.displayname))
         for user_id, member in members.items()
     }
     self.full_member_list[room_id] = True
Beispiel #8
0
 async def set_members(self,
                       room_id: RoomID,
                       members: Dict[UserID,
                                     Union[Member,
                                           MemberStateEventContent]],
                       joined_only: bool = False) -> None:
     # TODO if joined_only is true, don't forget invited/left members
     self.members[room_id] = {
         user_id: (member if isinstance(member, Member) else Member(
             membership=member.membership,
             avatar_url=member.avatar_url,
             displayname=member.displayname))
         for user_id, member in members.items()
     }
     self.full_member_list[room_id] = True
Beispiel #9
0
    async def get_profile(self, user_id: str) -> Member:
        """
        Get the combined profile information for a user.

        See also: `API reference <https://matrix.org/docs/spec/client_server/r0.4.0.html#get-matrix-client-r0-profile-userid>`__

        Args:
            user_id: The ID of the user whose profile to get.

        Returns:
            The profile information of the given user.
        """
        content = await self.api.request(Method.GET, Path.profile[user_id])
        try:
            return Member.deserialize(content)
        except SerializerError as e:
            raise MatrixResponseError("Invalid member in response") from e
Beispiel #10
0
 def deserialize(self, data: Dict[str, Any]) -> None:
     self.members = {
         room_id: {
             user_id: Member.deserialize(member)
             for user_id, member in members.items()
         }
         for room_id, members in data["members"].items()
     }
     self.full_member_list = data["full_member_list"]
     self.power_levels = {
         room_id: PowerLevelStateEventContent.deserialize(content)
         for room_id, content in data["power_levels"].items()
     }
     self.encryption = {
         room_id: (RoomEncryptionStateEventContent.deserialize(content)
                   if content is not None else None)
         for room_id, content in data["encryption"].items()
     }
Beispiel #11
0
 async def get_member_profiles(
     self,
     room_id: RoomID,
     memberships: tuple[Membership,
                        ...] = (Membership.JOIN, Membership.INVITE),
 ) -> dict[UserID, Member]:
     membership_values = [membership.value for membership in memberships]
     if self.db.scheme in (Scheme.POSTGRES, Scheme.COCKROACH):
         q = (
             "SELECT user_id, membership, displayname, avatar_url FROM mx_user_profile "
             "WHERE room_id=$1 AND membership=ANY($2)")
         res = await self.db.fetch(q, room_id, membership_values)
     else:
         membership_placeholders = ("?," * len(memberships)).rstrip(",")
         q = (
             "SELECT user_id, membership, displayname, avatar_url FROM mx_user_profile "
             f"WHERE room_id=? AND membership IN ({membership_placeholders})"
         )
         res = await self.db.fetch(q, room_id, *membership_values)
     return {
         profile["user_id"]: Member.deserialize(profile)
         for profile in res
     }
Beispiel #12
0
 async def set_members(
     self,
     room_id: RoomID,
     members: dict[UserID, Member | MemberStateEventContent],
     only_membership: Membership | None = None,
 ) -> None:
     old_members = {}
     if only_membership is not None:
         old_members = {
             user_id: member
             for user_id, member in self.members.get(room_id, {}).items()
             if member.membership != only_membership
         }
     self.members[room_id] = {
         user_id: (member if isinstance(member, Member) else Member(
             membership=member.membership,
             avatar_url=member.avatar_url,
             displayname=member.displayname,
         ))
         for user_id, member in members.items()
     }
     self.members[room_id].update(old_members)
     self.full_member_list[room_id] = True
Beispiel #13
0
    def deserialize(self, data: SerializedStateStore) -> None:
        """
        Parse a previously serialized dict into this state store.

        Args:
            data: A dict returned by :meth:`serialize`.
        """
        self.members = {
            room_id: {
                user_id: Member.deserialize(member)
                for user_id, member in members.items()
            }
            for room_id, members in data["members"].items()
        }
        self.full_member_list = data["full_member_list"]
        self.power_levels = {
            room_id: PowerLevelStateEventContent.deserialize(content)
            for room_id, content in data["power_levels"].items()
        }
        self.encryption = {
            room_id: (RoomEncryptionStateEventContent.deserialize(content)
                      if content is not None else None)
            for room_id, content in data["encryption"].items()
        }
Beispiel #14
0
 def member(self) -> Member:
     return Member(membership=self.membership,
                   displayname=self.displayname,
                   avatar_url=self.avatar_url)
Beispiel #15
0
 async def set_membership(self, room_id: RoomID, user_id: UserID,
                          membership: Membership) -> None:
     await self.set_member(room_id, user_id, Member(membership=membership))