<?xml version="1.0" encoding="iso-8859-2"?>
<?xml-stylesheet type="text/xsl" href="lua.xsl"?>

<reference>

<group name="Funkcje w pliku main.lua">
	<func name="registerHandler">
		<param name="type">Rodzaj zdarzenia: &quot;openChat&quot;, &quot;sendMsg&quot;, &quot;recvMsg&quot;, &quot;fmtMsgTxt&quot; lub &quot;uninit&quot;.</param>
		<param name="func">Funkcja do obsługi zdarzenia.</param>
		<desc>Rejestruje funkcję handler-a do obsługi zadanego zdarzenia.</desc>
		<rem>
			Obecnie wszystkie skrypty w Unicomie są tworzone zgodnie z pewnym modelem, który zakłada, że:<br />
			<ul>
				<li>Dołączenie nowego skryptu do całości systemu sprowadza się do dopisania linijki
				<i>include (&quot;nowy_skrypt.lua&quot;)</i> do
				pliku <u>main.lua</u>.</li>
				<li>Inicjalizacja skryptu odbywa się z chwilą wywołania tegoż <i>include()</i>'a, a więc
				kod inicjalizujący musi znajdować się bezpośrednio w pliku LUA, nie zamknięty w żadnej
				funkcji.</li>
				<li>Skrypty komunikują się z programem poprzez system <i>handler</i>'ów, które
				muszą być zarejestrowane właśnie przy użyciu funkcji <b>registerHandler</b>.
				<i>Handler</i> jest wywoływany z chwilą wystąpienia zdarzenia do obsługi którego
				został zarejestrowany.</li>
			</ul>
			Konstrukcja handler'a zależy od rodzaju obsługiwanego zdarzenia. Idea w wypadku funkcji
			służących do obrabiania tekstu wiadomości jest bardzo podobna:<br /><br />
			<i>sendMsgHandler (acct_id, to_id, acct, to, text, rv1, rv2)</i><br />
			<i>recvMsgHandler (acct_id, from_id, acct, from, text, rv)</i><br />
			<i>fmtMsgTxtHandler (text, level, rv)</i><br /><br />
			i sprowadza się do zwracania albo odpowiednio przemielonego tekstu, albo <i>nil</i> jeśli
			handler nie chce nic zmieniać. Z kolei funkcja do obsługi <i>uninit</i> nie przyjmuje żadnych
			parametrów i nie zwraca wartości. Handler <i>openChat</i> jest nieco bardziej zaawansowany
			i zdecydowanie wymaga osobnego działu. Wszystkie funkcje handler'ów są opisane ze szczegółami
			w dalszej części tego dokumentu. Funkcja <i>statusChangeHandler (acct_id, ctct_id, acct, ctct, status, desc)</i>
			obsługuje proste zdarzenie zmiany statusu kogoś na liście kontaktów.
		</rem>
	</func>

	<func name="recvMsg">
		<desc>Nadrzędny handler zdarzenia &quot;recvMsg&quot; wywoływany przez program, nie powinien być używany z poziomu skryptów.</desc>
	</func>
	<func name="sendMsg">
		<desc>Nadrzędny handler zdarzenia &quot;sendMsg&quot; wywoływany przez program, nie powinien być używany z poziomu skryptów.</desc>
	</func>
	<func name="uninit">
		<desc>Nadrzędny handler zdarzenia &quot;uninit&quot; wywoływany przez program, nie powinien być używany z poziomu skryptów.</desc>
	</func>
	<func name="openChat">
		<desc>Nadrzędny handler zdarzenia &quot;openChat&quot; wywoływany przez program, nie powinien być używany z poziomu skryptów.</desc>
	</func>
	<func name="statusChange">
		<desc>Nadrzędny handler zdarzenia &quot;statusChange&quot; wywoływany przez program, nie powinien być używany z poziomu skryptów.</desc>
	</func>
</group>

<group name="Funkcje typu callback, definiowane przez użytkownika">
	<func name="sendMsgHandler">
		<desc>Funkcja typu callback tworzona przez użytkownika, musi zostać specjalnie nazwana, aby
		nie pokrywała się z nazwami innych funkcji w systemie skryptowym.</desc>
	</func>
	<func name="recvMsgHandler">
		<desc>Funkcja typu callback tworzona przez użytkownika, musi zostać specjalnie nazwana, aby
		nie pokrywała się z nazwami innych funkcji w systemie skryptowym.</desc>
	</func>
	<func name="fmtMsgTxtHandler">
		<desc>Funkcja typu callback tworzona przez użytkownika, musi zostać specjalnie nazwana, aby
		nie pokrywała się z nazwami innych funkcji w systemie skryptowym.</desc>
	</func>
	<func name="uninitHandler">
		<desc>Funkcja typu callback tworzona przez użytkownika, musi zostać specjalnie nazwana, aby
		nie pokrywała się z nazwami innych funkcji w systemie skryptowym.</desc>
	</func>
	<func name="openChatHandler">
		<desc>Funkcja typu callback tworzona przez użytkownika, musi zostać specjalnie nazwana, aby
		nie pokrywała się z nazwami innych funkcji w systemie skryptowym.</desc>
	</func>
	<func name="statusChangeHandler">
		<desc>Funkcja typu callback tworzona przez użytkownika, musi zostać specjalnie nazwana, aby
		nie pokrywała się z nazwami innych funkcji w systemie skryptowym.</desc>
	</func>
</group>

<group name="Funkcje do debugu">
	<func name="logInsert">
		<param name="text">Tekst, który zostanie dopisany do programowego dziennika zdarzeń.</param>
		<desc>Dopisuje tekst do okna dziennika zdarzeń oraz do pliku, jesli włączona jest opcja
			&quot;Loguj do pliku&quot;.</desc>
	</func>

	<func name="scriptDebug">
		<desc>Wypisuje zawartość stosu LUA. Ta funkcja jest wywoływana również automatycznie w wypadku wystąpienia błędów w callbackach.</desc>
	</func>

	<func name="unicom_var">
		<result name="var" />
		<param name="name" />
		<desc>Zwraca wartość zadanej zmiennej w programie.</desc>
		<rem>
			W zależności od parametru <i>name</i> zwracana jest:<br />
			<ul>
				<li><i>&quot;version&quot;</i> - wersja Unicoma postaci &quot;x.y.z&quot;</li>
				<li><i>&quot;os&quot;</i> - bieżący system operacyjny - &quot;linux&quot;, &quot;win32&quot; lub &quot;macos&quot;</li>
			</ul>
			Narazie lista ta jest bardzo ograniczona, ale stopniowo będzie rozbudowywana w miarę rosnących mam nadzieję potrzeb.
		</rem>
	</func>
</group>

<group name="Wysokopoziomowe funkcje komunikatora">
	<func name="dataCollectorAdd">
		<param name="data">Dane do dopisania do okna &quot;Zbieracza Danych&quot;</param>
		<param name="type">Typ, na razie 0 - URL lub 1 - email</param>
	</func>

	<func name="getStatus">
		<result name="status">Bieżący status użytkownika. Statusy numerowane są od 0 - Dostępny do 6 - Niedostępny w takiej kolejności jak są w menu statusu.</result>
		<desc>Zwraca bieżący status użytkownika.</desc>
	</func>
	<func name="setStatus">
		<param name="status">Status do ustawienia. Statusy są numerowane od 0 - Dostępny do 6 - Niedostępny w takiej kolejności jak są w menu statusu.</param>
		<desc>Ustawia status użytkownika.</desc>
	</func>
	<func name="getDesc">
		<result name="desc">Bieżący opis</result>
		<desc>Zwraca bieżący opis.</desc>
	</func>
	<func name="setDesc">
		<param name="desc">Opis do ustawienia.</param>
		<param name="addToHist">0 lub 1 - decyduje czy zapisać do historii opisów.</param>
	</func>
	<func name="setStatusAndDesc">
		<param name="status" />
		<param name="desc" />
		<param name="addToHist" />
		<desc>Ustawia jednocześnie status oraz opis.</desc>
	</func>

	<func name="sendText">
		<result name="ret">0 - sukces (w sensie przekazane do wykonania), 1 - kontakt nie istnieje, 2 - konto nie istnieje lub jest niepołączone</result>
		<param name="acct_id">ID konta, z którego będzie wysłana wiadomość</param>
		<param name="ctct_id">ID odbiorcy</param>
		<param name="msg">Treść wiadomości</param>
		<desc>Wysyła podaną wiadomość tekstową do zadanego kontaktu, używając określonego konta.
Identyfikatory konta i odbiorcy można uzyskać na przykład z argumentów handlera &quot;recvMsg&quot;.
Obecnie nie jest sprawdzane czy można wysłać z zadanego konta wiadomość do danego odbiorcy (zgodność protokołów) i
zachowanie programu w takiej sytuacji jest nieokreślone, natomiast funkcja będzie zwracać wartość 0, o ile nie wystąpiły
inne błędy.</desc>
	</func>

	<func name="findContact">
		<result name="name">Nazwa.</result>
		<result name="proto">Numer protokołu od zera kolejno GG, Jabber, Tlen, UniLAN.</result>
		<result name="username">Login.</result>
		<result name="flags">Flagi zgodnie ze wzorem (donttrust | (temporary &lt;&lt; 1) | (ignore &lt;&lt; 2)).</result>
		<param name="id">ID użytkownika, dostępne na przykład w handlerach sendMsg i recvMsg.</param>
		<desc>Szuka kontaktu o zadanym ID i zwraca jego podstawowe dane.</desc>
		<rem>Do obsłużenia flag można użyć funkcji z grupy bit_.</rem>
	</func>
	<func name="setContactFlags">
		<param name="id">ID użytkownika, dostępne na przykład w handlerach sendMsg i recvMsg.</param>
		<param name="flags">Flagi zgodnie ze wzorem (donttrust | (temporary &lt;&lt; 1) | (ignore &lt;&lt; 2)).</param>
		<desc>Ustawia flagi kontaktu.</desc>
		<rem>Do obsłużenia flag można użyć funkcji z grupy bit_.</rem>
	</func>
</group>

<group name="Obsługa GUI">
	<func name="addItem">
		<desc>Do obsługi GUI.</desc>
	</func>
	<func name="getParent">
		<desc>Do obsługi GUI.</desc>
	</func>
	<func name="getUserdata">
		<desc>Do obsługi GUI.</desc>
	</func>
	<func name="setUserdata">
		<desc>Do obsługi GUI.</desc>
	</func>
	<func name="getLabel">
		<desc>Do obsługi GUI.</desc>
	</func>
	<func name="setLabel">
		<desc>Do obsługi GUI.</desc>
	</func>
	<func name="insertToChat">
		<desc>Wstawia zadany kod HTML do okna rozmowy.</desc>
	</func>
</group>

<group name="Funkcje różne">
	<func name="include">
		<param name="script">Nazwa pliku skryptu, który ma zostać przetworzony.</param>
		<desc>Przetwarza zadany skrypt LUA.</desc>
	</func>
	<func name="exec">
		<param name="exe">Nazwa pliku wykonywalnego.</param>
		<param name="wait">0 lub 1 - określa czy skrypt ma oczekiwać na zakończenie wykonania wskazanej binarki.</param>
	</func>
	<func name="base64_encode">
		<result name="encoded" />
		<param name="data">Dane do zakodowania.</param>
		<param name="length">Długość danych.</param>
	</func>
	<func name="base64_decode">
		<result name="decoded" />
		<param name="data">Dane do zdekodowania.</param>
	</func>

	<func name="addTimeout">
		<param name="timeout">Ilość milisekund co ile ma być wywoływana funkcja obsługi timeout'u.</param>
		<param name="funcName">Nazwa funkcji obsługi timeout'u.</param>
		<desc>Dodaje timeout.</desc>
	</func>
	<func name="removeTimeout">
		<param name="funcName" />
		<desc>Usuwa timeout.</desc>
	</func>
</group>

<group name="Funkcje niskopoziomowe">
	<func name="dlopen">
		<result name="handle">Uchwyt do załadowanego kodu.</result>
		<param name="fname">Nazwa pliku z dynamicznym kodem do załadowania.</param>
	</func>
	<func name="dlsym">
		<result name="ptr">Wskaźnik do symbolu.</result>
		<param name="handle">Uchwyt do dynamicznego kodu.</param>
		<param name="name">Nazwa symbolu do znalezienia w dynamicznym kodzie.</param>
	</func>
	<func name="dlclose">
		<param name="handle">Uchwyt do dynamicznego kodu.</param>
		<desc>Zwalnia uchwyt do dynamicznego kodu.</desc>
	</func>
	<func name="std_call">
		<result name="ret">Wartość rejestru EAX po wykonaniu wywołania.</result>
		<param name="ptr">Wskaźnik do funkcji w konwencji stdcall.</param>
		<param name="...">Dowolna ilość argumentów o typach standardowych LUA lub lightweight userdata.
		To mogą być generalnie stringi, liczby albo wskaźniki.</param>
		<desc>Wywołuje funkcję w konwencji stdcall, tylko x86.</desc>
	</func>
	<func name="cdecl_call">
		<result name="ret">Wartość rejestru EAX po wykonaniu wywołania.</result>
		<param name="ptr">Wskaźnik do funkcji w konwencji cdecl.</param>
		<param name="...">Dowolna ilość argumentów o typach standardowych LUA lub lightweight userdata.
		To mogą być generalnie stringi, liczby albo wskaźniki.</param>
		<desc>Wywołuje funkcję w konwencji cdecl, tylko x86.</desc>
	</func>

	<func name="malloc">
		<result name="ptr">&quot;Wskaźnik&quot; do zaalokowanej pamięci.</result>
		<param name="size">Rozmiar pamięci do zaalokowania w bajtach.</param>
	</func>
	<func name="free">
		<param name="ptr">&quot;Wskaźnik&quot; do zaalokowanej pamięci.</param>
		<desc>Zwalnia pamięć zaalokowaną uprzednio przez funkcję malloc().</desc>
	</func>

	<func name="disp">
		<result name="displaced" />
		<param name="ptr" />
		<param name="ofs" />
		<desc>Tworzy nowy wskaźnik poprzez dodanie do istniejącego zadanego offsetu w bajtach.</desc>
	</func>
	<func name="rdBytes">
		<result name="bytes" />
		<param name="ptr" />
		<param name="length" />
	</func>
	<func name="rdInt">
		<result name="number" />
		<param name="ptr" />
	</func>
	<func name="rdShort">
		<result name="number" />
		<param name="ptr" />
	</func>
	<func name="rdByte">
		<result name="number" />
		<param name="ptr" />
	</func>
	<func name="rdPtr">
		<result name="ptr_out" />
		<param name="ptr_in" />
		<desc>Odczytuje wartość wskazywaną przez wskaźnik jako wskaźnik.</desc>
	</func>
	<func name="wrBytes">
		<param name="ptr" />
		<param name="data" />
		<param name="length" />
		<desc>Zapisuje dane w postaci łańcuchowej (string) o długości length pod adres we wskaźniku.</desc>
	</func>
	<func name="wrInt">
		<param name="ptr" />
		<param name="number" />
	</func>
	<func name="wrShort">
		<param name="ptr" />
		<param name="number" />
	</func>
	<func name="wrByte">
		<param name="ptr" />
		<param name="number" />
	</func>
	<func name="wrPtr">
		<param name="ptr_to" />
		<param name="ptr_from" />
		<desc>Zapisuje wskaźnik ptr_from pod adres we wskaźniku ptr_to.</desc>
	</func>
	<func name="to_string">
		<result name="string" />
		<param name="ptr" />
		<desc>Zwraca wartość wskazywaną przez wskaźnik jako łańcuch znaków LUA.</desc>
	</func>
	<func name="to_number">
		<result name="number" />
		<param name="ptr" />
		<desc>Zwraca wartość wskazywaną przez wskaźnik jako całkowitą liczbę 32-bitową LUA.</desc>
	</func>

	<func name="bitOr">
		<result name="or" />
		<param name="a" />
		<param name="b" />
		<desc>Odpowiednik (a | b) w C.</desc>
	</func>
	<func name="bitAnd">
		<result name="and" />
		<param name="a" />
		<param name="b" />
		<desc>Odpowiednik (a &amp; b) w C.</desc>
	</func>
	<func name="bitNot">
		<result name="not" />
		<param name="a" />
		<desc>Odpowiednik ~a w C.</desc>
	</func>
</group>

<group name="Obsługa wątków">
	<func name="thread_create">
		<result name="handle" />
		<param name="func" />
		<param name="param" />
		<desc>Tworzy wątek.</desc>
	</func>
	<func name="thread_join">
		<param name="handle" />
		<desc>Oczekuje na zakończenie wątka.</desc>
	</func>
	<func name="fl_lock">
		<desc>Odpowiednik wywołania Fl::lock() w FLTK, synchronizuje wątek z wątkiem głównym. Koniecznie trzeba
		pamiętać o wywołaniu fl_unlock() po wyjściu z sekcji krytycznej!!!</desc>
	</func>
	<func name="fl_unlock">
		<desc>Odpowiednik wywołania Fl::unlock() w FLTK, zwalnia mutex odpowiedzialny za synchronizację
		z wątkiem głównym.</desc>
	</func>
</group>

<group name="Wyrażenia regularne">
	<func name="pcre_compile">
		<result name="handle">Uchwyt do skompilowanego wyrażenia regularnego.</result>
		<param name="expression">Wyrażenie regularne do kompilacji, zgodne ze składnią Perla.</param>
		<param name="flags">Flagi analogicznie jak w dokumentacji PCRE.</param>
		<rem>Zwraca <i>nil</i> jeśli wyrażenie jest niepoprawne lub z innych względów (brak pamięci) nie można go skompilować.
		W przeciwnym razie zwraca <i>lightuserdata</i>, który następnie można zwolnić zwykłym wywołaniem funkcji <b>free()</b>.</rem>
	</func>
	<func name="pcre_exec">
		<result name="count">Ilość trafień.</result>
		<result name="ovector">Tablica offsetów trafień.</result>
		<param name="handle">Uchwyt do skompilowanego wyrażenia regularnego.</param>
		<param name="subject">Badany łańcuch.</param>
		<param name="len">Długość badanego łańcucha.</param>
		<param name="ofs">Offset od którego należy zacząć dopasowywanie.</param>
		<rem>ovector[0] i ovector[1] przechowują początek i koniec trafienia wyrażenia jako całości, zaś pod kolejnymi indeksami
		są trafienia poszczególnych <i>()</i> w wyrażeniu. Obecnie ilość trafień w sumie jest ograniczona do 15-tu. Jeśli nie ma trafień,
		ilość trafień przekracza 15-cie lub podczas wyszukiwania wystąpił błąd zwrócone zostanie <i>0, nil</i>.</rem>
	</func>
	<func name="pcre_free">
		<param name="handle">Uchwyt do skompilowanego wyrażenia regularnego.</param>
		<desc>Zwalnia skompilowane wyrażenie regularne.</desc>
	</func>
</group>

<group name="Funkcje wywodzące się z podsystemu wysyłania SMS-ów">
	<func name="url_encode">
		<result name="encoded" />
		<param name="string" />
		<desc>Zwraca łańcuch znaków zakodowany algorytmem URLencode.</desc>
	</func>
	<func name="show_message">
		<param name="msg" />
		<desc>Wyświetla okno z wiadomością. Odpowiednik fl_message().</desc>
	</func>
	<func name="set_status">
		<param name="status" />
		<desc>Ustawia tekst w pasku statusu okna wysyłania SMS-ów.</desc>
	</func>
	<func name="open_socket"></func>
	<func name="close_socket"></func>
	<func name="read_line"></func>
	<func name="read_bytes"></func>
	<func name="write_line"></func>
	<func name="show_token"></func>
	<func name="i18n_gettext">
		<result name="local" />
		<param name="english" />
		<desc>Zamienia tekst po angielsku na lokalny język zgodnie z tłumaczeniami w pliku <u>lang.txt</u>.</desc>
	</func>
</group>

<group name="Wrapper HTTP">
	<func name="http_new">
		<result name="h">Uchwyt do obiektu Http.</result>
		<desc>Tworzy nowy obiekt Http.</desc>
	</func>
	<func name="http_delete">
		<param name="h">Uchwyt do obiektu Http.</param>
		<desc>Zwalnia zasoby obiektu Http.</desc>
	</func>
	<func name="http_request">
		<param name="h">Uchwyt do obiektu Http.</param>
		<param name="host">Adres serwera HTTP (IP lub FQDN).</param>
		<param name="method">Metoda zapytania HTTP, 0 - GET, 1 - POST, 2 - RAW.</param>
		<param name="uri">Ścieżka na serwerze HTTP.</param>
		<param name="data">Dane w wypadku metody POST.</param>
		<desc>Wykonuje zapytanie HTTP i odbiera odpowiedź od serwera.</desc>
		<rem>W przypadku metody RAW (nie jest to część
standardu HTTP tylko moje wewnętrzne oznaczenie) całe zapytanie do serwera musi być podane jako parametr <b>uri</b>, klasa Http nie ingeruje
w treść zapytania.<br /><br />
Dane w metodzie POST są wysyłane jako application/x-www-form-urlencoded więc musze być wcześniej potraktowane funkcją <b>url_encode()</b>.</rem>
	</func>
	<func name="http_parser_request">
		<param name="h">Uchwyt do obiektu Http.</param>
		<param name="host">Adres serwera HTTP (IP lub FQDN).</param>
		<param name="method">Metoda zapytania HTTP, 0 - GET, 1 - POST, 2 - RAW.</param>
		<param name="uri">Ścieżka na serwerze HTTP.</param>
		<param name="data">Dane w wypadku metody POST.</param>
		<param name="maxRedirectNum">Maksymalna ilość przekierowań dopuszczana przez parser.</param>
		<desc>Wykonuje zapytanie HTTP i odbiera odpowiedź od serwera oraz używa parsera, aby odczytać ustawione ciasteczka
oraz obsłużyć ewentualne przekierowania, ustawia też pole nagłówka Referer.</desc>
		<rem>W przypadku metody RAW ta funkcja nie ma sensu, należy używać <b>http_request()</b>.<br /><br />
Dane w metodzie POST są wysyłane jako application/x-www-form-urlencoded więc musze być wcześniej potraktowane funkcją <b>url_encode()</b>.<br /><br />
W wypadku przekierowań po wykonaniu funkcji dostępny jest nagłówek i treść dokumentu otrzymanego w odpowiedzi tylko na OSTATNIE zapytanie.</rem>
	</func>
	<func name="http_content">
		<result name="content">Treść dokumentu otrzymanego w odpowiedzi na ostatnie zapytanie.</result>
		<param name="h">Uchwyt do obiektu Http.</param>
		<desc>Zwraca treść dokumentu otrzymanego w odpowiedzi na ostatnie zapytanie.</desc>
	</func>
	<func name="http_header">
		<result name="header">Nagłówek odpowiedzi na ostatnie zapytanie.</result>
		<param name="h">Uchwyt do obiektu Http.</param>
		<desc>Zwraca nagłówek odpowiedzi na ostatnie zapytanie.</desc>
	</func>
	<func name="http_result">
		<result name="result">Wynik ostatniego zapytania. Błąd wystąpił jeśli wynik jest różny od zera.</result>
		<param name="h">Uchwyt do obiektu Http.</param>
		<desc>Zwraca wynik ostatniego zapytania.</desc>
	</func>
	<func name="http_set_referer">
		<param name="h">Uchwyt do obiektu Http.</param>
		<param name="ref">Wartość pola nagłówka HTTP Referer.</param>
		<desc>Ustawia wartość pola nagłówka HTTP Referer.</desc>
	</func>
	<func name="http_clear_cookies">
		<param name="h">Uchwyt do obiektu Http.</param>
		<desc>Usuwa ciasteczka przechowywane w obiekcie Http.</desc>
	</func>
</group>

</reference>
