webForumDet fria alternativet

Antal online i shatten?

ASP

15 svar · 354 visningar · startad av Jesper T

Medlem sedan nov. 20017 144 inlägg
Frågan#1

Hej!
Jag har en chatt som bybber på applications med global.asa. Jag skulle vilja lista alla som för tillfället är online. Har någon något tips för detta?
Includefilen är en bamse på ca 600 rader så den tänker jag inte visa här i första taget.
Tacksam för hjälp eller tips.
MVH Jesper

I global.asa har jag detta.

</SCRIPT>
<!--#include file=chat/chatapi.asp-->
Sub Session_OnStart
	Session.Timeout=3 'minutes
End Sub

Sub Session_OnEnd
	call LogOffUser(ChatSessionUidGet(),false)
End Sub
</script>
Medlem sedan mars 20007 896 inlägg
#2

Lagra användarna i en array, som du puffar in i ett Application-objekt. När en användare loggar ut tar du bara bort han från arrayen och lagrar den editerade arrayen.

Medlem sedan nov. 20017 144 inlägg
#3

Tack, men...
Det finns faktiskt en sådan funktion på "loginsidan" till chatten men den sidan includerar också den där boutafilen som jag inte har lust att beklammra min redan betyngda index-sida med. Jag skulle bara vilja ha det mest nödvändiga till det såklart. Men vettefanken hur.

På "loginsidan" har jag bl.a detta:

 Response.Write "<tr><td>" & UsersCountGet() & " user(s) are currently chatting"

Och sedan en liten snutt ur includen:

'Returns a total user count (in all chat rooms)
Function UsersCountGet()
	Dim iUserId,iCount

	iCount=Clng(0)
	for iUserId=0 to MAX_USERS-1
		if isArray(Application(iUserId & "UsrZbC")) Then iCount=iCount+1
	next
	UsersCountGet=iCount
End Function

Men det räcker inte att bara lägga ihop dessa grejjer, jag fettekatten faktiskt om jag skall vara ärlig.

MVH Jesper

Medlem sedan nov. 20017 144 inlägg
#4

:(

Medlem sedan nov. 20017 144 inlägg
#5

Jag famlar i mörker......... :(

Är det bara Lars G som kan detta?

Medlem sedan mars 20007 896 inlägg
#6

Nej, jag har ju gett dig ett svar. :)

Jag läste frågan igen, och såg nu att jag missade att det var antalet användare du ville ha. Det gör det lite lättare att modifiera till script, du kan i global.asa lägga till det här under Application_OnStart:

Application ( "usersOnline" ) = 0

Under Session_OnStart:

Application ( "usersOnline" ) = cInt ( Application ( "usersOnline" ) ) + 1

Under Session_OnEnd:

Application ( "usersOnline" ) = cInt ( Application ( "usersOnline" ) ) - 1

Sen är det bara att hämta med Application ( "usersOnline" ).

Medlem sedan nov. 20017 144 inlägg
#7

Tack igen Spin!
Men jag vill ha antalet online i chatten och inte totalt online på sidan. Och hur man gör det har jag ingen som helst aning om, så snälla hjälp!

MVH Jesper

Medlem sedan okt. 20005 273 inlägg
#8

Skulle du inte kunna köra en UBound på arrayen

[red]
Function UsersCountGet()
    if isArray(Application(iUserId & "UsrZbC")) Then
       UsersCountGet=Ubound(Application(iUserId & "UsrZbC"))+1
    Else
       UsersCountGet=0
End If
End Function
[/red]

Jag kanske famlar i mörkret..... ;)

Medlem sedan nov. 20017 144 inlägg
#9

Tack Icaaq men....

var skall jag lägga detta?
Som jag beskrev tidigare så har jag en räknarfunktion på chattens "loginsida" men den incuderar en jätte stor includefil, detta skulle jag ju vilja undvika.
Jag provar det Spin skrev i alla fall, så får vi se.

//MVH JESPER

Medlem sedan nov. 20017 144 inlägg
#10

Det ser ut så här nu i Global.asa:

<!--#include file=chat/chatapi.asp-->
Sub Application_OnStart
Application ( "usersOnline" ) = 0
End sub
Sub Session_OnStart
	Session.Timeout=3 'minutes
	Application ( "usersOnline" ) = cInt ( Application ( "usersOnline" ) ) + 1
End Sub

Sub Session_OnEnd
	call LogOffUser(ChatSessionUidGet(),false)
	Application ( "usersOnline" ) = cInt ( Application ( "usersOnline" ) ) - 1
End Sub
</script>

Men inget skrivs ut med :
Response.write Application("usersOnline")

:(

Medlem sedan mars 20007 896 inlägg
#11

Undrar om jag är trött idag... Verkar inte kunna läsa rätt. ;)

Du får göra någon sorts tillämpning, själv gillar jag inkapsling så jag hade gjort så här:

Class OnlineInDaChat
     Dim arrUsers
     Dim iCurrentUsers
     Dim objConnection

     Sub Class_Initialize
          set objConnection = Server.CreateObject ( "ADODB.Connection" )
          objConnection.Open "DSN=myDSN"

          Dim objRecordset
          set objRecordset = objConnection.Execute ( "SELECT fldUsername FROM tblUsersOnline ORDER BY fldUsername ASC" )

          Dim i
          ReDim arrUsers ( objRecordset.Count )
          i = 0
          Do Until objRecordset.EOF
               arrUsers ( i ) = objRecordset ( "fldUsername" )
               i = i + 1
          Loop

          objRecordset.Close
          set objRecordset = Nothing

          iCurrentUsers = i
     End Sub

     Sub Save ( ByVal strUsername )
          Dim objRecordset
          set objRecordset = objConnection.Execute ( "SELECT fldUsername FROM tblUsersOnline WHERE fldUsername = '" & strUsername & "'" )

          If objRecordset.EOF Then
               iCurrentUsers = iCurrentUsers + 1
               ReDim arrUsers ( iCurrentUsers )

               arrUsers ( iCurrentUsers - 1 ) = strUsername

               objConnection.Execute ( "INSERT INTO tblUsersOnline (fldUsername, fldSessionID, fldTime) VALUES('" & strUsername & "', '" & Session.SessionID & "', #" & Time () & "#")" )
          Else
               objConnection.Execute ( "UPDATE tblUsersOnline SET fldTime = #" & Time () & "# WHERE fldSessionID = '" & Session.SessionID & "'" )
          End If

          objRecordset.Close
          set objRecordset = Nothing
     End Sub

     Sub Clear
          objConnection.Execute ( "DELETE FROM tblUsersOnline WHERE fldTime < #" & Time () - 600 & "#" )

          Dim objRecordset
          set objRecordset = objConnection.Execute ( "SELECT fldUsername FROM tblUsersOnline ORDER BY fldUsername ASC" )

          Dim i
          ReDim arrUsers ( objRecordset.Count )
          iCurrentUsers = objRecordset.Count
          i = 0

          Do Until objRecordset.EOF
               arrUsers ( i ) = objRecordset ( "fldUsername" )
               i = i + 1
          Loop

          objRecordset.Close
          set objRecordset = Nothing
     End Sub

     Sub Close
          objConnection.Close
          set objConnection = Nothing
     End Sub

     Function Run ( ByVal strUsername )
          Call Clear
          Call Save strUsername
          Call Close

          Run = arrUsers
     End Function
End Class

Används så här:

set onliners = new OnlineInDaChat
enArray = onliners.Run ( "användarnamn" )

Du behöver en tabell också, enligt nedan:

CREATE TABLE tblUsersOnline (
         fldUsername TEXT NOT NULL, 
         fldSessionID TEXT NOT NULL, 
         fldTime DATETIME NOT NULL, 
         PRIMARY KEY(fldSessionID)
)

Där har du en liten klass som håller koll på dina användare i chatten. Genom att loopa ut enArray får du [förhoppningsvis] ut alla användare som är online - och genom att köra en uBound på enArray får du ut antalet.

Antalet sekunder är just nu satt till 600, innan en användare loggas ut.

Möjligt att det är något fel i klassen, jag konverterade min PHP-klass som gör samma sak till ASP/VBScript - och har inte testat den. :)

Medlem sedan nov. 20017 144 inlägg
#12

Ha ha ha...
Tack Icaaq men....

Jag vill inte ha någon lista över VILKA som är online i chatten utan HUR MÅNGA, jag måste vara otydlig, och det är två som dansar en dålig tango.

<!--#include file=chat/chatapi.asp-->
Sub Application_OnStart
Application ( "usersOnline" ) = 0
End sub
Sub Session_OnStart
	Session.Timeout=3 'minutes
	Application.Lock
	Application ( "usersOnline" ) = cInt ( Application ( "usersOnline" ) ) + 1
	Application.UnLock
End Sub

Sub Session_OnEnd
	call LogOffUser(ChatSessionUidGet(),false)
	Application.Lock
	Application ( "usersOnline" ) = cInt ( Application ( "usersOnline" ) ) - 1
	Application.UnLock
End Sub
</script>

Jag har även lagt till Application.Lock och Application.UnLock i global.asa men det hjälpte inte. (Kan bero på att jag inte har ngn aning om vad Application.Lock & Application.UnLock har för funktion...)

MVH Jesper

Medlem sedan mars 20007 896 inlägg
#13

Med min klass får du både och. Vilka som är online och hur många de är.

Lock låser Application-objektet så att det endast pågående process kan skriva till den, och UnLock låser upp låset. Bra att ha om det är många online, annars kan räknare ställas fel om två eller fler uppdaterar samtidigt.

Medlem sedan nov. 20017 144 inlägg
#14

Men finns det inte ngt enkelt sätt? Tex ngt liknande som jag skrev in i global.asa (Spin)

MVH Jesper

Medlem sedan mars 20007 896 inlägg
#15

Jo, det borde ju funka - men som du säger så får du inte bara användare av chatten då. Då får för hela sidan.

Medlem sedan nov. 20017 144 inlägg
#16

Ja då vet jag inte riktigt vad göra?
Tillbaks på ruta ett....
Jag är hopplös!

271 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
137 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
136 ms — ändringar (db)