void IGroupRolemembersInterface.Delete(UGUI requestingAgent, UGI group, UUID roleID, UGUI principal)
        {
            bool isUnlimited = false;

            if (!IsGroupOwner(group, requestingAgent))
            {
                try
                {
                    VerifyAgentPowers(group, requestingAgent, GroupPowers.AssignMember);
                    isUnlimited = true;
                }
                catch (GroupInsufficientPowersException)
                {
                    VerifyAgentPowers(group, requestingAgent, GroupPowers.AssignMemberLimited);
                }
            }
            else
            {
                isUnlimited = true;
            }

            if (!isUnlimited && !Rolemembers.ContainsKey(requestingAgent, group, roleID, requestingAgent))
            {
                throw new GroupInsufficientPowersException(GroupPowers.AssignMemberLimited);
            }

            m_InnerService.Rolemembers.Delete(requestingAgent, group, roleID, principal);
        }
        void IGroupRolemembersInterface.Add(UGUI requestingAgent, GroupRolemember rolemember)
        {
            bool isUnlimited = false;

            if (m_InnerService.Invites[requestingAgent, rolemember.Group, rolemember.RoleID, rolemember.Principal].Count != 0)
            {
            }
            else
            {
                if (!IsGroupOwner(rolemember.Group, requestingAgent))
                {
                    try
                    {
                        VerifyAgentPowers(rolemember.Group, requestingAgent, GroupPowers.AssignMember);
                        isUnlimited = true;
                    }
                    catch (GroupInsufficientPowersException)
                    {
                        VerifyAgentPowers(rolemember.Group, requestingAgent, GroupPowers.AssignMemberLimited);
                    }
                }
                else
                {
                    isUnlimited = true;
                }

                if (!isUnlimited && !Rolemembers.ContainsKey(requestingAgent, rolemember.Group, rolemember.RoleID, requestingAgent))
                {
                    throw new GroupInsufficientPowersException(GroupPowers.AssignMemberLimited);
                }
            }

            m_InnerService.Rolemembers.Add(requestingAgent, rolemember);
        }
        public GroupMember AddAgentToGroup(UGUI requestingAgent, UGI group, UUID roleid, UGUI agent, string accessToken)
        {
            bool alreadyInGroup;

            GroupMember gmem;

            alreadyInGroup = Members.TryGetValue(requestingAgent, group, agent, out gmem);
            if (!alreadyInGroup)
            {
                gmem = Members.Add(requestingAgent, group, agent, roleid, accessToken);
            }

            try
            {
                if (!Rolemembers.ContainsKey(requestingAgent, group, UUID.Zero, agent))
                {
                    var rolemember = new GroupRolemember
                    {
                        Group     = group,
                        Principal = agent,
                        RoleID    = UUID.Zero
                    };
                    Rolemembers.Add(requestingAgent, rolemember);
                }

                if (UUID.Zero != roleid)
                {
                    var rolemember = new GroupRolemember
                    {
                        Group     = group,
                        Principal = agent,
                        RoleID    = roleid
                    };
                    Rolemembers.Add(requestingAgent, rolemember);
                }

                try
                {
                    var invites = Invites[requestingAgent, group, roleid, agent];
                    foreach (var invite in invites)
                    {
                        invites.Remove(invite);
                    }
                }
                catch
                {
                    /* intentionally ignored */
                }
            }
            catch
            {
                if (!alreadyInGroup)
                {
                    Members.Delete(requestingAgent, group, agent);
                }
            }

            return(gmem);
        }
        public virtual GroupInfo CreateGroup(UGUI requestingAgent, GroupInfo ginfo, GroupPowers everyonePowers, GroupPowers ownerPowers)
        {
            var role_everyone = new GroupRole
            {
                ID          = UUID.Zero,
                Group       = ginfo.ID,
                Name        = "Everyone",
                Description = "Everyone in the group",
                Title       = "Member of " + ginfo.ID.GroupName,
                Powers      = everyonePowers
            };
            var role_owner = new GroupRole
            {
                ID          = UUID.Random,
                Group       = ginfo.ID,
                Name        = "Owners",
                Description = "Owners of the group",
                Title       = "Owner of " + ginfo.ID.GroupName,
                Powers      = ownerPowers
            };

            ginfo.OwnerRoleID = role_owner.ID;

            var gmemrole_owner = new GroupRolemember
            {
                Group     = ginfo.ID,
                RoleID    = role_owner.ID,
                Principal = ginfo.Founder
            };
            var gmemrole_everyone = new GroupRolemember
            {
                Group     = ginfo.ID,
                RoleID    = role_everyone.ID,
                Principal = ginfo.Founder
            };

            Groups.Create(requestingAgent, ginfo);

            try
            {
                Roles.Add(requestingAgent, role_everyone);
                Roles.Add(requestingAgent, role_owner);
                Members.Add(requestingAgent, ginfo.ID, ginfo.Founder, role_owner.ID, UUID.Random.ToString());
                Rolemembers.Add(requestingAgent, gmemrole_owner);
                Rolemembers.Add(requestingAgent, gmemrole_everyone);
                ginfo.RoleCount   = 2;
                ginfo.MemberCount = 1;
            }
            catch
            {
                Groups.Delete(requestingAgent, ginfo.ID);
                throw;
            }
            return(ginfo);
        }
 GroupRolemember IGroupRolemembersInterface.this[UUI requestingAgent, UGI group, UUID roleID, UUI principal]
 {
     get
     {
         GroupRolemember rolemem;
         if (!Rolemembers.TryGetValue(requestingAgent, group, roleID, principal, out rolemem))
         {
             throw new KeyNotFoundException();
         }
         return(rolemem);
     }
 }