GridTalk.de

Normale Version: Intercom - neu
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Auf vielfachen Wunsch eines einzelnen Herren Big Grin hier mal die 3 Skripte, die für ein gridübergreifendes Chatsystem nötig sind. Als Basis diente das Intercom von Kira Komarov, leider ist das fehlerhaft so dass ichs umgeschrieben hab. Steht eigenlich alles im Skript drin, ansonsten einfach fragen :-)

EDIT: Hatte leider noch eine Zeile auskommentiert, nun ist es besser.
EDIT2: Löschen von ungültigen URLs korrigiert, leider mit minderem Erfolg. Siehe Script-Forum.

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();
    }
}