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>
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.
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.
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:
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!
[red]
Function UsersCountGet()
if isArray(Application(iUserId & "UsrZbC")) Then
UsersCountGet=Ubound(Application(iUserId & "UsrZbC"))+1
Else
UsersCountGet=0
End If
End Function
[/red]
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.
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.
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...)
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.