//==================================================================== // IRC_Channel's handle all communication between the IRC_Link and // an IRC channel // // Updated by Ron Prestenback // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class UT2K4IRC_Channel extends UT2K4IRC_Page; var UT2K4IRC_System tp_System; var string ChannelName, ChannelTopic, DefaultListClass; var localized string OpUserText, HelpUserText, VoiceUserText, ReasonText, MessageUserText, WhoisUserText, DeopUserText, DehelpUserText, DevoiceUserText, KickUserText; var bool IsPrivate; // ChannelName will ~= Remote's Nick in this case var GUIListBox lb_User; // ===================================================================================================================== // Commands // ===================================================================================================================== function ProcessInput(string Text) { if(Left(Text, 4) ~= "/me ") { ChannelAction(tp_System.NickName, Mid(Text, 4)); tp_System.Link.SendChannelAction(ChannelName, Mid(Text, 4)); } else if(Left(Text, 1) == "/") { tp_System.Link.SendCommandText(Mid(Text, 1)); } else { if(Text != "") { ChannelText(tp_System.NickName, Text); if ( Left(ChannelName,1) != "#" ) ChannelName = "#" $ ChannelName; tp_System.Link.SendChannelText(ChannelName, Text); } } } function Whois( string Nick ) { if ( tp_System == None ) return; tp_System.Whois(Nick); } function Op( string Nick ) { if ( tp_System == None ) return; tp_System.Op(Nick, ChannelName); } function Deop( string Nick ) { if ( tp_System == None ) return; tp_System.Deop(Nick, ChannelName); } function Voice( string Nick ) { if ( tp_System == None ) return; tp_System.Voice(Nick, ChannelName); } function DeVoice( string Nick ) { if ( tp_System == None ) return; tp_System.DeVoice(Nick, ChannelName); } function Help( string Nick ) { if ( tp_System == None ) return; tp_System.Help(Nick, ChannelName); } function DeHelp( string Nick ) { if ( tp_System == None ) return; tp_System.DeHelp(Nick, ChannelName); } function Kick( string Nick, optional string Reason ) { if ( tp_System == None ) return; tp_System.Kick(Nick, ChannelName, Reason); } function Ban( string Nick, optional string Reason ) { if ( tp_System == None ) return; tp_System.Ban(Nick, ChannelName, Reason); } function Unban( string Nick ) { if ( tp_System == None ) return; tp_System.Unban(Nick, ChannelName); } // ===================================================================================================================== // Events // ===================================================================================================================== function UserInChannel(string Nick) { AddUser(Nick); } function AddUser( string Nick ) { local int i; i = GetUser(Nick); if( i > -1 ) return; // already in user list lb_User.List.Add(Nick); } function RemoveUser( string Nick ) { local int i; i = GetUser(Nick); if( i < 0 ) return; // not in list lb_User.List.RemoveItem(Nick); } function ChangeOp( string Nick, bool NewOp ) { local int i; i = GetUser(Nick); if( i < 0 ) return; UserSetFlag(i, "o", NewOp); lb_User.List.Sort(); } function ChangeHalfOp( string Nick, bool NewHalfOp ) { local int i; i = GetUser(Nick); if( i < 0 ) return; UserSetFlag(i, "h", NewHalfOp); lb_User.List.Sort(); } function ChangeVoice( string Nick, bool NewVoice ) { local int i; i = GetUser(Nick); if( i < 0 ) return; UserSetFlag(i, "v", NewVoice); lb_User.List.Sort(); } function ChangedNick(string OldNick, string NewNick) { local string S; S = MakeColorCode(IRCInfoColor); S $= Repl( NowKnownAsText, "%OldName%", OldNick ); S = Repl( S, "%NewName%", NewNick ); lb_TextDisplay.AddText( S ); ChangeNick(OldNick, NewNick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function ChangeTopic( string NewTopic ) { ChannelTopic = NewTopic; InterpretColorCodes(NewTopic); lb_TextDisplay.AddText( MakeColorCode(IRCInfoColor)$"*** "$NewTopicText$": "$NewTopic); if(!MyButton.bActive) MyButton.bForceFlash = true; } function ChannelText(string Nick, string Text) { if(MyButton.bActive && bIRCTextToSpeechEnabled) PlayerOwner().TextToSpeech( StripColorCodes(Text), 1 ); InterpretColorCodes(Text); lb_TextDisplay.AddText( MakeColorCode(IRCNickColor)$"<"$Nick$"> "$MakeColorCode(IRCTextColor)$ColorizeLinks(Text) ); if(!MyButton.bActive) MyButton.bForceFlash = true; } function ChannelAction(string Nick, string Text) { InterpretColorCodes(Text); lb_TextDisplay.AddText( MakeColorCode(IRCActionColor)$"* "$Nick$" "$Text ); if(!MyButton.bActive) MyButton.bForceFlash = true; } function UserNotice(string Nick, string Text) { InterpretColorCodes(Text); lb_TextDisplay.AddText(MakeColorCode(IRCActionColor)$"-"$Nick$"- "$Text); if(!MyButton.bActive) MyButton.bForceFlash = true; } function JoinedChannel(string Nick) { local string S; S = MakeColorCode(IRCInfoColor); S $= Repl( HasJoinedText, "%Name%", Nick ); S = Repl( S, "%Chan%", ChannelName ); InterpretColorCodes(Nick); lb_TextDisplay.AddText( S ); AddUser(Nick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function PartedChannel(string Nick) { local string S; S = MakeColorCode(IRCInfoColor); S $= Repl( HasLeftText, "%Name%", Nick ); S = Repl( S, "%Chan%", ChannelName ); InterpretColorCodes(Nick); lb_TextDisplay.AddText(S); RemoveUser(Nick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function KickUser(string KickedNick, string Kicker, string Reason) { local string S; S = MakeColorCode(IRCInfoColor); S $= Repl( WasKickedByText, "%Kicked%", KickedNick ); S = Repl( S, "%Kicker%", Kicker ); S = Repl( S, "%Reason%", Reason ); InterpretColorCodes(Reason); lb_TextDisplay.AddText( S ); RemoveUser(KickedNick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function UserQuit(string Nick, string Reason) { local string S; S = MakeColorCode(IRCInfoColor); S $= Repl( QuitText, "%Name%", Nick ); S = Repl( S, "%Reason%", Reason ); InterpretColorCodes(Reason); lb_TextDisplay.AddText( S ); RemoveUser(Nick); if(!MyButton.bActive) MyButton.bForceFlash = true; } function ChangeMode(string Nick, string Mode) { local string S; S = MakeColorCode(IRCInfoColor); S $= Repl( SetsModeText, "%Name%", Nick ); S = Repl( S, "%Mode%", Mode ); lb_TextDisplay.AddText( S ); if(!MyButton.bActive) MyButton.bForceFlash = true; } // ===================================================================================================================== // Query / Utility / Internal // ===================================================================================================================== function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); if (lb_User != None) { // Set delegates for user list box lb_User.List.bSorted = True; lb_User.List.OnDrawItem=MyOnDrawItem; lb_User.List.CompareItem=MyCompareItem; lb_User.List.OnDblClick=MyListDblClick; } } function ShowPanel(bool bShow) { Super.ShowPanel(bShow); if (bShow && bInit) { sp_Main.SplitterUpdatePositions(); bInit=False; } } function InternalOnCreateComponent(GUIComponent NewComp, GUIComponent Sender) { if (GUIListBox(NewComp) != None) { lb_User = GUIListBox(NewComp); lb_User.FillOwner(); } else Super.InternalOnCreateComponent(NewComp, Sender); } function InternalOnLoadIni(GUIComponent Sender, string S) { if (Sender == sp_Main) sp_Main.SplitPosition = MainSplitterPosition; } function InternalOnReleaseSplitter(GUIComponent Sender, float NewPos) { if (Sender == sp_Main) { MainSplitterPosition = NewPos; SaveConfig(); } } function bool MyListDblClick(GUIComponent Sender) { local string UserName; UserName = lb_User.List.Get(); if(UserName == "") return true; // Make new channel active in this case tp_System.AddChannel(UserName, True, True); 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; local GUIStyles S; if ( lb_User.List.Style == None ) return; NickName = lb_User.List.GetItemAtIndex(i); Flags = lb_User.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; if ( bSelected && lb_User.List.SelectedStyle != None ) { S = lb_User.List.SelectedStyle; S.Draw( Canvas, lb_User.List.MenuState, X, Y, W, H ); } else S = lb_User.List.Style; S.DrawText( Canvas, MSAT_Blurry, X, Y, W, H, TXTA_Left, DrawName, lb_User.FontScale ); } function int GetUser( string Nick ) { return lb_User.List.FindIndex(Nick); } function string GetFlags( string NickName ) { local int i; i = GetUser(NickName); if ( i != -1 ) return lb_User.List.GetExtraAtIndex(i); return ""; } function bool FindNick( string Nick ) { if( GetUser(Nick) > -1 ) return true; return false; } function bool UserIsOp( string NickName ) { return InStr(GetFlags(NickName), "o") != -1; } function bool UserIsHelper( string NickName ) { return InStr(GetFlags(NickName), "h") != -1; } function bool UserIsVoice( string NickName ) { return InStr(GetFlags(NickName), "v") != -1; } function ChangeNick( string OldNick, string NewNick) { local int i; i = GetUser(OldNick); if( i < 0 ) return; lb_User.List.SetItemAtIndex(i, NewNick); lb_User.List.Sort(); } function UserSetFlag(int i, string flag, bool bSet) { local string flags, s; local int flagPos; flags = lb_User.List.GetExtraAtIndex(i); for ( s = Left(flag,1); s != ""; s = Mid(s,1) ) { if(bSet) // TURN FLAG ON { // If user already has flag set, do nothing. if( InStr(flags, s) != -1 ) return; // Add to end of existing flags. lb_User.List.SetExtraAtIndex(i, flags$s); } else // TURN FLAG OFF { flagPos = InStr(flags, s); // If flag not in flag list, do nothing; if(flagPos == -1) return; // Remove flags from string flags = Repl(flags, s, ""); lb_User.List.SetExtraAtIndex(i, flags); } } } // ===================================================================================================================== // Context Menu // ===================================================================================================================== function bool ContextMenuOpen(GUIContextMenu Sender) { local string SelectedNick; if ( Sender.ContextItems.Length > 0 ) Sender.ContextItems.Remove(0, Sender.ContextItems.Length); // TODO Add code to modify items in list based on context of user's position in channel if ( Controller == None || Controller.ActiveControl != lb_User.List ) return false; SelectedNick = lb_User.List.Get(); if ( tp_System.IsMe(SelectedNick) ) return false; AddUserContextOptions( Sender, SelectedNick ); AddControlContextOptions( Sender, SelectedNick ); return true; } function AddUserContextOptions( GUIContextMenu Menu, string Nick ) { Menu.AddItem( MessageUserText ); Menu.AddItem( WhoisUserText ); } function AddControlContextOptions( GUIContextMenu Menu, string Nick ) { if ( Menu == None || tp_System == None || !UserIsOp(tp_System.NickName) ) return; Menu.AddItem("-"); if ( UserIsOp(Nick) ) Menu.AddItem(DeopUserText); else Menu.AddItem(OpUserText); if ( UserIsHelper(Nick) ) Menu.AddItem(DehelpUserText); else Menu.AddItem(HelpUserText); if ( UserIsVoice(Nick) ) Menu.AddItem(DevoiceUserText); else Menu.AddItem(VoiceUserText); Menu.AddItem( "-" ); Menu.AddItem( KickUserText ); Menu.AddItem( KickUserText $ "..." ); } function ContextMenuClick(GUIContextMenu Sender, int ClickIndex) { local int AbsIndex; local string Nick; Nick = lb_User.List.Get(); AbsIndex = GetAbsoluteIndex(Sender, ClickIndex); switch ( AbsIndex ) { case 0: // Msg tp_System.AddChannel(Nick, True, True); break; case 1: // Whois Whois(Nick); break; case 2: // Op Op(Nick); break; case 3: // Deop Deop(Nick); break; case 4: // Help Help(Nick); break; case 5: // Dehelp Dehelp(Nick); break; case 6: // Voice Voice(Nick); break; case 7: // Devoice Devoice(Nick); break; case 8: // Kick Kick(Nick); break; case 9: // Kick with reason if ( Controller.OpenMenu(Controller.RequestDataMenu, "", ReasonText) ) Controller.ActivePage.OnClose = KickReasonClose; break; } } function int GetAbsoluteIndex( GUIContextMenu Menu, int Index ) { if ( Menu == None || Index < 0 || Index >= Menu.ContextItems.Length ) return -1; if ( Index == 0 || Index == 1 ) return Index; if ( Menu.ContextItems[Index] == "-" ) Index++; switch ( Menu.ContextItems[Index] ) { case MessageUserText: return 0; case WhoisUserText: return 1; case OpUserText: return 2; case DeopUserText: return 3; case HelpUserText: return 4; case DehelpUserText: return 5; case VoiceUserText: return 6; case DevoiceUserText: return 7; case KickUserText: return 8; case KickUserText $ "...": return 9; default: return 1; } } function KickReasonClose( bool bCancelled ) { if ( !bCancelled ) Kick(lb_User.List.Get(), Controller.ActivePage.GetDataString()); } defaultproperties { Begin Object Class=GUISplitter Name=SplitterA WinWidth=1.0 WinHeight=0.95 WinTop=0 WinLeft=0 OnCreateComponent=InternalOnCreateComponent DefaultPanels(0)="XInterface.GUIScrollTextBox" DefaultPanels(1)="XInterface.GUIListBox" SplitOrientation=SPLIT_Horizontal SplitPosition=0.75 bFixedSplitter=false IniOption="@Internal" OnLoadIni=InternalOnLoadIni OnReleaseSplitter=InternalOnReleaseSplitter End Object sp_Main=SplitterA MainSplitterPosition=0.75 Begin Object Class=GUIContextMenu Name=RCMenu OnOpen=ContextMenuOpen OnSelect=ContextMenuClick End Object ContextMenu=RCMenu ReasonText="Reason: " MessageUserText="Open Query" WhoisUserText="Whois" OpUserText="Make Op" DeopUserText="Remove Op" HelpUserText="Make Helper" DeHelpUserText="Remove Helper" VoiceUserText="Make Voice" DevoiceUserText="Remove Voice" KickUserText="Kick User" // WinWidth=1.000000 // WinHeight=0.752727 // WinLeft=0.000000 // WinTop=79.954597 }