PyResult BookmarkService::Handle_DeleteBookmarks(PyCallArgs &call) { if ( !(call.tuple->GetItem( 0 )->IsList()) ) { sLog.Error( "BookmarkService::Handle_DeleteBookmarks()", "%s: call.tuple is of the wrong type: '%s'. Expected PyList type.", call.client->GetName(), call.tuple->TypeString() ); return NULL; } PyList *list = call.tuple->GetItem( 0 )->AsList(); uint32 i; uint32 bookmarkID; std::vector<unsigned long> bookmarkIDs; if( list->size() > 0 ) { for(i=0; i<(list->size()); i++) { bookmarkID = call.tuple->GetItem( 0 )->AsList()->GetItem(i)->AsInt()->value(); bookmarkIDs.push_back( bookmarkID ); } m_db.DeleteBookmarksFromDatabase( call.client->GetCharacterID(),&bookmarkIDs ); } else { sLog.Error( "BookmarkService::Handle_DeleteBookmarks()", "%s: call.tuple->GetItem( 0 )->AsList()->size() == 0. Expected size >= 1.", call.client->GetName() ); return NULL; } return(new PyNone()); }
PyResult ContractMgrService::Handle_CreateContract( PyCallArgs& call ) { Call_CreateContract info; PyList* requestItemTypeList = new PyList; PyList* itemList = new PyList; uint32 flag = 0; bool forCorp = false; double volume = 0; uint32 maxCharContracts = 0; if( call.byname.find( "forCorp" ) != call.byname.end() ) { forCorp = call.byname.find( "forCorp" )->second->AsBool()->value(); } // Let's see the players limit of contracts CharacterRef ch = call.client->GetChar(); if( forCorp ) { if( ch->HasSkill( 25233 ) ) { SkillRef skill = ch->GetSkill( 25233 ); uint32 skillLevel = skill->GetAttribute( 280 ).get_int(); maxCharContracts = ( 10 * skillLevel ) + 10; } else { maxCharContracts = 10; } } else { if( ch->HasSkill( 25235 ) ) { SkillRef skill = ch->GetSkill( 25235 ); uint32 skillLevel = skill->GetAttribute( 280 ).get_int(); maxCharContracts = ( 4 * skillLevel ) + 1; } else { maxCharContracts = 1; } uint32 numOutstandingContractsNonCorp = 0; uint32 numOutstandingContractsForCorp = 0; std::map<uint32, ContractRef>::const_iterator cur, end; std::map<uint32, ContractRef> contracts = m_contractManager->GetContractList(); cur = contracts.begin(); end = contracts.end(); for(; cur != end; cur++ ) { ContractRef contract = cur->second; if( contract->issuerID() == call.client->GetCharacterID() ) { if( contract->forCorp() ) numOutstandingContractsForCorp += 1; else numOutstandingContractsNonCorp += 1; } } if( ( forCorp ) && ( numOutstandingContractsForCorp >= maxCharContracts ) ) { call.client->SendInfoModalMsg( "Your Corporation Contracting skill level only allows you to create %d public contracts for your corp/alliance", maxCharContracts ); return new PyBool( false ); } if( ( !forCorp ) && ( numOutstandingContractsNonCorp >= maxCharContracts ) ) { call.client->SendInfoModalMsg( "Your Contracting skill level only allows you to create %d public contracts", maxCharContracts ); return new PyBool( false ); } } if( !info.Decode( &call.tuple ) ) { codelog(SERVICE__ERROR, "%s: Bad arguments to CreateContract in contractMgr", call.client->GetCharacterName() ); return NULL; } if( call.byname.find( "requestItemTypeList" ) != call.byname.end() ) { requestItemTypeList = call.byname.find( "requestItemTypeList" )->second->AsList(); } if( call.byname.find( "flag" ) != call.byname.end() ) { flag = call.byname.find( "flag" )->second->AsInt()->value(); } if( call.byname.find( "itemList" ) != call.byname.end() ) { itemList = call.byname.find( "itemList" )->second->AsList(); } if( info.endStationID == 0 )info.endStationID = info.startStationID; ContractData* cData = new ContractData( call.client->GetCharacterID(), call.client->GetCorporationID(), info.type, info.avail, info.assigneeID, info.expiretime, info.expiretime, info.startStationID, info.endStationID, call.client->GetSystemID(), call.client->GetSystemID(), call.client->GetRegionID(), call.client->GetRegionID(), info.price, info.reward, info.collateral, info.title, info.description, forCorp, conStatusOutstanding, false, 0, Win32TimeNow(), Win32TimeNow() + ( info.duration * Win32Time_Day ), Win32TimeNow(), Win32TimeNow(), 0, false, 0, 0, 0 ); std::map<uint32, ContractRequestItemRef> requestItems; std::map<uint32, ContractGetItemsRef> items; uint32 itemID = 0; uint32 typeID = 0; for( size_t i = 0; i < itemList->size(); i ++ ) { if( itemList->IsList() ) { if( itemList->GetItem( i )->AsList()->GetItem( 0 )->IsInt() ) itemID = itemList->GetItem( i )->AsList()->GetItem( 0 )->AsInt()->value(); else{ sLog.Error( "ContractMgrService", "Wrong list args" ); break; } } InventoryItemRef item = m_manager->item_factory.GetItem( itemID ); if( item == NULL ) { sLog.Error( "ContractMgrService", "GetItem returned NULL" ); break; } item->Move( call.client->GetStationID(), flagBriefcase, true ); item->ChangeOwner( 1, true ); items.insert( std::make_pair( itemID, ContractGetItemsRef( new ContractGetItems( itemID, itemList->GetItem( i )->AsList()->GetItem( 1 )->AsInt()->value() ) ) ) ); } if( cData->m_type == conTypeItemExchange ) { for( size_t i = 0; i < requestItemTypeList->size(); i ++ ) { if( itemList->IsList() ) { if( requestItemTypeList->GetItem( i )->AsList()->GetItem( 0 )->IsInt() ) typeID = requestItemTypeList->GetItem( i )->AsList()->GetItem( 0 )->AsInt()->value(); else{ sLog.Error( "ContractMgrService", "Wrong list args" ); break; } } requestItems.insert( std::make_pair( itemID, ContractRequestItemRef( new ContractRequestItem(itemID, requestItemTypeList->GetItem( i )->AsList()->GetItem( 1 )->AsInt()->value() ) ) ) ); } } uint32 contractID = 0; sLog.Debug( "ContractMgrService", "Creating contract..." ); ContractRef _contract = ContractRef( new Contract( contractID, *cData, requestItems, items, m_manager->item_factory, *m_contractManager ) ); contractID = m_contractManager->CreateContract( _contract ); sLog.Debug( "ContractMgrService", "Contract created" ); return new PyInt( contractID ); }