Private Memory

Sub Script(Name, Major, Minor, Build, Author, Commands, Description)
	Name = "Seen Script"
	Major = 1
	Minor = 0
	Build = 2
	Author = "Droid"
	Commands = "seen"
	Description = "Tracks the last time the bot saw a user. Ported to MB 9.4 from 9.3 Script by MikeA."
End Sub

Sub Event_Load()
	Set Memory = New SeenScriptMemory
	Memory.Path = GetDataPath() & "Seen.txt"
	Memory.CompareMode = 1
	Memory.Initialize()
	CreateCommand "seen", "Seen", "Command_Seen", "", "user", "Returns when user was last seen.", 0, True
	AddChat RGB(255, 236, 179), "Seen Script loaded: " & Memory.Count & " entries."
End Sub

Sub Event_Unload()
	Memory.Flush()
	AddChat RGB(235, 176, 0), "Seen Script unloaded: " & Memory.Count & " entries."
End Sub

Sub Event_UserJoin(CE)
	Memory.SetSeen CE.Username, Now()
End Sub

Sub Event_UserPresent(CE)
	Memory.SetSeen CE.Username, Now()
End Sub

Sub Event_UserLeave(CE)
	Memory.SetSeen CE.Username, Now()
End Sub

Sub Command_Seen(CS)
	Query = CS.Message 
	If Query = vbNullstring Then 
		If Memory.Count = 1 Then 
			CS.Reply "There is 1 seen entry in my data file."
		Else
			CS.Reply "There are " & Memory.Count & " seen entries in my data file."
		End If
		Exit Sub
	End If
	If GetUserPing(Query) <> -2 Then CS.Reply Query & " is currently in this channel.": Exit Sub
    Result = Memory.GetSeen(Query)
    If Result = vbNullString Then
		CS.Reply "I have not seen " & Query & "."
    Else
        SecondsAgo = DateDiff("s", result, Now)
        DaysAgo = CLng(SecondsAgo / 86400)
        SecondsAgo = SecondsAgo - DaysAgo * 86400
        HoursAgo = CLng(SecondsAgo / 3600)
        SecondsAgo = SecondsAgo - HoursAgo * 3600
        MinutesAgo = CLng(SecondsAgo / 60)
        SecondsAgo = SecondsAgo - MinutesAgo * 60
        
        If SecondsAgo < 0 Then MinutesAgo = MinutesAgo - 1: SecondsAgo = SecondsAgo + 60
        If MinutesAgo < 0 Then HoursAgo = HoursAgo - 1: MinutesAgo = MinutesAgo + 60
        If HoursAgo < 0 Then DaysAgo = DaysAgo - 1: HoursAgo = HoursAgo + 24
        
        If DaysAgo <> 0 Then FinalDiff = DaysAgo & " days, "
        If DaysAgo = 1 Then FinalDiff = Replace(FinalDiff, "days", "day")
        If HoursAgo <> 0 Then FinalDiff = FinalDiff & HoursAgo & " hours, "
        If HoursAgo = 1 Then FinalDiff = Replace(FinalDiff, "hours", "hour")
        If MinutesAgo <> 0 Then FinalDiff = FinalDiff & MinutesAgo & " minutes, and "
        If MinutesAgo = 1 Then FinalDiff = Replace(FinalDiff, "minutes", "minute")
        FinalDiff = FinalDiff & SecondsAgo & " seconds ago"
        If SecondsAgo = 1 Then FinalDiff = Replace(FinalDiff, "seconds", "second")
		
		CS.Reply Query & " was last seen on " & Split(Result)(0) & " at " & Split(Result)(1) & Split(Result)(2) & " (" & FinalDiff & ")."
    End If
End Sub

Class SeenScriptMemory
	Private dictMemory
	Private filePath
	
	Public Property Let Path(value)
		filePath = value
	End Property
	
	Private Sub Class_Initialize()
		Set dictMemory = CreateObject("Scripting.Dictionary")
	End Sub

	Private Sub Class_Terminate()
		Set dictMemory = Nothing
	End Sub

	Public Function Initialize()
		On Error Resume Next
		Set fileSystem = CreateObject("Scripting.FileSystemObject")
		If Not fileSystem.FileExists(filePath) Then
		Set textStream = fileSystem.OpenTextFile(filePath, 2, True)
			textStream.WriteLine "MirageBot|" & Date() & " " & Time()
			textStream.Close
		End If
		Set textStream = fileSystem.OpenTextFile(filePath, 1)
		If textStream.AtEndOfStream Then Exit Function
		For Each line In Split(textStream.ReadAll, vbNewLine)
			If InStr(line, "|") Then
				dictMemory.Add Split(line, "|")(0), Split(line, "|")(1)
			End if
		Next
		textStream.Close()
		Set textStream = Nothing
		Set fileSystem = Nothing 
		If Err Then AddChat vbRed, err.Description
	End Function
	
	Public Function GetSeen(User)
		If dictMemory.Exists(User) Then GetSeen = dictMemory.Item(User)
	End Function
	
	Public Function SetSeen(User, Seen)
		dictMemory.Item(User) = Seen
	End Function

	Public Property Let CompareMode(Mode)
		dictMemory.CompareMode = Mode
	End Property
	
	Public Function Flush()
		Set fileSystem = CreateObject("Scripting.FileSystemObject")
		Set textStream = fileSystem.OpenTextFile(filePath, 2, True)
		For Each key In dictMemory.Keys()
			textStream.WriteLine key & "|" & dictMemory.Item(key)
		Next
		textStream.Close()
		Set textStream = Nothing
		Set fileSystem = Nothing
	End Function
	
	Public Function Count()
		Count = dictMemory.Count
	End Function
End Class