CasperUpdate: Difference between revisions

From CasperTech Wiki
Jump to navigation Jump to search
 
(125 intermediate revisions by 4 users not shown)
Line 2: Line 2:
   |__TOC__
   |__TOC__
   |}
   |}
{{Information|THIS IS A STANDALONE PRODUCT! CasperVend is NOT required to use this product}}
CasperUpdate is a system which allows creators to make self-updating products. Once a product is sold to the customer, the product will check for an update every time it is rezzed (or at specific intervals). If an update is found, the customer is asked if they wish to receive the update (which will be delivered to them).
CasperUpdate is a system which allows creators to make self-updating products. Once a product is sold to the customer, the product will check for an update every time it is rezzed (or at specific intervals). If an update is found, the customer is asked if they wish to receive the update (which will be delivered to them).


{{Information|CasperUpdate is currently in PUBLIC BETA, with final release expected sometime in July 2015.}}
Don't have it yet? '''[http://maps.secondlife.com/secondlife/Izanagi/190/88/134 Buy CasperUpdate in-world]''' or on '''[https://marketplace.secondlife.com/p/CasperUpdate-Low-Lag-Low-Nag-Product-Update-System/7387197 SL Marketplace]'''
 


== <span style="color:#00528c">'''Features'''</span> ==
== <span style="color:#00528c">'''Features'''</span> ==
Line 28: Line 29:


# The system must '''ONLY''' be used for its intended purpose - to provide '''product''' updates.  
# The system must '''ONLY''' be used for its intended purpose - to provide '''product''' updates.  
# Using the API commands for any other purpose is prohibitied and is grounds for service suspension.  
# Using the API commands for any other purpose is prohibited and is grounds for service suspension.  
# Each object may only check for updates - at most - once per hour. Exceeding this limit '''''temporarily''''' (such as for testing purposes) is OK.   
# Each object may only check for updates - at most - once per hour. Exceeding this limit '''''temporarily''''' (such as for testing purposes) is OK.   
# The server "rate-limits" requests. Currently these limits are set high, but we reserve the right to lower these limits if the service is being abused.
# The server "rate-limits" requests. See the below section for more information.
 
== <span style="color:#00528c">'''Rate Limits'''</span> ==
 
The system will only process:
 
# 1 request per minute per user per product
# 5 requests per hour per object
# 50 requests per minute per IP address (region)
# 100 requests per minute per product
# 300 requests per minute per API key
 
'''If you are legitimately hitting these limits during normal usage, contact support and we'll look into getting them raised for you.'''
 
It is possible to temporarily exceed these limits, due to the nature of our network - for this reason, if you rez 100 objects at the same time, you may still get more than one dialog box.
 
== <span style="color:#00528c">'''Let's get started!'''</span> ==
 
The steps you need to follow to get set up with CasperUpdate are as follows:
 
:# [[#aplsetup|Account and Product Listing Setup]]
:# [[#acuprod|Adding CasperUpdate to Your Products]]
:# [[#finalchecks|Final Checks]]
:# [[#adddropbox|Add your items to your DropBox]]
:# [[#test|Test!]]


== Instructions ==  
== <span style="color:#00528c">'''Video Tutorial'''</span> ==  
{{Information|CasperUpdate uses the CasperVend back end for its functions, so you will still need a CasperVend website account. However, you do not need to have - or be using - the vendors because CasperUpdate comes with its own DropBox.}}
This video runs about 10 minutes, so settle in and make sure you don't miss anything.  


'''If you have already set up your products in CasperVend, please skip to section for [[#Adding_CasperUpdate_to_Your_Products | Adding CasperUpdate to Your Products]].'''
If you don't want to - or can't - view the video, the text instructions begin below this section.  


=== Set up your account ===
'''Please note that this video follows a slightly different process than the instructions on this page (Casper places the item into the dropbox BEFORE setting up CasperUpdate, and then replaces it later). Either method will work.'''
 
{{#ev:youtube|LzSl_ziGJ3o|600|center|CasperUpdate tutorial video}}
 
== <span style="color:#00528c" id="aplsetup">'''Account and Product Listing Setup'''</span> ==
{{Information|CasperUpdate uses the CasperVend back end for its functions, so you will still need a CasperVend website account (see the '''"Set up your account"''' section below). However, you do not need to own (or use) the vendors because CasperUpdate comes with its own DropBox.}}
 
If you have already set up your products in CasperVend, please skip down to the section for '''[[#Adding_CasperUpdate_to_Your_Products | Adding CasperUpdate to Your Products]]'''.
 
=== New User? Set Up Your Account ===
----
{{Warning|If nothing happens when you click the shipping crate, or you don't get a popup menu when you click the dropbox, that means your current location does not allow you to run scripts.<br /><br />If you don't get a "Go to URL" popup, you may have yourself muted - please check your viewer's mute/block list.}}


<ol>
<ol>
<li>Before you begin, rez the CasperUpdate crate and touch it to unpack.</li>
<li>Make sure you are on land where YOU can rez objects and run scripts. (Correct group tag, etc.</li>
{{Warning|<b>DO NOT</b> open the crate manually, or your purchase may not be registered. If touching the crate does nothing, check that scripts are enabled on the parcel you are on.}}
<li>Rez the CasperUpdate shipping crate and click it to unpack. Do '''NOT''' open manually or your purchase will not properly register!</li>
<li>Choose a suitable location to rez your DropBox. Your DropBox must stay rezzed at all times, so choose somewhere that it can stay.</li>
<li>Choose a suitable place '''inworld''' to leave your DropBox. This '''MUST STAY REZZED AT ALL TIMES''' so make sure it is someplace where it can stay long-term.</li>
<li>Rez the DropBox in your chosen location. The DropBox will be named something like "CasperTech DropBox vX.XX".</li>
<li>Rez the DropBox. The DropBox will be named something like "'''CasperTech Dropbox ''((version number))'''''"</li>
<li>Touch the DropBox, which will bring up a blue dialog.</li>
<li>Click the DropBox. This will bring up a popup menu.</li>
{{Warning|If you don't get a blue pop-up dialog when you touch your dropbox, make sure your chosen location has scripts enabled.}}
<li>From the popup menu, select "Admin."</li>
<li>From the blue menu, choose "Admin". This will then show you a dialog menu asking you to visit a URL. Click "Go to URL".</li>
<li>This will show you a popup menu asking you to visit a URL. Click '''Go to URL'''.</li>
{{Warning|If you don't get a "Go to URL" dialog, you may have yourself muted (it sounds silly, but this is a very common problem). Please check your viewer's block list.}}
<li>Once you have loaded the website, you may be asked to choose a password. Do this now. If you have previously created an account, you will be asked to enter your password and log in.</li>
<li>Once you have loaded the website, you may be asked to choose a password. Do this now. If you have previously created an account, you will be asked to enter your password.</li>
<li>If you don't remember your password, you will have a "forgot password" option as long as you arrived via a URL from inworld. (The inworld object acts as identity verification to the website.)</li>
<li>Once successfully logged in, you should be presented with a page titled "Vendors", and you will see a few details about your DropBox.</li>
<li>Once successfully logged in, you should be presented with a page titled "Vendors", and you will see a few details about your DropBox.</li>
</ol>
</ol>
=== Add Items to Your DropBox ===
----
{{Warning|Do not drag over any items which show '''(no transfer)''' next to them. You cannot transfer/send those to your customers, so they will not work in the DropBox either.}}
{{Warning|Do '''NOT''' delete the DropBox script or your updates will not be sent.}}
# Switch back to Second Life, and right-click the dropbox that you rezzed out.
# Choose "Edit".
# Click the "Contents" tab in the edit floater. You should see a script with the name '''CasperTech DropBox".
# Choose the product(s) in your inventory that will be delivered to your customers when they claim an update.
# Drag them from your inventory to the DropBox contents window.
# Wait for the DropBox to upload information about the items to our servers.
# DropBox will show hovertext saying "Box is live" when this process is complete, along with the number of items it counts as valid products.


=== Add Product Listings ===
=== Add Product Listings ===
Line 79: Line 101:


{{Information|Most of the settings available to you here are only useful if you use CasperVend, or you plan to. You can ignore them all, except the following::
{{Information|Most of the settings available to you here are only useful if you use CasperVend, or you plan to. You can ignore them all, except the following::
<ul><li>'''Item''' - This allows you to select an item from your dropbox to deliver to the customer when they update this product.</li>
<ul><li>'''Item''' - This allows you to choose the item (from your dropbox) that you will deliver to your customers. If you're setting up a brand new product, choose "Don't deliver anything." for now, but '''remember to come back and select the dropbox item later.'''</li>
<li>'''Name''' - This is the name of the product.</li>
<li>'''Name''' - This is the name of the product.</li>
<li>'''Price''' - This isn't used by CasperUpdate, but it's required so that CasperVend merchants don't accidentally give their products away for free!</li>
<li>'''Price''' - This isn't used by CasperUpdate, but it's required so that CasperVend merchants don't accidentally give their products away for free!</li>
Line 87: Line 109:
</ol>
</ol>


=== Adding CasperUpdate To Your Products ===
If you are done adding product listings, then you can go to the next sections to get started with adding CasperUpdate to your physical products, checking the settings, and then putting the completed products in the DropBox.
 
=== Missing CasperUpdate options? ===
----
----
Not seeing the CasperUpdate options in your product listings?
That's because your purchase of CasperUpdate wasn't properly registered. You will need to rez your CasperUpdate shipping crate on land where YOU can run scripts and click it, in order for your copy of CasperUpdate to be registered to you.
If you've deleted your shipping crate, you can redeliver it from any CasperVend redelivery terminal.
== <span style="color:#00528c" id="acuprod">'''Adding CasperUpdate to Your Products'''</span> ==
'''Repeat the following steps for each product that you wish to use with CasperUpdate.'''
'''Repeat the following steps for each product that you wish to use with CasperUpdate.'''


<ul><li>Rez the product on the ground.</li>
{{Critical|Make sure you use the correct script! '''DO NOT''' drag the<br /> "CasperUpdate No-Copy Protector" script into your object yet! <br />'''Using the wrong script may destroy your object!'''}}
 
<ol><li>Rez the product on the ground.</li>
<li>Right click the product, go to "Edit", then switch to the "Contents" tab.</li>
<li>Right click the product, go to "Edit", then switch to the "Contents" tab.</li>
<li>'''After reading the warning below''', drag the "CasperUpdate vX.X" script into your object.</li>
<li>Drag the "CasperUpdate vX.X" script into your object.</li>
{{Critical|Make sure you use the correct script! '''DO NOT''' drag the "CasperUpdate No-Copy Protector" script into your object yet! '''This may destroy your object!'''}}
<li>Leave the object rezzed and continue with the following steps</li>
<li>Leave the object rezzed and continue with the following steps</li>
</ul>
</ol>


=== Set Permissions ===
=== Set Permissions ===
 
----
{{Critical|'''Make certain''' that you set the correct permissions for '''both''' your object '''and''' the script inside. Not doing so may result in people being able to obtain your products without paying.}}
{{Critical|'''Make certain''' that you set the correct permissions for '''both''' your object '''and''' the script inside. Not doing so may result in people being able to obtain your products without paying.}}
==== For objects with COPY permissions ====
==== For products with COPY permissions ====
----


For objects with '''COPY''' permissions, you '''MUST''' set:
* Set "CasperUpdate vX.XX" script permissions to "'''No Modify'''" and '''"No Transfer"'''.
* Make sure your product object itself is set to "'''No Transfer'''".


* The "CasperUpdate vX.XX" script permissions to "'''No Modify'''". If your object is "No Transfer", you '''MUST''' also set the script to No Transfer.
==== For products with both COPY and TRANSFER permissions ====
 
----
The object permissions don't matter for Copy products.
* Set "CasperUpdate vX.XX" script permissions to "'''No Modify'''" and "'''No Transfer'''".
 
==== For objects with NO COPY permissions ====


==== For products with NO COPY permissions ====
----
For objects with '''NO COPY''' permissions, you '''MUST''' set:
For objects with '''NO COPY''' permissions, you '''MUST''' set:


* The "CasperUpdate vX.XX" script permissions to "'''No Modify'''" and "'''No Copy'''".
* Set "CasperUpdate vX.XX" script permissions to '''"No Copy"''' and "'''No Modify'''".
* The OBJECT permissions to "'''No Modify'''".
* Make sure your product object itself is set to '''"No Copy"'''and "'''No Modify'''".


Once you have finished editing the script (as described below), and you have confirmed that the script is running, and you have taken a backup copy of your object.. '''and only then'''.. drop the "CasperUpdate No-Copy Protector" script into your object. LEAVE THE PERMISSIONS FOR THIS SCRIPT AS THEY ARE.
==== Adding no-copy protection to no-copy products ====
----
Once you have finished editing the script (as described above), and you have confirmed that the script is running, and you have taken a backup copy of your object, then - '''and ONLY then!''' - drop the "CasperUpdate No-Copy Protector" script into your object.  


{{Critical|For no-copy objects, it is '''absolutely crucial''' that you set the object to "no-modify", and that the "CasperUpdate No-Copy Protector" script is set to "COPY". If you don't do this, people will be able to effectively make copies of your no-copy item.}}
DO NOT CHANGE PERMISSIONS FOR THIS SCRIPT - LEAVE THEM AS THEY ARE


=== Edit the script and set options ===
{{Critical|For no-copy objects, it is '''absolutely crucial''' that you set the product object to "no-modify", and that the "CasperUpdate No-Copy Protector" script stays copiable. If you don't do this, people will be able to effectively make copies of your no-copy item.}}


=== Edit Script and Set Options ===
----
Inside each of the products, you should now have (at least) a "CasperUpdate v#.##" script. Double click the script in order to open the script editor window.
Inside each of the products, you should now have (at least) a "CasperUpdate v#.##" script. Double click the script in order to open the script editor window.


Line 135: Line 173:


Look for the following line:
Look for the following line:
<lsl>string APIKey = "";</lsl>
<syntaxhighlight lang="lsl">string APIKey = "";</syntaxhighlight>


You need to place your key between the " characters. So, in this case, it will end up look like this:
You need to place your key between the " characters. So, in this case, it will end up look like this:


<lsl>string APIKey = "1ff379c6a13eb414877b8734781244dbb594e56d";</lsl></div>
<syntaxhighlight lang="lsl">string APIKey = "1ff379c6a13eb414877b8734781244dbb594e56d";</syntaxhighlight></div>
</li>
</li>
<li><div>'''Add your Product Update Key'''
<li><div>'''Add your Product Update Key'''


You can find this key by going to the '''Products'' section on the website, clicking '''Edit''' next to the product you're currently working with, and scrolling down to "Update Key". Click the "Generate Key" button, and then copy the key into the script.
You can find this key by going to the '''Products''' section on the website, clicking '''Edit''' next to the product you're currently working with, and scrolling down to "Update Key". Click the "Generate Key" button, and then copy the key into the script.


In my case,
In my case,


<lsl>string ProductUpdateKey = "";</lsl>
<syntaxhighlight lang="lsl">string ProductUpdateKey = "";</syntaxhighlight>


becomes
becomes


<lsl>string ProductUpdateKey = "dd6ba159a09d3ceea613b5b7c80c01966557204b";</lsl>
<syntaxhighlight lang="lsl">string ProductUpdateKey = "dd6ba159a09d3ceea613b5b7c80c01966557204b";</syntaxhighlight>
</div>
</div>
</li>
</li>
Line 161: Line 199:
For example,
For example,


<lsl>string Version = "";</lsl>
<syntaxhighlight lang="lsl">string Version = "";</syntaxhighlight>


might become
might become


<lsl>string Version = "1.0 BETA";</lsl>
<syntaxhighlight lang="lsl">string Version = "1.0 BETA";</syntaxhighlight>
</div>
</div>
</li>
</li>
Line 172: Line 210:
Click "Save" at the bottom of the script. After a few seconds, you should see "Save complete" at the bottom of the window. If you see something else, check that you have made the edits exactly as described above.
Click "Save" at the bottom of the script. After a few seconds, you should see "Save complete" at the bottom of the window. If you see something else, check that you have made the edits exactly as described above.


{{Critical|Make sure the "Running" tickbox at the bottom of the script is TICKED.}}
{{Critical|Make sure the "Running" tickbox at the bottom of the script is CHECKED/TICKED.}}
</div>
</div>
</li>
</li>
</ol>
</ol>


=== Final Checks ===
== <span style="color:#00528c" id="finalchecks">'''Final Checks'''</span> ==


Once done, you should check that your settings are correct.
Once done, you should check that your settings are correct.


==== For objects with COPY permissions ====
=== For objects with COPY permissions ===
----


# Your object should contain the "CasperUpdate v#.##" script, which should be set to "NO MODIFY", "COPY" and, if your object is no transfer, then the script should also be set to NO TRANSFER.
# Your object should contain the "CasperUpdate v#.##" script, which should be set to "NO MODIFY", "COPY"  
# If your object is no transfer, then the script should also be set to NO TRANSFER.
# The script should contain your API key, the Product Update Key, and the Version, and it should be saved and RUNNING (check the running tickbox at the bottom).
# The script should contain your API key, the Product Update Key, and the Version, and it should be saved and RUNNING (check the running tickbox at the bottom).


==== For objects with NO COPY permissions ====
As an additional security feature, for all copiable products tracked '''through CasperVend only''' you may tick/check this additional option:


[[File:CU_Update_Options.png]]
This will ensure that only the people who purchased your product will get the future updates.
As it shows in the picture, do NOT use this option if your product is transferrable, or if you normally sell through a medium that is NOT tracked by CasperVend.
=== For objects with NO COPY permissions ===
----
# Your object should contain the "CasperUpdate v#.##" script, which should be set to "NO MODIFY" and "NO COPY".
# Your object should contain the "CasperUpdate v#.##" script, which should be set to "NO MODIFY" and "NO COPY".
# The script should contain your API key, the Product Update Key, and the Version, and it should be saved and RUNNING (check the running tickbox at the bottom).
# The script should contain your API key, the Product Update Key, and the Version, and it should be saved and RUNNING (check the running tickbox at the bottom).
Line 193: Line 241:
# Your object should contain the "CasperUpdate No-Copy Protector" script, which should be set to "NO MODIFY", "COPY", "TRANSFER".
# Your object should contain the "CasperUpdate No-Copy Protector" script, which should be set to "NO MODIFY", "COPY", "TRANSFER".


=== Test! ===
== <span style="color:#00528c" id="adddropbox">'''Add your items to your dropbox'''</span> ==
{{Warning|Do not drag over any items which show '''(no transfer)''' next to them. You cannot send/transfer those to your customers, so they will not work in the DropBox either. <br /> <br />Do '''NOT''' delete the DropBox script or your updates will not be sent.}}


# Switch back to Second Life, and right-click the dropbox that you rezzed out.
# Choose "Edit".
# Click the "Contents" tab in the edit floater. You should see a script with the name '''CasperTech DropBox".
# Drag the products (which you have set up with the CasperUpdate script) from your inventory to the DropBox contents window.
# Wait for the DropBox to upload information about the items to our servers.
# When finished, DropBox will show hovertext saying "Box is live" when this process is complete, along with the number of items it counts as valid (transferrable) items.
# '''If you chose 'Don't deliver anything.' when setting up your product''', or if you '''replaced an item in the dropbox with a different name''', you now need to go back to the website and edit the product you created, and select this item for delivery.
== <span style="color:#00528c" id="test">'''Test!'''</span> ==
We recommend that you send a copy of the product to a trusted friend or alt. If set up correctly, they SHOULD NOT receive any notices from the CasperUpdate script, UNTIL you update your product.
We recommend that you send a copy of the product to a trusted friend or alt. If set up correctly, they SHOULD NOT receive any notices from the CasperUpdate script, UNTIL you update your product.


You may wish to follow the steps below to test the update process to make sure everything works.
You may wish to follow the steps below to test the update process to make sure everything works.


=== When you update your product ===
Remember that CasperUpdate will check - by default - on rez, and once per hour for each copy of the product. Update sending will be triggered if the version identifier has changed in '''any''' way from what is in the script.
 
=== About the update menu ===
----
 
[[File:CU_CustomerButtons.png]]
 
# '''Not Now''' will wait until the next time a copy of the product is rezzed, '''and''' at least 1 hour from that time.
# '''Postpone''' will wait until the following version is released.
# '''Never''' will set a flag on the website, so that no matter how many copies are rezzed of that product, the customer never gets an update offer.
 
"Not Now" and "Postpone" answers are stored '''in the script''' - so if you delete the first copy and rez a second copy of the product with the CasperUpdate script, it will '''not''' know that you answered either of those two options before....and will ask you again.
 
{{Information|As always, the customer may receive any future updates of copiable products at any time by visiting a redelivery terminal.}}
 
== <span style="color:#00528c">'''Additional functionality'''</span> ==
 
=== Forced Updates ===
 
There are two options which can be used for forced (compulsory) updates. We highly recommend against forcing your users to update, since it will do nothing but annoy your customers.
 
In the case of combat systems and such, this kind of check should be done '''within the combat system protocol''' and '''NOT''' in the update script, for security reasons!
 
However, if you really want to do it, the two options available in the script are:
 
# '''Mandatory''' - This will continuously offer the customer updates until they accept it (once per minute).
# '''Automatic''' - This will automatically accept the update and deliver it to the customer, without any interaction.
 
=== Script interface ===
----
You can tell the update script to check for an update as follows (available in version 1.2 and above):
 
<syntaxhighlight lang="lsl">llMessageLinked( LINK_THIS, TRUE, "UPDCHK", NULL_KEY );</syntaxhighlight>
 
The "TRUE" parameter tells the script that it's a MANUAL check - so displays chat output. If this is a regular automatic check, you should pass in FALSE.
 
The script will also emit certain linked messages, so other scripts in the object can tell if there's an update:
 
<syntaxhighlight lang="lsl">
//An update is available
llMessageLinked(LINK_SET, -9191, "UPDATE", "");
 
//An update has been requested
llMessageLinked(LINK_SET, -9191, "REQUESTED", "");
 
//You already have the latest version
llMessageLinked(LINK_SET, -9191, "NO_UPDATE", "");
 
//The user has not purchased this item
llMessageLinked(LINK_SET, -9191, "NO_PURCHASE", "");
 
//The object is being destroyed as part of an update(because it's no-copy)
llMessageLinked(LINK_SET, -9191, "DESTROYED", ""); 
</syntaxhighlight>
 
=== Update Check Options ===
----
# '''UpdateCheckHours''' - This configures the script to check for updates at the interval specified (in hours).
# '''CheckOnLongTouch''' - (Version 1.2 and above) - If the user holds down the mouse on the object for longer than 2 seconds, the object will perform an update.
 
=== Debug Mode ===
----
The script will generally remain silent if no updates are found (unless the check is being done in a manual mode, such as after a long-touch event).
 
If there is no result message at all when an update should be sent, check for errors using debug mode:
 
# Temporarily change '''"integer Debug = FALSE"''' to '''"integer Debug = TRUE"''' in the script, in order to receive error messages
# Save, and then try again
# Watch for error messages
 
== <span style="color:#00528c">'''Updating Your Products'''</span> ==


# Remove the old item from your DropBox, and wait for it to update.
# Remove the old item from your DropBox, and wait for it to update.
# Add the updated to your dropbox, and wait for it to update.
# Add the updated version to your dropbox, and wait for it to update.
# Touch the DropBox, go to "Admin", and then follow the URL to take you to the website.
# Touch the DropBox, go to "Admin", and then follow the URL to take you to the website.
# Click "Products" on the left, and then click "edit" next to the product you are updating.
# Click "Products" on the left, and then click "edit" next to the product you are updating.
# Under "Item", you need to change the item to the new version (If the name hasn't changed, then leave as is.)
# Under "Item", you need to change the item to the new version (If the name hasn't changed, then leave as is.)
# Under "Version", give the product a new version.
# Under "Version", give the product a new version number.
# Save the product.
# Save the product.


==Troubleshooting==
=== Update Questions ===
----
: '''Q. If a customer rezzes the an older version of a No-Copy product, will it delete the old version? Does it matter what sim/region the object is in?'''
:: '''A.''' Yes, it will delete the old version. The update is requested from the object that is being updated, so it doesn't matter what sim the object is in. Just make sure that it is configured '''PROPERLY''' before the product is first sold.
 
: '''Q. If a customer buys two (or more) of a No-Copy product, and they trigger an update for each, will they get multiple updates or just one?'''
:: '''A.''' Each separate object makes its own request for an update. So if you have two (or more) products, they will each be able to update independently.
 
== <span style="color:#00528c">'''Sales Statistics'''</span> ==
 
When a product is rezzed that contains the CasperUpdate script, the customer's purchase will turn green in your sales statistics:
 
: [[File:Green.jpg]]
 
In addition, any updates that are delivered will appear in your statistics with a notation for "Update" under the "Net" and "Received" columns. This can be seen in this example:
 
: [[File:CasperUpdate_-_StatsColumn.png]]
 
'''Exception:''' If YOU rez YOUR own product, it will not turn green. It only turns green when a different avatar rezzes the product. If you want to test this, you'll need an alt to rez the product in question with the update script.
 
== <span style="color:#00528c">'''Emergency: Renew / Revoke the API keys'''</span> ==
If all goes well, you should never need to use these options.
 
However, in case one or more products with the the CasperUpdate script accidentally gets out with the script in a visible (modifiable) manner, you have the ability to revoke either the update key associated with that product from the product listing (which will prevent auto-updates for any copies already purchased), or renew the global API key associated with your account from the OVERVIEW tab (which will prevent auto-updates for ANY of your products already purchased).
 
'''Using either of these renew/revoke options means that, at minimum, the next update you send out for your product(s) (or all products if you change the global API key) must be sent manually after you replace the key information in the CasperUpdate script.'''
 
{{Information|All customers will be able to redeliver copiable products '''at any time''' by visiting a redelivery terminal, regardless of whether you've had to revoke or renew the API keys.}}


===Not getting a dialog on rez?===
== <span style="color:#00528c">'''Scripter Questions'''</span> ==
: '''Q. Can I use llSetScriptState to stop/not run the updater script as a means of making a scripted object use less memory?'''
:: '''A1.''' This won't actually give you any real benefit. The "script time" shown by the region is misleading - the script doesn't use any timers. If there are no pending events in the script, the script has zero performance penalty on the region, despite the 0.001ms figure given in the script panel. Basically, the script is inactive anyway.
:: '''A2.''' Yes, but don't reset the script (don't use llResetOtherScript). Instead, use llMessageLinked( LINK_THIS, TRUE, "UPDCHK", NULL_KEY ); to check for an update, once you've reactivated the script.
:: '''A3.''' Resetting the script will cause the script to forget the user's "Don't notify me" preferences.
:: '''A4.''' Resetting the script also makes you run the risk of exceeding our usage limits.
:: '''A5.''' Resetting the script will also reset the "firstContact" flag, which will interfere with the rez indication in the CasperVend statistics.
:: '''A6.''' '''Please don't reset the script.''' :)


Make sure that the product on the website has a different "version" number than is set in the script.
== <span style="color:#00528c">'''FAQ / Troubleshooting'''</span> ==


You can also temporarily change "integer Debug = FALSE" to "integer Debug = TRUE" in order to receive error messages, to make sure that your settings are correct.
:'''Q: "Sorry there was an error contacting the server. Please try again. If the error persists please contact customer support."'''
::'''A:'''Enable "DEBUG" option in the script, and it will tell you the reason when you run it again.

Latest revision as of 00:47, 7 February 2024

THIS IS A STANDALONE PRODUCT! CasperVend is NOT required to use this product

CasperUpdate is a system which allows creators to make self-updating products. Once a product is sold to the customer, the product will check for an update every time it is rezzed (or at specific intervals). If an update is found, the customer is asked if they wish to receive the update (which will be delivered to them).

Don't have it yet? Buy CasperUpdate in-world or on SL Marketplace

Features

  • Completely web networked and automated.
  • No notecards to edit
  • Unintrusive - unlike competing systems, CasperUpdate allows customers to suppress further update notifications.
  • No-copy support - CasperUpdate can securely distribute updates for your no-copy products.
  • Efficient - Just a single script powers our DropBox (Compared to HippoUpdate's 28 script server).
  • Fast - Updates are delivered in a flash.
  • Unlimited number of products supported - Not "almost" limitless, *actually* limitless.
  • Any version format supported, including minor releases, code names and sub-versions.
  • Full statistics and reporting of updates delivered, including CSV export.
  • CasperVend integration - keep track of which products have been rezzed by the customer
  • Communications fully encrypted with SSL
  • A fully redundant, reliable network, as proven by the success of CasperVend itself
  • Free updates for life

Rules

In order to ensure that the service remains available and fast for everyone to use, we have a few limits and rules in place.

  1. The system must ONLY be used for its intended purpose - to provide product updates.
  2. Using the API commands for any other purpose is prohibited and is grounds for service suspension.
  3. Each object may only check for updates - at most - once per hour. Exceeding this limit temporarily (such as for testing purposes) is OK.
  4. The server "rate-limits" requests. See the below section for more information.

Rate Limits

The system will only process:

  1. 1 request per minute per user per product
  2. 5 requests per hour per object
  3. 50 requests per minute per IP address (region)
  4. 100 requests per minute per product
  5. 300 requests per minute per API key

If you are legitimately hitting these limits during normal usage, contact support and we'll look into getting them raised for you.

It is possible to temporarily exceed these limits, due to the nature of our network - for this reason, if you rez 100 objects at the same time, you may still get more than one dialog box.

Let's get started!

The steps you need to follow to get set up with CasperUpdate are as follows:

  1. Account and Product Listing Setup
  2. Adding CasperUpdate to Your Products
  3. Final Checks
  4. Add your items to your DropBox
  5. Test!

Video Tutorial

This video runs about 10 minutes, so settle in and make sure you don't miss anything.

If you don't want to - or can't - view the video, the text instructions begin below this section.

Please note that this video follows a slightly different process than the instructions on this page (Casper places the item into the dropbox BEFORE setting up CasperUpdate, and then replaces it later). Either method will work.

CasperUpdate tutorial video

Account and Product Listing Setup

CasperUpdate uses the CasperVend back end for its functions, so you will still need a CasperVend website account (see the "Set up your account" section below). However, you do not need to own (or use) the vendors because CasperUpdate comes with its own DropBox.

If you have already set up your products in CasperVend, please skip down to the section for Adding CasperUpdate to Your Products.

New User? Set Up Your Account


If nothing happens when you click the shipping crate, or you don't get a popup menu when you click the dropbox, that means your current location does not allow you to run scripts.

If you don't get a "Go to URL" popup, you may have yourself muted - please check your viewer's mute/block list.
  1. Make sure you are on land where YOU can rez objects and run scripts. (Correct group tag, etc.)
  2. Rez the CasperUpdate shipping crate and click it to unpack. Do NOT open manually or your purchase will not properly register!
  3. Choose a suitable place inworld to leave your DropBox. This MUST STAY REZZED AT ALL TIMES so make sure it is someplace where it can stay long-term.
  4. Rez the DropBox. The DropBox will be named something like "CasperTech Dropbox ((version number))"
  5. Click the DropBox. This will bring up a popup menu.
  6. From the popup menu, select "Admin."
  7. This will show you a popup menu asking you to visit a URL. Click Go to URL.
  8. Once you have loaded the website, you may be asked to choose a password. Do this now. If you have previously created an account, you will be asked to enter your password and log in.
  9. If you don't remember your password, you will have a "forgot password" option as long as you arrived via a URL from inworld. (The inworld object acts as identity verification to the website.)
  10. Once successfully logged in, you should be presented with a page titled "Vendors", and you will see a few details about your DropBox.

Add Product Listings


  1. If you have closed the website, touch the DropBox again and choose "Admin"
  2. Follow the link it gives you.
  3. Once the site is open and you've logged in (if necessary), choose "Products" from the website's left side menu.
  4. Repeat the following steps for each product that you wish to use with CasperUpdate.
  5. Click "List New Product" at the top of the page.
  6. Fill out the information about your product.
  7. Most of the settings available to you here are only useful if you use CasperVend, or you plan to. You can ignore them all, except the following::
    • Item - This allows you to choose the item (from your dropbox) that you will deliver to your customers. If you're setting up a brand new product, choose "Don't deliver anything." for now, but remember to come back and select the dropbox item later.
    • Name - This is the name of the product.
    • Price - This isn't used by CasperUpdate, but it's required so that CasperVend merchants don't accidentally give their products away for free!
    • Permissions - The "Copy" tickbox is important. This changes the behaviour of CasperUpdate based on whether your item is copy or no-copy.
    • Version
  8. Click "Save" at the bottom of the product page.

If you are done adding product listings, then you can go to the next sections to get started with adding CasperUpdate to your physical products, checking the settings, and then putting the completed products in the DropBox.

Missing CasperUpdate options?


Not seeing the CasperUpdate options in your product listings?

That's because your purchase of CasperUpdate wasn't properly registered. You will need to rez your CasperUpdate shipping crate on land where YOU can run scripts and click it, in order for your copy of CasperUpdate to be registered to you.

If you've deleted your shipping crate, you can redeliver it from any CasperVend redelivery terminal.

Adding CasperUpdate to Your Products

Repeat the following steps for each product that you wish to use with CasperUpdate.

Make sure you use the correct script! DO NOT drag the
"CasperUpdate No-Copy Protector" script into your object yet!
Using the wrong script may destroy your object!
  1. Rez the product on the ground.
  2. Right click the product, go to "Edit", then switch to the "Contents" tab.
  3. Drag the "CasperUpdate vX.X" script into your object.
  4. Leave the object rezzed and continue with the following steps

Set Permissions


Make certain that you set the correct permissions for both your object and the script inside. Not doing so may result in people being able to obtain your products without paying.

For products with COPY permissions


  • Set "CasperUpdate vX.XX" script permissions to "No Modify" and "No Transfer".
  • Make sure your product object itself is set to "No Transfer".

For products with both COPY and TRANSFER permissions


  • Set "CasperUpdate vX.XX" script permissions to "No Modify" and "No Transfer".

For products with NO COPY permissions


For objects with NO COPY permissions, you MUST set:

  • Set "CasperUpdate vX.XX" script permissions to "No Copy" and "No Modify".
  • Make sure your product object itself is set to "No Copy"and "No Modify".

Adding no-copy protection to no-copy products


Once you have finished editing the script (as described above), and you have confirmed that the script is running, and you have taken a backup copy of your object, then - and ONLY then! - drop the "CasperUpdate No-Copy Protector" script into your object.

DO NOT CHANGE PERMISSIONS FOR THIS SCRIPT - LEAVE THEM AS THEY ARE

For no-copy objects, it is absolutely crucial that you set the product object to "no-modify", and that the "CasperUpdate No-Copy Protector" script stays copiable. If you don't do this, people will be able to effectively make copies of your no-copy item.

Edit Script and Set Options


Inside each of the products, you should now have (at least) a "CasperUpdate v#.##" script. Double click the script in order to open the script editor window.

  1. Add your API key

    On the website, click the "Overview" button around the top left of the page.

    In the "API Configuration" box, you should see a line which reads "Full API Key".

    Your full API key is a 40-character long code which will look something like this:

    1ff379c6a13eb414877b8734781244dbb594e56d

    Look for the following line:

    string APIKey = "";
    

    You need to place your key between the " characters. So, in this case, it will end up look like this:

    string APIKey = "1ff379c6a13eb414877b8734781244dbb594e56d";
    
  2. Add your Product Update Key

    You can find this key by going to the Products section on the website, clicking Edit next to the product you're currently working with, and scrolling down to "Update Key". Click the "Generate Key" button, and then copy the key into the script.

    In my case,

    string ProductUpdateKey = "";
    

    becomes

    string ProductUpdateKey = "dd6ba159a09d3ceea613b5b7c80c01966557204b";
    
  3. Set the version

    The "Version" parameter should be set to the same version that you set on the product's entry in the website.

    For example,

    string Version = "";
    

    might become

    string Version = "1.0 BETA";
    
  4. Save the script

    Click "Save" at the bottom of the script. After a few seconds, you should see "Save complete" at the bottom of the window. If you see something else, check that you have made the edits exactly as described above.

    Make sure the "Running" tickbox at the bottom of the script is CHECKED/TICKED.

Final Checks

Once done, you should check that your settings are correct.

For objects with COPY permissions


  1. Your object should contain the "CasperUpdate v#.##" script, which should be set to "NO MODIFY", "COPY"
  2. If your object is no transfer, then the script should also be set to NO TRANSFER.
  3. The script should contain your API key, the Product Update Key, and the Version, and it should be saved and RUNNING (check the running tickbox at the bottom).

As an additional security feature, for all copiable products tracked through CasperVend only you may tick/check this additional option:

This will ensure that only the people who purchased your product will get the future updates.

As it shows in the picture, do NOT use this option if your product is transferrable, or if you normally sell through a medium that is NOT tracked by CasperVend.

For objects with NO COPY permissions


  1. Your object should contain the "CasperUpdate v#.##" script, which should be set to "NO MODIFY" and "NO COPY".
  2. The script should contain your API key, the Product Update Key, and the Version, and it should be saved and RUNNING (check the running tickbox at the bottom).
  3. Your object should be set to "NO MODIFY" and "NO COPY".
  4. Your object should contain the "CasperUpdate No-Copy Protector" script, which should be set to "NO MODIFY", "COPY", "TRANSFER".

Add your items to your dropbox

Do not drag over any items which show (no transfer) next to them. You cannot send/transfer those to your customers, so they will not work in the DropBox either.

Do NOT delete the DropBox script or your updates will not be sent.
  1. Switch back to Second Life, and right-click the dropbox that you rezzed out.
  2. Choose "Edit".
  3. Click the "Contents" tab in the edit floater. You should see a script with the name CasperTech DropBox".
  4. Drag the products (which you have set up with the CasperUpdate script) from your inventory to the DropBox contents window.
  5. Wait for the DropBox to upload information about the items to our servers.
  6. When finished, DropBox will show hovertext saying "Box is live" when this process is complete, along with the number of items it counts as valid (transferrable) items.
  7. If you chose 'Don't deliver anything.' when setting up your product, or if you replaced an item in the dropbox with a different name, you now need to go back to the website and edit the product you created, and select this item for delivery.

Test!

We recommend that you send a copy of the product to a trusted friend or alt. If set up correctly, they SHOULD NOT receive any notices from the CasperUpdate script, UNTIL you update your product.

You may wish to follow the steps below to test the update process to make sure everything works.

Remember that CasperUpdate will check - by default - on rez, and once per hour for each copy of the product. Update sending will be triggered if the version identifier has changed in any way from what is in the script.

About the update menu


  1. Not Now will wait until the next time a copy of the product is rezzed, and at least 1 hour from that time.
  2. Postpone will wait until the following version is released.
  3. Never will set a flag on the website, so that no matter how many copies are rezzed of that product, the customer never gets an update offer.

"Not Now" and "Postpone" answers are stored in the script - so if you delete the first copy and rez a second copy of the product with the CasperUpdate script, it will not know that you answered either of those two options before....and will ask you again.

As always, the customer may receive any future updates of copiable products at any time by visiting a redelivery terminal.

Additional functionality

Forced Updates

There are two options which can be used for forced (compulsory) updates. We highly recommend against forcing your users to update, since it will do nothing but annoy your customers.

In the case of combat systems and such, this kind of check should be done within the combat system protocol and NOT in the update script, for security reasons!

However, if you really want to do it, the two options available in the script are:

  1. Mandatory - This will continuously offer the customer updates until they accept it (once per minute).
  2. Automatic - This will automatically accept the update and deliver it to the customer, without any interaction.

Script interface


You can tell the update script to check for an update as follows (available in version 1.2 and above):

llMessageLinked( LINK_THIS, TRUE, "UPDCHK", NULL_KEY );

The "TRUE" parameter tells the script that it's a MANUAL check - so displays chat output. If this is a regular automatic check, you should pass in FALSE.

The script will also emit certain linked messages, so other scripts in the object can tell if there's an update:

//An update is available
llMessageLinked(LINK_SET, -9191, "UPDATE", "");

//An update has been requested
llMessageLinked(LINK_SET, -9191, "REQUESTED", "");

//You already have the latest version
llMessageLinked(LINK_SET, -9191, "NO_UPDATE", "");

//The user has not purchased this item
llMessageLinked(LINK_SET, -9191, "NO_PURCHASE", "");

//The object is being destroyed as part of an update(because it's no-copy)
llMessageLinked(LINK_SET, -9191, "DESTROYED", "");

Update Check Options


  1. UpdateCheckHours - This configures the script to check for updates at the interval specified (in hours).
  2. CheckOnLongTouch - (Version 1.2 and above) - If the user holds down the mouse on the object for longer than 2 seconds, the object will perform an update.

Debug Mode


The script will generally remain silent if no updates are found (unless the check is being done in a manual mode, such as after a long-touch event).

If there is no result message at all when an update should be sent, check for errors using debug mode:

  1. Temporarily change "integer Debug = FALSE" to "integer Debug = TRUE" in the script, in order to receive error messages
  2. Save, and then try again
  3. Watch for error messages

Updating Your Products

  1. Remove the old item from your DropBox, and wait for it to update.
  2. Add the updated version to your dropbox, and wait for it to update.
  3. Touch the DropBox, go to "Admin", and then follow the URL to take you to the website.
  4. Click "Products" on the left, and then click "edit" next to the product you are updating.
  5. Under "Item", you need to change the item to the new version (If the name hasn't changed, then leave as is.)
  6. Under "Version", give the product a new version number.
  7. Save the product.

Update Questions


Q. If a customer rezzes the an older version of a No-Copy product, will it delete the old version? Does it matter what sim/region the object is in?
A. Yes, it will delete the old version. The update is requested from the object that is being updated, so it doesn't matter what sim the object is in. Just make sure that it is configured PROPERLY before the product is first sold.
Q. If a customer buys two (or more) of a No-Copy product, and they trigger an update for each, will they get multiple updates or just one?
A. Each separate object makes its own request for an update. So if you have two (or more) products, they will each be able to update independently.

Sales Statistics

When a product is rezzed that contains the CasperUpdate script, the customer's purchase will turn green in your sales statistics:

In addition, any updates that are delivered will appear in your statistics with a notation for "Update" under the "Net" and "Received" columns. This can be seen in this example:

Exception: If YOU rez YOUR own product, it will not turn green. It only turns green when a different avatar rezzes the product. If you want to test this, you'll need an alt to rez the product in question with the update script.

Emergency: Renew / Revoke the API keys

If all goes well, you should never need to use these options.

However, in case one or more products with the the CasperUpdate script accidentally gets out with the script in a visible (modifiable) manner, you have the ability to revoke either the update key associated with that product from the product listing (which will prevent auto-updates for any copies already purchased), or renew the global API key associated with your account from the OVERVIEW tab (which will prevent auto-updates for ANY of your products already purchased).

Using either of these renew/revoke options means that, at minimum, the next update you send out for your product(s) (or all products if you change the global API key) must be sent manually after you replace the key information in the CasperUpdate script.

All customers will be able to redeliver copiable products at any time by visiting a redelivery terminal, regardless of whether you've had to revoke or renew the API keys.

Scripter Questions

Q. Can I use llSetScriptState to stop/not run the updater script as a means of making a scripted object use less memory?
A1. This won't actually give you any real benefit. The "script time" shown by the region is misleading - the script doesn't use any timers. If there are no pending events in the script, the script has zero performance penalty on the region, despite the 0.001ms figure given in the script panel. Basically, the script is inactive anyway.
A2. Yes, but don't reset the script (don't use llResetOtherScript). Instead, use llMessageLinked( LINK_THIS, TRUE, "UPDCHK", NULL_KEY ); to check for an update, once you've reactivated the script.
A3. Resetting the script will cause the script to forget the user's "Don't notify me" preferences.
A4. Resetting the script also makes you run the risk of exceeding our usage limits.
A5. Resetting the script will also reset the "firstContact" flag, which will interfere with the rez indication in the CasperVend statistics.
A6. Please don't reset the script. :)

FAQ / Troubleshooting

Q: "Sorry there was an error contacting the server. Please try again. If the error persists please contact customer support."
A:Enable "DEBUG" option in the script, and it will tell you the reason when you run it again.