class IRC_Channel extends IRC_Page; var string ChannelName; var IRC_System SystemPage; var string ChannelTopic; var bool IsPrivate; // ChannelName will ~= Remote's Nick in this case //struct IRCUser //{ // var string NickName; // var bool bChOp; // var bool bVoice; //}; //var array Users; var GUIListBox UserListBox; var bool bUsersNeedSorting; // NB - this assume 'flag' is always a 1-character string function UserSetFlag(int i, string flag, bool bSet) { local string flags; local int flagPos; flags = UserListBox.List.GetExtraAtIndex(i); if(bSet) // TURN FLAG ON { // If user already has flag set, do nothing. if( InStr(flags, flag) != -1 ) return; // Add to end of existing flags. UserListBox.List.SetExtraAtIndex(i, flags$flag); } else // TURN FLAG OFF { flagPos = InStr(flags, flag); // If flag not in flag list, do nothing; if(flagPos == -1) return; // Remove flags from string flags = Left(flags, flagPos)$Mid(flags, flagPos+1); UserListBox.List.SetExtraAtIndex(i, flags); } } function InitComponent(GUIController MyController, GUIComponent MyOwner) { local GUIPanel UtilPanel; // Split horizontally to allow room for user list GUISplitter(Controls[1]).SplitOrientation = SPLIT_Horizontal; GUISplitter(Controls[1]).SplitPosition = 0.75; GUISplitter(Controls[1]).bFixedSplitter = false; // Put the user list into the Util panel UtilPanel = GUIPanel( GUISplitter(Controls[1]).Controls[1] ); UtilPanel.Controls[0] = UserListBox; Super.Initcomponent(MyController, MyOwner); // Set delegates for user list box UserListBox.List.OnDrawItem=MyOnDrawItem; UserListBox.List.CompareItem=MyCompareItem; UserListBox.List.OnDblClick=MyListDblClick; UserListBox.OnPreDraw=MyOnPreDraw; } // Sort the users list prior to drawing if necessary function bool MyOnPreDraw(Canvas C) { if(bUsersNeedSorting) { UserListBox.List.SortList(); bUsersNeedSorting=false; } return true; } function bool MyListDblClick(GUIComponent Sender) { local string UserName; UserName = UserListBox.List.Get(); if(UserName == "") return true; SystemPage.CreatePrivChannel(UserName, true); // Make new channel active in this case return true; } // Sort alphabetically, but with ops first, then voice, then plebs :) function int MyCompareItem(GUIListElem ElemA, GUIListElem ElemB) { local string s1, s2; // Add some extra spaces to the start of the names if they are ops or voice (to rank them towards the top) if( InStr(ElemA.ExtraStrData,"o") != -1) s1 = " "$ElemA.item; else if( InStr(ElemA.ExtraStrData,"h") != -1) s1 = " "$ElemA.item; else if( InStr(ElemA.ExtraStrData,"v") != -1) s1 = " "$ElemA.item; else s1 = ElemA.item; if( InStr(ElemB.ExtraStrData,"o") != -1) s2 = " "$ElemB.item; else if( InStr(ElemB.ExtraStrData,"h") != -1) s2 = " "$ElemB.item; else if( InStr(ElemB.ExtraStrData,"v") != -1) s2 = " "$ElemB.item; else s2 = ElemB.item; s1 = Caps(s1); s2 = Caps(s2); // ugh.. need script strcmp if(s1 > s2) return 1; else if(s1 < s2) return -1; else return 0; } function MyOnDrawItem(Canvas Canvas, int i, float X, float Y, float W, float H, bool bSelected, bool bPending) { local string DrawName, NickName, Flags; NickName = UserListBox.List.GetItemAtIndex(i); Flags = UserListBox.List.GetExtraAtIndex(i); if( InStr(Flags,"o") != -1) DrawName = "@"$NickName; else if( InStr(Flags,"h") != -1) DrawName = "%"$NickName; else if( InStr(Flags,"v") != -1) DrawName = "+"$NickName; else DrawName = NickName; UserListBox.Style.DrawText( Canvas, MSAT_Blurry, X, Y, W, H, TXTA_Left, DrawName, UserListBox.FontScale ); } // user funcs --- function int GetUser( string Nick ) { local int i; for( i=0; i -1 ) return true; return false; } function AddUser( string Nick ) { local int i; i = GetUser(Nick); if( i > -1 ) return; // already in user list UserListBox.List.Add(Nick); bUsersNeedSorting=true; } function RemoveUser( string Nick ) { local int i; i = GetUser(Nick); if( i < 0 ) return; // not in list UserListBox.List.RemoveItem(Nick); bUsersNeedSorting=true; } function ChangeNick( string OldNick, string NewNick) { local int i; i = GetUser(OldNick); if( i < 0 ) return; UserListBox.List.SetItemAtIndex(i, NewNick); } function ChangeOp( string Nick, bool NewOp ) { local int i; i = GetUser(Nick); if( i < 0 ) return; UserSetFlag(i, "o", NewOp); bUsersNeedSorting=true; } function ChangeHalfOp( string Nick, bool NewHalfOp ) { local int i; i = GetUser(Nick); if( i < 0 ) return; UserSetFlag(i, "h", NewHalfOp); bUsersNeedSorting=true; } function ChangeVoice( string Nick, bool NewVoice ) { local int i; i = GetUser(Nick); if( i < 0 ) return; UserSetFlag(i, "v", NewVoice); bUsersNeedSorting=true; } function ChangeTopic( string NewTopic ) { ChannelTopic = NewTopic; TextDisplay.AddText( MakeColorCode(IRCInfoColor)$"*** "$NewTopicText$": "$NewTopic); if(!MyButton.bActive) MyButton.bForceFlash = true; } // --- user funcs function ChannelText(string Nick, string Text) { TextDisplay.AddText( MakeColorCode(IRCNickColor)$"<"$Nick$"> "$MakeColorCode(IRCTextColor)$ColorizeLinks(Text) ); if(!MyButton.bActive) MyButton.bForceFlash = true; } function ChannelAction(string Nick, string Text) { TextDisplay.AddText( MakeColorCode(IRCActionColor)$"* "$Nick$" "$Text ); if(!MyButton.bActive) MyButton.bForceFlash = true; } function UserNotice(string Nick, string Text) { TextDisplay.AddText(MakeColorCode(IRCActionColor)$"-"$Nick$"- "$Text); if(!MyButton.bActive) MyButton.bForceFlash = true; } function ProcessInput(string Text) { if(Left(Text, 4) ~= "/me ") { ChannelAction(SystemPage.NickName, Mid(Text, 4)); SystemPage.Link.SendChannelAction(ChannelName, Mid(Text, 4)); } else if(Left(Text, 1) == "/") { SystemPage.Link.SendCommandText(Mid(Text, 1)); } else { if(Text != "") { ChannelText(SystemPage.NickName, Text); SystemPage.Link.SendChannelText(ChannelName, Text); } } } function PartedChannel(string Nick) { TextDisplay.AddText( MakeColorCode(IRCInfoColor)$"*** "$Nick@HasLeftText@ChannelName$"."); RemoveUser(Nick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function JoinedChannel(string Nick) { TextDisplay.AddText( MakeColorCode(IRCInfoColor)$"*** "$Nick@HasJoinedText@ChannelName$"."); AddUser(Nick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function KickUser(string KickedNick, string Kicker, string Reason) { TextDisplay.AddText( MakeColorCode(IRCInfoColor)$"*** "$KickedNick@WasKickedByText@Kicker$" ("$Reason$")"); RemoveUser(KickedNick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function UserInChannel(string Nick) { AddUser(Nick); } function ChangedNick(string OldNick, string NewNick) { TextDisplay.AddText( MakeColorCode(IRCInfoColor)$"*** "$OldNick@NowKnownAsText@NewNick$"."); ChangeNick(OldNick, NewNick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function UserQuit(string Nick, string Reason) { TextDisplay.AddText( MakeColorCode(IRCInfoColor)$"*** "$Nick@QuitText@"("$Reason$")."); RemoveUser(Nick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function ChangeMode(string Nick, string Mode) { TextDisplay.AddText( MakeColorCode(IRCInfoColor)$"*** "$Nick@SetsModeText$": "$Mode); if(!MyButton.bActive) MyButton.bForceFlash = true; } defaultproperties { Begin Object Class=GUIListBox Name=MyUserListBox WinWidth=1 WinHeight=1 WinLeft=0 WinTop=0 bVisibleWhenEmpty=true StyleName="ServerBrowserGrid" bScaleToParent=true End Object UserListBox=MyUserListBox }