public static async Task Handle(Packet p, Presence pr)
        {
            var ms = new MemoryStream(p.Data);

            using var reader = new SerializationReader(ms);

            var presenceIds = new List <int>();
            int length      = reader.ReadInt16();

            for (var i = 0; i < length; i++)
            {
                presenceIds.Add(reader.ReadInt32());
            }

            foreach (var prId in presenceIds)
            {
                var otherPresence = PresenceManager.GetPresenceById(prId);
                if (otherPresence is not null)
                {
                    await pr.UserPresence(otherPresence);
                }
                else
                {
                    await pr.UserLogout(prId);
                }
            }
        }
Exemple #2
0
        public static async Task Handle(Packet p, Presence pr)
        {
            var ms = new MemoryStream(p.Data);

            using var reader = new SerializationReader(ms);

            var userId = reader.ReadInt32();

            var spectatingPresence = PresenceManager.GetPresenceById(userId);

            pr.Spectating = spectatingPresence;
            await pr.Spectating.SpectatorJoined(pr.Id);

            if (pr.Spectating.SpectatorChannel is null)
            {
                var channel = new Channel($"spect_{pr.Spectating.Id}", "", 1, true);
                pr.Spectating.SpectatorChannel = channel;

                ChannelManager.Channels.TryAdd(channel.RawName, channel);

                await pr.Spectating.JoinChannel($"spect_{pr.Spectating.Id}");
            }

            await pr.JoinChannel($"spect_{pr.Spectating.Id}");

            spectatingPresence.Spectators.Add(pr);
        }
Exemple #3
0
        public static void Handle(Packet p, Presence pr, OyasumiDbContext context)
        {
            var ms = new MemoryStream(p.Data);

            using var reader = new SerializationReader(ms);

            var id = reader.ReadInt32();

            var friend = PresenceManager.GetPresenceById(id);

            if (friend is null)
            {
                return;
            }

            var exists = context.Friends.FirstOrDefault(x => x.Friend2 == id);

            if (exists is not null)
            {
                return;
            }

            context.Friends.Add(new ()
            {
                Friend1 = pr.Id,
                Friend2 = id
            });

            Base.FriendCache[pr.Id].Add(friend.Id);

            context.SaveChanges();
        }
Exemple #4
0
        public static async Task <Match> ReadMatch(this SerializationReader reader)
        {
            var match = new Match();

            reader.ReadInt16(); // match id
            reader.ReadByte();  // in progress

            match.Type       = (MatchTypes)reader.ReadByte();
            match.ActiveMods = (Mods)reader.ReadInt32();

            match.GameName     = reader.ReadString();
            match.GamePassword = reader.ReadString();

            reader.ReadString(); // beatmap name

            match.BeatmapId       = reader.ReadInt32();
            match.BeatmapChecksum = reader.ReadString();

            match.Beatmap = (await BeatmapManager.Get(match.BeatmapChecksum)).Item2;

            foreach (var slot in match.Slots)
            {
                slot.Status = (SlotStatus)reader.ReadByte();
            }

            foreach (var slot in match.Slots)
            {
                slot.Team = (SlotTeams)reader.ReadByte();
            }

            foreach (var slot in match.Slots)
            {
                if ((slot.Status & SlotStatus.HasPlayer) > 0)
                {
                    reader.ReadInt32();
                }
            }

            match.Host = PresenceManager.GetPresenceById(reader.ReadInt32());

            match.PlayMode    = (PlayMode)reader.ReadByte();
            match.ScoringType = (MatchScoringTypes)reader.ReadByte();
            match.TeamType    = (MatchTeamTypes)reader.ReadByte();
            match.FreeMods    = reader.ReadBoolean();

            if (match.FreeMods)
            {
                foreach (var slot in match.Slots)
                {
                    slot.Mods = (Mods)reader.ReadInt32();
                }
            }

            match.Seed = reader.ReadInt32();

            return(match);
        }
Exemple #5
0
        public static async Task Handle(Packet p, Presence pr)
        {
            var match = pr.CurrentMatch;

            if (match is null)
            {
                return;
            }

            var reader = new SerializationReader(new MemoryStream(p.Data));

            var target = PresenceManager.GetPresenceById(reader.ReadInt32());

            if (target is null)
            {
                return;
            }

            await target.MatchInvite(pr, $"Come join to my game: [osump://{match.Id}/{match.GamePassword} {match.GameName}]");
        }
Exemple #6
0
        public static async Task UBan(Presence pr, string channel, string message, string[] args)
        {
            var user = Base.UserCache[args[0]];

            if (!user.Banned())
            {
                await ChannelManager.BotMessage(pr, channel, $"Bye, bye, {user.Username}");

                user.Privileges &= ~Privileges.Normal;

                await using (var db = MySqlProvider.GetDbConnection())
                    await db.ExecuteAsync($"UPDATE Users SET Privileges = {(int)user.Privileges} WHERE Id = {user.Id}");

                var target = PresenceManager.GetPresenceById(user.Id);

                if (target is not null)
                {
                    await target.LoginReply(LoginReplies.WrongCredentials);

                    await target.Notification("Your account is banned.");
                }

                new Thread(async() =>
                {
                    IEnumerable <DbScore> scores = null;
                    await using (var db = MySqlProvider.GetDbConnection())
                    {
                        scores = await db.QueryAsync <DbScore>($"SELECT * FROM Scores " +
                                                               $"WHERE UserId = {user.Id} " +
                                                               $"AND Completed = {(int)CompletedStatus.Best}");
                    }

                    foreach (var score in scores)
                    {
                        var lbMode  = score.Relaxing ? LeaderboardMode.Relax : LeaderboardMode.Vanilla;
                        var beatmap = (await BeatmapManager.Get(score.FileChecksum, "", 0, true, score.PlayMode)).Item2;
                        if (beatmap is not null)
                        {
                            await beatmap.UpdateLeaderboard(lbMode, score.PlayMode);
                        }
                    }
                }).Start();
            }
            else
            {
                await ChannelManager.BotMessage(pr, channel, $"Welcome back, {user.Username}");

                user.Privileges |= Privileges.Normal;

                await using (var db = MySqlProvider.GetDbConnection())
                {
                    await db.ExecuteAsync($"UPDATE Users SET Privileges = {(int)user.Privileges} WHERE Id = {user.Id}");
                }

                new Thread(async() =>
                {
                    IEnumerable <DbScore> scores = null;
                    await using (var db = MySqlProvider.GetDbConnection())
                    {
                        scores = await db.QueryAsync <DbScore>($"SELECT * FROM Scores " +
                                                               $"WHERE UserId = {user.Id} " +
                                                               $"AND Completed = {(int)CompletedStatus.Best}");
                    }

                    foreach (var score in scores)
                    {
                        var lbMode  = score.Relaxing ? LeaderboardMode.Relax : LeaderboardMode.Vanilla;
                        var beatmap = (await BeatmapManager.Get(score.FileChecksum, "", 0, true, score.PlayMode)).Item2;
                        if (beatmap is not null)
                        {
                            await beatmap.UpdateLeaderboard(lbMode, score.PlayMode);
                        }
                    }
                }).Start();
            }
        }