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()) m.mods = Mods(await self.read_i32()) m.name = await self.read_string() m.passwd = await self.read_string() # TODO: don't do this, do it like everyone else.. # ignore the map's name, we're going # to get all it's info from the md5. await self.read_string() map_id = await self.read_i32() map_md5 = await self.read_string() m.bmap = await Beatmap.from_md5(map_md5) if not m.bmap and map_id != (1 << 32) - 1: # if they pick an unsubmitted map, # just give them vivid [insane] lol. vivid_md5 = '1cf5b2c2edfafd055536d2cefcb89c0e' m.bmap = await Beatmap.from_md5(vivid_md5) for slot in m.slots: slot.status = await self.read_i8() for slot in m.slots: slot.team = Teams(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_by_id(host_id) m.mode = GameMode(await self.read_i8()) m.match_scoring = MatchScoringTypes(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
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
def read_match(self) -> Match: """Read an osu! match from the internal buffer.""" m = Match() # ignore match id (i16) and inprogress (i8). self.body_view = self.body_view[3:] self.read_i8() # powerplay unused m.mods = Mods(self.read_i32()) m.name = self.read_string() m.passwd = self.read_string() m.map_name = self.read_string() m.map_id = self.read_i32() m.map_md5 = self.read_string() for slot in m.slots: slot.status = SlotStatus(self.read_i8()) for slot in m.slots: slot.team = MatchTeams(self.read_i8()) for slot in m.slots: if slot.status & SlotStatus.has_player: # we don't need this, ignore it. self.body_view = self.body_view[4:] host_id = self.read_i32() m.host = glob.players.get(id=host_id) m.mode = GameMode(self.read_i8()) m.win_condition = MatchWinConditions(self.read_i8()) m.team_type = MatchTeamTypes(self.read_i8()) m.freemods = 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(self.read_i32()) # read the seed (used for mania) m.seed = self.read_i32() return m
async def read_match(data: memoryview) -> tuple[Match, int]: """ Read an osu! match from `data`. """ m = Match() # Ignore match id (i32) & inprogress (i8). offset = 3 # Read match type (no idea what this is tbh). m.type = MatchTypes(data[offset]) offset += 1 # Read match mods. m.mods = Mods.from_bytes(data[offset:offset+4], 'little') offset += 4 # Read match name & password. m.name, offs = await read_string(data[offset:]) offset += offs m.passwd, offs = await read_string(data[offset:]) offset += offs # Ignore map's name. if data[offset] == 0x0b: offset += sum(await read_uleb128(data[offset + 1:])) offset += 1 # Read beatmap information (id & md5). map_id = int.from_bytes(data[offset:offset+4], 'little') offset += 4 map_md5, offs = await read_string(data[offset:]) offset += offs # Get beatmap object for map selected. m.bmap = await Beatmap.from_md5(map_md5) if not m.bmap and map_id != (1 << 32) - 1: # If they pick an unsubmitted map, # just give them Vivid [Insane] lol. vivid_md5 = '1cf5b2c2edfafd055536d2cefcb89c0e' m.bmap = await Beatmap.from_md5(vivid_md5) # Read slot statuses. for s in m.slots: s.status = data[offset] offset += 1 # Read slot teams. for s in m.slots: s.team = Teams(data[offset]) offset += 1 for s in m.slots: if s.status & SlotStatus.has_player: # Dont think we need this? offset += 4 # Read match host. user_id = int.from_bytes(data[offset:offset+4], 'little') m.host = await glob.players.get_by_id(user_id) offset += 4 # Read match mode, match scoring, # team type, and freemods. m.mode = GameMode(data[offset]) offset += 1 m.match_scoring = MatchScoringTypes(data[offset]) offset += 1 m.team_type = MatchTeamTypes(data[offset]) offset += 1 m.freemods = data[offset] == 1 offset += 1 # If we're in freemods mode, # read individual slot mods. if m.freemods: for s in m.slots: s.mods = Mods.from_bytes(data[offset:offset+4], 'little') offset += 4 # Read the seed from multi. # XXX: Used for mania random mod. m.seed = int.from_bytes(data[offset:offset+4], 'little') return m, offset + 4