meme si nous ne sommes pas connecté !!
et peut nous avertir (par un beep() ) si un membre est connecté
savoir si Fred passe sur le forum par exemple

ou pour surveiller un robot spameur par exemple
Google Translate :
this prg is used to see who is logged on the forum English
although we are not connected!
and can we tell (by an beep() ) if someone is logged
whether Fred connecting on the forum for example

or an robot for the moderate ...
run this code and wait 10 secondes
; Spy_Pseudo
; by Dobro
; Purebasic 4.51
;-initialisation
Declare.S dobro_replace2(chaine$,chaine_cherche$,chaine_remplace$)
Declare.S Url2Text(Url.S)
Declare.S Url2Text2(Url.S, OpenType.b,ProxyAndPort.S)
Declare TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Declare.S recup_pseudo()
Declare.S Extract(phrase.S,balise_gauche.S,balise_droite.S,longueur)
Declare sonne(*bidon)
Global newlist liste_pseudo.S()
Global pseudo_alarme.S
;****************** exemple de phrase a recuperer **********************************************
; <td class="row1" width="100%"><span class="genmed">Au total il y a <strong>17</strong> utilisateurs en ligne :: 9 enregistrés, 0 invisible et 8 invités (basées sur les utilisateurs actifs des 5 dernières minutes)<br />Le record du nombre d’utilisateurs en ligne est de <strong>59</strong>, Le Dim 11/Juin/2006 19:10<br /><br />utilisateurs enregistrés : <a href="./memberlist.php?mode=viewprofile&u=1659">Berfau</a>, <a href="./memberlist.php?mode=viewprofile&u=111">Dobro</a>, <span style="color: #9E8DA7;" class="username-coloured">Exabot [Bot]</span>, <a href="./memberlist.php?mode=viewprofile&u=305">flaith</a>, <span style="color: #9E8DA7;" class="username-coloured">Google [Bot]</span>, <span style="color: #9E8DA7;" class="username-coloured">Google Adsense [Bot]</span>, <a href="./memberlist.php?mode=viewprofile&u=406">SPH</a>, <a href="./memberlist.php?mode=viewprofile&u=1570">Warkering</a>, <span style="color: #9E8DA7;" class="username-coloured">Yahoo [Bot]</span></span></td>
;
;
; StringField(string$,1,">Dobro</a>" )
; ************************************************************************************************
Enumeration
#Window
#timer_1
#editor
#file
#pseudo
#text_pseudo
#font
#titre
EndEnumeration
Global Site.S= "index.php"
; *********************************************************************
If filesize ( "spy_pseudo" ) <>-1
openfile ( #file , "spy_pseudo" )
windowx = readlong ( #file )
windowy = readlong ( #file )
pseudo_alarme.S= readstring ( #file )
closefile ( #file )
Else
windowx =10
windowy =10
EndIf
Global decalage=30
; ************************* interface *************************************
;-interface
openwindow ( #Window , windowx , windowy ,100,350, "Liste des Pseudo Connectés" , #PB_Window_SystemMenu )
stickywindow ( #Window , 1)
Handle = windowid ( #Window )
SetTimer_ (Handle, #timer_1 , 5000, @TimerProc()) ; toute les 1 minutes
textgadget ( #titre , 10, 5, 100, 50, "Spy_Pseudo" )
If loadfont ( #font , "Comic Sans MS" , 12, #PB_Font_Bold )
setgadgetfont ( #titre , fontid ( #font ))
EndIf
editorgadget ( #editor , 10, 10+decalage, 100,200)
textgadget ( #text_pseudo , 10, 220+decalage, 90, 55, "nicklist monitor" + chr (10)+ "separated by a comma" )
stringgadget ( #pseudo , 10, 280+decalage, 90, 20, "" )
setgadgettext ( #pseudo ,pseudo_alarme.S)
; ************************************************************************²
; ****************** boucle principale ***************************************
;-bouce_principale
Repeat
event= windowevent ()
; tout se passe dans le timer
Select event
Case #PB_Event_Gadget
pseudo_alarme.S= getgadgettext ( #pseudo )
EndSelect
Until event = #PB_Event_CloseWindow
; **************************************************************************
KillTimer_ (Handle, #timer_1 )
openfile ( #file , "spy_pseudo" )
X= windowx ( #Window ):Y= windowy ( #Window )
writelong ( #file , X)
writelong ( #file , Y)
pseudo_alarme.S= getgadgettext ( #pseudo )
writestringn ( #file ,pseudo_alarme.S)
closefile ( #file )
; ***************** Zone Procedures ****************************************************
;- les procedures
Procedure.S recup_pseudo()
; recupere les pseudo et les mets dans liste()
text_page$=Url2Text(Site.S)
For i2=1 To len (text_page$)
ligne_page$= stringfield (text_page$,i2, chr (10))
If findstring (ligne_page$, "gistered users" ,1)
ok=1
; pos_debut1= FindString(ligne_page$,"tilisateurs enregistr",1)+35
clearlist (liste_pseudo.S())
Repeat
pseudo.S=Extract(ligne_page$, chr (34)+ ">" , "</a>" ,15) ; on ne recupere que si inf a 15 carcteres d'ecart ²
If pseudo.S<> "dobro_stop"
If pseudo.S<> ""
addelement (liste_pseudo())
liste_pseudo()=pseudo.S
EndIf
EndIf
Until pseudo.S= "dobro_stop"
EndIf
If ok=1
ok=0
Break
EndIf
Next i2
ProcedureReturn
EndProcedure
ProcedureDLL.S Url2Text2(Url.S, OpenType.b,ProxyAndPort.S)
; 1 INTERNET_OPEN_TYPE_DIRECT Resolves all host names locally.
; 0 INTERNET_OPEN_TYPE_PRECONFIG Retrieves the proxy Or direct configuration from the registry.
; 4 INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY Retrieves the proxy Or direct configuration from the registry And prevents the use of a startup Microsoft JScript Or Internet Setup (INS) file.
; 3 INTERNET_OPEN_TYPE_PROXY Passes requests To the proxy unless a proxy bypass list is supplied And the name To be resolved bypasses the proxy. In this Case, the function uses INTERNET_OPEN_TYPE_DIRECT.
isLoop.b=1
INET_RELOAD.l = $80000000
hInet.l=0
hURL.l=0
Bytes.l=0
Buffer.S= space (2048 )
res.S= ""
hInet = InternetOpen_ ( "" , OpenType, ProxyAndPort, "" , 0)
hURL = InternetOpenUrl_ (hInet, Url, #Null , 0, INET_RELOAD, 0)
Repeat
InternetReadFile_ (hURL,@Buffer, len (Buffer), @Bytes)
If Bytes = 0
isLoop=0
Else
res = res + left (Buffer, Bytes)
EndIf
Until isLoop=0
InternetCloseHandle_ (hURL)
InternetCloseHandle_ (hInet)
ProcedureReturn res
EndProcedure
ProcedureDLL.S Url2Text(Url.S)
ProcedureReturn Url2Text2(Url,1, "" )
EndProcedure
; **************************** Timer **********************************************
;-Timer
Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Select uMsg
Case #WM_TIMER
Select idEvent
Case #timer_1
; Ici, le code à executer toutes les 30 secondes
; AddGadgetItem(#editor, -1, Url2Text(Site.S))
recup_pseudo()
ClearGadgetItems( #editor )
compteur= countstring (pseudo_alarme.S, "," )+1
ForEach liste_pseudo.S()
pseudo.S =liste_pseudo.S()
For i=1 To compteur
pseudo_test.S = stringfield (pseudo_alarme.S ,i, "," )
If pseudo.S=pseudo_test.S
createthread (@sonne(),*bidon)
EndIf
Next i
addgadgetitem ( #editor , -1, pseudo.S )
Next
EndSelect
EndSelect
EndProcedure
Procedure.S Extract(phrase.S,balise_gauche.S,balise_droite.S,longueur)
; by Dobro
; retourne l'extrait de chaine compris entre 2 balises
; les balises sont 1 caractere ou un mot.....
; utile pour extraire les infos d'une page web par exemple
; le parametre longueur , sert a determiner l'eccart entre 2 balises
; et de savoir si l'on recupere l'extrait si les balises sont trop éloigné
; si "dobro_stop" est renvoyé , fin de l'exploration du text$
Static pointeur_debut
Static pointeur_fin
pointeur_debut= findstring (phrase.S,balise_gauche.S,pointeur_debut)+ len (balise_gauche.S)
pointeur_fin= findstring (phrase.S,balise_droite.S,pointeur_debut)
If (pointeur_debut- len (balise_gauche.S))=0 Or pointeur_fin=0
extrait$= "dobro_stop" ; signale la fin du traitement²
pointeur_debut=0
pointeur_fin=0
ProcedureReturn extrait$
EndIf
long=pointeur_fin-pointeur_debut
extrait$= mid (phrase.S,pointeur_debut,long)
If len (extrait$)<longueur
pointeur_debut=pointeur_fin
ProcedureReturn extrait$
Else
extrait$= ""
ProcedureReturn extrait$
EndIf
EndProcedure
Procedure sonne(*bidon)
beep_ (880,1000)
EndProcedure