def enqueue(self, data: bytes, lobby: bool = True, immune: Sequence[int] = []) -> None: """Add data to be sent to all clients in the match.""" if not self.chat: point_of_interest() self.chat.enqueue(data, immune) if lobby and (lchan := glob.channels['#lobby']) and lchan.players: lchan.enqueue(data)
def enqueue_state(self, lobby: bool = True) -> None: """Enqueue `self`'s state to players in the match & lobby.""" if not self.chat: point_of_interest() # TODO: hmm this is pretty bad, writes twice # send password only to users currently in the match. self.chat.enqueue(packets.updateMatch(self, send_pw=True)) if lobby and (lchan := glob.channels['#lobby']) and lchan.players: lchan.enqueue(packets.updateMatch(self, send_pw=False))
async def read_match(self) -> Match: """Read an osu! match from the internal buffer.""" m = Match() # ignore match id (i16) and inprogress (i8). self._buf = self._buf[3:] #m.type = MatchTypes(await self.read_i8()) if await self.read_i8() == 1: point_of_interest() # what is powerplay m.mods = Mods(await self.read_i32()) m.name = await self.read_string() m.passwd = await self.read_string() m.map_name = await self.read_string() m.map_id = await self.read_i32() m.map_md5 = await self.read_string() for slot in m.slots: slot.status = await self.read_i8() for slot in m.slots: slot.team = MatchTeams(await self.read_i8()) for slot in m.slots: if slot.status & SlotStatus.has_player: # we don't need this, ignore it. self._buf = self._buf[4:] host_id = await self.read_i32() m.host = await glob.players.get(id=host_id) m.mode = GameMode(await self.read_i8()) m.win_condition = MatchWinConditions(await self.read_i8()) m.team_type = MatchTeamTypes(await self.read_i8()) m.freemods = await self.read_i8() == 1 # if we're in freemods mode, # read individual slot mods. if m.freemods: for slot in m.slots: slot.mods = Mods(await self.read_i32()) # read the seed (used for mania) m.seed = await self.read_i32() return m