Jesper TMedlem sedan nov. 20017 144 inläggHej!
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>
SSPiNMedlem sedan mars 20007 896 inlägg 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.
Jesper TMedlem sedan nov. 20017 144 inläggTack, 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
Jesper TMedlem sedan nov. 20017 144 inläggJag famlar i mörker......... :(
Är det bara Lars G som kan detta?
SSPiNMedlem sedan mars 20007 896 inlägg 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" ).
Jesper TMedlem sedan nov. 20017 144 inläggTack 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
IicaaqMedlem sedan okt. 20005 273 inlägg 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..... ;)
Jesper TMedlem sedan nov. 20017 144 inläggTack 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
Jesper TMedlem sedan nov. 20017 144 inläggDet 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")
:(
SSPiNMedlem sedan mars 20007 896 inlägg 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. :)
Jesper TMedlem sedan nov. 20017 144 inläggHa 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
SSPiNMedlem sedan mars 20007 896 inlägg 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.
Jesper TMedlem sedan nov. 20017 144 inläggMen finns det inte ngt enkelt sätt? Tex ngt liknande som jag skrev in i global.asa (Spin)
MVH Jesper
SSPiNMedlem sedan mars 20007 896 inlägg 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.
Jesper TMedlem sedan nov. 20017 144 inläggJa då vet jag inte riktigt vad göra?
Tillbaks på ruta ett....
Jag är hopplös!