From d9b13ba8fbfaa1f8b5c83cfb4e52ad23aad019cd Mon Sep 17 00:00:00 2001 From: Andreas Luxbauer Date: Tue, 22 Nov 2022 22:39:35 +0100 Subject: [PATCH] Session / UserActivity CHAT --> AFK-Erkennung --- VERAG_PROG_ALLGEMEIN/Classes/cSession.vb | 20 ++++++++++++--- VERAG_PROG_ALLGEMEIN/Classes/cUserActivity.vb | 25 +++++++++++++++++++ .../Messenger/frmMessenger.vb | 16 +++++++++--- .../VERAG_PROG_ALLGEMEIN.vbproj | 1 + 4 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 VERAG_PROG_ALLGEMEIN/Classes/cUserActivity.vb diff --git a/VERAG_PROG_ALLGEMEIN/Classes/cSession.vb b/VERAG_PROG_ALLGEMEIN/Classes/cSession.vb index 4292f07e..66b7be71 100644 --- a/VERAG_PROG_ALLGEMEIN/Classes/cSession.vb +++ b/VERAG_PROG_ALLGEMEIN/Classes/cSession.vb @@ -22,6 +22,8 @@ Public Class cSession Property sess_login As Object = Nothing = Now Property sess_logout As Object = Nothing Property sess_lastRm As Object = Nothing + Property sess_lastActivity As Object = Nothing + Property sess_status As Object = Nothing Dim SQL As New SQL @@ -49,6 +51,8 @@ Public Class cSession list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("sess_login", sess_login)) list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("sess_logout", sess_logout)) list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("sess_lastRm", sess_lastRm)) + list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("sess_lastActivity", sess_lastActivity)) + list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("sess_status", sess_status)) Return list End Function @@ -105,7 +109,12 @@ Public Class cSession sess_lastRm = Now 'list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("sess_lastRm", sess_lastRm)) - Return SQL.doSQLVarList(" UPDATE [tblSessions] SET sess_lastRm=GETDATE() WHERE sess_Id=@sess_Id ", "ADMIN", , list) + sess_lastActivity = Now.AddSeconds(-1 * VERAG_PROG_ALLGEMEIN.cUserActivity.GetLastInputTime_Seconds) ' Letzte UserAktivität + 'If DateDiff(DateInterval.Minute, sess_lastActivity, Now) > 10 Then + ' sess_status = + 'End If + + Return SQL.doSQLVarList(" UPDATE [tblSessions] SET sess_lastRm=GETDATE(),sess_lastActivity='" & sess_lastActivity & "' WHERE sess_Id=@sess_Id ", "ADMIN", , list) Catch ex As Exception MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace) @@ -135,6 +144,7 @@ Public Class cSession Catch ex As Exception End Try Me.sess_lastRm = Now + Me.sess_lastActivity = Now Me.sess_progId = Nothing Me.sess_progName = VERAG_PROG_ALLGEMEIN.cAllgemein.PROGNAME Me.sess_progVersion = VERAG_PROG_ALLGEMEIN.cAllgemein.PROGVERSION @@ -148,11 +158,12 @@ Public Class cSession list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("sess_Id", sess_Id, , True)) sess_lastRm = Now + sess_lastActivity = Now ' list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("sess_lastRm", sess_lastRm)) sess_logout = Now ' list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("sess_logout", sess_logout)) - Return SQL.doSQLVarList(" UPDATE [tblSessions] SET sess_lastRm=GETDATE(),sess_logout=GETDATE() WHERE sess_Id=@sess_Id ", "ADMIN", , list) + Return SQL.doSQLVarList(" UPDATE [tblSessions] SET sess_lastRm=GETDATE(),sess_logout=GETDATE(),sess_lastActivity=GETDATE() WHERE sess_Id=@sess_Id ", "ADMIN", , list) Catch ex As Exception MsgBox("Fehler in der Funktion '" & System.Reflection.MethodInfo.GetCurrentMethod.Name & "'" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & ex.StackTrace) @@ -201,4 +212,7 @@ Public Class cSession Return "" End Function -End Class \ No newline at end of file +End Class +'Class cSESSION_STATUS +' Shared ONLINE As String = +'End Class \ No newline at end of file diff --git a/VERAG_PROG_ALLGEMEIN/Classes/cUserActivity.vb b/VERAG_PROG_ALLGEMEIN/Classes/cUserActivity.vb new file mode 100644 index 00000000..1efac774 --- /dev/null +++ b/VERAG_PROG_ALLGEMEIN/Classes/cUserActivity.vb @@ -0,0 +1,25 @@ +Imports System.Runtime.InteropServices +Public Class cUserActivity + Declare Function GetLastInputInfo Lib "user32" (ByRef plii As LASTINPUTINFO) As Boolean + 'Private WithEvents T As New Timer With {.Interval = 1000, .Enabled = True} + + Structure LASTINPUTINFO + Public cbSize As Integer + Public dwTime As Integer + End Structure + + Shared Function GetLastInputTime_Seconds() As Integer + Static LastInput As New LASTINPUTINFO() + LastInput.cbSize = Marshal.SizeOf(LastInput) + LastInput.dwTime = 0 + GetLastInputInfo(LastInput) + Return (Environment.TickCount - LastInput.dwTime) / 1000 + End Function + Shared Function GetLastInputTime_Minutes() As Integer + Return GetLastInputTime_Seconds() / 60 + End Function + + 'Private Sub T_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles T.Tick + ' Me.Text = "Letzte Aktivität vor " & GetLastInputTime() & " Sek." + 'End Sub +End Class diff --git a/VERAG_PROG_ALLGEMEIN/Messenger/frmMessenger.vb b/VERAG_PROG_ALLGEMEIN/Messenger/frmMessenger.vb index 1069d4af..e0c0dc9a 100644 --- a/VERAG_PROG_ALLGEMEIN/Messenger/frmMessenger.vb +++ b/VERAG_PROG_ALLGEMEIN/Messenger/frmMessenger.vb @@ -487,10 +487,18 @@ Public Class frmMessenger lblOnlineOffline.Visible = False Else lblOnlineOffline.Visible = True - Dim cntOnline = SQL.getValueTxtBySql("SELECT count(*) FROM [tblMessenger_ChatMembers] inner join tblSessions ON sess_maId=[chatMb_maId] and sess_lastRm > dateadd(MINUTE,-2, getdate()) where chatMb_chatId ='" & CHAT.chat_id & "' and chatMb_maId<>'" & VERAG_PROG_ALLGEMEIN.cAllgemein.USRID & "'", "ADMIN") - If cntOnline > 0 Then - lblOnlineOffline.Text = "ONLINE" - lblOnlineOffline.BackColor = Color.MediumSeaGreen + 'Dim cntOnline = SQL.getValueTxtBySql("SELECT count(*) FROM [tblMessenger_ChatMembers] inner join tblSessions ON sess_maId=[chatMb_maId] and sess_lastRm > dateadd(MINUTE,-2, getdate()) where chatMb_chatId ='" & CHAT.chat_id & "' and chatMb_maId<>'" & VERAG_PROG_ALLGEMEIN.cAllgemein.USRID & "'", "ADMIN") + Dim sess_IdOnline = SQL.getValueTxtBySql("SELECT sess_Id FROM [tblMessenger_ChatMembers] inner join tblSessions ON sess_maId=[chatMb_maId] and sess_lastRm > dateadd(MINUTE,-2, getdate()) where chatMb_chatId ='" & CHAT.chat_id & "' and chatMb_maId<>'" & VERAG_PROG_ALLGEMEIN.cAllgemein.USRID & "' ORDER BY sess_lastActivity DESC,sess_lastRm DESC", "ADMIN",,, -1) + If sess_IdOnline > 0 Then + + Dim SESSION As New cSession(sess_IdOnline) + If DateDiff(DateInterval.Minute, If(SESSION.sess_lastActivity, Now), Now) > 10 Then + lblOnlineOffline.Text = "AFK" + lblOnlineOffline.BackColor = Color.Orange + Else + lblOnlineOffline.Text = "ONLINE" + lblOnlineOffline.BackColor = Color.MediumSeaGreen + End If Else lblOnlineOffline.Text = "OFFLINE" lblOnlineOffline.BackColor = Color.Red diff --git a/VERAG_PROG_ALLGEMEIN/VERAG_PROG_ALLGEMEIN.vbproj b/VERAG_PROG_ALLGEMEIN/VERAG_PROG_ALLGEMEIN.vbproj index 8bf69920..a115abff 100644 --- a/VERAG_PROG_ALLGEMEIN/VERAG_PROG_ALLGEMEIN.vbproj +++ b/VERAG_PROG_ALLGEMEIN/VERAG_PROG_ALLGEMEIN.vbproj @@ -363,6 +363,7 @@ +