PHP Code:
Script("Name")     = "SharedQ"
Script("Author")   = "AwaKening"
Script("Major")    = 2
Script
("Minor")    = 0
Script
("Revision") = 6
Script
("Commands") = ""
Script("Notes")    = "Shares the bot's queue system between other bots to avoid flooding:"&_
                     
"This scripts needs to be loaded on every bot using the system"
Script("FileName") = "SharedQ.txt"


'***********
CHANGELOG

'// v2.0.6 updated 11/15/2009
'
//    - Fixed problem with queue backing up if no channel was specified in settings
'// v2.0.5 updated 11/14/2009
'
//    - Added channel check before grabbing a message from the queue
'// v2.0.4 updated 11/10/2009
'
//    - Added Queued variable to make the bot skip interval if message received
'//      (should help with the out of order messages until SB is updated with queue.credits)
'
//    - Added ignore public output messages setting
'//    - Fixed occasional error message: Scripting runtime error '62' in SharedQ: (line 234; column 1)
'
// v2.0.3 updated 10/23/2009
'//    - Added Setting to ignore whispered messages
'
//    - Added Setting to ignore emoted messages
'//    - Added Setting to ignore whispered messages to specified users
'
//    - Added Setting to share Moderation commands
'//    - Fixed cq and scq commands
'
// v2.0.2 updated 10/22/2009
'//    - Added a setting for shared channel
'
//    - Added a check for filesize before opening the queue file
'//     - Fixed queueFile Location
'
// v2.0.0 updated 10/22/2009
'//    - Completely reworked the sharing method
'
// v1.00 updated 09/14/2009
'//    - Converted to script format
'
// v0.14 updated 08/09/2009
'//    - Attempt to fix lost messages by adding Event_MessageSent
'
//    - sq_whispered has been changed to sq_ignored and assigned as Integer
'// v0.13 updated 03/31/2009
'
//    - Added Const sq_padqueue setting to optionally ignore blank messages
'//    - padqueues are now ignored in message queued event
'
//    - Added command followbot along with access setting
'//    - Added sq_HasAccess Function
'
//    - Added a fix for lost messages when queue is backed up with whispers
'// v0.12 updated 03/30/2009
'
//    - Followbot is now designated on channeljoin rather than on botload
'//    - Added some usercheck's to redesignate a followbot if necessary
'//    - Added a check for empty queue in messagequeued to check the Shared queue
'
// v0.11 updated 03/28/2009
'//    - Added cq and scq functionality


'
***********
' GLOBALS

Private Const ForReading = 1
Private Const ForWriting = 2
Private Const ForAppending = 8
Private Const Skips = 0

Private FSO, queueFile, Queued

'
************
' BOT EVENTS

Sub Event_Load()
    Set FSO = CreateObject("Scripting.FileSystemObject")

    queueFile = CreateObject("Wscript.Shell").ExpandEnvironmentStrings("%AppData%")&"\sharedq.txt"

    If NOT FSO.FileExists(queueFile) Then
        FSO.CreateTextFile(queueFile)
    End If

    If Len(GetSettingsEntry("sharePublic (info)"))=0 Then
        Call CreateSettings()

        AddChat color.Plum, "SharedQ settings stored in scripts.ini"
        AddChat color.Plum, "   Additional settings can be found there as well"
    End If

    ObserveScript(SSC.InternalScript)

    CreateObj "Longtimer", "Delay"
    Delay.Interval = 1
    Delay.Enabled = True

    AddChat color.Purple, "AwaKening'
s SharedQ is Active!"
End Sub

Sub Event_Command(Command)
    Select Case LCase(Command.Name)
        Case "
cq", "scq": EmptySharedQ
    End Select
End Sub

Sub Event_MessageQueued(MessageID, Message, Tag)
    If Len(Message)=0 Then Exit Sub
    If Tag="
SharedQ" Then Exit Sub

    If Len(GetSettingsEntry("
sqChannel"))>0 Then
        If LCase(myChannel) <> LCase(GetSettingsEntry("
sqChannel")) Then Exit Sub
    End If

    If Trim(Message) = "
%%%%%blankqueuemessage%%%%%" Then
        Queue.RemoveItemById(MessageID)
        Exit Sub
    ElseIf Left(Message, 1) = "
/" Then
        If NOT shareCommand(Message) Then Exit Sub
    Else
        If NOT BooleanSetting("
sharePublic") Then Exit Sub
    End If

    Queue.RemoveItemByID(MessageID)
    Queued = Skips
    Call AddToSharedQ(Message)
End Sub


'********
' TIMERS

Sub Delay_Timer()
    If Queued Then
        '// Skip intervals to avoid out-of-order messages
        Queued = Queued-1
    ElseIf Queue.Count=0 AND IsOnline Then
        If MessageWaiting() Then
            Dim channel

            channel = GetSettingsEntry("
sqChannel")

            If Len(channel)>0 Then
                If LCase(myChannel) <> LCase(channel) Then Exit Sub
            End If

            AddQ DisplayAndDelete(), , "
SharedQ"
        End If
    End If
End Sub


'***********************
' SHARED SUBS/FUNCTIONS

Private Function shareCommand(ByVal Message)
    Dim msgArr, users, user

    msgArr = Split(LCase(Message))

    Select Case msgArr(0)
    Case "
/me", "/emote"
        If NOT BooleanSetting("
shareEmotes") Then Exit Function
    Case "
/w"
        If NOT BooleanSetting("
shareWhispers") Then Exit Function
        If UBound(msgArr)=0 Then Exit Function

        users = GetSettingsEntry("
whisperUsers")
        If Len(users)>0 Then
            users = Replace(users, "
,", "")
            For Each user in Split(LCase(users))
                 If msgArr(1) = user Then Exit Function
            Next
        End If
    Case "
/ban", "/unban", "/kick"
        If NOT BooleanSetting("
shareMod") Then Exit Function        
    Case Else
        Exit Function
    End Select

    shareCommand = True
End Function

Private Sub CreateSettings()
    Dim response, title

    title = "
AwaKening's SharedQ"

    '
// v2.0.4
    
WriteSettingsEntry "sharePublic (info)""Y/N share public output messages"
    
WriteSettingsEntry "sharePublic""Y"

    '// v2.0.3
    If Len(GetSettingsEntry("shareWhispers (info)")) > 0 Then Exit Sub

    response = MsgBox("Would you like to share Whispers?", vbYesNo, title)

    WriteSettingsEntry "shareWhispers (info)", "Y/N share whispered messages"
    WriteSettingsEntry "shareWhispers", vbResponse(response)

    response = MsgBox("Would you like to share Emotes?", vbYesNo, title)

    WriteSettingsEntry "shareEmotes (info)", "Y/N share emoted messages"
    WriteSettingsEntry "shareEmotes", vbResponse(response)

    response = MsgBox("Would you like to share Moderation?"&vbcrlf&_
    "(Other bots MUST be channel ops)", vbYesNo, title)

    WriteSettingsEntry "shareMod (info)", "Y/N share Moderation commands"
    WriteSettingsEntry "shareMod", vbResponse(response)

    response = InputBox("List any users you whisper to that you don'
t want shared"&_
    " 
(Seperate users with a space)"&vbcrlf&vbcrlf&"Leave Blank if none", title, "")

    WriteSettingsEntry "
whisperUsers (info)", "Whispers to any of these users will not be shared"&_
    " 
(Seperate users with a space)"
    WriteSettingsEntry "
whisperUsers", response

    '// v2.0.2
    If Len(GetSettingsEntry("
sqChannel (info)")) > 0 Then Exit Sub

    response = InputBox("
Set a channel name here if you want to share your queue "&_
    " 
only while in this channel"&vbcrlf&vbcrlf&"Leave blank to share everywhere", title, "")

    WriteSettingsEntry "
sqChannel (info)", "Set a channel name here if you want "&_
    "
to share your queue only while in this channel"
    WriteSettingsEntry "
sqChannel", response
End Sub

Private Function vbResponse(response)
    If response = vbYes Then
        vbResponse = "
Y"
    Else
        vbResponse = "
N"
    End If
End Function

Private Function BooleanSetting(Setting)
    Select Case UCase(GetSettingsEntry(Setting))
        Case "
NO", "N", "FALSE", "0": BooleanSetting = False
        Case Else: BooleanSetting = True
    End Select
End Function

Private Function MessageWaiting()
    If FSO.FileExists(queueFile) Then
        Dim f
        Set f = FSO.GetFile(queueFile)
        MessageWaiting = CBool(f.Size)
        Set f = Nothing
    Else
        MessageWaiting = False
    End If
End Function

Private Sub EmptySharedQ()
    FSO.DeleteFile(queueFile)
    FSO.CreateTextFile(queueFile)
End Sub

Private Sub AddToSharedQ(ByVal Message)
    Dim f    
    Set f = FSO.OpenTextFile(queueFile, 8, True)
    f.WriteLine Message
    f.Close
    Set f = Nothing
End Sub

Private Function DisplayAndDelete()
    Dim f, msgs, i

    Set f = FSO.OpenTextFile(queueFile, 1, True)

    If f.AtEndOfStream Then
        f.Close
        Set f=Nothing
        Exit Function
    End If

    msgs = Split(f.ReadAll, vbCrLf)
    f.Close

    Set f = FSO.OpenTextFile(queueFile, 2, True)
    For i=1 To UBound(msgs)
        If Len(msgs(i))>0 Then f.WriteLine msgs(i)
    Next
    f.Close
    Set f = Nothing
    
    DisplayAndDelete = msgs(0)
End Function