Beispiel #1
0
def startSpectating(p: Player, pr: PacketReader) -> None:
    target_id = pr.read(osuTypes.i32)[0]

    if not (host := glob.players.get_by_id(target_id)):
        printlog(f'{p} tried to spectate nonexistant id {target_id}.',
                 Ansi.YELLOW)
        return
Beispiel #2
0
def matchJoin(p: Player, pr: PacketReader) -> None:
    m_id, passwd = pr.read(osuTypes.i32, osuTypes.string)
    if m_id not in range(64):
        return

    if not (m := glob.matches.get_by_id(m_id)):
        printlog(f'{p} tried to join a non-existant mp lobby?')
        return
Beispiel #3
0
def matchInvite(p: Player, pr: PacketReader) -> None:
    if not p.match:
        printlog(f"{p} tried to invite someone to a match but isn't in one!")
        pr.ignore(4)
        return

    userID = pr.read(osuTypes.i32)[0]
    if not (t := glob.players.get_by_id(userID)):
        printlog(f'{t} tried to invite a user who is not online! ({userID})')
        return
Beispiel #4
0
def statsRequest(p: Player, pr: PacketReader) -> None:
    if len(pr.data) < 6:
        return

    userIDs = pr.read(osuTypes.i32_list)
    is_online = lambda o: o in glob.players.ids and o != p.id

    for online in filter(is_online, userIDs):
        target = glob.players.get_by_id(online)
        p.enqueue(packets.userStats(target))
Beispiel #5
0
def sendPrivateMessage(p: Player, pr: PacketReader) -> None:
    if p.silenced:
        printlog(f'{p} tried to send a dm while silenced.', Ansi.YELLOW)
        return

    client, msg, target, client_id = pr.read(osuTypes.message)

    if not (t := glob.players.get_by_name(target)):
        printlog(f'{p} tried to write to non-existant user {target}.',
                 Ansi.YELLOW)
        return
Beispiel #6
0
def channelJoin(p: Player, pr: PacketReader) -> None:
    chan_name = pr.read(osuTypes.string)[0]
    c = glob.channels.get(chan_name)

    if not c or not p.join_channel(c):
        printlog(f'{p} failed to join {chan_name}.', Ansi.YELLOW)
        return

    # Enqueue new channelinfo (playercount) to all players.
    glob.players.enqueue(packets.channelInfo(*c.basic_info))

    # Enqueue channelJoin to our player.
    p.enqueue(packets.channelJoin(c.name))
Beispiel #7
0
def readStatus(p: Player, pr: PacketReader) -> None:
    data = pr.read(
        osuTypes.u8,  # actionType
        osuTypes.string,  # infotext
        osuTypes.string,  # beatmap md5
        osuTypes.u32,  # mods
        osuTypes.u8,  # gamemode
        osuTypes.i32  # beatmapid
    )

    p.status.update(*data)
    p.rx = p.status.mods & Mods.RELAX > 0
    glob.players.enqueue(packets.userStats(p))
Beispiel #8
0
def sendMessage(p: Player, pr: PacketReader) -> None:
    if p.silenced:
        printlog(f'{p} tried to send a message while silenced.', Ansi.YELLOW)
        return

    # client_id only proto >= 14
    client, msg, target, client_id = pr.read(osuTypes.message)

    # no nice wrapper to do it in reverse :P
    if target == '#spectator':
        target = f'#spec_{p.spectating.id if p.spectating else p.id}'
    elif target == '#multiplayer':
        target = f'#multi_{p.match.id if p.match is not None else 0}'

    if not (t := glob.channels.get(target)):
        printlog(f'{p} tried to write to non-existant {target}.', Ansi.YELLOW)
        return
Beispiel #9
0
def toggleBlockingDMs(p: Player, pr: PacketReader) -> None:
    p.pm_private = pr.read(osuTypes.i32)[0] == 1
Beispiel #10
0
def userPresenceRequest(p: Player, pr: PacketReader) -> None:
    for pid in pr.read(osuTypes.i32_list):
        if t := glob.players.get_by_id(pid):
            p.enqueue(packets.userPresence(t))
Beispiel #11
0
def setAwayMessage(p: Player, pr: PacketReader) -> None:
    pr.ignore(3)  # why does first string send \x0b\x00?
    p.away_msg = pr.read(osuTypes.string)[0]
    pr.ignore(4)
Beispiel #12
0
def receiveUpdates(p: Player, pr: PacketReader) -> None:
    if (f := pr.read(osuTypes.i32)[0]) not in range(3):
        printlog(f'{p} tried to set his presence filter to {f}?')
        return
Beispiel #13
0
def channelPart(p: Player, pr: PacketReader) -> None:
    if not (chan := pr.read(osuTypes.string)[0]):
        return
Beispiel #14
0
def friendRemove(p: Player, pr: PacketReader) -> None:
    userID = pr.read(osuTypes.i32)[0]

    if not (t := glob.players.get_by_id(userID)):
        printlog(f'{t} tried to remove a user who is not online! ({userID})')
        return
Beispiel #15
0
def matchCreate(p: Player, pr: PacketReader) -> None:
    m = pr.read(osuTypes.match)[0]

    m.host = p
    p.join_match(m, m.passwd)
    printlog(f'{p} created a new multiplayer match.')