2010-04-02 13:53:10 +00:00
/ *
* Copyright ( c ) Contributors , http : //opensimulator.org/
* See CONTRIBUTORS . TXT for a full list of copyright holders .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
* * Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ` ` AS IS ' ' AND ANY
* EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
* ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
* LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
* /
using System ;
using System.Collections ;
using System.Collections.Generic ;
using System.Collections.Specialized ;
using System.Reflection ;
using Nwc.XmlRpc ;
using log4net ;
using Mono.Addins ;
using Nini.Config ;
using OpenMetaverse ;
using OpenMetaverse.StructuredData ;
using OpenSim.Framework ;
using OpenSim.Framework.Communications ;
using OpenSim.Region.Framework.Interfaces ;
using OpenSim.Services.Interfaces ;
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Simian Data Map
* = = = = = = = = = = = = = = =
*
* OwnerID - > Type - > Key
* - - - - - - - - - - - - - - - - - - - - - - -
*
* UserID - > Group - > ActiveGroup
* + GroupID
*
* UserID - > GroupMember - > GroupID
* + SelectedRoleID [ UUID ]
* + AcceptNotices [ bool ]
* + ListInProfile [ bool ]
* + Contribution [ int ]
*
* UserID - > GroupRole [ GroupID ] - > RoleID
*
* GroupID - > Group - > GroupName
* + Charter
* + ShowInList
* + InsigniaID
* + MembershipFee
* + OpenEnrollment
* + AllowPublish
* + MaturePublish
* + FounderID
* + EveryonePowers
* + OwnerRoleID
* + OwnersPowers
*
* GroupID - > GroupRole - > RoleID
* + Name
* + Description
* + Title
* + Powers
*
* GroupID - > GroupMemberInvite - > InviteID
* + AgentID
* + RoleID
*
* GroupID - > GroupNotice - > NoticeID
* + TimeStamp [ uint ]
* + FromName [ string ]
* + Subject [ string ]
* + Message [ string ]
* + BinaryBucket [ byte [ ] ]
*
* * /
namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
{
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
public class SimianGroupsServicesConnectorModule : ISharedRegionModule , IGroupsServicesConnector
{
private static readonly ILog m_log = LogManager . GetLogger ( MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
public const GroupPowers m_DefaultEveryonePowers = GroupPowers . AllowSetHome |
GroupPowers . Accountable |
GroupPowers . JoinChat |
GroupPowers . AllowVoiceChat |
GroupPowers . ReceiveNotices |
GroupPowers . StartProposal |
GroupPowers . VoteOnProposal ;
// Would this be cleaner as (GroupPowers)ulong.MaxValue;
public const GroupPowers m_DefaultOwnerPowers = GroupPowers . Accountable
| GroupPowers . AllowEditLand
| GroupPowers . AllowFly
| GroupPowers . AllowLandmark
| GroupPowers . AllowRez
| GroupPowers . AllowSetHome
| GroupPowers . AllowVoiceChat
| GroupPowers . AssignMember
| GroupPowers . AssignMemberLimited
| GroupPowers . ChangeActions
| GroupPowers . ChangeIdentity
| GroupPowers . ChangeMedia
| GroupPowers . ChangeOptions
| GroupPowers . CreateRole
| GroupPowers . DeedObject
| GroupPowers . DeleteRole
| GroupPowers . Eject
| GroupPowers . FindPlaces
| GroupPowers . Invite
| GroupPowers . JoinChat
| GroupPowers . LandChangeIdentity
| GroupPowers . LandDeed
| GroupPowers . LandDivideJoin
| GroupPowers . LandEdit
| GroupPowers . LandEjectAndFreeze
| GroupPowers . LandGardening
| GroupPowers . LandManageAllowed
| GroupPowers . LandManageBanned
| GroupPowers . LandManagePasses
| GroupPowers . LandOptions
| GroupPowers . LandRelease
| GroupPowers . LandSetSale
| GroupPowers . ModerateChat
| GroupPowers . ObjectManipulate
| GroupPowers . ObjectSetForSale
| GroupPowers . ReceiveNotices
| GroupPowers . RemoveMember
| GroupPowers . ReturnGroupOwned
| GroupPowers . ReturnGroupSet
| GroupPowers . ReturnNonGroup
| GroupPowers . RoleProperties
| GroupPowers . SendNotices
| GroupPowers . SetLandingPoint
| GroupPowers . StartProposal
| GroupPowers . VoteOnProposal ;
private bool m_connectorEnabled = false ;
2010-05-05 15:12:52 +00:00
private string m_serviceURL = string . Empty ;
2010-04-02 13:53:10 +00:00
private bool m_debugEnabled = false ;
// private IUserAccountService m_accountService = null;
#region IRegionModuleBase Members
public string Name
{
get { return "SimianGroupsServicesConnector" ; }
}
// this module is not intended to be replaced, but there should only be 1 of them.
public Type ReplaceableInterface
{
get { return null ; }
}
public void Initialise ( IConfigSource config )
{
IConfig groupsConfig = config . Configs [ "Groups" ] ;
if ( groupsConfig = = null )
{
// Do not run this module by default.
return ;
}
else
{
// if groups aren't enabled, we're not needed.
// if we're not specified as the connector to use, then we're not wanted
if ( ( groupsConfig . GetBoolean ( "Enabled" , false ) = = false )
| | ( groupsConfig . GetString ( "ServicesConnectorModule" , "Default" ) ! = Name ) )
{
m_connectorEnabled = false ;
return ;
}
2010-05-05 15:12:52 +00:00
m_log . InfoFormat ( "[GROUPS-CONNECTOR]: Initializing {0}" , this . Name ) ;
2010-04-06 02:56:03 +00:00
2010-05-05 15:12:52 +00:00
m_serviceURL = groupsConfig . GetString ( "XmlRpcServiceURL" , string . Empty ) ;
if ( ( m_serviceURL = = null ) | |
( m_serviceURL = = string . Empty ) )
2010-04-06 02:56:03 +00:00
{
2010-05-05 15:12:52 +00:00
m_log . ErrorFormat ( "Please specify a valid Simian Server URL for XmlRpcServiceURL in OpenSim.ini, [Groups]" ) ;
2010-04-02 13:53:10 +00:00
m_connectorEnabled = false ;
return ;
}
// If we got all the config options we need, lets start'er'up
m_connectorEnabled = true ;
m_debugEnabled = groupsConfig . GetBoolean ( "DebugEnabled" , true ) ;
}
}
public void Close ( )
{
2010-05-05 15:12:52 +00:00
m_log . InfoFormat ( "[GROUPS-CONNECTOR]: Closing {0}" , this . Name ) ;
2010-04-02 13:53:10 +00:00
}
public void AddRegion ( OpenSim . Region . Framework . Scenes . Scene scene )
{
if ( m_connectorEnabled )
{
scene . RegisterModuleInterface < IGroupsServicesConnector > ( this ) ;
}
}
public void RemoveRegion ( OpenSim . Region . Framework . Scenes . Scene scene )
{
if ( scene . RequestModuleInterface < IGroupsServicesConnector > ( ) = = this )
{
scene . UnregisterModuleInterface < IGroupsServicesConnector > ( this ) ;
}
}
public void RegionLoaded ( OpenSim . Region . Framework . Scenes . Scene scene )
{
// TODO: May want to consider listenning for Agent Connections so we can pre-cache group info
// scene.EventManager.OnNewClient += OnNewClient;
}
# endregion
#region ISharedRegionModule Members
public void PostInitialise ( )
{
// NoOp
}
# endregion
#region IGroupsServicesConnector Members
/// <summary>
/// Create a Group, including Everyone and Owners Role, place FounderID in both groups, select Owner as selected role, and newly created group as agent's active role.
/// </summary>
public UUID CreateGroup ( UUID requestingAgentID , string name , string charter , bool showInList , UUID insigniaID ,
int membershipFee , bool openEnrollment , bool allowPublish ,
bool maturePublish , UUID founderID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
UUID GroupID = UUID . Random ( ) ;
UUID OwnerRoleID = UUID . Random ( ) ;
OSDMap GroupInfoMap = new OSDMap ( ) ;
GroupInfoMap [ "Charter" ] = OSD . FromString ( charter ) ;
GroupInfoMap [ "ShowInList" ] = OSD . FromBoolean ( showInList ) ;
GroupInfoMap [ "InsigniaID" ] = OSD . FromUUID ( insigniaID ) ;
GroupInfoMap [ "MembershipFee" ] = OSD . FromInteger ( 0 ) ;
GroupInfoMap [ "OpenEnrollment" ] = OSD . FromBoolean ( openEnrollment ) ;
GroupInfoMap [ "AllowPublish" ] = OSD . FromBoolean ( allowPublish ) ;
GroupInfoMap [ "MaturePublish" ] = OSD . FromBoolean ( maturePublish ) ;
GroupInfoMap [ "FounderID" ] = OSD . FromUUID ( founderID ) ;
GroupInfoMap [ "EveryonePowers" ] = OSD . FromULong ( ( ulong ) m_DefaultEveryonePowers ) ;
GroupInfoMap [ "OwnerRoleID" ] = OSD . FromUUID ( OwnerRoleID ) ;
GroupInfoMap [ "OwnersPowers" ] = OSD . FromULong ( ( ulong ) m_DefaultOwnerPowers ) ;
if ( SimianAddGeneric ( GroupID , "Group" , name , GroupInfoMap ) )
{
2010-05-05 15:12:52 +00:00
AddGroupRole ( requestingAgentID , GroupID , UUID . Zero , "Everyone" , "Members of " + name , "Member of " + name , ( ulong ) m_DefaultEveryonePowers ) ;
AddGroupRole ( requestingAgentID , GroupID , OwnerRoleID , "Owners" , "Owners of " + name , "Owner of " + name , ( ulong ) m_DefaultOwnerPowers ) ;
2010-04-02 13:53:10 +00:00
AddAgentToGroup ( requestingAgentID , requestingAgentID , GroupID , OwnerRoleID ) ;
return GroupID ;
}
else
{
return UUID . Zero ;
}
}
public void UpdateGroup ( UUID requestingAgentID , UUID groupID , string charter , bool showInList ,
UUID insigniaID , int membershipFee , bool openEnrollment ,
bool allowPublish , bool maturePublish )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
// TODO: Check to make sure requestingAgentID has permission to update group
string GroupName ;
OSDMap GroupInfoMap ;
if ( SimianGetFirstGenericEntry ( groupID , "GroupInfo" , out GroupName , out GroupInfoMap ) )
{
GroupInfoMap [ "Charter" ] = OSD . FromString ( charter ) ;
GroupInfoMap [ "ShowInList" ] = OSD . FromBoolean ( showInList ) ;
GroupInfoMap [ "InsigniaID" ] = OSD . FromUUID ( insigniaID ) ;
GroupInfoMap [ "MembershipFee" ] = OSD . FromInteger ( 0 ) ;
GroupInfoMap [ "OpenEnrollment" ] = OSD . FromBoolean ( openEnrollment ) ;
GroupInfoMap [ "AllowPublish" ] = OSD . FromBoolean ( allowPublish ) ;
GroupInfoMap [ "MaturePublish" ] = OSD . FromBoolean ( maturePublish ) ;
SimianAddGeneric ( groupID , "Group" , GroupName , GroupInfoMap ) ;
}
}
public void AddGroupRole ( UUID requestingAgentID , UUID groupID , UUID roleID , string name , string description ,
string title , ulong powers )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap GroupRoleInfo = new OSDMap ( ) ;
GroupRoleInfo [ "Name" ] = OSD . FromString ( name ) ;
GroupRoleInfo [ "Description" ] = OSD . FromString ( description ) ;
GroupRoleInfo [ "Title" ] = OSD . FromString ( title ) ;
GroupRoleInfo [ "Powers" ] = OSD . FromULong ( ( ulong ) powers ) ;
// TODO: Add security, make sure that requestingAgentID has permision to add roles
SimianAddGeneric ( groupID , "GroupRole" , roleID . ToString ( ) , GroupRoleInfo ) ;
}
public void RemoveGroupRole ( UUID requestingAgentID , UUID groupID , UUID roleID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
// TODO: Add security
// Can't delete the Everyone Role
if ( roleID ! = UUID . Zero )
{
// Remove all GroupRole Members from Role
Dictionary < UUID , OSDMap > GroupRoleMembers ;
string GroupRoleMemberType = "GroupRole" + groupID . ToString ( ) ;
if ( SimianGetGenericEntries ( GroupRoleMemberType , roleID . ToString ( ) , out GroupRoleMembers ) )
{
foreach ( UUID UserID in GroupRoleMembers . Keys )
{
EnsureRoleNotSelectedByMember ( groupID , roleID , UserID ) ;
SimianRemoveGenericEntry ( UserID , GroupRoleMemberType , roleID . ToString ( ) ) ;
}
}
// Remove role
SimianRemoveGenericEntry ( groupID , "GroupRole" , roleID . ToString ( ) ) ;
}
}
public void UpdateGroupRole ( UUID requestingAgentID , UUID groupID , UUID roleID , string name , string description ,
string title , ulong powers )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
// TODO: Security, check that requestingAgentID is allowed to update group roles
OSDMap GroupRoleInfo ;
if ( SimianGetGenericEntry ( groupID , "GroupRole" , roleID . ToString ( ) , out GroupRoleInfo ) )
{
if ( name ! = null )
{
GroupRoleInfo [ "Name" ] = OSD . FromString ( name ) ;
}
if ( description ! = null )
{
GroupRoleInfo [ "Description" ] = OSD . FromString ( description ) ;
}
if ( title ! = null )
{
GroupRoleInfo [ "Title" ] = OSD . FromString ( title ) ;
}
GroupRoleInfo [ "Powers" ] = OSD . FromULong ( ( ulong ) powers ) ;
}
SimianAddGeneric ( groupID , "GroupRole" , roleID . ToString ( ) , GroupRoleInfo ) ;
}
public GroupRecord GetGroupRecord ( UUID requestingAgentID , UUID groupID , string groupName )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap GroupInfoMap = null ;
if ( groupID ! = UUID . Zero )
{
if ( ! SimianGetFirstGenericEntry ( groupID , "Group" , out groupName , out GroupInfoMap ) )
{
return null ;
}
}
else if ( ( groupName ! = null ) & & ( groupName ! = string . Empty ) )
2010-05-05 15:12:52 +00:00
{
2010-04-02 13:53:10 +00:00
if ( ! SimianGetFirstGenericEntry ( "Group" , groupName , out groupID , out GroupInfoMap ) )
{
return null ;
}
}
GroupRecord GroupInfo = new GroupRecord ( ) ;
2010-05-05 15:12:52 +00:00
GroupInfo . GroupID = groupID ;
2010-04-02 13:53:10 +00:00
GroupInfo . GroupName = groupName ;
GroupInfo . Charter = GroupInfoMap [ "Charter" ] . AsString ( ) ;
GroupInfo . ShowInList = GroupInfoMap [ "ShowInList" ] . AsBoolean ( ) ;
GroupInfo . GroupPicture = GroupInfoMap [ "InsigniaID" ] . AsUUID ( ) ;
GroupInfo . MembershipFee = GroupInfoMap [ "MembershipFee" ] . AsInteger ( ) ;
GroupInfo . OpenEnrollment = GroupInfoMap [ "OpenEnrollment" ] . AsBoolean ( ) ;
GroupInfo . AllowPublish = GroupInfoMap [ "AllowPublish" ] . AsBoolean ( ) ;
GroupInfo . MaturePublish = GroupInfoMap [ "MaturePublish" ] . AsBoolean ( ) ;
GroupInfo . FounderID = GroupInfoMap [ "FounderID" ] . AsUUID ( ) ;
GroupInfo . OwnerRoleID = GroupInfoMap [ "OwnerRoleID" ] . AsUUID ( ) ;
return GroupInfo ;
}
public GroupProfileData GetMemberGroupProfile ( UUID requestingAgentID , UUID groupID , UUID memberID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap groupProfile ;
string groupName ;
if ( ! SimianGetFirstGenericEntry ( groupID , "Group" , out groupName , out groupProfile ) )
{
// GroupProfileData is not nullable
return new GroupProfileData ( ) ;
}
GroupProfileData MemberGroupProfile = new GroupProfileData ( ) ;
MemberGroupProfile . GroupID = groupID ;
MemberGroupProfile . Name = groupName ;
if ( groupProfile [ "Charter" ] ! = null )
{
MemberGroupProfile . Charter = groupProfile [ "Charter" ] . AsString ( ) ;
}
MemberGroupProfile . ShowInList = groupProfile [ "ShowInList" ] . AsString ( ) = = "1" ;
MemberGroupProfile . InsigniaID = groupProfile [ "InsigniaID" ] . AsUUID ( ) ;
MemberGroupProfile . MembershipFee = groupProfile [ "MembershipFee" ] . AsInteger ( ) ;
MemberGroupProfile . OpenEnrollment = groupProfile [ "OpenEnrollment" ] . AsBoolean ( ) ;
MemberGroupProfile . AllowPublish = groupProfile [ "AllowPublish" ] . AsBoolean ( ) ;
MemberGroupProfile . MaturePublish = groupProfile [ "MaturePublish" ] . AsBoolean ( ) ;
MemberGroupProfile . FounderID = groupProfile [ "FounderID" ] . AsUUID ( ) ; ;
MemberGroupProfile . OwnerRole = groupProfile [ "OwnerRoleID" ] . AsUUID ( ) ;
Dictionary < UUID , OSDMap > Members ;
if ( SimianGetGenericEntries ( "GroupMember" , groupID . ToString ( ) , out Members ) )
{
MemberGroupProfile . GroupMembershipCount = Members . Count ;
}
Dictionary < string , OSDMap > Roles ;
if ( SimianGetGenericEntries ( groupID , "GroupRole" , out Roles ) )
{
MemberGroupProfile . GroupRolesCount = Roles . Count ;
}
// TODO: Get Group Money balance from somewhere
// group.Money = 0;
GroupMembershipData MemberInfo = GetAgentGroupMembership ( requestingAgentID , memberID , groupID ) ;
MemberGroupProfile . MemberTitle = MemberInfo . GroupTitle ;
MemberGroupProfile . PowersMask = MemberInfo . GroupPowers ;
return MemberGroupProfile ;
}
public void SetAgentActiveGroup ( UUID requestingAgentID , UUID agentID , UUID groupID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap ActiveGroup = new OSDMap ( ) ;
ActiveGroup . Add ( "GroupID" , OSD . FromUUID ( groupID ) ) ;
SimianAddGeneric ( agentID , "Group" , "ActiveGroup" , ActiveGroup ) ;
}
public void SetAgentActiveGroupRole ( UUID requestingAgentID , UUID agentID , UUID groupID , UUID roleID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap GroupMemberInfo ;
if ( ! SimianGetGenericEntry ( agentID , "GroupMember" , groupID . ToString ( ) , out GroupMemberInfo ) )
{
GroupMemberInfo = new OSDMap ( ) ;
}
GroupMemberInfo [ "SelectedRoleID" ] = OSD . FromUUID ( roleID ) ;
SimianAddGeneric ( agentID , "GroupMember" , groupID . ToString ( ) , GroupMemberInfo ) ;
}
public void SetAgentGroupInfo ( UUID requestingAgentID , UUID agentID , UUID groupID , bool acceptNotices , bool listInProfile )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap GroupMemberInfo ;
if ( ! SimianGetGenericEntry ( agentID , "GroupMember" , groupID . ToString ( ) , out GroupMemberInfo ) )
{
GroupMemberInfo = new OSDMap ( ) ;
}
GroupMemberInfo [ "AcceptNotices" ] = OSD . FromBoolean ( acceptNotices ) ;
GroupMemberInfo [ "ListInProfile" ] = OSD . FromBoolean ( listInProfile ) ;
GroupMemberInfo [ "Contribution" ] = OSD . FromInteger ( 0 ) ;
GroupMemberInfo [ "SelectedRole" ] = OSD . FromUUID ( UUID . Zero ) ;
SimianAddGeneric ( agentID , "GroupMember" , groupID . ToString ( ) , GroupMemberInfo ) ;
}
public void AddAgentToGroupInvite ( UUID requestingAgentID , UUID inviteID , UUID groupID , UUID roleID , UUID agentID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap Invite = new OSDMap ( ) ;
Invite [ "AgentID" ] = OSD . FromUUID ( agentID ) ;
Invite [ "RoleID" ] = OSD . FromUUID ( roleID ) ;
SimianAddGeneric ( groupID , "GroupMemberInvite" , inviteID . ToString ( ) , Invite ) ;
}
public GroupInviteInfo GetAgentToGroupInvite ( UUID requestingAgentID , UUID inviteID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap GroupMemberInvite ;
UUID GroupID ;
if ( ! SimianGetFirstGenericEntry ( "GroupMemberInvite" , inviteID . ToString ( ) , out GroupID , out GroupMemberInvite ) )
{
return null ;
}
GroupInviteInfo inviteInfo = new GroupInviteInfo ( ) ;
inviteInfo . InviteID = inviteID ;
inviteInfo . GroupID = GroupID ;
inviteInfo . AgentID = GroupMemberInvite [ "AgentID" ] . AsUUID ( ) ;
inviteInfo . RoleID = GroupMemberInvite [ "RoleID" ] . AsUUID ( ) ;
return inviteInfo ;
}
public void RemoveAgentToGroupInvite ( UUID requestingAgentID , UUID inviteID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
GroupInviteInfo invite = GetAgentToGroupInvite ( requestingAgentID , inviteID ) ;
SimianRemoveGenericEntry ( invite . GroupID , "GroupMemberInvite" , inviteID . ToString ( ) ) ;
}
public void AddAgentToGroup ( UUID requestingAgentID , UUID AgentID , UUID GroupID , UUID RoleID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
// Setup Agent/Group information
SetAgentGroupInfo ( requestingAgentID , AgentID , GroupID , true , true ) ;
// Add agent to Everyone Group
AddAgentToGroupRole ( requestingAgentID , AgentID , GroupID , UUID . Zero ) ;
// Add agent to Specified Role
AddAgentToGroupRole ( requestingAgentID , AgentID , GroupID , RoleID ) ;
// Set selected role in this group to specified role
SetAgentActiveGroupRole ( requestingAgentID , AgentID , GroupID , RoleID ) ;
}
public void RemoveAgentFromGroup ( UUID requestingAgentID , UUID agentID , UUID groupID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
// If current active group is the group the agent is being removed from, change their group to UUID.Zero
GroupMembershipData memberActiveMembership = GetAgentActiveMembership ( requestingAgentID , agentID ) ;
if ( memberActiveMembership . GroupID = = groupID )
{
SetAgentActiveGroup ( agentID , agentID , UUID . Zero ) ;
}
// Remove Group Member information for this group
SimianRemoveGenericEntry ( agentID , "GroupMember" , groupID . ToString ( ) ) ;
// By using a Simian Generics Type consisting of a prefix and a groupID,
// combined with RoleID as key allows us to get a list of roles a particular member
// of a group is assigned to.
string GroupRoleMemberType = "GroupRole" + groupID . ToString ( ) ;
// Take Agent out of all other group roles
Dictionary < string , OSDMap > GroupRoles ;
if ( SimianGetGenericEntries ( agentID , GroupRoleMemberType , out GroupRoles ) )
{
foreach ( string roleID in GroupRoles . Keys )
{
SimianRemoveGenericEntry ( agentID , GroupRoleMemberType , roleID ) ;
}
}
}
public void AddAgentToGroupRole ( UUID requestingAgentID , UUID agentID , UUID groupID , UUID roleID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
SimianAddGeneric ( agentID , "GroupRole" + groupID . ToString ( ) , roleID . ToString ( ) , new OSDMap ( ) ) ;
}
public void RemoveAgentFromGroupRole ( UUID requestingAgentID , UUID agentID , UUID groupID , UUID roleID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
// Cannot remove members from the Everyone Role
if ( roleID ! = UUID . Zero )
{
EnsureRoleNotSelectedByMember ( groupID , roleID , agentID ) ;
string GroupRoleMemberType = "GroupRole" + groupID . ToString ( ) ;
SimianRemoveGenericEntry ( agentID , GroupRoleMemberType , roleID . ToString ( ) ) ;
}
}
public List < DirGroupsReplyData > FindGroups ( UUID requestingAgentID , string search )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
List < DirGroupsReplyData > findings = new List < DirGroupsReplyData > ( ) ;
NameValueCollection requestArgs = new NameValueCollection
{
{ "RequestMethod" , "GetGenerics" } ,
{ "Type" , "Group" } ,
{ "Key" , search } ,
{ "Fuzzy" , "1" }
} ;
2010-05-05 15:12:52 +00:00
OSDMap response = WebUtil . PostToService ( m_serviceURL , requestArgs ) ;
2010-04-02 13:53:10 +00:00
if ( response [ "Success" ] . AsBoolean ( ) & & response [ "Entries" ] is OSDArray )
{
OSDArray entryArray = ( OSDArray ) response [ "Entries" ] ;
foreach ( OSDMap entryMap in entryArray )
{
DirGroupsReplyData data = new DirGroupsReplyData ( ) ;
data . groupID = entryMap [ "OwnerID" ] . AsUUID ( ) ;
data . groupName = entryMap [ "Key" ] . AsString ( ) ;
// TODO: is there a better way to do this?
Dictionary < UUID , OSDMap > Members ;
if ( SimianGetGenericEntries ( "GroupMember" , data . groupID . ToString ( ) , out Members ) )
{
data . members = Members . Count ;
}
else
{
data . members = 0 ;
}
// TODO: sort results?
// data.searchOrder = order;
findings . Add ( data ) ;
}
}
return findings ;
}
public GroupMembershipData GetAgentGroupMembership ( UUID requestingAgentID , UUID agentID , UUID groupID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
GroupMembershipData data = new GroupMembershipData ( ) ;
///////////////////////////////
// Agent Specific Information:
/ /
OSDMap UserActiveGroup ;
if ( SimianGetGenericEntry ( agentID , "Group" , "ActiveGroup" , out UserActiveGroup ) )
{
data . Active = UserActiveGroup [ "GroupID" ] . AsUUID ( ) . Equals ( groupID ) ;
}
OSDMap UserGroupMemberInfo ;
if ( SimianGetGenericEntry ( agentID , "GroupMember" , groupID . ToString ( ) , out UserGroupMemberInfo ) )
{
data . AcceptNotices = UserGroupMemberInfo [ "AcceptNotices" ] . AsBoolean ( ) ;
data . Contribution = UserGroupMemberInfo [ "Contribution" ] . AsInteger ( ) ;
data . ListInProfile = UserGroupMemberInfo [ "ListInProfile" ] . AsBoolean ( ) ;
data . ActiveRole = UserGroupMemberInfo [ "SelectedRoleID" ] . AsUUID ( ) ;
///////////////////////////////
// Role Specific Information:
/ /
OSDMap GroupRoleInfo ;
if ( SimianGetGenericEntry ( groupID , "GroupRole" , data . ActiveRole . ToString ( ) , out GroupRoleInfo ) )
{
data . GroupTitle = GroupRoleInfo [ "Title" ] . AsString ( ) ;
data . GroupPowers = GroupRoleInfo [ "Powers" ] . AsULong ( ) ;
}
}
///////////////////////////////
// Group Specific Information:
/ /
OSDMap GroupInfo ;
string GroupName ;
if ( SimianGetFirstGenericEntry ( groupID , "Group" , out GroupName , out GroupInfo ) )
{
data . GroupID = groupID ;
data . AllowPublish = GroupInfo [ "AllowPublish" ] . AsBoolean ( ) ;
data . Charter = GroupInfo [ "Charter" ] . AsString ( ) ;
data . FounderID = GroupInfo [ "FounderID" ] . AsUUID ( ) ;
data . GroupName = GroupName ;
data . GroupPicture = GroupInfo [ "InsigniaID" ] . AsUUID ( ) ;
data . MaturePublish = GroupInfo [ "MaturePublish" ] . AsBoolean ( ) ;
data . MembershipFee = GroupInfo [ "MembershipFee" ] . AsInteger ( ) ;
data . OpenEnrollment = GroupInfo [ "OpenEnrollment" ] . AsBoolean ( ) ;
data . ShowInList = GroupInfo [ "ShowInList" ] . AsBoolean ( ) ;
}
return data ;
}
public GroupMembershipData GetAgentActiveMembership ( UUID requestingAgentID , UUID agentID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
UUID GroupID = UUID . Zero ;
OSDMap UserActiveGroup ;
if ( SimianGetGenericEntry ( agentID , "Group" , "ActiveGroup" , out UserActiveGroup ) )
{
GroupID = UserActiveGroup [ "GroupID" ] . AsUUID ( ) ;
2010-05-05 15:12:52 +00:00
}
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] Active GroupID : {0}" , GroupID . ToString ( ) ) ;
2010-04-02 13:53:10 +00:00
return GetAgentGroupMembership ( requestingAgentID , agentID , GroupID ) ;
}
public List < GroupMembershipData > GetAgentGroupMemberships ( UUID requestingAgentID , UUID agentID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
List < GroupMembershipData > memberships = new List < GroupMembershipData > ( ) ;
Dictionary < string , OSDMap > GroupMemberShips ;
if ( SimianGetGenericEntries ( agentID , "GroupMember" , out GroupMemberShips ) )
{
foreach ( string key in GroupMemberShips . Keys )
{
memberships . Add ( GetAgentGroupMembership ( requestingAgentID , agentID , UUID . Parse ( key ) ) ) ;
}
}
return memberships ;
}
public List < GroupRolesData > GetAgentGroupRoles ( UUID requestingAgentID , UUID agentID , UUID groupID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
List < GroupRolesData > Roles = new List < GroupRolesData > ( ) ;
2010-05-05 15:12:52 +00:00
Dictionary < string , OSDMap > GroupRoles ;
if ( SimianGetGenericEntries ( groupID , "GroupRole" , out GroupRoles ) )
{
Dictionary < string , OSDMap > MemberRoles ;
if ( SimianGetGenericEntries ( agentID , "GroupRole" + groupID . ToString ( ) , out MemberRoles ) )
{
foreach ( KeyValuePair < string , OSDMap > kvp in MemberRoles )
{
GroupRolesData data = new GroupRolesData ( ) ;
data . RoleID = UUID . Parse ( kvp . Key ) ;
data . Name = GroupRoles [ kvp . Key ] [ "Name" ] . AsString ( ) ;
data . Description = GroupRoles [ kvp . Key ] [ "Description" ] . AsString ( ) ;
data . Title = GroupRoles [ kvp . Key ] [ "Title" ] . AsString ( ) ;
data . Powers = GroupRoles [ kvp . Key ] [ "Powers" ] . AsULong ( ) ;
Roles . Add ( data ) ;
}
}
2010-04-02 13:53:10 +00:00
}
return Roles ;
}
public List < GroupRolesData > GetGroupRoles ( UUID requestingAgentID , UUID groupID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
List < GroupRolesData > Roles = new List < GroupRolesData > ( ) ;
Dictionary < string , OSDMap > GroupRoles ;
if ( SimianGetGenericEntries ( groupID , "GroupRole" , out GroupRoles ) )
{
foreach ( KeyValuePair < string , OSDMap > role in GroupRoles )
{
GroupRolesData data = new GroupRolesData ( ) ;
data . RoleID = UUID . Parse ( role . Key ) ;
data . Name = role . Value [ "Name" ] . AsString ( ) ;
data . Description = role . Value [ "Description" ] . AsString ( ) ;
data . Title = role . Value [ "Title" ] . AsString ( ) ;
data . Powers = role . Value [ "Powers" ] . AsULong ( ) ;
Dictionary < UUID , OSDMap > GroupRoleMembers ;
if ( SimianGetGenericEntries ( "GroupRole" + groupID . ToString ( ) , role . Key , out GroupRoleMembers ) )
{
data . Members = GroupRoleMembers . Count ;
}
else
{
data . Members = 0 ;
}
Roles . Add ( data ) ;
}
}
return Roles ;
}
public List < GroupMembersData > GetGroupMembers ( UUID requestingAgentID , UUID GroupID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
List < GroupMembersData > members = new List < GroupMembersData > ( ) ;
OSDMap GroupInfo ;
string GroupName ;
UUID GroupOwnerRoleID = UUID . Zero ;
if ( ! SimianGetFirstGenericEntry ( GroupID , "Group" , out GroupName , out GroupInfo ) )
{
return members ;
}
GroupOwnerRoleID = GroupInfo [ "OwnerRoleID" ] . AsUUID ( ) ;
// Locally cache group roles, since we'll be needing this data for each member
Dictionary < string , OSDMap > GroupRoles ;
SimianGetGenericEntries ( GroupID , "GroupRole" , out GroupRoles ) ;
// Locally cache list of group owners
Dictionary < UUID , OSDMap > GroupOwners ;
SimianGetGenericEntries ( "GroupRole" + GroupID . ToString ( ) , GroupOwnerRoleID . ToString ( ) , out GroupOwners ) ;
Dictionary < UUID , OSDMap > GroupMembers ;
if ( SimianGetGenericEntries ( "GroupMember" , GroupID . ToString ( ) , out GroupMembers ) )
{
foreach ( KeyValuePair < UUID , OSDMap > member in GroupMembers )
{
GroupMembersData data = new GroupMembersData ( ) ;
data . AgentID = member . Key ;
UUID SelectedRoleID = member . Value [ "SelectedRoleID" ] . AsUUID ( ) ;
data . AcceptNotices = member . Value [ "AcceptNotices" ] . AsBoolean ( ) ;
data . ListInProfile = member . Value [ "ListInProfile" ] . AsBoolean ( ) ;
data . Contribution = member . Value [ "Contribution" ] . AsInteger ( ) ;
data . IsOwner = GroupOwners . ContainsKey ( member . Key ) ;
OSDMap GroupRoleInfo = GroupRoles [ SelectedRoleID . ToString ( ) ] ;
data . Title = GroupRoleInfo [ "Title" ] . AsString ( ) ;
data . AgentPowers = GroupRoleInfo [ "Powers" ] . AsULong ( ) ;
members . Add ( data ) ;
}
}
return members ;
}
public List < GroupRoleMembersData > GetGroupRoleMembers ( UUID requestingAgentID , UUID groupID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
List < GroupRoleMembersData > members = new List < GroupRoleMembersData > ( ) ;
Dictionary < string , OSDMap > GroupRoles ;
if ( SimianGetGenericEntries ( groupID , "GroupRole" , out GroupRoles ) )
{
foreach ( KeyValuePair < string , OSDMap > Role in GroupRoles )
{
Dictionary < UUID , OSDMap > GroupRoleMembers ;
if ( SimianGetGenericEntries ( "GroupRole" + groupID . ToString ( ) , Role . Key , out GroupRoleMembers ) )
{
foreach ( KeyValuePair < UUID , OSDMap > GroupRoleMember in GroupRoleMembers )
{
2010-05-05 15:12:52 +00:00
GroupRoleMembersData data = new GroupRoleMembersData ( ) ;
2010-04-02 13:53:10 +00:00
data . MemberID = GroupRoleMember . Key ;
data . RoleID = UUID . Parse ( Role . Key ) ;
members . Add ( data ) ;
}
}
}
}
return members ;
}
public List < GroupNoticeData > GetGroupNotices ( UUID requestingAgentID , UUID GroupID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
List < GroupNoticeData > values = new List < GroupNoticeData > ( ) ;
Dictionary < string , OSDMap > Notices ;
if ( SimianGetGenericEntries ( GroupID , "GroupNotice" , out Notices ) )
{
foreach ( KeyValuePair < string , OSDMap > Notice in Notices )
{
GroupNoticeData data = new GroupNoticeData ( ) ;
data . NoticeID = UUID . Parse ( Notice . Key ) ;
data . Timestamp = Notice . Value [ "TimeStamp" ] . AsUInteger ( ) ;
data . FromName = Notice . Value [ "FromName" ] . AsString ( ) ;
data . Subject = Notice . Value [ "Subject" ] . AsString ( ) ;
data . HasAttachment = Notice . Value [ "BinaryBucket" ] . AsBinary ( ) . Length > 0 ;
//TODO: Figure out how to get this
data . AssetType = 0 ;
values . Add ( data ) ;
}
}
return values ;
}
public GroupNoticeInfo GetGroupNotice ( UUID requestingAgentID , UUID noticeID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap GroupNotice ;
UUID GroupID ;
if ( SimianGetFirstGenericEntry ( "GroupNotice" , noticeID . ToString ( ) , out GroupID , out GroupNotice ) )
{
GroupNoticeInfo data = new GroupNoticeInfo ( ) ;
data . GroupID = GroupID ;
data . Message = GroupNotice [ "Message" ] . AsString ( ) ;
data . BinaryBucket = GroupNotice [ "BinaryBucket" ] . AsBinary ( ) ;
data . noticeData . NoticeID = noticeID ;
data . noticeData . Timestamp = GroupNotice [ "TimeStamp" ] . AsUInteger ( ) ;
data . noticeData . FromName = GroupNotice [ "FromName" ] . AsString ( ) ;
data . noticeData . Subject = GroupNotice [ "Subject" ] . AsString ( ) ;
data . noticeData . HasAttachment = data . BinaryBucket . Length > 0 ;
data . noticeData . AssetType = 0 ;
if ( data . Message = = null )
{
data . Message = string . Empty ;
}
return data ;
}
return null ;
}
public void AddGroupNotice ( UUID requestingAgentID , UUID groupID , UUID noticeID , string fromName , string subject , string message , byte [ ] binaryBucket )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
OSDMap Notice = new OSDMap ( ) ;
Notice [ "TimeStamp" ] = OSD . FromUInteger ( ( uint ) Util . UnixTimeSinceEpoch ( ) ) ;
Notice [ "FromName" ] = OSD . FromString ( fromName ) ;
Notice [ "Subject" ] = OSD . FromString ( subject ) ;
Notice [ "Message" ] = OSD . FromString ( message ) ;
Notice [ "BinaryBucket" ] = OSD . FromBinary ( binaryBucket ) ;
SimianAddGeneric ( groupID , "GroupNotice" , noticeID . ToString ( ) , Notice ) ;
}
2010-04-06 02:56:03 +00:00
# endregion
2010-04-02 13:53:10 +00:00
private void EnsureRoleNotSelectedByMember ( UUID groupID , UUID roleID , UUID userID )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name ) ;
// If member's SelectedRole is roleID, change their selected role to Everyone
// before removing them from the role
OSDMap UserGroupInfo ;
if ( SimianGetGenericEntry ( userID , "GroupMember" , groupID . ToString ( ) , out UserGroupInfo ) )
{
if ( UserGroupInfo [ "SelectedRoleID" ] . AsUUID ( ) = = roleID )
{
UserGroupInfo [ "SelectedRoleID" ] = OSD . FromUUID ( UUID . Zero ) ;
}
SimianAddGeneric ( userID , "GroupMember" , groupID . ToString ( ) , UserGroupInfo ) ;
}
}
#region Simian Util Methods
private bool SimianAddGeneric ( UUID ownerID , string type , string key , OSDMap map )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2},{3})" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name , ownerID , type , key ) ;
string value = OSDParser . SerializeJsonString ( map ) ;
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] value: {0}" , value ) ;
NameValueCollection RequestArgs = new NameValueCollection
{
{ "RequestMethod" , "AddGeneric" } ,
{ "OwnerID" , ownerID . ToString ( ) } ,
{ "Type" , type } ,
{ "Key" , key } ,
{ "Value" , value }
} ;
2010-05-05 15:12:52 +00:00
OSDMap Response = WebUtil . PostToService ( m_serviceURL , RequestArgs ) ;
2010-04-02 13:53:10 +00:00
if ( Response [ "Success" ] . AsBoolean ( ) )
{
return true ;
}
else
{
m_log . WarnFormat ( "[SIMIAN GROUPS CONNECTOR]: Error {0}, {1}, {2}, {3}" , ownerID , type , key , Response [ "Message" ] ) ;
return false ;
}
}
/// <summary>
/// Returns the first of possibly many entries for Owner/Type pair
/// </summary>
private bool SimianGetFirstGenericEntry ( UUID ownerID , string type , out string key , out OSDMap map )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2})" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name , ownerID , type ) ;
NameValueCollection RequestArgs = new NameValueCollection
{
{ "RequestMethod" , "GetGenerics" } ,
{ "OwnerID" , ownerID . ToString ( ) } ,
{ "Type" , type }
} ;
2010-05-05 15:12:52 +00:00
OSDMap Response = WebUtil . PostToService ( m_serviceURL , RequestArgs ) ;
2010-04-02 13:53:10 +00:00
if ( Response [ "Success" ] . AsBoolean ( ) & & Response [ "Entries" ] is OSDArray )
{
2010-05-05 15:12:52 +00:00
OSDArray entryArray = ( OSDArray ) Response [ "Entries" ] ;
if ( entryArray . Count > = 1 )
{
OSDMap entryMap = entryArray [ 0 ] as OSDMap ;
key = entryMap [ "Key" ] . AsString ( ) ;
map = ( OSDMap ) OSDParser . DeserializeJson ( entryMap [ "Value" ] . AsString ( ) ) ;
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}" , entryMap [ "Value" ] . AsString ( ) ) ;
return true ;
}
else
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] No Generics Results" ) ;
2010-04-02 13:53:10 +00:00
}
}
else
{
m_log . WarnFormat ( "[SIMIAN GROUPS CONNECTOR]: Error retrieving group info ({0})" , Response [ "Message" ] ) ;
}
key = null ;
map = null ;
return false ;
}
private bool SimianGetFirstGenericEntry ( string type , string key , out UUID ownerID , out OSDMap map )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2})" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name , type , key ) ;
NameValueCollection RequestArgs = new NameValueCollection
{
{ "RequestMethod" , "GetGenerics" } ,
{ "Type" , type } ,
{ "Key" , key }
} ;
2010-05-05 15:12:52 +00:00
OSDMap Response = WebUtil . PostToService ( m_serviceURL , RequestArgs ) ;
2010-04-02 13:53:10 +00:00
if ( Response [ "Success" ] . AsBoolean ( ) & & Response [ "Entries" ] is OSDArray )
{
2010-05-05 15:12:52 +00:00
OSDArray entryArray = ( OSDArray ) Response [ "Entries" ] ;
if ( entryArray . Count > = 1 )
{
OSDMap entryMap = entryArray [ 0 ] as OSDMap ;
ownerID = entryMap [ "OwnerID" ] . AsUUID ( ) ;
map = ( OSDMap ) OSDParser . DeserializeJson ( entryMap [ "Value" ] . AsString ( ) ) ;
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}" , entryMap [ "Value" ] . AsString ( ) ) ;
return true ;
}
else
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] No Generics Results" ) ;
2010-04-02 13:53:10 +00:00
}
}
else
{
m_log . WarnFormat ( "[SIMIAN GROUPS CONNECTOR]: Error retrieving group info ({0})" , Response [ "Message" ] ) ;
}
ownerID = UUID . Zero ;
map = null ;
return false ;
}
private bool SimianGetGenericEntry ( UUID ownerID , string type , string key , out OSDMap map )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2},{3})" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name , ownerID , type , key ) ;
NameValueCollection RequestArgs = new NameValueCollection
{
{ "RequestMethod" , "GetGenerics" } ,
{ "OwnerID" , ownerID . ToString ( ) } ,
{ "Type" , type } ,
{ "Key" , key }
} ;
2010-05-05 15:12:52 +00:00
OSDMap Response = WebUtil . PostToService ( m_serviceURL , RequestArgs ) ;
2010-04-02 13:53:10 +00:00
if ( Response [ "Success" ] . AsBoolean ( ) & & Response [ "Entries" ] is OSDArray )
{
OSDArray entryArray = ( OSDArray ) Response [ "Entries" ] ;
if ( entryArray . Count = = 1 )
{
OSDMap entryMap = entryArray [ 0 ] as OSDMap ;
key = entryMap [ "Key" ] . AsString ( ) ;
2010-05-05 15:12:52 +00:00
map = ( OSDMap ) OSDParser . DeserializeJson ( entryMap [ "Value" ] . AsString ( ) ) ;
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}" , entryMap [ "Value" ] . AsString ( ) ) ;
2010-04-02 13:53:10 +00:00
return true ;
2010-05-05 15:12:52 +00:00
}
else
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] No Generics Results" ) ;
}
2010-04-02 13:53:10 +00:00
}
else
{
m_log . WarnFormat ( "[SIMIAN GROUPS CONNECTOR]: Error retrieving group info ({0})" , Response [ "Message" ] ) ;
}
map = null ;
return false ;
}
private bool SimianGetGenericEntries ( UUID ownerID , string type , out Dictionary < string , OSDMap > maps )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2})" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name , ownerID , type ) ;
NameValueCollection requestArgs = new NameValueCollection
{
{ "RequestMethod" , "GetGenerics" } ,
{ "OwnerID" , ownerID . ToString ( ) } ,
{ "Type" , type }
} ;
2010-05-05 15:12:52 +00:00
OSDMap response = WebUtil . PostToService ( m_serviceURL , requestArgs ) ;
2010-04-02 13:53:10 +00:00
if ( response [ "Success" ] . AsBoolean ( ) & & response [ "Entries" ] is OSDArray )
{
maps = new Dictionary < string , OSDMap > ( ) ;
OSDArray entryArray = ( OSDArray ) response [ "Entries" ] ;
foreach ( OSDMap entryMap in entryArray )
2010-05-05 15:12:52 +00:00
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}" , entryMap [ "Value" ] . AsString ( ) ) ;
2010-04-02 13:53:10 +00:00
maps . Add ( entryMap [ "Key" ] . AsString ( ) , ( OSDMap ) OSDParser . DeserializeJson ( entryMap [ "Value" ] . AsString ( ) ) ) ;
}
2010-05-05 15:12:52 +00:00
if ( maps . Count = = 0 )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] No Generics Results" ) ;
2010-04-02 13:53:10 +00:00
}
return true ;
}
else
{
maps = null ;
m_log . WarnFormat ( "[SIMIAN GROUPS CONNECTOR]: Error retrieving group info ({0})" , response [ "Message" ] ) ;
}
return false ;
}
private bool SimianGetGenericEntries ( string type , string key , out Dictionary < UUID , OSDMap > maps )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2})" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name , type , key ) ;
NameValueCollection requestArgs = new NameValueCollection
{
{ "RequestMethod" , "GetGenerics" } ,
{ "Type" , type } ,
{ "Key" , key }
} ;
2010-05-05 15:12:52 +00:00
OSDMap response = WebUtil . PostToService ( m_serviceURL , requestArgs ) ;
2010-04-02 13:53:10 +00:00
if ( response [ "Success" ] . AsBoolean ( ) & & response [ "Entries" ] is OSDArray )
{
maps = new Dictionary < UUID , OSDMap > ( ) ;
OSDArray entryArray = ( OSDArray ) response [ "Entries" ] ;
foreach ( OSDMap entryMap in entryArray )
2010-05-05 15:12:52 +00:00
{
2010-04-02 13:53:10 +00:00
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}" , entryMap [ "Value" ] . AsString ( ) ) ;
maps . Add ( entryMap [ "OwnerID" ] . AsUUID ( ) , ( OSDMap ) OSDParser . DeserializeJson ( entryMap [ "Value" ] . AsString ( ) ) ) ;
2010-05-05 15:12:52 +00:00
}
if ( maps . Count = = 0 )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] No Generics Results" ) ;
}
2010-04-02 13:53:10 +00:00
return true ;
}
else
{
maps = null ;
m_log . WarnFormat ( "[SIMIAN-GROUPS-CONNECTOR]: Error retrieving group info ({0})" , response [ "Message" ] ) ;
}
return false ;
}
private bool SimianRemoveGenericEntry ( UUID ownerID , string type , string key )
{
if ( m_debugEnabled ) m_log . InfoFormat ( "[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2},{3})" , System . Reflection . MethodBase . GetCurrentMethod ( ) . Name , ownerID , type , key ) ;
NameValueCollection requestArgs = new NameValueCollection
{
{ "RequestMethod" , "RemoveGeneric" } ,
{ "OwnerID" , ownerID . ToString ( ) } ,
{ "Type" , type } ,
{ "Key" , key }
} ;
2010-05-05 15:12:52 +00:00
OSDMap response = WebUtil . PostToService ( m_serviceURL , requestArgs ) ;
2010-04-02 13:53:10 +00:00
if ( response [ "Success" ] . AsBoolean ( ) )
{
return true ;
}
else
{
m_log . WarnFormat ( "[SIMIAN GROUPS CONNECTOR]: Error {0}, {1}, {2}, {3}" , ownerID , type , key , response [ "Message" ] ) ;
return false ;
}
}
2010-04-06 02:56:03 +00:00
# endregion
2010-04-02 13:53:10 +00:00
}
}