|
Bonsoir,
Je t'aide pour le premier script, il s'agit donc de partager le tip entre plusieurs personnes selon un pourcentage. Par contre, la clée des personnes avec qui le partage se fera doit être renseignée sur la base de donnée "w-hat.com" pour que la tipjar fonctionne. Mais en modifiant un peu le script, il doit être possible de renseigner directement les uuid's ou même grâce à une notecard.
Commentaires non traduits.
// lists for names, keys of avatar to split the money with and percentages of split.
list SplitWith = ["Prénom Nom","Prénom Nom"]; // ["etc","etc","etc"]
list SplitPercent = [0.7,0.3]; // [float,float,float] make sure it adds up to 1.0
list SplitKey; // list with keys belonging to names, looked up on "w-hat.com"
integer length; // number of items in lists
integer count; // index#
key name_query; // dataserver query for avatar name to check avatar key.
integer flag = TRUE; // used to stop script on problem with lists.
// CARP Donation box script. Written by Angel Fluffy, with credit to :
// Keknehv Psaltery, jean cook, ama omega, nada epoch, YadNi Monde
// for their work on the "DONATION box" script upon which it was based.
string imtext = "I'm the Dancer's Donation Box! Please right click and pay me to donate, as this supports the __________ project and helps keep the place open for you!";
// this is the text sent to someone who clicks on the prim containing this script and who isn't the owner.
// first line of hover text above box (always constant)
string floaty = "__________ Donation Box\n";
// when total donated this month is less than monthlyneeded, display whatfunding_1 as the funding target,
// when it is more, display whatfunding_2. This allows you to show your donors when you have switched
// from funding your essential running costs to funding expansion.
string whatfunding_1 = "Funding : __________ \n";
string whatfunding_2 = "Funding : __________ \n";
// name of the current month
// we *could* get this automatically, but changing the month automatically isn't as easy as it seems.
// This is a change I might make in a future version.
string thismonth = "October";
// How much are we trying to raise per month?
// The script displays a countdown in SETTEXT above the prim its in, counting down until this target is reached.
// After this target is reached, the countdown disappears, being replaced with a tally.
// The goal of this is to encourage people to donate by setting a clear goal they feel they can help achieve by donating.
integer monthlyneeded = 30000;
// These two variables define the starting numbers for how much has been donated across all time, and how much this month.
// These starting numbers will have the donations the script recieves in between each reset/save added to it,
// and the result displayed in float text over the top of the script.
// The first time you start accepting donations, you should set both of the numbers below to zero.
// When saving this script, you (the object owner) should touch the donation box object,
// which will then tell you how much has been donated in total and how much has been donated this month.
// Entering this information here before saving will allow you to preserve the 'state' of the script across edits/restarts.
integer totaldonated = 0;
integer monthdonated = 0;
// these settings are like the above, but save the 'last donor' information. You can set them to "" and 0 to clear saved info.
string lastdonor = "Taffy Tinlegs";
integer lastdonated = 0;
// this interval defines how long we wait between each reminder to donate broadcast to SAY (range=20m)
integer timer_interval = 3600;
// these settings determine what the 'default' donation amounts are.
// the buttons are the 'fast pay' buttons, the 'payfield' is the default amount in the text box.
list paybuttons = [50,200,400,800];
integer payfield = 100;
// these variables should be left undefined.
string owner;
string otext;
integer mpercent;
integer updatemath() {
float mpercentfloat = ((monthdonated * 100) / monthlyneeded);
mpercent = (integer)mpercentfloat;
return 1;
}
integer updatetext() {
otext = floaty;
if (mpercent >= 100) {
otext += whatfunding_2;
} else {
otext += whatfunding_1;
}
if (lastdonated > 0) {
otext += "Last donation : L$" + (string)lastdonated + " by " + lastdonor +"\n";
}
if (mpercent >= 100) {
otext += "We have raised L$"+(string)(monthdonated - monthlyneeded)+" for this, beyond our basic running costs of L$"+(string)monthlyneeded+" for "+thismonth+". \n";
//otext += "The excess will go towards giving prizes and running special events!";
} else {
otext += "Our donors have contributed "+(string)mpercent+"% of our basic running costs ("+(string)monthdonated+"/"+(string)monthlyneeded+") for "+thismonth+".\n";
}
llSetText(otext,<1,1,1>,1);
return 1;
}
default
{
state_entry()
{
llSetText("TipJar not active. \nTouch to activate.",<.984, .686, .365>,.8);
if(flag) llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
}
run_time_permissions (integer perm)
{
if (perm == PERMISSION_DEBIT) state init;
else llOwnerSay("I need those permissions. Please touch me to try again.");
}
touch_start(integer num_detected){
if (llDetectedKey(0) == llGetOwner()) llResetScript();
else llSay(0,"Only the owner can activate me.");
}
on_rez( integer sparam )
{
llResetScript();
}
}
state init
{
state_entry()
{
llSetText("Initialising....",<.984, .686, .365>,1.0);
flag = TRUE;
length = llGetListLength(SplitWith);
// get avatar keys from webserver at w-hat.com
count = 0; // index# of SplitWith
key Key = llHTTPRequest("http://w-hat.com/name2key?terse=1&name=" + llEscapeURL(llList2String(SplitWith, count)), [], "");
}
http_response(key id, integer status, list metadata, string body) // get avatar keys
{
if (status == 200){
SplitKey += (list)body;
++count;
if (count < length){
key Key = llHTTPRequest("http://w-hat.com/name2key?terse=1&name=" + llEscapeURL(llList2String(SplitWith, count)), [], "");
} else { // check lists on data integrity
if (length != llGetListLength(SplitPercent)){ // check if lists are same length
llOwnerSay("Please check the lists. Each name needs a split percentage.");
flag = FALSE;
} else { // check if sum of percentages is 100% and if there's no NULL_KEY in list
float sum;
integer i;
for (i=0; i<length; ++i){
sum += llList2Float(SplitPercent,i);
if (llList2Key(SplitKey,i) == NULL_KEY){
llOwnerSay(llList2String(SplitWith,i) + "'s key is not in the database at 'w-hat.com'. \nAborting!");
flag = FALSE;
}
}
if (sum != 1){
llOwnerSay("Please check the lists. The percentages do not add up to 100%.");
flag = FALSE;
}
}
if (flag){ // check if found keys belong to respective names
count = 0;
llSetTimerEvent(30);
name_query = llRequestAgentData(llList2Key(SplitKey,count), DATA_NAME);
} else state default;
}
} else {
llOwnerSay("Website for Name2Key is down.\nAborting!");
flag = FALSE;
state default;
}
}
dataserver(key queryid, string data)
{
if (name_query == queryid) { // request agent data to check Name2Key
if (data != llList2String(SplitWith,count)){
llOwnerSay(llList2String(SplitWith,count) + "'s key does not match with name!");
flag = FALSE;
} else if (count < length){
++count;
name_query = llRequestAgentData(llList2Key(SplitKey,count), DATA_NAME);
}
if (flag && count == length) {
llSetTimerEvent(0);
state active; // everything checks out activate tipjar
}
}
}
timer()
{
llSetTimerEvent(0);
llOwnerSay("Something went wrong with the dataserver while looking up '" + llList2String(SplitWith,count) + "' and key '" + llList2String(SplitKey,count) + "' . \nAborting!");
flag = FALSE;
state default;
}
on_rez( integer sparam )
{
llResetScript();
}
}
state active
{
state_entry()
{
updatemath();
updatetext();
owner = llKey2Name( llGetOwner() );
llSetPayPrice(payfield,paybuttons);
llSetTimerEvent(timer_interval);
llSay(0,"Script updated. Usually this is caused by the donation box owner updating the script.");
}
money(key id, integer amount)
{
totaldonated += amount;
monthdonated += amount;
lastdonor = llKey2Name(id);
lastdonated = amount;
updatemath();
updatetext();
llInstantMessage(id,"On behalf of everyone who uses this place, thank you for the donation!");
llSay(0,(string)llKey2Name(id)+" donated L$" + (string)amount + ". Thank you very much for supporting us, it is much appreciated!" );
// split amount among avatars in list
integer i;
for (i=0; i<length; ++i){
llGiveMoney(llList2Key(SplitKey,i), llFloor(amount * llList2Float(SplitPercent,i)));
}
}
touch_start(integer num_detected){
if (llDetectedKey(0) == llGetOwner()) {
llOwnerSay("Reporting script status, because you are recognised as the owner of this donation box.");
llOwnerSay("Current TOTAL donations across all time: L$"+(string)totaldonated);
llOwnerSay("Current TOTAL donations for this month: L$"+(string)monthdonated);
} else {
llInstantMessage(llDetectedKey(0),imtext);
}
}
timer() {
integer premainder = 100 - mpercent;
integer aremainder = monthlyneeded - monthdonated;
if (mpercent < 100) {
llSay(0,"We still need to meet the last "+(string)premainder+"% of our basic costs (L$"+(string)aremainder+") this month, to pay for land tier etc. Please consider donating to help us out!");
}
llSetTimerEvent(timer_interval);
}
on_rez( integer sparam )
{
llResetScript();
}
}
EDIT :
Ou plus simple...
//Generic Tip Jar 1.0 -- 03/07/06
// by Keknehv Psaltery
integer IM = 0; integer WHISPER = 1; integer SAY = 2;
//##########################SET THESE VALUES#########################//
list suggestedTips = [25,50,100,200]; //The "Fast Pay" buttons (enter four values)
integer defaultAmount = 40; //The default amount in the pay dialog
string amountBegin = "L$";
string amountEnd = " has been tipped so far";
string thanksBegin = "Thanks for the tip, "; // Begin + Name + End
string thanksEnd = "!";
//How the script thanks donors
integer thanksMode = WHISPER; //Set this to IM, WHISPER, or SAY to select
vector color = <0.6,0.6,0.6>; //The color for the hover text
float alpha = 1.0; //The transparency for the hover text
key splitKey = "f1f2d29a-210b-4b00-96d7-ab16c962a40f"; //The key of the person to split the money with
float splitPercentage = 0.0; //The percentage for the splittee
// Edit the prim's description -- this goes on the first line of the hovertext
// e.g., the description might be "Keknehv's tip jar, please donate"
//##########################END CONFIGURATION########################//
string description; //This will be set to whatever the Prim's Description is -- not the owner's name
//This means that you probably want to set the description to something like "Keknehv's tip jar, please donate!"
integer totalMoney = 0; //The total amount tipped so far
updateText() //Update the hover text. Placed here for easy modification, not speed
{
llSetText( description + "\n" + amountBegin + (string)totalMoney + amountEnd, color, alpha );
}
default
{
state_entry()
{
splitPercentage /= 100.0;
if ( splitPercentage > 0 )
llRequestPermissions( llGetOwner(), PERMISSION_DEBIT );
else //There's no need to get permissions
state soliciting;
}
touch_start(integer total_number)
{
llRequestPermissions( llGetOwner(), PERMISSION_DEBIT );
}
run_time_permissions( integer perm )
{
if ( perm & PERMISSION_DEBIT )
state soliciting;
}
}
state soliciting //Accepting tips now...
{
state_entry()
{
llSetPayPrice( defaultAmount, suggestedTips );
description = llGetObjectDesc();
updateText();
}
money( key id, integer amount )
{
string donor = llKey2Name( id );
totalMoney += amount;
description = llGetObjectDesc(); //Might as well...
updateText();
if ( splitPercentage > 0 )
llGiveMoney( splitKey, (integer)(amount * splitPercentage) );
if ( thanksMode == 0 )
llInstantMessage( id, thanksBegin + donor + thanksEnd );
else if ( thanksMode == 1 )
llWhisper( 0, thanksBegin + donor + thanksEnd );
else if ( thanksMode == 2 )
llSay( 0, thanksBegin + donor + thanksEnd );
}
}
|