Suggestion Box

Written by Kitsune
// This script transform a prim to a Mail Box.

// Folks can drop notecard to the box.

// Read/unread information is displayed as hovering text.

// You can copy/modify this script, it's totally free.

// --------------------------------------//

// Modified by dakar Muliaina, converted to The king's English

// and a few other enhancements.

//-------------------------------------------//

 

list lMail = [];

// column 1 = notecard name, column 2 = read by user

integer MAIL_UNREADED = 0;

integer MAIL_READED = 1;

integer DIALOG_CHANNEL = 49383;

list DIALOG_CHOICE =

["Unread",

"Read",

"Delete"];

integer nLastCardCount = 0;

integer nLastItemCount = 0;

 

TxtRefresh()

{

// show the unreadable notecard

integer nTotalCard = 0;

integer nNotReaded = 0;

integer nCount = 0;

for (nCount = 0; nCount < llGetListLength(lMail); nCount += 2)

{

if (llList2Integer(lMail, nCount + 1) == MAIL_UNREADED)

nNotReaded += 1;

nTotalCard += 1;

}

 

// total string

string cPost = (string)nTotalCard + " card";

if (nTotalCard > 1) cPost += "s";

cPost += " posted";

 

// unreaded string

string cUnreaded = (string)nNotReaded + " unread";

llSetText("\n" + cPost + "\n" + cUnreaded, <1.95, .75, 0>, 1);

}

 

default

{

state_entry()

{

// Allowing dropping of object

llAllowInventoryDrop(TRUE);

llListen(DIALOG_CHANNEL, "", NULL_KEY, "");

nLastCardCount = llGetInventoryNumber(INVENTORY_ALL);

nLastItemCount = llGetInventoryNumber(INVENTORY_NOTECARD);

 

// Auto complete list

integer nCardCount = llGetInventoryNumber(INVENTORY_NOTECARD);

integer n_CurObj = 0;

string c_Name = "NotEmpty";

while (c_Name != "")

{

c_Name = llGetInventoryName(INVENTORY_NOTECARD, n_CurObj);

n_CurObj += 1;

if (c_Name != "")

{

lMail += [c_Name];

lMail += MAIL_UNREADED;

}

}

TxtRefresh();

}

 

touch_start(integer total_number)

{

//---- Change MY OWNER above to suit your likes and needs. //

// if owner

key id = llDetectedKey(0);
if (id == llGetOwner())

{

// Show a dialog

llDialog(id, "What do you want to do ?", DIALOG_CHOICE,

DIALOG_CHANNEL);

}

}

 

listen(integer channel, string name, key id, string message)

{

if (llGetOwner() == id && llListFindList(DIALOG_CHOICE,

[message]) != -1)

{

integer i;

string cName;

list lRemove;

integer nStatus;

for (i = 0; i < llGetListLength(lMail); i += 2)

{

cName = llList2String(lMail, i);

nStatus = llList2Integer(lMail, i + 1);

if (message == llList2String(DIALOG_CHOICE, 0)

&& nStatus == MAIL_UNREADED)

{

// open un-readed

llGiveInventory(id, cName);

// mark for readed

lMail = llListReplaceList(lMail, [MAIL_READED],

i + 1, i + 1);

}

if (message == llList2String(DIALOG_CHOICE, 1)

&& nStatus == MAIL_READED)

{

// open readed

llGiveInventory(id, cName);

}

if (message == llList2String(DIALOG_CHOICE, 2)

&& nStatus == MAIL_READED)

{

// delete readed

llSay(0, cName);

llRemoveInventory(cName);

lRemove += i;

}

}

// remove from the list

if (llGetListLength(lRemove) > 0)

{

integer k;

for (k = 0; k < llGetListLength(lRemove); k++)

{

i = llList2Integer(lRemove, k);

lMail = llDeleteSubList(lMail, i, i+1);

}

}

TxtRefresh();

}

}

 

changed(integer change)

{

// dont accept other than a notecard

integer nItemCount = llGetInventoryNumber(INVENTORY_ALL);

if (nItemCount < 2)

{

// clear the list

lMail = [];

}

 

if (nItemCount != nLastItemCount)

{

// delete other item type than notecard

string cName = "NotEmpty";

integer nCurObj = 0;

integer nObjType = INVENTORY_NONE;

list lRemove = [];

while (cName != "")

{

cName = llGetInventoryName(INVENTORY_ALL, nCurObj);

nCurObj += 1;

nObjType = llGetInventoryType(cName);

if (nObjType != INVENTORY_NOTECARD)

{

// add for deletion, its not a notecard

lRemove += cName;

}

}

 

// delete other object than notecard

integer nD = 0;

for (nD = 0; nD < llGetListLength(lRemove); nD += 1)

{

// dont remove this script !

cName = llList2String(lRemove, nD);

if (cName != llGetScriptName() && cName != "")

{

llSay(0, "Sorry but " + cName + " is not a notecard.");

llRemoveInventory(cName);

}

}

 

// search for a new notecard

integer n_CurObj = 0;

string c_Name = "NotEmpty";

while (c_Name != "")

{

c_Name = llGetInventoryName(INVENTORY_NOTECARD, n_CurObj);

llSay(0, c_Name);

n_CurObj += 1;

// search for this card

if (llListFindList(lMail, [c_Name]) == -1 && c_Name != "")

{

// ok its a new card

lMail += [c_Name];

lMail += MAIL_UNREADED;

llSay(0, c_Name + " added to the mailbox.");

}

}

}

nLastItemCount = llGetInventoryNumber(INVENTORY_ALL);

nLastCardCount = llGetInventoryNumber(INVENTORY_NOTECARD);

// refresh the text

TxtRefresh();

}

}