/** * @param $message - an array holding a result from the shub_message row * @param array $existing_rows - optional array passed in from the individual extension already having data for this row. * @return array */ public function output_row($message, $existing_rows = array()) { $extension_message = $this->get_message(false, false, $message['shub_message_id']); $messages = $extension_message->get_comments(); $return = array(); ob_start(); echo $this->get_friendly_icon(); ?> <a href="<?php echo $extension_message->get_link(); ?> " target="_blank"><?php echo htmlspecialchars($extension_message->get('account') ? $extension_message->get('account')->get('account_name') : 'Item'); ?> </a> <br/> <?php echo htmlspecialchars($extension_message->get_type_pretty()); ?> <?php $return['shub_column_account'] = ob_get_clean(); ob_start(); $shub_product_id = $extension_message->get_product_id(); $product_data = array(); $item_data = array(); $item = $extension_message->get('item'); if (!$shub_product_id && $item) { $shub_product_id = $item->get('shub_product_id'); $item_data = $item->get('item_data'); if (!is_array($item_data)) { $item_data = array(); } } if ($shub_product_id) { $shub_product = new SupportHubProduct(); $shub_product->load($shub_product_id); $product_data = $shub_product->get('product_data'); if (!empty($product_data['image'])) { ?> <img src="<?php echo esc_attr($product_data['image']); ?> " class="shub_friendly_icon"> <?php } ?> <?php if (!empty($product_data['url'])) { ?> <a href="<?php echo esc_url($product_data['url']); ?> " target="_blank"><?php echo htmlspecialchars($shub_product->get('product_name')); ?> </a> <?php } else { ?> <?php echo htmlspecialchars($shub_product->get('product_name')); ?> <?php } } $return['shub_column_product'] = ob_get_clean(); $return['shub_column_time'] = '<span class="shub_time" data-time="' . esc_attr($extension_message->get('last_active')) . '" data-date="' . esc_attr(shub_print_date($extension_message->get('last_active'), true)) . '">' . shub_pretty_date($extension_message->get('last_active')) . '</span>'; ob_start(); // work out who this is from. $from = $extension_message->get_from(); ?> <div class="shub_from_holder"> <div class="shub_from_full"> <?php foreach ($from as $id => $from_data) { ?> <div> <a href="<?php echo esc_url($from_data->get_link()); ?> " target="_blank"><img src="<?php echo esc_attr($from_data->get_image()); ?> " class="shub_from_picture"></a> <?php echo htmlspecialchars($from_data->get_name()); ?> </div> <?php } ?> </div> <?php reset($from); if (isset($from_data)) { echo '<a href="' . $from_data->get_link() . '" target="_blank">' . '<img src="' . esc_attr($from_data->get_image()) . '" class="shub_from_picture"></a> '; echo '<span class="shub_from_count">'; if (count($from) > 1) { echo '+' . (count($from) - 1); } echo '</span>'; } ?> </div> <?php $return['shub_column_from'] = ob_get_clean(); ob_start(); ?> <span style="float:right;"> <?php echo count($messages) > 0 ? '(' . count($messages) . ')' : ''; ?> </span> <div class="shub_message_summary<?php echo !isset($message['read_time']) || !$message['read_time'] ? ' unread' : ''; ?> "> <?php // todo - pull in comments here, not just title/summary // todo - style customer and admin replies differently (eg <em> so we can easily see) $title = strip_tags($extension_message->get('title')); $summary = strip_tags($extension_message->get('summary')); echo htmlspecialchars(strlen($title) > 80 ? substr($title, 0, 80) . '...' : $title) . ($summary != $title ? '<br/>' . htmlspecialchars(strlen($summary) > 80 ? substr($summary, 0, 80) . '...' : $summary) : ''); ?> </div> <?php $return['shub_column_summary'] = ob_get_clean(); ob_start(); ?> <a href="<?php echo $extension_message->link_open(); ?> " class="socialmessage_open shub_modal button" data-modaltitle="<?php echo esc_attr($title); ?> " data-network="<?php echo esc_attr($this->id); ?> " data-message_id="<?php echo (int) $extension_message->get('shub_message_id'); ?> "><?php _e('Open'); ?> </a> <?php if ($extension_message->get('shub_status') == _shub_MESSAGE_STATUS_ANSWERED) { ?> <a href="#" class="socialmessage_action shub_message_action button" data-action="set-unanswered" data-post="<?php echo esc_attr(json_encode(array('network' => $this->id, 'shub_message_id' => $extension_message->get('shub_message_id')))); ?> "><?php _e('Inbox'); ?> </a> <?php } else { ?> <a href="#" class="socialmessage_action shub_message_action button" data-action="set-answered" data-post="<?php echo esc_attr(json_encode(array('network' => $this->id, 'shub_message_id' => $extension_message->get('shub_message_id')))); ?> "><?php _e('Archive'); ?> </a> <?php } ?> <?php $return['shub_column_action'] = ob_get_clean(); return $return; }
public function update_author_sale_history($debug = false, $do_all = false) { return; // todo: save sale history in db with no username/api key just for stats $api = $this->get_api(); // how many days do we want to go back? maybe 60 days to start with? $last_sale = get_option('supporthub_envato_author_sales_last', false); if (!$last_sale) { $last_sale = strtotime('-360 days'); } $last_sale_in_this_batch = 0; $page = 1; while (true) { $recent_sales = $api->api('v2/market/author/sales?page=' . $page, array(), true); // echo "Recent sales are: ";print_r($recent_sales);exit; if ($debug) { echo "Page {$page} of sales data contained " . count($recent_sales) . " results.<br>\n"; } $page++; if (!$recent_sales || !is_array($recent_sales)) { break; } foreach ($recent_sales as $recent_sale) { if ($recent_sale && !empty($recent_sale['sold_at']) && !empty($recent_sale['code']) && !empty($recent_sale['item']['id'])) { // echo $recent_sale['sold_at']."<br>"; // add this to the database, or break if we already have this one in the db. $sale_time = strtotime($recent_sale['sold_at']); // we might already have this one in our database // unless we are doing the intial seed $existing_purchase = shub_get_single('shub_envato_purchase', array('purchase_code'), array($recent_sale['code'])); if ($existing_purchase) { if (!$do_all) { break 2; // stop processing once we reach one we've already saved } continue; // exists already in the db, skip to next one. } $last_sale_in_this_batch = max($last_sale_in_this_batch, $sale_time); // todo: check if they add username to the system, for now we use a 0 shub_user_id because we're unsure which user this purchase is related to (without doing another separate purchase call) if ($debug) { echo " - adding new sale to database ( " . shub_print_date($sale_time, true) . " - " . $recent_sale['item']['name'] . " )...<br>\n"; } // for now we do all processing based on this purchase code. SLOW. but until we get usernames in the buyer result there is no other way. // echo "Query this code: ".$recent_sale['code'];exit; SupportHub::getInstance()->message_managers['envato']->pull_purchase_code($api, $recent_sale['code'], $recent_sale); update_option('supporthub_envato_author_sales_last', $last_sale_in_this_batch); continue; // save this purchase code into the db // find the product this purchase is related to $existing_products = SupportHub::getInstance()->get_products(); // check if this item exists already $exists = false; foreach ($existing_products as $existing_product) { if (isset($existing_product['product_data']['envato_item_id']) && $existing_product['product_data']['envato_item_id'] == $recent_sale['item']['id']) { $exists = $existing_product['shub_product_id']; } } $newproduct = new SupportHubProduct(); if (!$exists) { $newproduct->create_new(); if (!$newproduct->get('product_name')) { $newproduct->update('product_name', $recent_sale['item']['name']); } $existing_product_data = $newproduct->get('product_data'); if (!is_array($existing_product_data)) { $existing_product_data = array(); } if (empty($existing_product_data['envato_item_id'])) { $existing_product_data['envato_item_id'] = $recent_sale['item']['id']; } if (empty($existing_product_data['envato_item_data'])) { $existing_product_data['envato_item_data'] = $recent_sale['item']; } if (empty($existing_product_data['image'])) { $existing_product_data['image'] = $recent_sale['item']['thumbnail_url']; } if (empty($existing_product_data['url'])) { $existing_product_data['url'] = $recent_sale['item']['url']; } $newproduct->update('product_data', $existing_product_data); } else { $newproduct->load($exists); } if ($newproduct->get('shub_product_id')) { // product has been added // time to add it to the purchase db // check if this already exists in the db $existing_purchase = shub_get_single('shub_envato_purchase', array('purchase_code'), array($recent_sale['code'])); if (!$existing_purchase) { $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', false, 'shub_envato_purchase', array('shub_user_id' => 0, 'shub_product_id' => $newproduct->get('shub_product_id'), 'purchase_time' => $sale_time, 'envato_user_id' => 0, 'purchase_code' => $recent_sale['code'], 'api_type' => 'author/sales', 'purchase_data' => json_encode($recent_sale))); } else { $shub_envato_purchase_id = $existing_purchase['shub_envato_purchase_id']; } if ($shub_envato_purchase_id) { // we have a purchase in the db // add or update the support expiry based on this purchase history. // work out when this purchase support expires // this is the expiry date returned in the api or just 6 months from the original purchase date. $support_expiry_time = strtotime("+6 months", $sale_time); // todo - check for this expiry time in the new api results. $existing_support = shub_get_single('shub_envato_support', array('shub_envato_purchase_id'), array($shub_envato_purchase_id)); if ($existing_support && $existing_support['shub_envato_support_id'] && $existing_support['start_time'] == $sale_time) { // check the existing support expiry matches the one we have in the database. if ($existing_support['end_time'] < $support_expiry_time) { // we have a support extension! $shub_envato_support_id = shub_update_insert('shub_envato_support_id', $existing_support['shub_envato_support_id'], 'shub_envato_support', array('end_time' => $support_expiry_time, 'api_type' => 'buyer/purchases', 'support_data' => json_encode($recent_sale))); } } else { // we are adding a new support entry $shub_envato_support_id = shub_update_insert('shub_envato_support_id', false, 'shub_envato_support', array('shub_user_id' => 0, 'shub_product_id' => $newproduct->get('shub_product_id'), 'shub_envato_purchase_id' => $shub_envato_purchase_id, 'start_time' => $sale_time, 'end_time' => $support_expiry_time, 'api_type' => 'author/sales', 'support_data' => json_encode($recent_sale))); } } } } } } }
public function output_message_page($type = 'inline') { $message_id = $this->get('shub_message_id'); if ($message_id && $this->get('shub_account_id')) { if ('popup' == $type) { $this->mark_as_read(); } // icon for this account. $icons = SupportHub::getInstance()->message_managers[$this->network]->get_friendly_icon('shub_message_account_icon'); // icon for the linked product $shub_product_id = $this->get_product_id(); $product_data = array(); $item_data = array(); $bbpress_item = $this->get('item'); if (!$shub_product_id && $bbpress_item) { $shub_product_id = $bbpress_item->get('shub_product_id'); $item_data = $bbpress_item->get('item_data'); if (!is_array($item_data)) { $item_data = array(); } } if ($shub_product_id) { $shub_product = new SupportHubProduct(); $shub_product->load($shub_product_id); $product_data = $shub_product->get('product_data'); } if ($shub_product_id && !empty($product_data['image'])) { if (!empty($product_data['url'])) { $icons .= '<a href="' . esc_attr($product_data['url']) . '" target="_blank">'; } $icons .= '<img src="' . esc_attr($product_data['image']) . '" class="shub_message_account_icon">'; if (!empty($product_data['url'])) { $icons .= '</a>'; } } ?> <div class="message_edit_form" data-network="<?php echo $this->network; ?> "> <section class="message_sidebar"> <nav> <?php if ($this->get('shub_status') == _shub_MESSAGE_STATUS_ANSWERED) { ?> <a href="#" class="shub_message_action btn btn-default btn-xs button shub_button_loading" data-action="set-unanswered" data-post="<?php echo esc_attr(json_encode(array('network' => $this->network, 'shub_message_id' => $message_id, 'last_activity' => $this->get('last_active')))); ?> "><?php _e('Inbox'); ?> </a> <?php } else { ?> <a href="#" class="shub_message_action btn btn-default btn-xs button shub_button_loading" data-action="set-answered" data-post="<?php echo esc_attr(json_encode(array('network' => $this->network, 'shub_message_id' => $message_id, 'last_activity' => $this->get('last_active')))); ?> "><?php _e('Archive'); ?> </a> <?php } ?> <span class="responsive_sidebar_summary"> <?php echo $icons; // todo - what other details need to show in mobile view? ?> </span> <a href="#" class="shub_view_full_message_sidebar btn btn-default btn-xs button alignright"><?php _e('More Details'); ?> </a> </nav> <header> <a href="<?php echo $this->get_link(); ?> " class="social_view_external btn btn-default btn-xs button" target="_blank"><?php _e('View Comment'); ?> </a> <?php if ($this->get('shub_status') == _shub_MESSAGE_STATUS_ANSWERED) { ?> <a href="#" class="shub_message_action btn btn-default btn-xs button shub_button_loading" data-action="set-unanswered" data-post="<?php echo esc_attr(json_encode(array('network' => $this->network, 'shub_message_id' => $message_id, 'last_activity' => $this->get('last_active')))); ?> "><?php _e('Inbox'); ?> </a> <?php } else { ?> <a href="#" class="shub_message_action btn btn-default btn-xs button shub_button_loading" data-action="set-answered" data-post="<?php echo esc_attr(json_encode(array('network' => $this->network, 'shub_message_id' => $message_id, 'last_activity' => $this->get('last_active')))); ?> "><?php _e('Archive'); ?> </a> <?php } ?> </header> <aside class="message_sidebar"> <?php echo $icons; echo '<br/>'; // this method does all the magic of getting the linked user ids and other messages $data = $this->get_message_sidebar_data($product_data, $item_data); if (!empty($data['message_details'])) { ?> <div class="message_sidebar_details"> <?php foreach ($data['message_details'] as $message_details) { ?> <div> <strong><?php echo htmlspecialchars($message_details[0]); ?> :</strong> <?php echo $message_details[1]; ?> </div> <?php } ?> </div> <?php } if (!empty($data['extra_datas'])) { ?> <div class="message_sidebar_extra_data"> <?php foreach ($data['extra_datas'] as $extra_data) { if (isset($extras[$extra_data->get('shub_extra_id')])) { ?> <div> <strong><?php echo htmlspecialchars($extras[$extra_data->get('shub_extra_id')]->get('extra_name')); ?> :</strong> <?php switch ($extras[$extra_data->get('shub_extra_id')]->get('field_type')) { case 'encrypted': echo '(encrypted)'; break; default: echo shub_forum_text($extra_data->get('extra_value'), false); } ?> </div> <?php } } ?> </div> <?php } if (!empty($data['user_bits'])) { ?> <ul class="linked_user_details"> <?php foreach ($data['user_bits'] as $user_bit) { ?> <li><strong><?php echo $user_bit[0]; ?> :</strong> <?php echo $user_bit[1]; ?> </li> <?php } ?> </ul> <?php } if (!empty($data['other_messages'])) { ?> <div class="shub_other_messages"> <strong><?php echo sprintf(_n('%d Other Message:', '%d Other Messages:', count($data['other_messages']), 'support_hub'), count($data['other_messages'])); ?> </strong><br/> <ul> <?php foreach ($data['other_messages'] as $other_message) { ?> <li> <span class="other_message_time"><?php echo shub_pretty_date($other_message['time']); ?> </span> <span class="other_message_status"><?php if (isset($other_message['message_status'])) { switch ($other_message['message_status']) { case _shub_MESSAGE_STATUS_ANSWERED: echo '<span class="message_status_archived">Archived</span>'; break; case _shub_MESSAGE_STATUS_UNANSWERED: echo '<span class="message_status_inbox">Inbox</span>'; break; case _shub_MESSAGE_STATUS_HIDDEN: echo '<span class="message_status_hidden">Hidden</span>'; break; default: echo 'UNKNOWN?'; } } ?> </span> <span class="other_message_network"> <?php echo $other_message['icon']; ?> </span> <br/> <a href="<?php echo esc_attr($other_message['link']); ?> " target="_blank" class="shub_modal" data-network="<?php echo esc_attr($other_message['network']); ?> " data-message_id="<?php echo (int) $other_message['message_id']; ?> " data-message_comment_id="<?php echo isset($other_message['message_comment_id']) ? (int) $other_message['message_comment_id'] : ''; ?> " data-modaltitle="<?php echo esc_attr($other_message['summary']); ?> "><?php echo esc_html($other_message['summary']); ?> </a> </li> <?php } ?> </ul> </div> <?php } do_action('supporthub_message_header', $this->network, $this); ?> </aside> </section> <section class="message_content"> <?php // we display the first "primary" message (from the ucm_message table) followed by comments from the ucm_message_comment table. //$this->full_message_output(true); $this->output_message_list(); ?> </section> <section class="message_request_extra"> <?php SupportHubExtra::form_request_extra(array('network' => $this->network, 'account-id' => $this->get('shub_account_id'), 'message-id' => $message_id)); ?> </section> </div> <?php } }
public function pull_purchase_code($api, $purchase_code, $api_raw_data = array(), $existing_shub_user_id = false) { $purchase_code = strtolower(preg_replace('#([a-z0-9]{8})-?([a-z0-9]{4})-?([a-z0-9]{4})-?([a-z0-9]{4})-?([a-z0-9]{12})#', '$1-$2-$3-$4-$5', $purchase_code)); // todo: add documentation that it needs to be named "Purchase Code" // todo: add a default extra value called Purchase Code. if (strlen($purchase_code) != 36) { return false; } // check existing purchase code and return that if it's cached $existing_purchase = shub_get_single('shub_envato_purchase', 'purchase_code', $purchase_code); if ($existing_purchase && $existing_purchase['shub_envato_purchase_id']) { // if there is a matching support id, grab that cached support data, add shub_user_id do it and return it // this matches our return data below. // if we don't find this then we continue below and call the API again to get fresh data. $existing_support = shub_get_single('shub_envato_support', array('shub_envato_purchase_id'), array($existing_purchase['shub_envato_purchase_id'])); if ($existing_support && $existing_support['shub_user_id'] && $existing_support['support_data']) { $return = @json_decode($existing_support['support_data'], true); if ($return) { $return['shub_user_id'] = $existing_support['shub_user_id']; return $return; } } } $accounts = array(); if (!$api) { // loop through accounts and try an API call on each one. $accounts = $this->get_accounts(); } do { if ($accounts) { // grab an API from this account. $account = array_shift($accounts); $shub_envato_account = new shub_envato_account($account['shub_account_id']); // found the account, pull in the API and build the url $api = $shub_envato_account->get_api(); } if (!$api) { break; } // $result = $api->api('v1/market/private/user/verify-purchase:' . $purchase_code . '.json'); $result = $api->api('v2/market/author/sale?code=' . $purchase_code); /* { "amount": "12.60", "sold_at": "2015-08-18T21:30:02+10:00", "item": { "id": 1299019, "name": "WooCommerce Australia Post Shipping Calculator", "description": ... "site": "codecanyon.net", "classification": "wordpress/ecommerce/woocommerce/shipping", "classification_url": "http://codecanyon.net/category/wordpress/ecommerce/woocommerce/shipping", "price_cents": 1800, "number_of_sales": 1054, "author_username": "******", "author_url": "http://codecanyon.net/user/dtbaker", "author_image": "https://0.s3.envato.com/files/111547951/dtbaker-php-scripts-wordpress-themes-and-plugins.png", "url": "http://codecanyon.net/item/woocommerce-australia-post-shipping-calculator/1299019", "thumbnail_url": "https://0.s3.envato.com/files/15047665/thumb.png", "summary": "High Resolution: No, Compatible With: WooCommerce 2.3.x, Software Version: WordPress 4.2, WordPress 4.1, WordPress 4.0, WordPress 3.9, WordPress 3.8, WordPress 3.7", "rating": { "rating": 3.82, "count": 49 }, "updated_at": "2015-08-13T12:34:59+10:00", "published_at": "2012-01-15T17:59:18+11:00", "trending": false, "previews": { "landscape_preview": { "landscape_url": "https://image-cc.s3.envato.com/files/15047663/preview.jpg" } } }, "license": "Regular License", "code": "c77ff344-9be4-4ba1-9e50-ce92e37c33e0", "support_amount": "" } }*/ if ($result && !empty($result['item']) && !empty($result['item']['id'])) { // valid purchase code. // what is the username attached to this purchase result? $envato_username = $result['buyer']; // find this user in our system. $shub_user = new SupportHubUser_Envato(); if ($existing_shub_user_id) { $shub_user->load($existing_shub_user_id); } else { $shub_user->load_by_meta('envato_username', strtolower($envato_username)); } if (!$shub_user->get('shub_user_id')) { // no users exists in our system with this username. // add a new one. $shub_user->create_new(); } if (!$shub_user->get('user_username')) { $shub_user->update('user_username', $envato_username); } $shub_user->add_unique_meta('envato_username', strtolower($envato_username)); // find out which product this purchase code is relating to $existing_products = SupportHub::getInstance()->get_products(); // check if this item exists already $exists = false; foreach ($existing_products as $existing_product) { if (isset($existing_product['product_data']['envato_item_id']) && $existing_product['product_data']['envato_item_id'] == $result['item']['id']) { $exists = $existing_product['shub_product_id']; } } $newproduct = new SupportHubProduct(); if (!$exists) { $newproduct->create_new(); } else { $newproduct->load($exists); } if (!$newproduct->get('product_name')) { $newproduct->update('product_name', $result['item']['name']); } $existing_product_data = $newproduct->get('product_data'); if (!is_array($existing_product_data)) { $existing_product_data = array(); } if (empty($existing_product_data['envato_item_id'])) { $existing_product_data['envato_item_id'] = $result['item']['id']; } if (empty($existing_product_data['envato_item_data'])) { // get these item details from api $existing_product_data['envato_item_data'] = $result['item']; if (empty($existing_product_data['image'])) { $existing_product_data['image'] = $result['item']['thumbnail_url']; } if (empty($existing_product_data['url'])) { $existing_product_data['url'] = $result['item']['url']; } } $newproduct->update('product_data', $existing_product_data); if ($newproduct->get('shub_product_id')) { } $shub_envato_purchase_id = false; // store this in our purchase code database so we can access it easier later on $existing_purchase = shub_get_single('shub_envato_purchase', 'purchase_code', $purchase_code); if (!$existing_purchase) { // see if we can find an existing purchase by this user at the same time, without a purchase code. // (because results from the purchase api do not contian purchase codes) $possible_purchases = shub_get_multiple('shub_envato_purchase', array('shub_user_id' => $shub_user->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'purchase_time' => strtotime($result['sold_at']))); foreach ($possible_purchases as $possible_purchase) { if (empty($possible_purchases['purchase_code'])) { // this purchase came from the other api and doesn't have a purchase code. // add it in! $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', $possible_purchase['shub_envato_purchase_id'], 'shub_envato_purchase', array('purchase_code' => $purchase_code, 'api_time' => time())); if (empty($possible_purchases['purchase_data'])) { $raw_purchase_data = array_merge(array('author/sale' => $result), is_array($api_raw_data) ? $api_raw_data : array()); $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', $possible_purchase['shub_envato_purchase_id'], 'shub_envato_purchase', array('purchase_data' => json_encode($raw_purchase_data))); } } } } else { // we do have an existing purchase. $shub_envato_purchase_id = $existing_purchase['shub_envato_purchase_id']; // if (empty($existing_purchase['shub_user_id'])) { shub_update_insert('shub_envato_purchase_id', $shub_envato_purchase_id, 'shub_envato_purchase', array('shub_user_id' => $shub_user->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'purchase_time' => strtotime($result['sold_at']))); // } } if (!$shub_envato_purchase_id) { // add new one $raw_purchase_data = array_merge(array('author/sale' => $result), is_array($api_raw_data) ? $api_raw_data : array()); $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', false, 'shub_envato_purchase', array('shub_user_id' => $shub_user->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'envato_user_id' => 0, 'api_time' => time(), 'api_type' => 'author/sale', 'purchase_time' => strtotime($result['sold_at']), 'purchase_code' => $purchase_code, 'purchase_data' => json_encode($raw_purchase_data))); } if ($shub_envato_purchase_id) { // support expiry time is 6 months from the purchase date, or as specified by the api result. if (strtotime($result['sold_at']) < strtotime("2015-09-01")) { $support_expiry_time = strtotime("+6 months", strtotime("2015-09-01")); } else { $support_expiry_time = strtotime("+6 months", strtotime($result['sold_at'])); } if (!empty($result['supported_until'])) { $support_expiry_time = strtotime($result['supported_until']); } $existing_support = shub_get_single('shub_envato_support', array('shub_envato_purchase_id'), array($shub_envato_purchase_id)); if ($existing_support && empty($existing_support['shub_user_id'])) { shub_update_insert('shub_envato_support_id', $existing_support['shub_envato_support_id'], 'shub_envato_support', array('shub_user_id' => $shub_user->get('shub_user_id'))); } if ($existing_support && $existing_support['shub_envato_support_id'] && $existing_support['start_time'] == strtotime($result['sold_at'])) { // check the existing support expiry matches the one we have in the database. if ($existing_support['end_time'] < $support_expiry_time) { // we have a support extension! $shub_envato_support_id = shub_update_insert('shub_envato_support_id', $existing_support['shub_envato_support_id'], 'shub_envato_support', array('end_time' => $support_expiry_time, 'api_type' => 'author/sale', 'support_data' => json_encode($result))); } } else { // we are adding a new support entry $shub_envato_support_id = shub_update_insert('shub_envato_support_id', false, 'shub_envato_support', array('shub_user_id' => $shub_user->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'shub_envato_purchase_id' => $shub_envato_purchase_id, 'api_type' => 'author/sale', 'start_time' => strtotime($result['sold_at']), 'end_time' => $support_expiry_time, 'support_data' => json_encode($result))); } } $result['shub_user_id'] = $shub_user->get('shub_user_id'); return $result; } } while (count($accounts)); // if we get here it means the API request failed or it's an invalid purchase code. // log it in our database so we can at least re-check it at a later point in time or show it as failed in the UI somehow. $existing_purchase = shub_get_single('shub_envato_purchase', 'purchase_code', $purchase_code); if (!$existing_purchase) { $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', false, 'shub_envato_purchase', array('shub_user_id' => $existing_shub_user_id, 'shub_product_id' => 0, 'envato_user_id' => 0, 'api_type' => 'fail', 'purchase_time' => 0, 'purchase_code' => $purchase_code, 'purchase_data' => '')); } return false; }
public function update_purchase_history() { $tokens = shub_get_multiple('shub_envato_oauth', array('shub_user_id' => $this->shub_user_id)); // find the latest token for this user, per account. $account_tokens = array(); // if any of them have expired, refresh the token from the api foreach ($tokens as $token) { if (!$token['shub_account_id']) { continue; } if (!isset($account_tokens[$token['shub_account_id']]) || $token['expire_time'] > $account_tokens[$token['shub_account_id']]['expire_time']) { $account_tokens[$token['shub_account_id']] = $token; } } foreach ($account_tokens as $account_token) { $shub_envato_account = new shub_envato_account($account_token['shub_account_id']); // found the account, pull in the API and build the url $api = $shub_envato_account->get_api(); $api->set_manual_token($account_token); if ($account_token['expire_time'] <= time()) { // renew this token! $new_access_token = $api->refresh_token(); if ($new_access_token) { shub_update_insert('shub_envato_oauth_id', $account_token['shub_envato_oauth_id'], 'shub_envato_oauth', array('access_token' => $new_access_token, 'expire_time' => time() + 3600)); } else { echo 'Token refresh failed'; return false; } } $api_result = $api->api('v1/market/private/user/username.json', array(), false); $api_result_email = $api->api('v1/market/private/user/email.json', array(), false); if ($api_result && !empty($api_result['username'])) { $this->add_unique_meta('envato_username', $api_result['username']); } if ($api_result_email && !empty($api_result_email['email'])) { $email = trim(strtolower($api_result_email['email'])); // todo: not sure if best to update users eamail , if they change email accounts and stuff $this->update('user_email', $email); } $api_result_purchase_history = $api->api('v2/market/buyer/purchases', array(), false); // store this purchase history in our db for later use. if ($api_result_purchase_history && !empty($api_result_purchase_history['buyer']['id']) && !empty($api_result_purchase_history['buyer']['username']) && $api_result_purchase_history['buyer']['username'] == $api_result['username']) { // we have the buyer ID! yay! this is better than a username. $this->add_unique_meta('envato_user_id', $api_result_purchase_history['buyer']['id']); if (!empty($api_result_purchase_history['purchases']) && is_array($api_result_purchase_history['purchases'])) { foreach ($api_result_purchase_history['purchases'] as $purchase) { if (!empty($purchase['item']['id'])) { // todo: beg envato to add the purchase code to this output so we can link it together correctly. // find out which shub product this is for // if we cannot find one then we create one. this helps when new items are made. $existing_products = SupportHub::getInstance()->get_products(); // check if this item exists already $exists = false; foreach ($existing_products as $existing_product) { if (isset($existing_product['product_data']['envato_item_id']) && $existing_product['product_data']['envato_item_id'] == $purchase['item']['id']) { $exists = $existing_product['shub_product_id']; } } $newproduct = new SupportHubProduct(); if (!$exists) { $newproduct->create_new(); } else { $newproduct->load($exists); } if (!$newproduct->get('product_name')) { $newproduct->update('product_name', $purchase['item']['name']); } $existing_product_data = $newproduct->get('product_data'); if (!is_array($existing_product_data)) { $existing_product_data = array(); } if (empty($existing_product_data['envato_item_id'])) { $existing_product_data['envato_item_id'] = $purchase['item']['id']; } if (empty($existing_product_data['envato_item_data'])) { $existing_product_data['envato_item_data'] = $purchase['item']; } if (empty($existing_product_data['image'])) { $existing_product_data['image'] = $purchase['item']['thumbnail_url']; } if (empty($existing_product_data['url'])) { $existing_product_data['url'] = $purchase['item']['url']; } $newproduct->update('product_data', $existing_product_data); if ($newproduct->get('shub_product_id')) { // product has been added // time to add it to the purchase db // check if this already exists in the db $existing_purchase = shub_get_single('shub_envato_purchase', array('purchase_code'), array($purchase['code'])); if (!$existing_purchase) { $shub_envato_purchase_id = shub_update_insert('shub_envato_purchase_id', false, 'shub_envato_purchase', array('shub_user_id' => $this->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'purchase_time' => strtotime($purchase['sold_at']), 'envato_user_id' => $api_result_purchase_history['buyer']['id'], 'purchase_code' => $purchase['code'], 'api_type' => 'buyer/purchases', 'purchase_data' => json_encode($purchase))); } else { if (!$existing_purchase['shub_user_id']) { shub_update_insert('shub_envato_purchase_id', $existing_purchase['shub_envato_purchase_id'], 'shub_envato_purchase', array('shub_user_id' => $this->get('shub_user_id'))); } $shub_envato_purchase_id = $existing_purchase['shub_envato_purchase_id']; } if ($shub_envato_purchase_id) { // we have a purchase in the db // add or update the support expiry based on this purchase history. // work out when this purchase support expires // this is the expiry date returned in the api or just 6 months from the original purchase date. $support_expiry_time = strtotime("+6 months", strtotime($purchase['sold_at'])); // todo - check for this expiry time in the new api results. $existing_support = shub_get_single('shub_envato_support', array('shub_envato_purchase_id'), array($shub_envato_purchase_id)); if ($existing_support && empty($existing_support['shub_user_id'])) { shub_update_insert('shub_envato_support_id', $existing_support['shub_envato_support_id'], 'shub_envato_support', array('shub_user_id' => $this->get('shub_user_id'))); } if ($existing_support && $existing_support['shub_envato_support_id'] && $existing_support['start_time'] == strtotime($purchase['sold_at'])) { // check the existing support expiry matches the one we have in the database. if ($existing_support['end_time'] < $support_expiry_time) { // we have a support extension! $shub_envato_support_id = shub_update_insert('shub_envato_support_id', $existing_support['shub_envato_support_id'], 'shub_envato_support', array('end_time' => $support_expiry_time, 'api_type' => 'buyer/purchases', 'support_data' => json_encode($purchase))); } } else { // we are adding a new support entry $shub_envato_support_id = shub_update_insert('shub_envato_support_id', false, 'shub_envato_support', array('shub_user_id' => $this->get('shub_user_id'), 'shub_product_id' => $newproduct->get('shub_product_id'), 'shub_envato_purchase_id' => $shub_envato_purchase_id, 'start_time' => strtotime($purchase['sold_at']), 'end_time' => $support_expiry_time, 'api_type' => 'buyer/purchases', 'support_data' => json_encode($purchase))); } } } } } } } } return true; }