Difference between revisions of "User:Kireji Haiku/SIMchat headset"
Kireji Haiku (talk | contribs) (this was necessary! phew) |
Kireji Haiku (talk | contribs) |
||
Line 10: | Line 10: | ||
This script is being provided "as is". It's been thoroughly tested in May 2010. | This script is being provided "as is". It's been thoroughly tested in May 2010. | ||
If you want to use it, you should drop it into a <font color="red">childprim</font> of a linkset | If you want to use it, you should drop it into a <font color="red">childprim</font> of a linkset. This setup will give you the possibilty to forward your chat on a certain channel <font color="red">within</font> the whole region your are in and <font color="red">encrypt</font> it. Just make sure anybody you want to talk to has the same variables as you do. | ||
You can turn off the SIMchat function (if you are being spammed on that channel...you could of course change the channel, too), get a SLURL to your current location, get the current count of avatars within the region or get a quick reminder of the currently-used-channel and a howto <font color="red">by touching the childprim</font> containing this script | You can turn off the SIMchat function (if you are being spammed on that channel...you could of course change the channel, too), get a SLURL to your current location, get the current count of avatars within the region or get a quick reminder of the currently-used-channel and a howto <font color="red">by touching the childprim</font> containing this script. | ||
Line 18: | Line 18: | ||
[http://wiki.secondlife.com/wiki/User:Kireji_Haiku/SIMchat_headset Go to top!] | [http://wiki.secondlife.com/wiki/User:Kireji_Haiku/SIMchat_headset Go to top!] | ||
<lsl> | <lsl> | ||
string ProtocolSignature; | string ProtocolSignature = "ENC";//your signature | ||
float ProtocolVersion; // can range from 0.0 to 255.255 | float ProtocolVersion = 0.3; // can range from 0.0 to 255.255 | ||
string Password; | string Password = "P@ssw0rd";//your password | ||
integer communicationsChannel; | integer communicationsChannel = 9;//the channel you use for communication | ||
integer mChannel = 8989;//channel for dialog-menu | |||
string strHex = "0123456789ABCDEF";//hex-password | |||
//############################################################################## | |||
//do not change anything below if you are not 100% sure about what you are doing | |||
//############################################################################## | |||
string Header; | string Header; | ||
integer Debug = TRUE; | |||
integer Debug; | |||
integer listener; | integer listener; | ||
integer gListenID = -1; | integer gListenID = -1; | ||
Line 32: | Line 41: | ||
key user; | key user; | ||
list mainmenu = ["RegionCount","SLURL","SIMchatOFF","Chat info","Chat howto"]; | list mainmenu = ["RegionCount","SLURL","SIMchatOFF","Chat info","Chat howto"]; | ||
string Name; | string Name; | ||
string SLURL; | string SLURL; | ||
Line 41: | Line 49: | ||
"; | "; | ||
string menu_info_2 = "Choose one of the following."; | string menu_info_2 = "Choose one of the following."; | ||
string prim_name; | string prim_name; | ||
string prim_desc; | string prim_desc; | ||
Line 50: | Line 57: | ||
list target_parameters=[]; | list target_parameters=[]; | ||
string error(string message) | |||
{ | { | ||
if(Debug) llSay(DEBUG_CHANNEL, message); | if(Debug) llSay(DEBUG_CHANNEL, message); | ||
Line 133: | Line 63: | ||
} | } | ||
string | string decrypt(string password, string message) | ||
{ | { | ||
integer signatureLength = llStringLength(ProtocolSignature); | integer signatureLength = llStringLength(ProtocolSignature); | ||
Line 151: | Line 81: | ||
string oneTimePad = llMD5String(password, nonce); | string oneTimePad = llMD5String(password, nonce); | ||
while(llStringLength(oneTimePad) < (llStringLength(message) / 2 * 3)) | while(llStringLength(oneTimePad) < (llStringLength(message) / 2 * 3)) | ||
oneTimePad += llMD5String(oneTimePad, nonce); | |||
oneTimePad = llStringToBase64(oneTimePad); | oneTimePad = llStringToBase64(oneTimePad); | ||
message = llXorBase64StringsCorrect(message, oneTimePad); | message = llXorBase64StringsCorrect(message, oneTimePad); | ||
Line 162: | Line 92: | ||
} | } | ||
string | string hex(integer value) | ||
{ | { | ||
integer digit = value & 0xF; | integer digit = value & 0xF; | ||
Line 180: | Line 110: | ||
} | } | ||
string | string encrypt(string password, string message) | ||
{ | { | ||
integer nonce = (integer)llFrand(0x7FFFFFFF); | integer nonce = (integer)llFrand(0x7FFFFFFF); | ||
Line 213: | Line 143: | ||
default | default | ||
{ | { | ||
state_entry() | state_entry() | ||
Line 296: | Line 160: | ||
llSetObjectDesc(prim_desc); | llSetObjectDesc(prim_desc); | ||
particle_parameters = [ | particle_parameters = [ | ||
PSYS_PART_START_SCALE,<0.02,0.02,FALSE>,PSYS_PART_END_SCALE,<0.5,0.5, FALSE>, | PSYS_PART_START_SCALE, <0.02, 0.02, FALSE>, PSYS_PART_END_SCALE, <0.5,0.5, FALSE>, | ||
PSYS_PART_START_COLOR,<0.94118,0.00000,0.23529>,PSYS_PART_END_COLOR,<1,0,0>, | PSYS_PART_START_COLOR, <0.94118, 0.00000, 0.23529>, PSYS_PART_END_COLOR, <1,0,0>, | ||
PSYS_PART_START_ALPHA,(float)0.5,PSYS_PART_END_ALPHA,(float)0.0, | PSYS_PART_START_ALPHA, (float) 0.5, PSYS_PART_END_ALPHA, (float) 0.0, | ||
PSYS_SRC_BURST_PART_COUNT,(integer)4, | PSYS_SRC_BURST_PART_COUNT, (integer) 4, | ||
PSYS_SRC_BURST_RATE,(float)7.5, | PSYS_SRC_BURST_RATE, (float) 7.5, | ||
PSYS_PART_MAX_AGE,(float)0.5, | PSYS_PART_MAX_AGE, (float) 0.5, | ||
PSYS_SRC_PATTERN,(integer)1, | PSYS_SRC_PATTERN, (integer) 1, | ||
PSYS_PART_FLAGS,(integer)(0 |PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_FLAGS, (integer) ( 0 | ||
| PSYS_PART_INTERP_COLOR_MASK | |||
| PSYS_PART_INTERP_SCALE_MASK | |||
| PSYS_PART_EMISSIVE_MASK | |||
| PSYS_PART_FOLLOW_SRC_MASK | |||
| PSYS_PART_TARGET_POS_MASK | |||
) | |||
]; | |||
if ( AUTO_START ) llParticleSystem( particle_parameters ); | if ( AUTO_START ) llParticleSystem( particle_parameters ); | ||
} | } | ||
Line 330: | Line 199: | ||
touch_start(integer total_number) | touch_start(integer total_number) | ||
{ | { | ||
user = llDetectedKey(0); | |||
llDialog(user, menu_info_1 + menu_info_2,mainmenu,mChannel); | |||
llListen(mChannel,llKey2Name(user),user,""); | |||
} | } | ||
Line 349: | Line 215: | ||
Y = (integer)Where.y; | Y = (integer)Where.y; | ||
Z = (integer)Where.z; | Z = (integer)Where.z; | ||
SLURL = "SLURL for this location is: | SLURL = "SLURL for this location is:\n" + "http://slurl.com/secondlife/" + Name + "/" + (string)X + "/" + (string)Y + "/" + (string)Z + "/"; | ||
llSay(0, SLURL); | llSay(0, SLURL); | ||
return; | return; | ||
Line 365: | Line 231: | ||
if(message=="Chat howto") | if(message=="Chat howto") | ||
{ | { | ||
llOwnerSay("Type in local chat: /" + (string)communicationsChannel + " ... | llOwnerSay("Type in local chat: /" + (string)communicationsChannel + " ... | ||
For example: /" + (string)communicationsChannel + " hello, my name is Nick. | |||
Everybody in the same SIM using this SIMchat function on channel " + (string)communicationsChannel + " will be able to read what you write. | |||
Remember to use channel" + (string)communicationsChannel + "for anything you want to write with this SIMchat-tool. Local chat is limited to 20m radius."); | |||
return; | return; | ||
} | } | ||
Line 408: | Line 277: | ||
{ | { | ||
llOwnerSay("SIMchat back online! Touch headset for further informations."); | llOwnerSay("SIMchat back online! Touch headset for further informations."); | ||
state | state default; | ||
} | } | ||
} | } | ||
Line 417: | Line 286: | ||
} | } | ||
} | } | ||
</lsl> | </lsl> |
Revision as of 22:48, 27 May 2010
Help Portal: |
Avatar | Bug Fixes | Communication | Community | Glossary | Land & Sim | Multimedia | Navigation | Object | Video Tutorials | Viewer | Wiki | Misc |
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
SIMchat headset
SCRIPT:
This script is being provided "as is". It's been thoroughly tested in May 2010.
If you want to use it, you should drop it into a childprim of a linkset. This setup will give you the possibilty to forward your chat on a certain channel within the whole region your are in and encrypt it. Just make sure anybody you want to talk to has the same variables as you do.
You can turn off the SIMchat function (if you are being spammed on that channel...you could of course change the channel, too), get a SLURL to your current location, get the current count of avatars within the region or get a quick reminder of the currently-used-channel and a howto by touching the childprim containing this script.
Go to top! <lsl> string ProtocolSignature = "ENC";//your signature float ProtocolVersion = 0.3; // can range from 0.0 to 255.255 string Password = "P@ssw0rd";//your password integer communicationsChannel = 9;//the channel you use for communication integer mChannel = 8989;//channel for dialog-menu string strHex = "0123456789ABCDEF";//hex-password
//############################################################################## //do not change anything below if you are not 100% sure about what you are doing //##############################################################################
string Header;
integer Debug = TRUE;
integer listener;
integer gListenID = -1;
integer X;
integer Y;
integer Z;
key user;
list mainmenu = ["RegionCount","SLURL","SIMchatOFF","Chat info","Chat howto"];
string Name;
string SLURL;
string menu_info_1 = "
This popup shows up because you touched your SIMchat headset.
";
string menu_info_2 = "Choose one of the following."; string prim_name; string prim_desc; vector Where; string CONTROLLER_ID = "A"; integer AUTO_START = TRUE; list particle_parameters=[]; list target_parameters=[];
string error(string message) {
if(Debug) llSay(DEBUG_CHANNEL, message); return "";
}
string decrypt(string password, string message) {
integer signatureLength = llStringLength(ProtocolSignature); integer headerLength = signatureLength + 12; if(llStringLength(message) < signatureLength + 44) return error("Too small for secret message."); if(llSubStringIndex(message, ProtocolSignature) != 0) return error("Unknown protocol."); integer index = signatureLength; string major = "0x" + llGetSubString(message, index, ++index); string minor = "0x" + llGetSubString(message, ++index, ++index); float version = (float)((string)((integer)major) + "." + (string)((integer)minor)); if(version != ProtocolVersion) return error("Unknown version."); integer nonce = (integer)("0x" + llGetSubString(message, ++index, index + 7)); message = llGetSubString(message, headerLength, -1); string oneTimePad = llMD5String(password, nonce); while(llStringLength(oneTimePad) < (llStringLength(message) / 2 * 3)) oneTimePad += llMD5String(oneTimePad, nonce); oneTimePad = llStringToBase64(oneTimePad); message = llXorBase64StringsCorrect(message, oneTimePad); message = llBase64ToString(message); string digest = llGetSubString(message, 0, 31); message = llGetSubString(message, 32, -1); if(llMD5String(message, nonce) != digest) return error("Message digest was not valid."); return message;
}
string hex(integer value) {
integer digit = value & 0xF; string text = llGetSubString(strHex, digit, digit); value = (value >> 4) & 0xfffFFFF; integer odd = TRUE; while(value) { digit = value & 0xF; text = llGetSubString(strHex, digit, digit) + text; odd = !odd; value = value >> 4; } if(odd) text = "0" + text; return text;
}
string encrypt(string password, string message) {
integer nonce = (integer)llFrand(0x7FFFFFFF); message = llMD5String(message, nonce) + message; string oneTimePad = llMD5String(password, nonce); integer count = (llStringLength(message) - 1) / 32; if(count) do oneTimePad += llMD5String(oneTimePad, nonce); while(--count); return Header + llGetSubString("00000000" + hex(nonce), -8, -1) + llXorBase64StringsCorrect(llStringToBase64(message), llStringToBase64(oneTimePad));
}
init1() {
list versions = llParseString2List((string)ProtocolVersion, ["."], []); string minor = llList2String(versions, 1); integer p = 0; while(llGetSubString(minor, --p, p) == "0"); Header = ProtocolSignature + hex(llList2Integer(versions, 0)) + hex((integer)llGetSubString(minor, 0xFF000000, p));
}
init2() {
if(listener != 0) { llListenRemove(listener); listener = 0; } listener = llListen(communicationsChannel, "", NULL_KEY, "");
}
default {
state_entry() { llListenRemove(gListenID); gListenID = llListen(communicationsChannel, "", "", ""); init1(); init2(); llOwnerSay(" Initialisation complete! SIMchat online! Type /" + (string)communicationsChannel + " and then your message to talk to people that have their channel set the same. Touch headset for options."); prim_name = "SIMchat(" + llKey2Name(llGetOwner()) + ")"; prim_desc = "Last reset was: " + llGetTimestamp(); llSetObjectName(prim_name); llSetObjectDesc(prim_desc); particle_parameters = [ PSYS_PART_START_SCALE, <0.02, 0.02, FALSE>, PSYS_PART_END_SCALE, <0.5,0.5, FALSE>, PSYS_PART_START_COLOR, <0.94118, 0.00000, 0.23529>, PSYS_PART_END_COLOR, <1,0,0>, PSYS_PART_START_ALPHA, (float) 0.5, PSYS_PART_END_ALPHA, (float) 0.0, PSYS_SRC_BURST_PART_COUNT, (integer) 4, PSYS_SRC_BURST_RATE, (float) 7.5, PSYS_PART_MAX_AGE, (float) 0.5, PSYS_SRC_PATTERN, (integer) 1, PSYS_PART_FLAGS, (integer) ( 0 | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_EMISSIVE_MASK
| PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_TARGET_POS_MASK ) ];
if ( AUTO_START ) llParticleSystem( particle_parameters ); }
on_rez(integer start_param) { init1(); init2(); llResetScript(); }
attach(key id) { if (id) { llOwnerSay("Headset has been reset."); llResetScript(); }
}
touch_start(integer total_number) { user = llDetectedKey(0); llDialog(user, menu_info_1 + menu_info_2,mainmenu,mChannel); llListen(mChannel,llKey2Name(user),user,""); }
listen(integer channel, string name, key id, string message) { if(id==user) { if(message=="SLURL") { Name = llGetRegionName(); Where = llGetPos(); X = (integer)Where.x; Y = (integer)Where.y; Z = (integer)Where.z; SLURL = "SLURL for this location is:\n" + "http://slurl.com/secondlife/" + Name + "/" + (string)X + "/" + (string)Y + "/" + (string)Z + "/"; llSay(0, SLURL); return; } if(message=="SIMchatOFF") { state sleeping; return; } if(message=="Chat info") { llOwnerSay("Type /" + (string)communicationsChannel + " and then your message to talk to people that have their channel set the same."); return; } if(message=="Chat howto") { llOwnerSay("Type in local chat: /" + (string)communicationsChannel + " ... For example: /" + (string)communicationsChannel + " hello, my name is Nick. Everybody in the same SIM using this SIMchat function on channel " + (string)communicationsChannel + " will be able to read what you write. Remember to use channel" + (string)communicationsChannel + "for anything you want to write with this SIMchat-tool. Local chat is limited to 20m radius."); return; } if(message=="RegionCount") { llOwnerSay(" Region count is now:" + (string)llGetRegionAgentCount()); return; } else { //do nothing } } if (channel == communicationsChannel) { if (id == llGetOwner()) { llRegionSay(communicationsChannel, encrypt(Password, message)); llOwnerSay("You said: " + message); } if (llGetAgentSize(id) == ZERO_VECTOR) { string message = decrypt(Password, message); llOwnerSay((string)name + " said: " + (string)message); } } }
}
state sleeping {
state_entry() { llOwnerSay("SIMchat offline! Touch headset to go back online."); particle_parameters = []; if ( AUTO_START ) llParticleSystem( particle_parameters ); }
touch_start(integer n) { if (llDetectedKey(0) == llGetOwner()) { llOwnerSay("SIMchat back online! Touch headset for further informations."); state default; } }
on_rez(integer start_param) { llResetScript(); }
} </lsl>