🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.mail.mta
Article #50099

Re: Qmail i gadu-gadu ...

#50099
From: Piotr
Date: Fri, 09 Feb 2007 06:41
810 lines
28082 bytes
Dzieki slicznie, zaraz zabieram sie do pracy! :)



"Artur S." <swiety4@poczta.onet.pl> wrote in message 
news:eqfcti$3rn$3@mx1.internetia.pl...
> Piotr napisał(a):
>> Witam!
>>
>>
>> Czy ktorys z grupowiczow probowal zrobic powiadamianie o nowej, 
>> przychodzacej poczcie w Qmailu na GG?
>> Czy moglbym poprosic ewentualnie poprosic o jakies jakies url how to? :)
>>
>> Pozdrawiam
>> P.
> Witam,
> Dawno temu znalazlem w sieci coś takiego
>
> /bin/www2gg  (tresc sktyptu poniżej miedzu liniami)
>
> i w /home/(USER)/.procmail
> dopisz
>
> USER=`whoami`
> SUBJECT=`formail -zxSubject:`
> FROM=`formail -rt -xTo:`
> BODY=`formail -c | mimecut`
>
>
> :0 c
> * .*
> | if test -e $HOME/gg.txt ; then \
> www2gg $UIDGG "Serwer informuje o nowej przesyłce OD: $FROM TEMAT: 
> \"$SUBJECT\" TRESC: $BODY" ; fi
>
>
> teraz zostaje zostaje plik gg.txt grzie wpisujesz numer gg ktory ma byc 
> informowany.
>
>
> ---------------------------------------------------------------------
> #!/usr/bin/php -q
> <?php
> /*
>  * UWAGA WPISZ TUTAJ HASLO I NUMER KONTA GADU GADU
>  * KTORE BEDZIE PELNILO ROLE BRAMKI CZYLI NADAWCY
>  */
>
> $numer_bramki = "00000000";
> $haslo_bramki = "haslo";
>
> /*
>  * Jesli chcesz żeby wiadomości oczekujace na odebranie na serwerze gg 
> wyświetliły
>  * sie również przy używaniu konta bramki zmień poniższą wartość na 1
>  * Dla 0 wiadomości będa wyświetlane tylko w przypadku używania własnego 
> konta
>  */
>
> $POKAZ_OCZEKUJACE_WIADOMOSCI_DLA_BRAMKI = 0;
>
> $adresat = $_SERVER['argv'][1];
> $tresc   = $_SERVER['argv'][2];
>
> /*
>  * Niedawno wprowadzono na sewerze blokade, która miała w zamyśle
>  * zapobiegać spamowi, polega na blokowaniu wiadomości które
>  * zawieraja linki np www.wp.pl lub moj@email.pl.
> a także wyrażenia "www", "pl" itp
>  * Jak już wycofają się z tego błędu to zmień poniższą wartość na 0
>  * 1 - to zamiana tych wyrażeń np www.wp.pl zmieni sie na w*w. wp. pl
>  i uniknięcie zablokowania
>  */
>
> $DODAWAJ_SPACJE_W_LINKACH = 1;
>
> /*
>  * Teksty lepiej zmienic na własne gdyz producent gadu-gadu moze chciec 
> odrzucac wiadomosci
>  * z numerow majacych te opisy w statusie, mozna takze ustawic bez opisow 
> czyli = ""
>  */
>
> $OPIS_W_STATUSIE_PO_ZALOGOWANIU = "Wiadomość z ...............";
>
> $OPIS_W_STATUSIE_PO_WYLOGOWANIU = "..............................";
>
>
>
> //////////////////////////////////////////////////////////////////////////////////////
> //////////////////////////////////////////////////////////////////////////////////////
> //////////////////////////////////////////////////////////////////////////////////////
>
>
> if (($numer_bramki == "") or ($haslo_bramki == ""))
>     die("Wpisz do skrytpu numer i haslo bramki czyli jakies nieuzywane 
> konto gg");
>
>
> define ('HEADER','<HTML><HEAD><TITLE> Bramka www--&gt;GG </TITLE></HEAD>'
>        .'<META HTTP-EQUIV = "Content-Type" CONTENT ="text/html; 
> charset=ISO-8859-2" ><BODY>
> ');
> define ('FOOTER','</BODY></HTML>');
>
>
> error_reporting(E_ALL ^ E_NOTICE);  # jakby bylo za duzo błędów zmien na 
> E_NONE  ;)
> //require('klasy-gg.inc');            # w razie problemow wpisz pelna 
> sciezke do pliku
>
> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> #  BRAMKA WWW2GG V2.1 W CALOSCI W PHP A WIEC MULIPLATFORMOWA
> #  MOZLIWA DO ZAMIESZCZENIA NA SERWERACH BEZ OBSLUGI CGI
> #
> #  (C) Copyright 2001-2003 Piotr Mach <pm@gg.wha.la>
> #
> #  Bramka powstala dzięki opisowi protokołu gadu-gadu
> #  z projektu EKG http://dev.null.pl/ekg/
>
> # nazwy pakietów pochodzą w większości z EKG
> define("GG_WELCOME", 0x0001);
> define("GG_LOGIN",  0x000c);
> define("GG_LOGIN_OK", 0x0003);
> define("GG_LOGIN_FAILED", 0x0009);
> define("GG_NEW_STATUS", 0x0002);
> define("GG_STATUS",     0x0002);
> define("GG_STATUS_NOT_AVAIL", 0x0001);
> define("GG_STATUS_NOT_AVAIL_DESCR", 0x0015);
> define("GG_STATUS_AVAIL", 0x0002);
> define("GG_STATUS_AVAIL_DESCR", 0x0004);
> define("GG_STATUS_BUSY", 0x0003);
> define("GG_STATUS_BUSY_DESCR", 0x0005);
> define("GG_STATUS_INVISIBLE", 0x0014);
> define("GG_NOTIFY",             0x0010);
> define("GG_NOTIFY_REPLY", 0x000c);
> define("GG_USER_NORMAL", 0x0003);
> define("GG_USER_BLOCKED", 0x0004);
> define("GG_SEND_MSG", 0x000b);
> define("GG_CLASS_MSG", 0x0004);
> define("GG_CLASS_CHAT", 0x0008);
> define("GG_CLASS_ACK",          0x0020);
> define("GG_SEND_MSG_ACK", 0x0005);
> define("GG_ACK_DELIVERED", 0x0002);
> define("GG_ACK_QUEUED", 0x0003);
> define("GG_RECV_MSG", 0x000a);
> define("GG_LOGIN_FAILED2", 0x000B);
> define("GG_ACK_MBOXFULL", 0x0004);
> define("DISCONNECTED
> ",          0x0100);
> define("GG_PUBDIR50_REQUEST",   0x0014);
> define("GG_PUBDIR50_REPLY",     0x000e);
> define("GG_PUBDIR50_SEARCH",    0x0003);
>
>
> /* Zawiera funkcje nizszego poziomu ,z tej klasy dziedziczy klasa www2gg 
> */
> class GaduGadu
> {
>   var $fp;                             // polaczenie w sesji gadu-gadu
>   var $wiadomosci = array();            // tablica z odebranymi 
> wiadomosciami
>   var $status_kontaktu = array();       // odebrane dane adresata 
> wiadomosci
>   var $status_dostarczenia = array();   // tablica ze stanami dostarczenia 
> wiadomosci
>   var $wyniki_szukania = array();     // wyniki wyszukiwania w katalogu
>   var $debug = FALSE;                   // tryb debug
>
>   function GaduGadu()
> // konstruktor
>   {
>       mt_srand((double)microtime() * 1000000);
>   }
>
>   // zwraca stan dostarczenia wiadomosci o danym seq
>   function status_dostarczenia ($seq)
>   {
>       if ($this->status_dostarczenia[$seq])
>           return $this->status_dostarczenia[$seq];
>       else
>           return 0;
>   }
>
>   // wersje gadu gadu > 0x14 (4.8.9, 4.9.2, 5.x itp.)
>   function oblicz_nowy_hash ($haslo, $klucz) {  //takie efekty bitwy z php 
> i jego signed int  ;-)
>
>     $x0=0; $x1=0; $y0=0; $y1=0; $z=0; $tmp=0;
>     $y0 = ($klucz << 16) >> 16; $y1 = $klucz >> 16 ;
>
>     for ($i=0; $i<strlen($haslo); $i++) {
>         $x0 = ($x0 & 0xFF00) | ord($haslo[$i]); $x1 &= 0xFFFF;
>     $y0 ^= $x0; $y1 ^= $x1;
>         $y0 += $x0; $y1 += $x1;
>     $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
>         $y0 ^= $x0; $y1 ^= $x1;
>     $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
>         $y0 -= $x0; $y1 -= $x1;
>         $x1 <<= 8; $x1 |= ($x0 >> 8); $x0 <<= 8;
>         $y0 ^= $x0; $y1 ^= $x1;
>         $z = $y0 & 0x1F;
>
>         $y0 &= 0xFFFF; $y1 &= 0xFFFF;
>         if ($z <= 16) {
>         $tmp= ($y1 << $z) | ($y0 >> (16-$z));
>         $y0 = ($y1 >> (16-$z)) | ($y0 << $z);
>             $y1 = $tmp;
>         } else {
>         $tmp= $y0 << ($z-16);
>         $y0 = ($y0 >> (32-$z)) | ( (($y1 << $z) >> $z) << ($z-16) );
>             $y1 = ($y1 >> (32-$z)) | $tmp;
>     }
>     $y0 &= 0xFFFF; $y1 &= 0xFFFF;
>     }
>     $hash = hexdec(sprintf("%04x%04x", $y1, $y0));
>     settype($hash, 'integer');
>
>   return $hash;
>   }
>
>   function znajdz_serwer($numer)
>   {
>     $http_fp = fsockopen("appmsg.gadu-gadu.pl", 80, $errno, $errstr, 3); 
> //timeout=3s
>     if (!$http_fp) {
> $this->Debug
>         ("BRAK POLACZENA Z APPMSG.GADU-GADU.PL, MOZE BYC PRZECIAZONY: 
> $errno - $errstr<BR>\n");
>     } else {
>         $get = "GET /appsvc/appmsg.asp?fmnumber=<$numer> HTTP/1.0\r\n";
>         $get.= "Host: appmsg.gadu-gadu.pl\r\n";
>         $get.= "User-Agent: Mozilla/4.7 [en] (Win98; I)\r\n";
>         $get.= "Pragma: no-cache\r\n\r\n";
>         fputs($http_fp, $get);
>         fgets($http_fp, 128); fgets($http_fp, 128); $tmp = fgets($http_fp, 
> 128); // 3 linijka
>         fclose($http_fp);
>         if (preg_match("/\s([\d\.]{8,16})\:([\d]{1,5})\s/", $tmp, 
> $addres)) {
>             $host = $addres[1];
>             $port = $addres[2];
>             $this->Debug("Uzyskano adres hosta z appmsg.gadu-gadu.pl: 
> ".$host.":".$port);
>
>             return array ($host, $port);
>         }
>     }
>     # Losowanie jednego z hostow gadu-gadu w przypadku gdy nie udaje sie 
> uzyskać
>     # adresu hosta z appmsg.gadu-gadu.pl, ta lista może się w przyszłości 
> zmienić
>     $ip = array(85, 86, 88, 89);
>     $host = '217.17.41.'.$ip[rand(0,sizeof($ip)-1)];
>     $port = 8074;
>     $this->Debug ("Nie udalo sie uzyskac hosta od appmsg uzyto domyslnego 
> $host:$port");
>
>   return array ($host, $port);
>   }
>
>   function login($numer, $haslo, $host, $port, $opis = "", $wersja = 0x16)
>
>   {
>     $this->fp = fsockopen($host, $port, $errno, $errstr, 10); //timeout = 
> 10s
>     $this->Debug("Logowanie do $host:$port ...");
>     if (!$this->fp) {
>         $this->Debug("PROBLEM Z POLACZENIEM: $errno - $errstr<BR>\n");
>         return DISCONNECTED;
>     }
>
>     if (!$data = fread($this->fp, 12)) {
>         $this->Debug("Polaczenie nieoczekiwanie zamkniete<BR>\n");
>         return DISCONNECTED;
>     }
>     $tab = unpack("Vtyp/Vrozmiar/Vklucz", $data);
>     $this->Debug("Otrzymano pakiet z kluczem hasla: ", $tab, 
> bin2hex($data));
>     // wersja - 0x16-GG 4.9.x, 0x19-5.0.3
>     $hash = $this->oblicz_nowy_hash($haslo, $tab['klucz']);
>  //dla wersji gg >= 0x14
>     $this->Debug("Obliczono hash hasla ");
>
>     $data = pack("VVVVVVVva".strlen($opis)
> , GG_LOGIN, 0x16 + strlen($opis), $numer, $hash,
>         ($opis)?GG_STATUS_AVAIL_DESCR:GG_STATUS_AVAIL, $wersja, 0, 0, 
> $opis);
>     fwrite($this->fp, $data);
>
>     $this->Debug("Wyslano pakiet logowania: ".bin2hex($data));
>     # Przy podaniu zlego hasla moze natychmiast zerwac polaczenie
>     if (!$data1 = fread($this->fp, 8))
>     return GG_LOGIN_FAILED2;
>
>     $tab = unpack("Vlogin_status/Vrozmiar", $data1);
>     $this->Debug("Odpowiedz na logowanie ", $tab);
>
>   return $tab['login_status'];     //Wynik logowania GG_LOGIN_OK lub 
> GG_LOGIN_FAILED
>   }
>
>
>   function wyslij_liste_kontaktow ($uin)
>   {
>     // lista kontaków z jednym numerem
>     $data = pack ("VVVC",GG_NOTIFY, 5, $uin, GG_USER_NORMAL);
>     $this->Debug("Wyslano liste kontaktów".bin2hex($data));
>
>   return fwrite($this->fp,$data);
>   }
>
>   function wyslij_wiadomosc($adresat, $tresc, $potwierdzenie = TRUE)
>   {
>     $tresc = txt::iso2cp($tresc);
>     $seq = mt_rand();
>
>     $data = pack("VVVVVa".strlen($tresc)."C", GG_SEND_MSG, 0x0d + 
> strlen($tresc), $adresat,
> $seq,  ($potwierdzenie)?GG_CLASS_MSG:GG_CLASS_MSG | GG_CLASS_ACK, $tresc, 
> 0);
>     $this->Debug("Wyslano pakiet wiadomości : ".bin2hex($data), $data);
>
>     $this->status_dostarczenia[$seq] = FALSE; //zmieni sie przy otrzymaniu 
> potwierdzenia
>
>     if (!fwrite($this->fp, $data))
>       return FALSE;
>
>   return $seq;
>   }
>
>   function odbierz_dane ($auto_odpowiedz = "")
>   {
>     if (!$data = fread($this->fp, 8))
>         return FALSE;
>     $tab = unpack("Vtyp/Vrozmiar", $data);
>
>
>     # Odebranie wszystkich oczekujacych wiadomosci
>     while ($tab['typ'] == GG_RECV_MSG || $tab['typ'] == GG_NOTIFY_REPLY
>             || $tab['typ'] == GG_STATUS) {
>         $data = fread($this->fp, $tab['rozmiar']);
>
>         switch($tab['typ']) {
>           case GG_RECV_MSG:
>         $tab = unpack("Vnadawca/Vseq/Vtime/Vclass/A*wiadomosc", $data);
>             $this->Debug("Otrzymano wiadomosc ", $tab);
>             if ($auto_odpowiedz)
>               $this->wyslij_wiadomosc($tab['nadawca'], $auto_odpowiedz, 
> FALSE); //bez potwierdzen
>             array_push($this->wiadomosci, $tab);
>         break;
>           case GG_STATUS:
>           case GG_NOTIFY_REPLY:
>         $this->Debug ("Otrzymano odpowiedz ze statusem kontaktu 
> ".bin2hex($data));
>         $tab = unpack("Vuin/Vstatus", $data);
>         $this->status_kontaktu[$tab['uin']] = $data;
>         $this->Debug ($tab, $this->status_kontaktu);
>         break;
>     }
>
>     $data = fread($this->fp, 8);
>     $tab = unpack("Vtyp/Vrozmiar", $data);
>     }
>
>     # odebranie ostatnich pakietów
>     if (!$data = fread($this->fp, $tab['rozmiar']))
>         return FALSE;
>
>     if ($tab['typ']==GG_SEND_MSG_ACK) {
>     $tab = unpack("Vstatus/Vadresat/Vseq", $data);
>     $this->Debug("Otrzymano potwierdzenie wiadomosci ", $tab);
>         $this->status_dostarczenia[$tab['seq']] = $tab['status'];
>     } else if ($tab['typ']==GG_PUBDIR50_REPLY) {
>     $tab = unpack("Cunknown/Vczas/A*results", $data);
>     $this->Debug("Otrzymano wyniki szukania ", $tab);
>     $this->wyniki_szukania = $tab['results'];
>     }
>
>   return TRUE;
>   }
>
>   function logoff ($opis = "")
>   {
>     $data = pack("VVVa".strlen($opis), GG_NEW_STATUS, 0x04 + 
> strlen($opis),
>             ($opis)?GG_STATUS_NOT_AVAIL_DESCR:GG_STATUS_NOT_AVAIL, $opis);
>     fwrite($this->fp, $data);
>     $this->Debug("Wyslano pakiet logoff : ".bin2hex($data));
>     fclose($this->fp);
>   }
>
>   function Debug()
>   {
>     if (!$this->debug)
>         return;
>     foreach (func_get_args() as $info) {
>         if (is_array($info))
>             print_r($info);
>         else
>             echo "<BR>\nDEBUG: $info";
>     }
>     flush();
>   }
>
> } // koniec klasy GaduGadu
>
>
>
> Class www2gg extends GaduGadu
> {
>   var $numer = "";
>   var $haslo = "";
>   var $OPIS_W_STATUSIE_PO_ZALOGOWANIU = "";
>   var $OPIS_W_STATUSIE_PO_WYLOGOWANIU = "";
>   var $ilosc_prob = 3;    // ile razy probowac sie zalogowac i wyslac 
> wiadomosc
>   var $error = FALSE;
>   var $auto_odpowiedz;    // gdy rozna od "" wtedy przy odebraniu wiad 
> nadawca zostanie
>                           // poinformawany ze jest to numer bramki i 
> wiadomosc nie dotarla
>
>   function www2gg($numer, $haslo)
>   {
>     $this->GaduGadu();      // trzeba wywolywac konstuktor recznie
>     $this->numer = $numer;
>     $this->haslo = $haslo;
>   }
>
>   function ustaw_opisy ($opis1 ,$opis2)
>   {
>     # konwersja kodowania na CP-1250 i skrócenie statusów opisowych do 41 
> znaków
>     $this->OPIS_W_STATUSIE_PO_ZALOGOWANIU = 
> txt::iso2cp(substr($opis1,0,41));
>     $this->OPIS_W_STATUSIE_PO_WYLOGOWANIU = 
> txt::iso2cp(substr($opis2,0,41));
>   }
>
>   function wiadomosc($adresat, $tresc, $DODAWAJ_SPACJE_W_LINKACH = TRUE)
>   {
>     # Usuniecie dodatkowych \ przy włączonym magic_quotes w php.ini
>     if (get_magic_quotes_gpc())
>         $tresc = stripslashes($tresc);
>
>     # Modyfikacja linkow www, email i slow www, pl ktore sa filtrowane 
> przez blokade "antyspamowa"
>     if ($DODAWAJ_SPACJE_W_LINKACH)
>         $tresc = txt::odlinkuj($tresc);
>
>     # Sprawdzenie danych czy sie nadaja do wysyłania:)
>     if ($adresat == "") {
>         $this->error = "Wpisz numer adresata";
>         return FALSE;
>     }
>     if (!is_numeric($adresat) or ($adresat <= 1000) or ($adresat > 
> 10000000)) {
>         $this->error = "Adresat ma byc numerkiem gadu - gadu";
>         return FALSE;
>     }
>     if (strlen($tresc) == 0) {
>         $this->error = "Nie wpisaleś treści wiadomości";
>         return FALSE;
>     }
>     if (strlen($tresc) > 1999) {
>         $this->error = "Dlugość Wiadomości nie może przekroczyć 2000 
> znaków";
>         return FALSE;
>     }
>     if (($this->numer < 1000) or ($this->numer > 10000000) or 
> ($this->haslo == "")) {
>         $this->error = "Wpisz poprawnie numer i hasło nadawcy";
>         return FALSE;
>     }
>     if ($adresat == $this->numer) {
>         $this->error = "Nie możesz wysłać wiadomości sam do siebie";
>         return FALSE;
>     }
>
>     for ($i = 1; $i <= $this->ilosc_prob; ++$i) {
>     $this->Debug("Proba $i");
>
>         # Pyta o host z jakim nalezy sie polaczyc lub losuje domyslny w 
> przypadku niepowodzenia
>         list ($host, $port) = $this->znajdz_serwer($this->numer);
>
>         # Logowanie do serwera GG
>         switch ($this->login($this->numer, $this->haslo, $host,
>                 $port, $this->OPIS_W_STATUSIE_PO_ZALOGOWANIU))
>         {
>
>     # Wysyłanie wiadomości gdy GG_LOGIN_OK
>         case GG_LOGIN_OK:
>         if ($this->wyslij_liste_kontaktow ($adresat)) {
>           if ($seq = $this->wyslij_wiadomosc($adresat, $tresc))
>         if ($this->odbierz_dane($this->auto_odpowiedz))  // czy wysylac 
> odp. ze bramka
>           $this->logoff($this->OPIS_W_STATUSIE_PO_WYLOGOWANIU);
>             return $seq;  //sukces  :)
>         } else {
>           $this->Debug("Połączenie zerwane po zalogowaniu"); break;
>         }
>
>     case DISCONNECTED:
>         $this->Debug("Polaczenie odrzucone dla: $host
>         ".gethostbyaddr($host).": $port"); break;
>
>     case GG_LOGIN_FAILED:
>         $this->error = "<BR>LOGIN FAILED - złe hasło dla $numer";
>         return FALSE;
>
>     case GG_LOGIN_FAILED2:
>         $this->error = "<BR>LOGIN FAILED. "; return FALSE;
>
>     default:
>         $this->error = '<BR>LOGIN FAILED - hm, to nie powinno sie 
> zdarzyc:)';
>             return FALSE;
>         }
>     } // for i..
>
>     $this->error = "<BR>LOGIN FAILED - połączenie odrzucone $i 
> krotnie<BR>\n"
>                 ."Mozesz sprobowac jeszcze raz (odwiez strone)\n";
>   return FALSE;
>   } // function wiadomosc
>
> } // koniec klasy www2gg
>
>
> #
> # funckje do przekształcania i wyświetlania tekstu
> #
>
> class txt
> {
>   function txt() { die ("to jest statyczna klasa"); }
>
>   function wyswietl_status_odbiorcy($data)
>   {
>     if (strlen($data)<8)
>       return "";
>     $tab = unpack("Vuin/Vstatus", $data);
>
>     $opisy_stanow = array(GG_STATUS_AVAIL => "dostępny",
>                           GG_STATUS_AVAIL_DESCR => "dostępny z opisem",
>                           GG_STATUS_BUSY => "zaraz wracam",
>                           GG_STATUS_BUSY_DESCR => "zaraz wracam z opisem",
>                           GG_STATUS_NOT_AVAIL_DESCR => "niedostępny lub 
> niewidoczny z opisem");
>
>     switch ($tab['status']) {
>     case GG_STATUS_AVAIL:
>     case GG_STATUS_BUSY:
>           $tab = 
> unpack("Vuin/Vstatus/Vip/vport/Vversion/vunknown/",$data);
>       break;
>     case GG_STATUS_AVAIL_DESCR:
>     case GG_STATUS_BUSY_DESCR:
>           $tab = 
> unpack("Vuin/Vstatus/Vip/vport/Vversion/vunknown/A*opis",$data);
>       break;
>     case GG_STATUS_NOT_AVAIL_DESCR:
>       $tab = unpack("Vuin/Vstatus/A*opis",$data);
>       break;
>     default:
>           // Takiego statusu serwer nie powinien zwrocic
>           return "";
>     }
>     $tab['stan_slownie'] = $opisy_stanow[$tab['status']];
>
>     if ($tab['opis'])
>         list($tab['opis'], $tab['czaspowrotu']) = explode("\0", 
> $tab['opis']);
>
>     if ($tab['czaspowrotu']) {
>     $temp=unpack("Vczaspowrotu",$tab['czaspowrotu']);
>     setlocale ("LC_TIME", "pl_PL");
>     $tab['czaspowrotu']=strftime("<I>Będzie: %B %d(%A)  o %H:%M </I>", 
> $temp['czaspowrotu']);
>     }
>
>     // ułożenie informacji do wyświetlenia
>     $informacja = $tab['uin']." ma stan: <B>".$tab['stan_slownie']."</B>";
>     if ($tab['opis'])
>         $informacja.=': "'.$tab['opis'].'" ';
>     if ($tab['czaspowrotu'])
>         $informacja.=$tab['czaspowrotu'];
>
>   return "<BR>\n".$informacja;
>   }
>
>   function wyswietl_wiadomosci ($wiadomosci)
>   {
>     $html="";
>     foreach ($wiadomosci as $tab)
>         $html.=txt::wyswietl_wiadomosc($tab['nadawca'], $tab['time'], 
> $tab['wiadomosc']);
>
>   return $html;
>   }
>
>   function wyswietl_wiadomosc($nadawca, $czas, $wiadomosc)
>   {
>     # Wykrycue formatowania tekstu w nowszych wersjach i przerobienie go 
> na html
>     if (strpos($wiadomosc, "\0")+1 < strlen($wiadomosc)) {
>         $fmt = substr($wiadomosc, strpos($wiadomosc, "\0"));
>         $wiadomosc = substr($wiadomosc, 0, strpos($wiadomosc, "\0"));
>         $wiadomosc = txt::konwertuj_formatowanie_na_html($wiadomosc, 
> $fmt);
>     }
>     $wiadomosc = nl2br($wiadomosc);
>     # Ułożenie htmla do wyświetlenia
>     $html = "<BR><B>".$nadawca."</B> ".strftime("(%H:%M)<BR>\n",$czas);
>     $html.= txt::cp2iso($wiadomosc)."<HR>\n";
>
>   return $html;
>   }
>
>   function konwertuj_formatowanie_na_html($tresc, $fmt)
>   {
>
>     # Rozbijamy formatowenie na bajty i wstawiamy do tablicy
>     $fmt = preg_split('//', $fmt, -1, PREG_SPLIT_NO_EMPTY);
>     $i = 1;                    // Wskaznik aktualnego znaku
>     $tab = unpack("Ctyp/vsize", $fmt[$i++].$fmt[$i++].$fmt[$i++]);
>     # Rozmiar format. i typ=2
>     $size = $tab['size'];
>
>     $nr = 0;
>     $kawalek = "";
>
>     # Tekst składa się z kawałków o innym formatowaniu
>     while ($i < $size + 2) {
>         $nr++;
>         $tab = unpack("vpoz/Cmaska", $fmt[$i++].$fmt[$i++].$fmt[$i++]);
>         $kawalek[$nr]['pozycja'] = $tab['poz'];
>         $kawalek[$nr]['maska'] = $tab['maska'];
>
>         if ($tab['maska'] & 1)
>             $kawalek[$nr]['bold'] = 1;
>         if ($tab['maska'] & 2)
>             $kawalek[$nr]['italic'] = 1;
>         if ($tab['maska'] & 4)
>             $kawalek[$nr]['underline'] = 1;
>         if ($tab['maska'] & 8) {
>             $tab = unpack("CR/CG/CB", $fmt[$i++].$fmt[$i++].$fmt[$i++]);
>             $kawalek[$nr]['R'] = $tab['R'];
>             $kawalek[$nr]['G'] = $tab['G'];
>             $kawalek[$nr]['B'] = $tab['B'];
>         }
>     }
>
>     # Tworzymy pomocniczy kawalek z pozycja rowna dlugosci tresci
>     $poz = 0;
>     $kawalek[$nr + 1]['pozycja'] = strlen($tresc);
>
>     # Znalezienie granic textu n podstawie pozycji i dodanie html'a;
>     for ($i = 1; $i <= $nr; $i++) {
>         $kawalek[$i]['tekst'] = substr($tresc, $poz, $kawalek[$i + 
> 1]['pozycja'] - $poz);
>         $poz = $kawalek[$i + 1]['pozycja'];
>         $kawalek[$i]['html'] = $kawalek[$i]['tekst'];
>         if ($kawalek[$i]['bold'])
>             $kawalek[$i]['html'] = '<B>'.$kawalek[$i]['html'].'</B>';
>         if ($kawalek[$i]['italic'])
>             $kawalek[$i]['html'] = '<I>'.$kawalek[$i]['html'].'</I>';
>         if ($kawalek[$i]['underline'])
>             $kawalek[$i]['html'] = '<U>'.$kawalek[$i]['html'].'</U>';
>         $rgb = sprintf("%02X%02X%02X", $kawalek[$i]['R'],
>         $kawalek[$i]['G'], $kawalek[$i]['B']);
>         $kawalek[$i]['html'] = '<FONT 
> COLOR="'.$rgb.'">'.$kawalek[$i]['html'].'</FONT>';
>         $tresc_html.= $kawalek[$i]['html'];
>     }
>     array_pop($kawalek);       //Wywalamy pomocniczy kawalek
>
>   return $tresc_html;
>   }
>
>   function cp2iso($co) {
>     return strtr($co, "\xA5\x8C\x8F\xB9\x9C\x9F", 
> "\xA1\xA6\xAC\xB1\xB6\xBC"); }
>
>   function iso2cp($co) {
>     return strtr($co, "\xA1\xA6\xAC\xB1\xB6\xBC", 
> "\xA5\x8C\x8F\xB9\x9C\x9F"); }
>
>
>   /* zmiana linków np moj@email.pl na moj@ email. pl zeby uniknac 
> usunięcia */
>   function odlinkuj ($text) {
>
>     function dodajspacje ($text) { return preg_replace("/([\.@:])/","\\1 
> ","$text"); }
>
>     $search = array (
>               "/(\S+([\@\.])+?\S+)|(\S+:\/\/)/e"
>               ,"/www/i"
>               ,"/http/i"
>               ,"/pl/i"
>               );
>
>     $replace = array(
>               "dodajspacje('\\1\\3')"
>               ,"w*w"
>               ,"ht*p"
>               ,"p1"      //co ja poradze ze pogłupieli i filturja "pl" np. 
> plastik  :)
>               );
>   return preg_replace($search, $replace ,$text);
>   }
>
> } // koniec klasy txt
>
>
> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
> /*
>  * Dzieki temu bedzie dzialac na register_globals
>  on i off
>  * (php 4.2.0) a takze na track_vars on i off
>  */
>
> if ($HTTP_POST_VARS) foreach ($HTTP_POST_VARS as $Key => $Value) $$Key = 
> $Value;
> if ($HTTP_GET_VARS)  foreach ($HTTP_GET_VARS as $Key => $Value)  $$Key = 
> $Value;
> if ($_REQUEST)       foreach ($_REQUEST as $Key => $Value)       $$Key = 
> $Value;
>
> $tablica_komunikatow = array (
>       GG_ACK_DELIVERED =>
>        "<BR>\nWiadomość dla $adresat została odebrana",
>
>       GG_ACK_QUEUED =>
>        "<BR>\nWiadomość dla $adresat oczekuje w kolejce na 
> odebranie.<BR>\n"
>       ."Zostanie dostarczona gdy adresat włączy gadu-gadu<BR>\n lub 
> adresat"
>       ." ma w tej chwili status <B>niewidoczny</B> bądź \"tylko dla 
> znajomych\"",
>
>       GG_ACK_MBOXFULL =>
>        "<BR>\nSkrzynka odbiorcza adresata jest pełna, "
>       ."wiadomość nie została dostarczona",
>
>       0 =>
>        "<BR>Wiadomość nie została dostarczona, spróbuj jeszcze raz 
> (odśwież strone)"
> );
>
> # POCZATEK
>
> if ( $tryb == "numer_wlasny" ) {        // Dla trybu z wlasnym numerkiem 
> zostana
> $pokaz_odebrane = true;             // wyswietlone wiadomosci oczekujace 
> na serwerze GG
>     $gg = new www2gg ($numer, $haslo);
>
> } else {                                // dla trybu 'z bramki' lub dla 
> uproszczonej wersji
>     $gg = new www2gg ($numer_bramki, $haslo_bramki);
>     $gg->auto_odpowiedz = "To jest jednostronna bramka www2gg, wiadomość 
> nie dotarła do nadawcy";
>
>     $pokaz_odebrane = $POKAZ_OCZEKUJACE_WIADOMOSCI_DLA_BRAMKI; // Czy 
> pokazac wiadomosci dla bramki
>                                                                // ustaw w 
> zmiennej na poczatku pliku
>     $gg->ustaw_opisy($OPIS_W_STATUSIE_PO_ZALOGOWANIU, 
> $OPIS_W_STATUSIE_PO_WYLOGOWANIU);
> }
>
> //$gg->debug=true;
>
> /* wyswietlenie roznych informacji, które odebralismy */
>
> echo HEADER;
>
> if ($seq = $gg->wiadomosc ($adresat, $tresc, $DODAWAJ_SPACJE_W_LINKACH))
> {
>     /* statusu dostarczenia wiadomości */
>     echo $tablica_komunikatow[$gg->status_dostarczenia ($seq)];
>
>     /* pełnego statusu adresata wiadomości */
>     echo txt::wyswietl_status_odbiorcy ($gg->status_kontaktu[$adresat]);
>
>     /* opcjonalnie wiadomości odebrancyh z serwera o ile były jakieś */
>     if ($pokaz_odebrane)
>         echo txt::wyswietl_wiadomosci ($gg->wiadomosci);
>
> } else {
>     echo $gg->error;
> }
>
> echo FOOTER;
> ?>
>
>
> ---------------------------------------------------------------------------------
>
>
> 
Technical Details
Message-ID: <eqh4us$9oo$1@news.interia.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!not-for-mail
References: <eq9des$v68$1@news.interia.pl> <eqfcti$3rn$3@mx1.internetia.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!not-for-mail
From: "Piotr" <samotniq@interia.pl>
Newsgroups: pl.comp.mail.mta
Subject: Re: Qmail i gadu-gadu ...
Date: Fri, 9 Feb 2007 07:41:05 +0100
Organization: INTERIA.PL S.A.
Lines: 812
Message-ID: <eqh4us$9oo$1@news.interia.pl>
References: <eq9des$v68$1@news.interia.pl> <eqfcti$3rn$3@mx1.internetia.pl>
Reply-To: "Piotr" <samotniq@interia.pl>
NNTP-Posting-Host: samotniq.serv-net.pl
X-Trace: news.interia.pl 1171003164 10008 88.199.66.144 (9 Feb 2007 06:39:24 GMT)
X-Complaints-To: usenet@news.interia.pl
NNTP-Posting-Date: Fri, 9 Feb 2007 06:39:24 +0000 (UTC)
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028
X-RFC2646: Format=Flowed; Response
X-Newsreader: Microsoft Outlook Express 6.00.2900.3028
X-Priority: 3
X-Authenticated-User: samotniq % interia+pl
X-MSMail-Priority: Normal
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit