Code:
// Part of Intercom Chat Relay (1/3)
// Original Idea from Kira Komarov
// Rewritten by Rebbeka Revnik
// Funktion:
// Gibt den öffentlichen Chat von anderen URL Relays aus (nur von Avas)
// Funktioniert auch über Sim- und Grid-Grenzen
// Dazu gehören die Skripte url relay, message relay, chat plugin
// Diese müssen alle in ein Objekt, eventuell noch die access Notecard dazu
// Wie es funktioniert:
// Intercom Passwort
// 1. Denk dir ein Passwort aus oder...
// 2.1. Geh auf die Seite http://www.md5hashgenerator.com/index.php
// 2.2. Lass dir da eine Hash Summe generieren, die du als Passwort benutzt
// 3. Trage das Passwort unten bei INTERCOM_PASSWORD zwischen die Anführungsstriche ein
// 4. Nur die URL Relays mit dem gleichen Passwort können miteinander kommunizieren
// Also kann man auch mehrere Systeme parallel betreiben, wenn sie über unterschiedliche Passwörter verfügen
// Zugang:
// 1. Erstelle eine NC namens access
// 2. Trage da die Namen ein die das URL Relay bedienen dürfen
// 3. Lege sie in das Objekt mit den Skripten
// 4. Das sollte man tun bevor die URLs eingetragen/abgerufen wurden, sonst darf man alles nochmal machen, weil dadurch das Skript zurück gesetzt wird
// Standardmässig hat nur der Eigentümer Zugriff
// URLs:
// 1. Jedes URL Relay erhält beim Rezzen/Sim-Restart/Sim-Wechsel automatisch eine neue URL
// 2. Diese URLs müssen bei jedem URL Relay durch Anklicken und My URL abgerufen werden
// 3. Ein URL Relay (es reicht eins) erhält nun die URLs der anderen durch Anklicken und Add URL
// 4. Nach einer Weile (SYNC_TIME * Anzahl der URL Relays) bekommen diese URLs auch die anderen Relays
// 5. Das wirkt auch bei Rezzen/Sim-Restart/Sim-Wechsel, aber nicht bei Ändern/Zurücksetzen des Skripts
// Dann muss die URL erneut aufgenommen und eingetragen werden
// Falls es das Relay war wo alle anderen URLs eingetragen wurden, muss man Punkt 2 und 3 wiederholen
// Chat:
// 1. Das Chat Plugin nimmt den Chat auf
// Falls es sich nicht um Objekte handelt sendet es den Chat an das URL Relay
// /me wird dabei in den Namen umgewandelt
// 2. Das URL Relay sendet den Chat an das das Message Relay, zusammen mit den gespeicherten URLs ausser der eigenen
// 3. Das Message Relay sendet nun den Chat an alle übergebenen URLs
// 4. Jedes angeschlossene URL Relay gibt den Chat aus, ohne den Objekt-Namen davor
// Aber nur falls es auch eingeschaltet ist, standardmässig ist es Off
// Hinweis: Im OS muss möglicherweise die OpenSim.ini geändert werden
// Dazu muss im Abschnitt [Network] in der Zeile
// user_agent = "OpenSim LSL (Mozilla Compatible)"
// das führende Semikolon entfernt und die Sim neu gestartet werden
string INTERCOM_PASSWORD = "";
string NCNAME = "access";
// Language = 0 German/Deutsch
// Language = 1 English/Englisch
integer Language = 0;
integer SYNC_TIME = 10;
integer BROADCAST = 1000;
integer SEND = 1001;
string MyURL;
list URLs;
list URLs1;
list URLs2;
integer IntercomOn;
key User;
list Access;
integer NCLine;
key NCid;
integer Listener;
integer Handle;
Menu()
{
string s = "Options description:\n\nAdd URL: Use this to add new Intercoms.\n"
+ "My URL: Use this to get the address of this Intercom.\n"
+ "List URLs: Use this to list all the linked intercoms.\n"
+ "Reset: Use this to permanently reset the current Intercom since resetting "
+ "maybe it looses the contact to other Intercoms.\n"
+ "On/Off: This will turn the intercom on and off. It will remain connected "
+ "to the network but will not receive or broadcast messages.";
string s1 = "Beschreibung der Optionen\n\nAdd URL: URLs von anderen Intercoms hinzufügen\n"
+ "My URL: Ruft die eigene URL ab\n"
+ "List URLs: Listet alle verbundenen Intercom-URLs auf\n"
+ "Reset: Setzt das Intercom zurück "
+ "und kann dadurch den Kontakt zu anderen Intercoms verlieren\n"
+ "On/Off: Schaltet das Intercom ein/aus, bleibt aber verbunden, "
+ "sendet oder empfängt aber keine Nachrichten mehr";
list l = ["Add URL", "My URL", "List URLs", "Reset", "On", "Off"];
integer Channel = (integer)llFrand(99999) + 999;
Listener = llListen(Channel, "", User, "");
if(Language == 1) llDialog(User, s, l, Channel);
else llDialog(User, s1, l, Channel);
}
NewURL()
{
integer x = llListFindList(URLs, [MyURL]);
if(x != -1) URLs = llDeleteSubList(URLs, x, x);
x = llListFindList(URLs1, [MyURL]);
if(x != -1) URLs1 = llDeleteSubList(URLs1, x, x);
x = llListFindList(URLs2, [MyURL]);
if(x != -1) URLs2 = llDeleteSubList(URLs2, x, x);
llReleaseURL(MyURL);
MyURL = "";
llRequestURL();
}
Say(string s)
{
string s1 = llGetObjectName();
integer x = llSubStringIndex(s, " ");
if(x != -1)
{
string s2 = llGetSubString(s, 0, x - 1);
s = llDeleteSubString(s, 0, x -1);
s = "/me" + s;
llSetObjectName(s2);
}
llSay(0, s);
llSetObjectName(s1);
}
integer HasAccess(key k)
{
if(k == llGetOwner()) return TRUE;
string s = llKey2Name(k);
if(llListFindList(Access, [s]) != -1) return TRUE;
return FALSE;
}
default
{
on_rez(integer param)
{
NewURL();
}
changed(integer change)
{
if (change & (CHANGED_REGION_START | CHANGED_REGION)) NewURL();
if(change & CHANGED_INVENTORY) llResetScript();
}
state_entry()
{
IntercomOn = FALSE;
NewURL();
llSetTimerEvent(SYNC_TIME);
NCLine = 0;
if(llGetInventoryType(NCNAME) == INVENTORY_NOTECARD) NCid = llGetNotecardLine(NCNAME, NCLine++);
}
http_request(key id, string method, string body)
{
if (method == URL_REQUEST_GRANTED)
{
MyURL = body;
URLs += [body];
return;
}
if (method == URL_REQUEST_DENIED)
{
NewURL();
return;
}
if (method == "POST")
{
list l = llParseString2List(body, [" "], [""]);
if(llList2String(l, 1) != INTERCOM_PASSWORD) return;
if(llListFindList(URLs, [llList2String(l, 0)]) != -1) return;
URLs += [llList2String(l, 0)];
llHTTPResponse(id, 200, "OK");
return;
}
if (method == "PUT")
{
if (!IntercomOn) return;
Say(body);
llHTTPResponse(id, 200, "OK");
return;
}
}
http_response(key id, integer status, list metadata, string body)
{
if (status >= 400 && status <= 404)
{
integer i;
for(i = 0; i < llGetListLength(URLs); i++)
{
if (llSubStringIndex(body, llList2String(URLs, i)) != -1) URLs = llDeleteSubList(URLs, i, i);
}
for(i = 0; i < llGetListLength(URLs1); i++)
{
if (llSubStringIndex(body, llList2String(URLs1, i)) != -1) URLs1 = llDeleteSubList(URLs1, i, i);
}
for(i = 0; i < llGetListLength(URLs2); i++)
{
if (llSubStringIndex(body, llList2String(URLs2, i)) != -1) URLs2 = llDeleteSubList(URLs2, i, i);
}
}
}
link_message(integer sender_num, integer num, string str, key id)
{
if (!IntercomOn || num != BROADCAST) return;
integer x = llListFindList(URLs, [MyURL]);
list l = llDeleteSubList(URLs, x, x);
if (llGetListLength(l) == 0) return;
llMessageLinked(LINK_THIS, SEND, llList2CSV(l), str);
}
timer()
{
llSetTimerEvent((float)FALSE);
if (llGetListLength(URLs1) == 0)
{
URLs1 = URLs;
URLs2 = llDeleteSubList(URLs2, 0, 0);
}
if (llGetListLength(URLs2) == 0)
{
URLs2 = URLs;
}
if(llList2String(URLs1, 0) != "" && llList2String(URLs2, 0) != "")
{
llHTTPRequest(llList2String(URLs1, 0),
[HTTP_METHOD, "POST"],
llList2String(URLs2, 0) + " " + INTERCOM_PASSWORD);
}
URLs1 = llDeleteSubList(URLs1, 0, 0);
llSetTimerEvent(SYNC_TIME);
}
dataserver(key requested, string data)
{
if(requested == NCid)
{
if(data != EOF)
{
data = llStringTrim(data, STRING_TRIM);
if(data != "") Access += [data];
NCid = llGetNotecardLine(NCNAME, NCLine++);
}
}
}
listen(integer channel, string name, key id, string message)
{
llListenRemove(Listener);
llListenRemove(Handle);
if(message == "On")
{
IntercomOn = TRUE;
if(Language == 1) llInstantMessage(id, "Intercom is now: ON");
else llInstantMessage(id, "Intercom ist nun: AN");
return;
} else if(message == "Off")
{
IntercomOn = FALSE;
if(Language == 1) llInstantMessage(id, "Intercom is now: OFF");
else llInstantMessage(id, "Intercom ist nun: AUS");
return;
} else if(message == "My URL")
{
if (MyURL == "")
{
if(Language == 1) llInstantMessage(id, "I don't have an URL registered yet.");
else llInstantMessage(id, "Ich habe noch keine registrierte URL.");
return;
}
if(Language == 1) llInstantMessage(id, "My URL is: " + MyURL);
else llInstantMessage(id, "Meine URL lautet: " + MyURL);
} else if(message == "Add URL")
{
if(Language == 1)
{
llInstantMessage(id, "Please paste an URL on channel " + (string)89
+ " in order to register it with the system by typing:\n/" + (string)89
+ " URL\nWhere URL is the URL of another intercom.");
} else
{
llInstantMessage(id, "Bitte kopiere eine URL auf Kanal " + (string)89
+ ", um die URL im System zu registrieren. Tippe dazu \n/" + (string)89
+ " URL\n wobei URL die URL eines anderen Intercoms ist.");
}
Handle = llListen(89, "", id, "");
return;
} else if(message == "List URLs")
{
if(llGetListLength(URLs) == 0)
{
if(Language == 1) llInstantMessage(id, "No URLs registered.");
else llInstantMessage(id, "Es sind keine URLs registriert.");
return;
}
integer i;
for(i = 0; i < llGetListLength(URLs); i++) llSay(0, llList2String(URLs, i));
return;
} else if(message == "Reset")
{
llSetTimerEvent(0);
llResetScript();
return;
} else if(channel == 89)
{
message = llStringTrim(message, STRING_TRIM);
if(message == "") return;
if(llListFindList(URLs, [message]) != -1)
{
if(Language == 1) llInstantMessage(id, "URL already exists.");
else llInstantMessage(id, "Dies URL gibt es bereits.");
return;
}
URLs += [message];
if(Language == 1) llInstantMessage(id, "URL: " + message + " has been registered.");
else llInstantMessage(id, "URL: " + message + " wurde registriert.");
return;
}
}
touch_start(integer total_number)
{
User = llDetectedKey(0);
if(HasAccess(User)) Menu();
}
}