From cefc20ef91ee48c37a3d0c931ea2c6cffa080684 Mon Sep 17 00:00:00 2001 From: "enus.linden" Date: Thu, 5 Mar 2009 01:26:43 +0000 Subject: [PATCH] adding inventory item handling, populating a folders contents with inventory items returned in InventoryDescendents packets --- pyogp/lib/base/agent.py | 2 +- .../examples/sample_inventory_handling.py | 10 +- pyogp/lib/base/inventory.py | 147 +++++++++++++++--- pyogp/lib/base/settings.py | 2 +- 4 files changed, 135 insertions(+), 26 deletions(-) diff --git a/pyogp/lib/base/agent.py b/pyogp/lib/base/agent.py index 790bb64..e761c7b 100644 --- a/pyogp/lib/base/agent.py +++ b/pyogp/lib/base/agent.py @@ -201,7 +201,7 @@ class Agent(object): if self.settings.ENABLE_INVENTORY_MANAGEMENT: self.inventory = Inventory(self) - self.inventory._parse_inventory_from_login_response() + self.inventory._parse_folders_from_login_response() elif self.grid_type == 'OGP': diff --git a/pyogp/lib/base/examples/sample_inventory_handling.py b/pyogp/lib/base/examples/sample_inventory_handling.py index 2e19252..50fc43a 100644 --- a/pyogp/lib/base/examples/sample_inventory_handling.py +++ b/pyogp/lib/base/examples/sample_inventory_handling.py @@ -84,7 +84,7 @@ def login(): api.sleep(0) # for folders whose parent = root folder aka My Inventory, request their contents - [client.inventory._request_folder_contents(folder.folder_id) for folder in client.inventory.contents if folder.parent_id == client.inventory.root_folder.folder_id] + [client.inventory._request_folder_contents(folder.FolderID) for folder in client.inventory.folders if folder.ParentID == client.inventory.inventory_root.FolderID] while client.running: api.sleep(0) @@ -97,9 +97,11 @@ def login(): print attr, ':\t\t\t', client.__dict__[attr] print '' print '' - print 'Inventory: %s folders' % len(client.inventory.contents) - for inv_folder in client.inventory.contents: - print 'Inventory Folder', ':\t\t\t', inv_folder.name + print 'Inventory: %s folders' % len(client.inventory.folders) + for inv_folder in client.inventory.folders: + print 'Inventory Folder', ':\t\t\t', inv_folder.Name + for item in inv_folder.inventory: + print ' ', item.Name print '' print '' print 'Region attributes:' diff --git a/pyogp/lib/base/inventory.py b/pyogp/lib/base/inventory.py index a8d026a..a46efa1 100644 --- a/pyogp/lib/base/inventory.py +++ b/pyogp/lib/base/inventory.py @@ -55,14 +55,14 @@ class Inventory(object): self.agent = agent - # store the inventory contents in a list + # For now, store the inventory contents in a list + # of folders with it's contents list containing it's inventory items # Ditto the library - self.contents = [] - self.count = len(self.contents) + self.folders = [] # the root inventory and library root folder are special cases - self.root_folder = None + self.inventory_root = None self.library_root = None # set up callbacks @@ -78,8 +78,8 @@ class Inventory(object): if self.settings.LOG_VERBOSE: log(INFO, "Initializing the inventory") - def _parse_inventory_from_login_response(self): - """ the login response may contain inventory information, append data to our contents list """ + def _parse_folders_from_login_response(self): + """ the login response may contain inventory information, append data to our folders list """ if self.settings.LOG_VERBOSE: log(DEBUG, 'Parsing the login response for inventory folders') @@ -89,6 +89,31 @@ class Inventory(object): if self.agent.login_response.has_key('inventory-skel-lib'): [self._add_inventory_folder(folder) for folder in self.agent.login_response['inventory-skel-lib']] + def _add_inventory_item(self, inventory_item): + """ inventory items comes from packets """ + + # replace an existing list member, else, append + # for now, we are assuming the parent folder exists. + # if it doesn't we'll know via traceback + + index = [self.folders.index(folder) for folder in self.folders if folder.FolderID == inventory_item.FolderID] + + try: + + inventory_index = [self.folders[index].index(item) for item in self.folders[index].inventory] + + self.folders[index[0]].inventory[inventory_index[0]] = inventory_item + + except: + + self.folders[index[0]].inventory.append(inventory_item) + + def search_inventory_by_id(self, item_id): + """ search through all inventory folders for a uuid, return the match, or None if no match """ + + pass + + def _add_inventory_folder(self, folder_data): """ inventory folder data comes from either packets or login """ @@ -99,19 +124,25 @@ class Inventory(object): folder = InventoryFolder(folder_data['name'], folder_data['folder_id'], folder_data['parent_id'], folder_data['version'], folder_data['type_default']) - self.contents.append(folder) + self.folders.append(folder) if folder_data['parent_id'] == '00000000-0000-0000-0000-000000000000' and folder_data['name'] == 'My Inventory': - self.root_folder = folder + self.inventory_root = folder + elif folder_data['parent_id'] == '00000000-0000-0000-0000-000000000000' and folder_data['name'] == 'Library': self.library_root = folder + # otherwise, we are adding an InventoryFolder() instance + else: + + self.folders.append(folder) + def get_folder_contents(self, folder_id = None, name = None): """ returns a list of the local representation of a folder's contents """ if folder_id != None: - return [member for member in self.contents if member.parent_id == folder_id] + return [member for member in self.folders if member.ParentID == folder_id] # the name case is not handled at this time ''' @@ -125,7 +156,7 @@ class Inventory(object): def _request_folder_contents(self, folder_id = None, name = None): """ send a request to the server for folder contents, wraps sendFetchInventoryDescendentsPacket """ - self.sendFetchInventoryDescendentsPacket(folder_id = str(folder_id)) + self.sendFetchInventoryDescendentsPacket(folder_id = folder_id) def sendFetchInventoryDescendentsPacket(self, folder_id = None, name = None): """ send a request to the server for folder contents """ @@ -156,14 +187,18 @@ class InventoryFolder(object): Tests: tests/test_inventory.py """ - def __init__(self, name = None, folder_id = None, parent_id = None, version = None, type_default = None): + def __init__(self, Name = None, FolderID = None, ParentID = None, Version = None, Type = None): """ initialize the inventory folder """ - self.name = name - self.folder_id = uuid.UUID(folder_id) - self.parent_id = uuid.UUID(parent_id) - self.version = version - self.type_default = type_default + self.type = 'InventoryFolder' + + self.Name = Name + self.FolderID = uuid.UUID(str(FolderID)) + self.ParentID = uuid.UUID(str(ParentID)) + self.Version = Version + self.Type = Type + + self.inventory = [] class InventoryItem(object): """ represents an Inventory item @@ -175,10 +210,32 @@ class InventoryItem(object): Tests: tests/test_inventory.py """ - def __init__(self): - """ set up the event queue attributes """ + def __init__(self, ItemID = None, FolderID = None, CreatorID = None, OwnerID = None, GroupID = None, BaseMask = None, OwnerMask = None, GroupMask = None, EveryoneMask = None, NextOwnerMask = None, GroupOwned = None, AssetID = None, Type = None, InvType = None, Flags = None, SaleType = None, SalePrice = None, Name = None, Description = None, CreationDate = None, CRC = None): + """ initialize the inventory item """ - pass + self.type = 'InventoryItem' + + self.ItemID = uuid.UUID(str(ItemID)) + self.FolderID = uuid.UUID(str(FolderID)) + self.CreatorID = uuid.UUID(str(CreatorID)) + self.OwnerID = uuid.UUID(str(OwnerID)) + self.GroupID = uuid.UUID(str(GroupID)) + self.BaseMask = BaseMask + self.OwnerMask = OwnerMask + self.GroupMask = GroupMask + self.EveryoneMask = EveryoneMask + self.NextOwnerMask = NextOwnerMask + self.GroupOwned = GroupOwned + self.AssetID = uuid.UUID(str(AssetID)) + self.Type = Type + self.InvType = InvType + self.Flags = Flags + self.SaleType = SaleType + self.SalePrice = SalePrice + self.Name = Name + self.Description = Description + self.CreationDate = CreationDate + self.CRC = CRC #~~~~~~~~~~ # Callbacks @@ -186,4 +243,54 @@ class InventoryItem(object): def onInventoryDescendents(packet, inventory): - print packet \ No newline at end of file + if packet.message_data.blocks['AgentData'][0].get_variable('Descendents') > 0: + + _agent_id = packet.message_data.blocks['AgentData'][0].get_variable('AgentID') + _agent_id = packet.message_data.blocks['AgentData'][0].get_variable('AgentID') + _folder_id = packet.message_data.blocks['AgentData'][0].get_variable('FolderID') + _owner_id = packet.message_data.blocks['AgentData'][0].get_variable('OwnerID') + _version = packet.message_data.blocks['AgentData'][0].get_variable('Version') + _descendents = packet.message_data.blocks['AgentData'][0].get_variable('Descendents') + + if packet.message_data.blocks['ItemData'][0].get_variable('FolderID').data != uuid.UUID('00000000-0000-0000-0000-000000000000'): + + for item_data_block in packet.message_data.blocks['ItemData']: + + _ItemID = item_data_block.get_variable('ItemID').data + _FolderID = item_data_block.get_variable('FolderID').data + _CreatorID = item_data_block.get_variable('CreatorID').data + _OwnerID = item_data_block.get_variable('OwnerID').data + _GroupID = item_data_block.get_variable('GroupID').data + _BaseMask = item_data_block.get_variable('BaseMask').data + _OwnerMask = item_data_block.get_variable('OwnerMask').data + _GroupMask = item_data_block.get_variable('GroupMask').data + _EveryoneMask = item_data_block.get_variable('EveryoneMask').data + _NextOwnerMask = item_data_block.get_variable('NextOwnerMask').data + _GroupOwned = item_data_block.get_variable('GroupOwned').data + _AssetID = item_data_block.get_variable('AssetID').data + _Type = item_data_block.get_variable('Type').data + _InvType = item_data_block.get_variable('InvType').data + _Flags = item_data_block.get_variable('Flags').data + _SaleType = item_data_block.get_variable('SaleType').data + _SalePrice = item_data_block.get_variable('SalePrice').data + _Name = item_data_block.get_variable('Name').data + _Description = item_data_block.get_variable('Description').data + _CreationDate = item_data_block.get_variable('CreationDate').data + _CRC = item_data_block.get_variable('CRC').data + + inventory_item = InventoryItem(_ItemID, _FolderID, _CreatorID, _OwnerID, _GroupID, _BaseMask, _OwnerMask, _GroupMask, _EveryoneMask, _NextOwnerMask, _GroupOwned, _AssetID, _Type, _InvType, _Flags, _SaleType, _SalePrice, _Name, _Description, _CreationDate, _CRC) + + inventory._add_inventory_item(inventory_item) + + if packet.message_data.blocks['FolderData'][0].get_variable('FolderID').data != uuid.UUID('00000000-0000-0000-0000-000000000000'): + + for folder_data_block in packet.message_data.blocks['FolderData']: + + _FolderID = folder_data_block.get_variable('FolderID').data + _ParentID = folder_data_block.get_variable('ParentID').data + _Type = folder_data_block.get_variable('Type').data + _Name = folder_data_block.get_variable('Name').data + + folder = InventoryFolder( _Name, _FolderID, _ParentID, None, _Type) + + inventory._add_inventory_folder(folder) diff --git a/pyogp/lib/base/settings.py b/pyogp/lib/base/settings.py index f49c971..b82687b 100644 --- a/pyogp/lib/base/settings.py +++ b/pyogp/lib/base/settings.py @@ -87,7 +87,7 @@ class Settings(object): self.ENABLE_CAPS_LOGGING = False self.ENABLE_CAPS_LLSD_LOGGING = False self.ENABLE_EQ_LOGGING = False - self.ENABLE_UDP_LOGGING = True + self.ENABLE_UDP_LOGGING = False # allow disabling logging of certain packets self.DISABLE_SPAMMERS = False