'////////////////////////////////////////////////////////////////////////
'// MIMIC SCRIPT FOR 9.4
'// WRITTEN BY: Chriso
'// BASED OFF ORIGINAL SCRIPT BY: LocK
'// This script will allow you to return FMyLife.com entries and display
'// them in the channel.
'////////////////////////////////////////////////////////////////////////

Public Const FileName = "FMyLife"
Private BlankAmount
Private Store

'// Return Script Information
Sub Script(Name, Major, Minor, Build, Author, Commands, Description)
	Name = "FMyLife"
	Major = 1
	Minor = 4
	Build = 0
	Author = "Chriso"
	Commands = "fmlcat, fmllast, fmlmore, fmlrandom"
	Description = "Return entries from www.fmylife.com"
End Sub

'// Register Commands...
Sub Event_Load()
	CreateCommand "fmlmore", FileName, "Command_FmlMore", "fmlm", "", "Return more information about last FMyLife item.", 0, True
	CreateCommand "fmllast", FileName, "Command_FmlLast", "fmll", "", "Return latest FMyLife item.", 0, True
	CreateCommand "fmlrandom", FileName, "Command_FmlRandom", "fml", "", "Return random FMyLife item.", 0, True
	CreateCommand "fmlcat", FileName, "Command_FmlCat", "fmlc", "", "Return list of FMyLife categories.", 0, True
End Sub

'// Callback for "fmllast/fmll" command
Sub Command_FmlLast(CS)
	ReadFMyLife CS, "last"
End SUb

'// Callback for "fmlrandom/fml" command
Sub Command_FmlRandom(CS)
	ReadFMyLife CS, "random" 
End Sub

'// Callback for "fmlmore/fmlm" command
Sub Command_FmlMore(CS)
	If LenB(Store) = 0 Then
		CS.Reply "FMyLife has not been accessed yet."
	Else
		Dim Approve, Deserved, Category, Comments, ID
		If InStr(1, Store, "<agree>") then
			Approve = Split(Store, "<agree>")(1)
			Approve = Split(approve, "</agree>")(0)
		Else
			Approve = 0
		End If
		If InStr(1, Store, "<deserved>") > 0 then
			Deserved = Split(Store, "<deserved>")(1)
			Deserved = Split(Deserved, "</deserved>")(0)
		Else
			Deserved = 0
		End If
		If Instr(1, Store, "<category>") > 0 then
			Category = Split(Store, "<category>")(1)
			Category = Split(Category, "</category>")(0)
		Else
			Category = "None"
		End If
		If InStr(1, Store, "<comments>") > 0 then
			Comments = Split(Store, "<comments>")(1)
			Comments = Split(Comments, "</comments>")(0)
		Else
			Comments = 0
		End If
		If InStr(1, Store, "<item id=") > 0 then
			id = Split(Store, "<item id=")(1)
			id = Split(id, ">")(0)
			id = left(id, len(id) - 1)
			id = right(id, len(id) - 1)
		Else
			id = "None"
		End If
		CS.Reply "Post ID: " & id
		CS.Reply "Listed in category: " & Category
		CS.Reply approve & " people agree their life is fucked, while " & deserved & " people think they deserved it."
		CS.Reply comments & " comments have been left on this post."
	End if
End Sub

'// Callback for "fmlcat/fmlc" command
Sub Command_FmlCat(CS)
	Dim XmlHttp, XmlData, Cats, List, I
	Set XmlHttp = CreateObject("Microsoft.XmlHttp")
    XmlHttp.Open "GET", "http://api.betacie.com/view/categories?key=readonly&language=en", False
    XmlHttp.Send ""
    XmlData = XmlHttp.ResponseText
	
	'// See if Xml code contains error nodes
	If CheckForErrors(XmlData) Then Exit Sub
	
	Cats = Split(XmlData, "<categorie code=")
	For I = 1 To UBound(Cats)
		Cats(I) = Split(Cats(I), ">")(0)
		Cats(I) = Left(Cats(I), Len(Cats(I))-1)
		Cats(I) = Right(Cats(I), Len(Cats(I))-1)
		List = List & Cats(I) & ", "
	Next
	List = Left(List, Len(List)-2)
	CS.Reply "Categories: " & List
End Sub

'// Replace HTML characters
Private Function ParseHTML(strText)
	Dim Text
	Text = Replace(strText, "&nbsp;", " ")
	Text = Replace(Text, "&lt;", "<")
	Text = Replace(Text, "&quot;", """")
	Text = Replace(Text, "&apos;", "'")
	Text = Replace(Text, "&gt;", ">")
	Text = Replace(Text, "&laquo;", "")
	Text = Replace(Text, "&raquo;", "")
	Text = Replace(Text, "&copy;", "")
	Text = Replace(Text, "&reg;", "")
	ParseHTML = Text
End Function 

'// Extract Date
Public Function ParseDate(XmlData)
	Dim Stamp, D, M, Y, PTime, PDate
	Stamp = Split(XmlData, "<date>")(1)
	Stamp = Split(Stamp, "</date>")(0)
	Stamp = Replace(Stamp, "T", " ")
	PTime = Split(Stamp, " ")(1)
	PDate = Split(Stamp, " ")(0)
	D = Split(PDate, "-", 3)(2)
	M = Split(PDate, "-", 3)(1)
	Y = Split(PDate, "-", 3)(0)
	PTime = Split(PTime, "-")(0)
	ParseDate = M & "-" & D & "-" & Y & " " & PTime
End Function

'// Read Random/Latest FMyLife Entry
Public Sub ReadFMyLife(CS, view)
	Dim XmlHttp, XmlData, Text, Author, Buf
	Set XmlHttp = CreateObject("Microsoft.XmlHttp")
	XmlHttp.Open "GET", "http://api.betacie.com/view/" & view & "?key=readonly&language=en", False
    XmlHttp.Send ""
	XmlData = XmlHttp.ResponseText
	
	'// See if Xml code contains error nodes
	If CheckForErrors(XmlData) Then Exit Sub
	
	'// Read XML Data
	Text = Split(XmlData, "<text>")(1)
	Text = Split(Text, "</text>")(0)
	Text = ParseHTML(Text)
	Author = Split(XmlData, "<author ")(1)
	Author = Split(Author, "</author")(0)
	Author = Split(Author, """>")(1)
	Author = ParseHTML(Author)
	
	'// Concatenate Response Header
	Buf = "Submitted by: " & Author
	If UBound(Split(XmlData, "<date>")) > 0 Then
		Buf = Buf & " on " & ParseDate(XmlData)
	End If
	
	'// Send Response
	If view = "random" Then
		CS.Reply "Random FMyLife Entry (" & Buf & ")"
		CS.Reply Text
	Else
		CS.Reply "Latest FMyLife Entry (" & Buf & ")"
		CS.Reply Text
	End If
	
	'// Store Returned Data
	Store = XmlData
End Sub

'// Check XmlData for Errors
Public Function CheckForErrors(XmlData)
	If Len(XmlData) = 0 then
		CheckForErrors = True
		Select Case BlankAmount
		Case 1
			BlankAmount = 2
			SSC.Send "Returned data was empty. Try again Please."
		Case 2
			BlankAmount = 3
			SSC.Send "Returned data was empty."
			SSC.Send "The FMyLife website may be down, please try again in five minutes."
		Case 3
			BlankAmount = 1
			SSC.Send "Returned data was empty."
			SSC.Send "Please try again later."
		End Select
	ElseIf Ubound(Split(XmlData, "<errors>")) > 0 or Ubound(Split(XmlData, "<error>")) > 0 then
		Dim Error1, Errors, ErrorList
		Error1 = Ubound(Split(XmlData, "<error>"))
		If Error1 > 0 then
			CheckForErrors = True
			Errors = Split(XmlData, "<error>")
			For i = 1 to ubound(Errors)
				Errors(i) = Split(Errors(i), "</error>")(0)
				ErrorList = ErrorList &  ", " & Errors(i)
			Next
			ErrorList = right(ErrorList, len(ErrorList) - 1)
			SSC.Send "Encountered " & Error1 & " Error(s):"
			SSC.Send ErrorList
      End if
    End if
End Function