예제 #1
0
        private async Task BuildeUserLinkList()
        {
            using (await _overlapLock.LockAsync())
            {
                UserLinks.Clear();

                foreach (ulong discordUserId in DLStorage.WorldData.PlayerTrackedTrades.Keys)
                {
                    LinkedUser dlUser = LinkedUserManager.LinkedUserByDiscordId(discordUserId);
                    if (dlUser == null)
                    {
                        continue;
                    }

                    DiscordGuild guild = DiscordLink.Obj.GuildByNameOrId(dlUser.GuildId);
                    if (guild == null)
                    {
                        continue;
                    }

                    DiscordMember member = await guild.GetMemberAsync(discordUserId);

                    if (member != null)
                    {
                        UserLinks.Add(new UserLink(member));
                    }
                }
            }
        }
        public Task <Result> JoinRequest(CreateLinkedUserModel model)
        => Result.TryAsync(async() =>
        {
            var firstUser = (await _repository.FirstOrDefaultAsync <User>(u => u.Id == model.FirstUserId))
                            .Data;
            if (firstUser == null)
            {
                return(Result.Failed(Error.WithCode(ErrorCodes.NotFound)));
            }

            var secondUser = (await _repository.FirstOrDefaultAsync <User>(u => u.Id == generalDataService.User.Id))
                             .Data;
            if (secondUser == null)
            {
                return(Result.Failed(Error.WithCode(ErrorCodes.NotFound)));
            }


            var linkedUser = new LinkedUser
            {
                Id           = Guid.NewGuid(), CreationDate = DateTime.Now, FirstUser = firstUser, SecondUser = secondUser,
                RelationType = model.RelationType,
                LinkStatus   = (byte)LinkStatus.Pending
            };
            _repository.Add(linkedUser);
            await _repository.CommitAsync();
            return(Result.Successful());
        });
예제 #3
0
        public async Task Seed()
        {
            //_ctx.Database.EnsureCreated();

            var user = await _userManager.FindByEmailAsync("*****@*****.**");

            if (user == null)
            {
                user = new LinkedUser()
                {
                    FirstName = "Viktor",
                    LastName  = "Berglind",
                    UserName  = "******",
                    Email     = "*****@*****.**"
                };

                var result = await _userManager.CreateAsync(user, "P@ssw0rd!");

                if (result != IdentityResult.Success)
                {
                    throw new InvalidOperationException("Failed to create default user");
                }
            }

            _ctx.SaveChanges();
        }
예제 #4
0
 private void HandleLinkedUserRemoved(object sender, LinkedUser user)
 {
     using (_overlapLock.Lock())
     {
         int removeIndex = UserLinks.FindIndex(u => (u as UserLink).Member.Id == ulong.Parse(user.DiscordId));
         if (removeIndex >= 0)
         {
             UserLinks.RemoveAt(removeIndex);
         }
     }
 }
        public Task <Result <Guid> > Add(CreateLinkedUserModel model)
        => Result <Guid> .TryAsync(async() =>
        {
            var LinkedUser = new LinkedUser
            {
                Id           = Guid.NewGuid(), FirstUserId = model.FirstUserId ?? generalDataService.User.Id,
                SecondUserId = model.SecondUserId, CreationDate = DateTime.Now,
                LinkStatus   = (byte)LinkStatus.Pending
            };

            _repository.Add(LinkedUser);
            await _repository.CommitAsync();
            return(Result <Guid> .Successful(LinkedUser.Id));
        });
예제 #6
0
        public static bool CheckIfOwner(LinkedMessage e)
        {
            LinkedServer server = e.server;
            LinkedUser   user   = e.author;

            if (user.isIrc)
            {
                LinkedIrcUser ircUser = (LinkedIrcUser)user;
                if (ircUser.IrcUser.Match(Program.Config.servers[server.name].botOwnerHostmask))
                {
                    return(true);
                }
            }
            else if (user.isDiscord)
            {
                if (user.id.Equals(Program.Config.DiscordBotOwnerID.ToString()))
                {
                    return(true);
                }
            }

            return(false);
        }
예제 #7
0
        public static bool CheckPermission(string commandName, LinkedMessage e)
        {
            LinkedServer  server  = e.server;
            LinkedChannel channel = e.channel;
            LinkedUser    user    = e.author;

            if (CheckIfOwner(e))
            {
                return(true);                // If user is the Bot owner, bypass all permission checks
            }

            ICommand        command    = Program.CommandList[commandName];   // Get required permission level
            PermissionLevel permission = (PermissionLevel)Attribute.GetCustomAttribute(command.GetType(), typeof(PermissionLevel));

            if (permission == null)
            {
                Logger.Warn("Command \"{0}\" does not have a valid permission set on the class", commandName);
            }

            if (Program.Permissions.TryGetValue(server.name, out Dictionary <string, Dictionary <string, PermissionLevel> > channels))
            {
                string check = channel == null ? "PM" : channel.name;
                if (channels.TryGetValue(check, out Dictionary <string, PermissionLevel> commands))
                {
                    commands.TryGetValue(commandName, out permission);
                }
            }

            // Check permissions
            if (permission == null)
            {
                Logger.Warn("Disallowing use of command \"{0}\" because no permission is set", commandName);
                return(false);                // Prevent accidentally allowing dangerous commands to be ran by normal users
            }

            if (permission.minLevel == Modes.BotOwner)
            {
                return(false);
            }

            if (user.isIrc)
            {
                if (permission.minLevel == Modes.None)
                {
                    return(true);
                }

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

                LinkedIrcChannel ircChannel = (LinkedIrcChannel)channel;
                LinkedIrcUser    ircUser    = (LinkedIrcUser)user;
                return(ircChannel.channel.UsersByMode[IrcUtils.GetUserLevelChar(permission.minLevel)].Contains(ircUser));
            }

            if (user.isDiscord)
            {
                if (permission.requiredPermission == Permissions.None)
                {
                    return(true);
                }

                LinkedDiscordUser discordUser = (LinkedDiscordUser)user;
                if (channel == null)
                {
                    return(false);
                }

                LinkedDiscordChannel discordChannel = (LinkedDiscordChannel)channel;
                return(discordUser.DiscordMember.PermissionsIn(discordChannel).HasFlag(permission.requiredPermission));
            }

            return(false);
        }
        public Task <Result <object> > Register(AdvanceRegisterModel model)
        => Result <object> .TryAsync(async() =>
        {
            model.User.Password = _cryptoService.ComputeSha512Hash(model.User.Password);

            var username          = model.User.Firstname.ToCharArray()[0] + "." + model.User.Lastname;
            var duplicateUsername = await _repository.FirstOrDefaultAsNoTrackingAsync <User>(u =>
                                                                                             u.Username == username);
            if (duplicateUsername.Success && duplicateUsername.Data != null)
            {
                username = model.User.Firstname + "." + model.User.Lastname;
            }
            duplicateUsername = await _repository.FirstOrDefaultAsNoTrackingAsync <User>(u =>
                                                                                         u.Username == username);
            if (duplicateUsername.Success && duplicateUsername.Data != null)
            {
                username = model.User.Firstname + "." + model.User.Lastname + new Random(1000).Next();
            }

            var duplicateMobile = await _repository.FirstOrDefaultAsNoTrackingAsync <User>(u =>
                                                                                           u.Mobile == model.User.Mobile);
            if (duplicateMobile.Success && duplicateMobile.Data != null)
            {
                return(Result <object> .Failed(Error.WithData(1000, new[] { "Duplicate Mobile Number " })));
            }

            var duplicateEmail = await _repository.FirstOrDefaultAsNoTrackingAsync <User>(u =>
                                                                                          u.Email == model.User.Email);
            if (duplicateEmail.Success && duplicateEmail.Data != null)
            {
                return(Result <object> .Failed(Error.WithData(1000, new[] { "Duplicate Email Address " })));
            }

            var result = await _repository.FirstOrDefaultAsync <Role>(r => r.Name == "NormalUser",
                                                                      r => r.RoleFeature.Select(rf => rf.Feature.FeaturePermission.Select(fp => fp.Permission)));
            var role = result.Data;

            var id   = Guid.NewGuid();
            var user = new User
            {
                Id           = id,
                Address      = model.User.Address,
                City         = model.User.City,
                Province     = model.User.Province,
                CreationDate = DateTime.Now,
                DateOfBirth  = model.User.DateOfBirth ?? DateTime.Now,
                Email        = model.User.Email,
                Enabled      = true,
                SinNumber    = model.User.SinNumber,
                Firstname    = model.User.Firstname,
                Password     = _cryptoService.ComputeSha512Hash("" + model.User.DateOfBirth.Value.Year),
                PostalCode   = model.User.PostalCode,
                Lastname     = model.User.Lastname,
                Latitude     = model.User.Latitude,
                PoBox        = model.User.PoBox,
                Gender       = model.User.Gender,
                Longtitude   = model.User.Longtitude,
                AvatarId     = model.User.AvatarId,
                Receipt      = model.User.Receipts != null && model.User.Receipts.Any()
                        ? model.User.Receipts.Select(r => new Receipt {
                    BlobId = r, UserId = id, Id = Guid.NewGuid()
                })
                               .ToList()
                        : null,
                Mobile        = model.User.Mobile,
                Role          = role,
                Username      = username,
                MaritalStatus = (byte)MaritalStatus.Single,
            };

            var linkUser = new LinkedUser
            {
                Id           = Guid.NewGuid(),
                FirstUserId  = user.Id,
                SecondUserId = generalDataService.User.Id,
                CreationDate = DateTime.Now,
                RelationType = model.RelationType,
                LinkStatus   = (byte)LinkStatus.Pending
            };

            _repository.Add(user);
            _repository.Add(linkUser);
            await _repository.CommitAsync();

            return(Result <object> .Successful(user.Id));
        });
        public IHttpActionResult GetLinkedUsersById([FromBody] object data)
        {
            ArrayList  linkedUsers = new ArrayList();
            LinkedUser lu;

            try
            {
                var    headers = Request.Headers;
                string id      = headers.GetValues(Models.User.COL_ID).First();

                using (SqlConnection con = new SqlConnection(QueryGenerator.ConnectionString()))
                {
                    con.Open();
                    using (SqlCommand cmd = con.CreateCommand())
                    {
                        // query linked user list
                        ArrayList columsS1     = new ArrayList();
                        ArrayList conditionsS1 = new ArrayList();
                        string    statement1   = string.Empty;

                        columsS1.Add(LinkedUser.COL_ID);
                        columsS1.Add(LinkedUser.COL_USERID1);
                        columsS1.Add(LinkedUser.COL_USERID2);
                        columsS1.Add(LinkedUser.COL_ALERT1);
                        columsS1.Add(LinkedUser.COL_ALERT2);
                        columsS1.Add(LinkedUser.COL_MUTE1);
                        columsS1.Add(LinkedUser.COL_MUTE2);
                        columsS1.Add(LinkedUser.COL_DELETED);
                        columsS1.Add(LinkedUser.COL_ADDED1);
                        columsS1.Add(LinkedUser.COL_ADDED2);
                        conditionsS1.Add(LinkedUser.COL_USERID1 + "=" + id);
                        conditionsS1.Add(QueryGenerator.KW_OR);
                        conditionsS1.Add(LinkedUser.COL_USERID2 + "=" + id);
                        statement1 = QueryGenerator.GenerateSqlSelect(columsS1, LinkedUser.TABLE, conditionsS1);

                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = statement1;

                        using (SqlDataReader dr = cmd.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                lu = new LinkedUser();
                                int i = 0;
                                lu.ID = dr.GetInt32(i);
                                i++;
                                lu.UserIDMe = dr.GetInt32(i);
                                if (lu.UserIDMe == int.Parse(id))
                                {
                                    lu.UserIDMe = dr.GetInt32(i);
                                    i++;
                                    lu.UserIDTarget = dr.GetInt32(i);
                                    i++;
                                    lu.AlertMe = dr.GetBoolean(i);
                                    i++;
                                    lu.AlertTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.MuteMe = dr.GetBoolean(i);
                                    i++;
                                    lu.MuteTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.Deleted = dr.GetBoolean(i);
                                    i++;
                                    lu.AddedMe = dr.GetBoolean(i);
                                    i++;
                                    lu.AddedTarget = dr.GetBoolean(i);
                                }
                                else
                                {
                                    lu.UserIDTarget = dr.GetInt32(i);
                                    i++;
                                    lu.UserIDMe = dr.GetInt32(i);
                                    i++;
                                    lu.AlertTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.AlertMe = dr.GetBoolean(i);
                                    i++;
                                    lu.MuteTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.MuteMe = dr.GetBoolean(i);
                                    i++;
                                    lu.Deleted = dr.GetBoolean(i);
                                    i++;
                                    lu.AddedTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.AddedMe = dr.GetBoolean(i);
                                }

                                linkedUsers.Add(lu);
                            }
                            dr.Close();
                        }
                        linkedUsers.Sort();

                        // query linked user name and status
                        ArrayList columsS2     = new ArrayList();
                        ArrayList conditionsS2 = new ArrayList();
                        ArrayList ordersS2     = new ArrayList();
                        string    statement2   = string.Empty;

                        columsS2.Add(Models.User.COL_ID);
                        columsS2.Add(Models.User.COL_DELETED);
                        columsS2.Add(Models.User.COL_USERNAME);
                        columsS2.Add(Models.User.COL_STATUS);
                        for (int i = 0; i < linkedUsers.Count; ++i)
                        {
                            if (i > 0)
                            {
                                conditionsS2.Add(QueryGenerator.KW_OR);
                            }
                            conditionsS2.Add(Models.User.COL_ID + "=" + ((LinkedUser)linkedUsers[i]).UserIDTarget);
                        }
                        ordersS2.Add(Models.User.COL_ID);
                        statement2 = QueryGenerator.GenerateSqlSelect(columsS2, Models.User.TABLE, conditionsS2, ordersS2, QueryGenerator.KW_ASC);

                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = statement2;

                        using (SqlDataReader dr = cmd.ExecuteReader())
                        {
                            int i = 0;

                            if (linkedUsers.Count > 0)
                            {
                                while (dr.Read())
                                {
                                    if (((LinkedUser)linkedUsers[i]).UserIDTarget == dr.GetInt32(0) &&
                                        !dr.GetBoolean(1))
                                    {
                                        ((LinkedUser)linkedUsers[i]).NameTarget   = dr.GetString(2);
                                        ((LinkedUser)linkedUsers[i]).StatusTarget = dr.GetInt32(3);
                                    }
                                    else
                                    {
                                        ((LinkedUser)linkedUsers[i]).NameTarget   = string.Empty;
                                        ((LinkedUser)linkedUsers[i]).StatusTarget = 5;
                                    }
                                    i++;
                                }
                            }
                            dr.Close();
                        }
                        for (int i = linkedUsers.Count - 1; i >= 0; --i)
                        {
                            if (((LinkedUser)linkedUsers[i]).NameTarget.Length == 0)
                            {
                                linkedUsers.RemoveAt(i);
                            }
                        }
                    }
                    con.Close();
                }
            }
            catch (Exception e)
            {
                return(ResponseMessage(JsonContent.ReturnMessage("The request is invalid.", e.ToString())));
            }

            return(Ok(new { linkedUsers }));
        }
예제 #10
0
 public override async Task respond(string message, LinkedUser user = null)
 {
     await DiscordMember.SendMessageAsync(message);
 }
예제 #11
0
        public IHttpActionResult Alert([FromBody] object data)
        {
            LinkedUser lu;
            ArrayList  linkedUsers   = new ArrayList();
            ArrayList  emailsToAlert = new ArrayList();
            string     userName      = string.Empty;

            try
            {
                var    headers = Request.Headers;
                string id      = headers.GetValues(Models.User.COL_ID).First();
                string lat     = headers.GetValues(Location.COL_LAT).First();
                string lng     = headers.GetValues(Location.COL_LNG).First();

                using (SqlConnection con = new SqlConnection(QueryGenerator.ConnectionString()))
                {
                    con.Open();
                    using (SqlCommand cmd = con.CreateCommand())
                    {
                        // Set flag for user table ---------------------
                        ArrayList assignmentsS1 = new ArrayList();
                        ArrayList conditionsS1  = new ArrayList();
                        string    statement1;

                        assignmentsS1.Add(Models.User.COL_STATUS + "=6");
                        conditionsS1.Add(Models.User.COL_ID + "=" + id);
                        statement1 = QueryGenerator.GenerateSqlUpdate(Models.User.TABLE, assignmentsS1, conditionsS1);

                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = statement1.ToString();
                        cmd.ExecuteNonQuery();

                        // Set location for location table -------------
                        ArrayList valuesS2      = new ArrayList();
                        ArrayList assignmentsS2 = new ArrayList();
                        string    statement2    = string.Empty;

                        valuesS2.Add(id);
                        valuesS2.Add(lat);
                        valuesS2.Add(lng);
                        valuesS2.Add(QueryGenerator.QuoteString(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")));
                        statement2 = QueryGenerator.GenerateSqlInsert(valuesS2, Location.TABLE);

                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = statement2;
                        cmd.ExecuteNonQuery();

                        // Get linked users ----------------------------
                        ArrayList columsS3     = new ArrayList();
                        ArrayList conditionsS3 = new ArrayList();
                        string    statement3   = string.Empty;

                        columsS3.Add(LinkedUser.COL_ID);
                        columsS3.Add(LinkedUser.COL_USERID1);
                        columsS3.Add(LinkedUser.COL_USERID2);
                        columsS3.Add(LinkedUser.COL_ALERT1);
                        columsS3.Add(LinkedUser.COL_ALERT2);
                        columsS3.Add(LinkedUser.COL_MUTE1);
                        columsS3.Add(LinkedUser.COL_MUTE2);
                        columsS3.Add(LinkedUser.COL_DELETED);
                        columsS3.Add(LinkedUser.COL_ADDED1);
                        columsS3.Add(LinkedUser.COL_ADDED2);
                        conditionsS3.Add(LinkedUser.COL_USERID1 + "=" + id);
                        conditionsS3.Add(QueryGenerator.KW_OR);
                        conditionsS3.Add(LinkedUser.COL_USERID2 + "=" + id);
                        statement3 = QueryGenerator.GenerateSqlSelect(columsS3, LinkedUser.TABLE, conditionsS3);

                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = statement3;

                        using (SqlDataReader dr = cmd.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                lu = new LinkedUser();
                                int i = 0;
                                lu.ID = dr.GetInt32(i);
                                i++;
                                lu.UserIDMe = dr.GetInt32(i);
                                if (lu.UserIDMe == int.Parse(id))
                                {
                                    lu.UserIDMe = dr.GetInt32(i);
                                    i++;
                                    lu.UserIDTarget = dr.GetInt32(i);
                                    i++;
                                    lu.AlertMe = dr.GetBoolean(i);
                                    i++;
                                    lu.AlertTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.MuteMe = dr.GetBoolean(i);
                                    i++;
                                    lu.MuteTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.Deleted = dr.GetBoolean(i);
                                    i++;
                                    lu.AddedMe = dr.GetBoolean(i);
                                    i++;
                                    lu.AddedTarget = dr.GetBoolean(i);
                                }
                                else
                                {
                                    lu.UserIDTarget = dr.GetInt32(i);
                                    i++;
                                    lu.UserIDMe = dr.GetInt32(i);
                                    i++;
                                    lu.AlertTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.AlertMe = dr.GetBoolean(i);
                                    i++;
                                    lu.MuteTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.MuteMe = dr.GetBoolean(i);
                                    i++;
                                    lu.Deleted = dr.GetBoolean(i);
                                    i++;
                                    lu.AddedTarget = dr.GetBoolean(i);
                                    i++;
                                    lu.AddedMe = dr.GetBoolean(i);
                                }

                                linkedUsers.Add(lu);
                            }
                            dr.Close();
                        }
                        linkedUsers.Sort();

                        // Filter linked users -------------------------
                        for (int i = linkedUsers.Count - 1; i >= 0; --i)
                        {
                            LinkedUser linkedUser = (LinkedUser)linkedUsers[i];
                            if (!(linkedUser.AddedMe && linkedUser.AddedTarget) ||
                                !linkedUser.AlertMe ||
                                linkedUser.MuteTarget ||
                                linkedUser.Deleted)
                            {
                                linkedUsers.RemoveAt(i);
                            }
                        }

                        // Get linked user emails ----------------------
                        ArrayList columsS4     = new ArrayList();
                        ArrayList conditionsS4 = new ArrayList();
                        string    statement4   = string.Empty;

                        columsS4.Add(Models.User.COL_DELETED);
                        columsS4.Add(Models.User.COL_EMAIL);
                        for (int i = 0; i < linkedUsers.Count; ++i)
                        {
                            if (i > 0)
                            {
                                conditionsS4.Add(QueryGenerator.KW_OR);
                            }
                            conditionsS4.Add(Models.User.COL_ID + "=" + ((LinkedUser)linkedUsers[i]).UserIDTarget);
                        }
                        statement4 = QueryGenerator.GenerateSqlSelect(columsS4, Models.User.TABLE, conditionsS4);

                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = statement4;

                        // Set linked user emails ----------------------
                        using (SqlDataReader dr = cmd.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                if (!dr.GetBoolean(0))
                                {
                                    if (dr.GetValue(1) != DBNull.Value)
                                    {
                                        emailsToAlert.Add(dr.GetString(1));
                                    }
                                }
                            }
                            dr.Close();
                        }

                        // Get this user's name ------------------------
                        ArrayList columsS5     = new ArrayList();
                        ArrayList conditionsS5 = new ArrayList();
                        string    statement5   = string.Empty;

                        columsS5.Add(Models.User.COL_USERNAME);
                        conditionsS5.Add(Models.User.COL_ID + "=" + id);
                        statement5 = QueryGenerator.GenerateSqlSelect(columsS5, Models.User.TABLE, conditionsS5);

                        cmd.CommandType = CommandType.Text;
                        cmd.CommandText = statement5;

                        using (SqlDataReader dr = cmd.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                userName = dr.GetString(0);
                            }
                            dr.Close();
                        }
                    }
                    con.Close();
                }

                // Send notification
                foreach (string email in emailsToAlert)
                {
                    string message = "[" + userName + "] Help!";
                    SendNotification(message, email);
                }
            }
            catch (Exception e)
            {
                return(ResponseMessage(JsonContent.ReturnMessage("The request is invalid.", e.ToString())));
            }

            if (emailsToAlert.Count == 0)
            {
                return(ResponseMessage(JsonContent.ReturnMessage("No linked user is found.", "")));
            }
            //return ResponseMessage(JsonContent.ReturnMessage("Linked users are alerted.", ""));
            return(Ok(emailsToAlert));
        }
 private static LinkedUserModel Map(this LinkedUser input)
 => new LinkedUserModel
 {
     Username = input.Username,
     Reason   = input.Reason
 };