Example #1
0
        public async Task <bool> Login(string email, string password)
        {
            Authenticator authenticator = await Database.Authenticators.AsAsyncEnumerable().FirstOrDefaultAsync(e => e.Email == email);

            if (authenticator == null || !VerifyPasswordHash(password, authenticator.Password))
            {
                return(false);
            }

            UserSession session = authenticator.User.UserSession ?? new(DateTime.UtcNow, authenticator.User);
            User        user    = session.User;

            authenticator.User.UserSession = session;

            session.SignalRId = Context.ConnectionId;

            await Groups.AddToGroupAsync(Context.ConnectionId, user.GroupMember.Group.SignalRId);

            await Database.SaveChangesAsync();

            //Add to sessionlog
            var entry = new SessionLogEntry(SessionLogEntryType.Login, session.User.Id.ToString(), DateTime.UtcNow, user);
            await Database.SessionLogEntries.AddAsync(entry);

            await Database.SaveChangesAsync();

            return(true);
        }
Example #2
0
        public async Task <bool> ChangeUsername(string username)
        {
            UserSession session = await Database.UserSessions.FromSignalRId(Context.ConnectionId);

            if (session == null)
            {
                return(false);
            }

            username = Censor(username);

            User   user        = session.User;
            string oldUsername = user.Username;

            user.Username = username;

            await Database.SaveChangesAsync();

            await Clients.Group(user.GroupMember.Group.SignalRId).UpdateGroupMember(new(user.Id.ToString(), username, user.GroupMember.IsHost, user.GroupMember.IsDone, user.Score));

            await Clients.Caller.UpdateUserData(username, user.Score);

            //Add to sessionlog
            var entry = new SessionLogEntry(SessionLogEntryType.ChangeUsername, user.Id + ";" + oldUsername + ";" + username, DateTime.UtcNow, user);
            await Database.SessionLogEntries.AddAsync(entry);

            return(true);
        }
Example #3
0
        public override async Task OnDisconnectedAsync(Exception exception)
        {
            UserSession session = await Database.UserSessions.FromSignalRId(Context.ConnectionId);

            if (session != null)
            {
                //Add to sessionlog
                var entry = new SessionLogEntry(SessionLogEntryType.LostConnection, session.User.Id.ToString(), DateTime.UtcNow, session.User);
                await Database.SessionLogEntries.AddAsync(entry);

                await Database.SaveChangesAsync();

                session.SignalRId = null;
                await Database.SaveChangesAsync();
            }
            await base.OnDisconnectedAsync(exception);
        }
Example #4
0
        public async Task <bool> AttemptRelog(string session)
        {
            UserSession usession = await Database.UserSessions.FromToken(session);

            if (usession != null)
            {
                usession.SignalRId = Context.ConnectionId;
                await Groups.AddToGroupAsync(Context.ConnectionId, usession.User.GroupMember.Group.SignalRId);

                //Add to sessionlog
                var entry = new SessionLogEntry(SessionLogEntryType.Relog, usession.User.Id.ToString(), DateTime.UtcNow, usession.User);
                await Database.SessionLogEntries.AddAsync(entry);

                await Database.SaveChangesAsync();

                return(true);
            }
            return(false);
        }
Example #5
0
        public async Task <bool> Logout()
        {
            UserSession session = await Database.UserSessions.FromSignalRId(Context.ConnectionId);

            if (session == null)
            {
                return(false);
            }

            Database.Remove(session);
            await Groups.RemoveFromGroupAsync(Context.ConnectionId, session.User.GroupMember.Group.Id.ToString());

            //Add to sessionlog
            var entry = new SessionLogEntry(SessionLogEntryType.Logout, session.User.Id.ToString(), DateTime.UtcNow, session.User);
            await Database.SessionLogEntries.AddAsync(entry);

            await Database.SaveChangesAsync();

            return(true);
        }
Example #6
0
        public async Task <bool> Register(string username, string password, string email, double curLat, double curLong)
        {
            if (await Database.Authenticators.AsAsyncEnumerable().AnyAsync(e => e.Email.Equals(email, StringComparison.CurrentCultureIgnoreCase)))
            {
                return(false);
            }

            username = Censor(username);

            User user = new(0, username, email);

            user = (await Database.AddAsync(user)).Entity;

            Authenticator auth = new(email, CreatePasswordHash(password), DateTime.UtcNow, user);

            var newChal = await GroupExtensions.GetNewChallenge(null, Database.Challenges, curLong, curLat, true);

            Group g = new Group(newChal);

            g = (await Database.AddAsync(g)).Entity;
            await Database.SaveChangesAsync();

            user.GroupMember = new GroupMember(true, false, g);
            g.SignalRId      = g.Id.ToString();

            await Groups.AddToGroupAsync(Context.ConnectionId, auth.User.GroupMember.Group.Id.ToString());

            //Add to sessionlog
            var entry = new SessionLogEntry(SessionLogEntryType.UserCreated, user.Id.ToString(), DateTime.UtcNow, user);

            await Database.AddAsync(entry);

            await Database.SaveChangesAsync();

            return(true);
        }
Example #7
0
        public async Task <ChallengeProgressData> CheckProgress(double lat, double @long)
        {
            UserSession session = await Database.UserSessions.FromSignalRId(Context.ConnectionId);

            User      user = session.User;
            Challenge chal = user.GroupMember.Group.Challenge;

            var fPoint          = chal.LongLat;
            var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(fPoint.SRID);
            var nPoint          = geometryFactory.CreatePoint(new Coordinate(@long, lat));

            double dist = nPoint.ProjectTo(2830).Distance(fPoint.ProjectTo(2830));

            double d      = chal.Radius * 10.0;
            double scaled = ((dist + d) * d - d * d) / (d * (dist + d));

            if (dist < chal.Radius)
            {
                user.GroupMember.IsDone = true;
                await Clients.Caller.FinishChallenge();

                await Clients.Group(user.GroupMember.Group.SignalRId).UpdateGroupMember(
                    new(user.Id.ToString(), user.Username, user.GroupMember.IsHost, true, user.Score));

                if (!user.GroupMember.IsDone)
                {
                    //Add to sessionlog
                    var entry = new SessionLogEntry(SessionLogEntryType.FoundPlace, user.GroupMember.Group.Id.ToString(), DateTime.UtcNow, user);
                    await Database.SessionLogEntries.AddAsync(entry);
                }

                await Database.SaveChangesAsync();
            }

            if (user.GroupMember.Group.GroupMembers.All(b => b.IsDone))
            {
                foreach (GroupMember member in user.GroupMember.Group.GroupMembers)
                {
                    if (!user.PrevChallenges.Any(e => e.Challenge.Id == chal.Id))
                    {
                        member.User.Score += chal.Points;
                        member.User.PrevChallenges.Add(new PrevChallenge(DateTime.UtcNow, user.GroupMember.Group.Challenge, member.User));
                    }
                    member.User.GroupMember.IsDone = false;
                    await Clients.Group(user.GroupMember.Group.SignalRId).UpdateGroupMember(new GroupMemberData(
                                                                                                member.User.Id.ToString(), member.User.Username, member.IsHost, member.IsDone, member.User.Score
                                                                                                ));

                    string uId = member.User.UserSession?.SignalRId;
                    if (uId != null)
                    {
                        await Clients.Client(uId).UpdateUserData(member.User.Username, member.User.Score);
                    }
                }
                user.GroupMember.Group.PrevChallenges.Add(user.GroupMember.Group.Challenge);

                await Database.SaveChangesAsync();

                Challenge newChal = await user.GroupMember.Group.GetNewChallenge(Database.Challenges, @long, lat);

                user.GroupMember.Group.Challenge = newChal;

                ChallengeData cData = new ChallengeData(newChal.Id.ToString(), newChal.Description, newChal.Points, newChal.ImageUrl);
                await Database.SaveChangesAsync();

                await Clients.Group(user.GroupMember.Group.SignalRId).UpdateChallenge(cData);
            }

            string progressString = ((int)Math.Ceiling(dist / 64.32)).ToString() + " min";
            double progressScale  = 1.0 - Math.Max(Math.Min(scaled, 1.0), 0.0);

            return(new ChallengeProgressData(progressString, progressScale));
        }
Example #8
0
        public async Task <bool> Kick(string userId)
        {
            UserSession session = await Database.UserSessions.FromSignalRId(Context.ConnectionId);

            if (session == null)
            {
                return(false);
            }

            User user = await Database.Users.AsAsyncEnumerable().SingleAsync(b => b.Id == long.Parse(userId));

            if (user.GroupMember.Group == null)
            {
                return(false);                                //Is default null?
            }
            GroupMember gmem = user.GroupMember;
            Group       grp  = user.GroupMember.Group;

            if (gmem.IsHost)
            {
                foreach (GroupMember member in grp.GroupMembers)
                {
                    Group gp = new Group(grp.Challenge);
                    gp = (await Database.AddAsync(gp)).Entity;
                    gp.GroupMembers.Add(member);
                    member.Group  = gp;
                    member.IsHost = true;
                    gp.SyncPlacesWithUsers();

                    await Database.SaveChangesAsync();

                    gp.SignalRId = gp.Id.ToString();

                    if (member.User?.UserSession?.SignalRId != null)
                    {
                        await Groups.AddToGroupAsync(member.User.UserSession.SignalRId, gp.SignalRId);
                    }

                    await Clients.Group(gp.SignalRId).UpdateGroupData(gp.GetFriendlyId(), new GroupMemberData[] {
                        new GroupMemberData(member.User.Id.ToString(), member.User.Username, true, member.IsDone, member.User.Score)
                    });
                }
            }
            else
            {
                Group gp = new Group(grp.Challenge);
                gp = (await Database.AddAsync(gp)).Entity;

                gp.GroupMembers.Add(gmem);
                gmem.Group  = gp;
                gmem.IsHost = true;
                gp.SyncPlacesWithUsers();

                await Database.SaveChangesAsync();

                gp.SignalRId = gp.Id.ToString();

                await Groups.RemoveFromGroupAsync(gmem.User.UserSession.SignalRId, grp.SignalRId);

                await Groups.AddToGroupAsync(gmem.User.UserSession.SignalRId, gp.SignalRId);

                grp.GroupMembers.Remove(gmem);

                await Clients.Group(grp.SignalRId).UpdateGroupData(grp.GetFriendlyId(), grp.GroupMembers.Select(gmem =>
                                                                                                                new GroupMemberData(gmem.User.Id.ToString(), gmem.User.Username, true, gmem.IsDone, gmem.User.Score)).ToArray());

                await Clients.Group(gp.SignalRId).UpdateGroupData(gp.GetFriendlyId(), new[] {
                    new GroupMemberData(gmem.User.Id.ToString(), gmem.User.Username, true, gmem.IsDone, gmem.User.Score)
                });
            }
            await Database.SaveChangesAsync();

            //Add to sessionlog
            if (user.Id == long.Parse(userId) && !user.GroupMember.IsHost)
            {
                var entry = new SessionLogEntry(SessionLogEntryType.LeaveGroup, user + ";" + grp, DateTime.UtcNow, user);
                await Database.SessionLogEntries.AddAsync(entry);
            }
            else if (user.Id == long.Parse(userId) && user.GroupMember.IsHost)
            {
                var entry = new SessionLogEntry(SessionLogEntryType.LeaveGroup, user + ";" + grp, DateTime.UtcNow, user);
                await Database.SessionLogEntries.AddAsync(entry);

                var entry2 = new SessionLogEntry(SessionLogEntryType.DisbandedGroup, user + ";" + grp, DateTime.UtcNow, user);
                await Database.SessionLogEntries.AddAsync(entry2);
            }
            else
            {
                var entry = new SessionLogEntry(SessionLogEntryType.KickedMember, session.User + ";" + user + ";" + grp, DateTime.UtcNow, session.User);
                await Database.SessionLogEntries.AddAsync(entry);

                var entry2 = new SessionLogEntry(SessionLogEntryType.KickedByHost, user + ";" + session.User + ";" + grp, DateTime.UtcNow, user);
                await Database.SessionLogEntries.AddAsync(entry2);
            }

            if (!user.GroupMember.IsHost)
            {
                foreach (GroupMember gmem2 in grp.GroupMembers)
                {
                    //Add to sessionlog of group members
                    if (gmem2.Id != long.Parse(userId))
                    {
                        var entry2 = new SessionLogEntry(SessionLogEntryType.UserFromGroupLeft, user + ";" + grp, DateTime.UtcNow, gmem2.User);
                        await Database.SessionLogEntries.AddAsync(entry2);
                    }
                }
            }
            await Database.SaveChangesAsync();

            return(true);
        }
Example #9
0
        public async Task <bool> JoinGroup(string groupId)
        {
            groupId = groupId.ToUpper();

            UserSession session = await Database.UserSessions.FromSignalRId(Context.ConnectionId);

            User  user = session.User;
            Group grp;

            try
            {
                grp = await Database.Groups.FromFriendlyId(groupId);
            }
            catch
            {
                return(false);
            }

            //Make sure group isnt null
            if (grp == null)
            {
                return(false);
            }

            if (grp.Id == user.GroupMember.Group.Id || grp.MaxMembers == grp.GroupMembers.Count || grp.GroupMembers.Count == 0)
            {
                return(false);
            }

            //Remove user from old group
            await Kick(user.Id.ToString());

            //Add user to new group
            grp.GroupMembers.Add(user.GroupMember);
            user.GroupMember.Group  = grp;
            user.GroupMember.IsHost = false;

            user.GroupMember.IsDone = user.PrevChallenges.Any(e => e.Challenge.Id == grp.Challenge.Id);

            //Add to sessionlog
            var entry = new SessionLogEntry(SessionLogEntryType.UserFromGroupJoined, user.Id + ";" + groupId, DateTime.UtcNow, user);
            await Database.SessionLogEntries.AddAsync(entry);

            await Groups.AddToGroupAsync(user.UserSession.SignalRId, grp.Id.ToString());

            await Clients.Group(grp.SignalRId).UpdateGroupData(grp.GetFriendlyId(), grp.GroupMembers.Select(gmem =>
                                                                                                            new GroupMemberData(gmem.User.Id.ToString(), gmem.User.Username, true, gmem.IsDone, gmem.User.Score)).ToArray());

            foreach (GroupMember gmem2 in user.GroupMember.Group.GroupMembers)
            {
                //Add to sessionlog of group members
                if (gmem2.Id != user.Id)
                {
                    var entry2 = new SessionLogEntry(SessionLogEntryType.UserFromGroupJoined, user + ";" + grp, DateTime.UtcNow, user);
                    await Database.SessionLogEntries.AddAsync(entry2);
                }
            }

            await Database.SaveChangesAsync();

            return(true);
        }