[docs]asyncdeffill(self):self.log.debug("Filling rooms")forroominself.session.matrix.rooms:try:awaitself.by_legacy_id(room)exceptXMPPErrorase:self.log.debug("%s is not a group chat or trouble getting it: %r",room,e)
[docs]asyncdefget_room(self):try:returnself.session.matrix.rooms[self.legacy_id]exceptKeyError:raiseXMPPError("item-not-found",f"No room named {self.legacy_id}")
[docs]asyncdefupdate_info(self):room=awaitself.get_room()ifnew:=room.replacement_room:raiseXMPPError("redirect",f"{new}")self.log.debug("Children: %s",room.children)ifroom.children:raiseXMPPError("bad-request","This is not a real room but a 'space'")self.user_nick=room.user_name(self.session.matrix.user_id)self.log.debug("User nick: %s",self.user_nick)self.name=room.display_nameself.log.debug("Avatar: %s",room.room_avatar_url)self.n_participants=room.member_countself.subject=room.topicifroom.room_avatar_url:self.avatar=awaitself.session.matrix.mxc_to_http(room.room_avatar_url)elifroom.member_count==2:# if 1:1 set room avatar to other users's avatarforuser_id,userinlist(room.users.items()):ifuser_id==self.session.matrix.user_id:continueifuser.avatar_urlisNone:breakself.avatar=awaitself.session.matrix.mxc_to_http(user.avatar_url)break
[docs]asyncdeffill_participants(self):room=awaitself.get_room()ifnotroom.members_synced:resp=awaitself.session.matrix.joined_members(self.legacy_id)ifisinstance(resp,nio.JoinedMembersResponse):self.log.debug("Joined members response: %s participants",len(resp.members))else:self.log.debug("Joined members error: %s",resp)power_levels=room.power_levels.usersi=0iflen(room.users.items())>config.MAX_PARTICIPANTS_FETCH:# matrix groups are hugeself.KEEP_BACKFILLED_PARTICIPANTS=Trueforuser_id,userinlist(room.users.items()):power_level=power_levels.get(user_id,0)ifpower_level<50andi>config.MAX_PARTICIPANTS_FETCH:continuetry:p=awaitself.get_participant_by_legacy_id(user.user_id)exceptXMPPError:continuep.set_affiliation_from_power_level(power_level)ifpower_level<50:i+=1yieldp
[docs]asyncdefbackfill(self,after:HoleBound|None=None,before:HoleBound|None=None,):after_date=NoneifafterisNoneelseafter.timestampbefore_date=NoneifbeforeisNoneelsebefore.timestampasyncforeventinself.session.matrix.fetch_history(self.legacy_id,config.MAX_HISTORY_FETCH,):ifnotisinstance(event,nio.RoomMessage):self.log.debug("Not back-filling with %s",type(event))when=server_timestamp_to_datetime(event)ifafter_dateisnotNoneandwhen<=after_date:continueifbefore_dateisnotNoneandwhen>=before_date:continuetry:participant=awaitself.session.matrix.get_participant(awaitself.get_room(),event)exceptXMPPErrorase:# maybe deleted profiles?self.log.debug("Something is wrong with participant %s, falling back to using matrix ID as nickname: %s",event.sender,e,)participant=awaitself.get_participant(event.sender)awaitparticipant.send_matrix_message(event,archive_only=True)
# FIXME: this breaks everything, probably because of parallel calls# to sync()# if isinstance(event, nio.UnknownEvent) and event.type == "m.reaction":# await self.session.matrix.on_reaction(# await self.get_room(), event, when=when, archive_only=True# )# continue