rott/kf_sources/XInterface/Classes/IRC_Channel.uc
2026-07-14 20:27:09 +07:00

372 lines
8.8 KiB
Ucode

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<IRCUser> 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<UserListBox.List.ItemCount; i++ )
{
if ( UserListBox.List.GetItemAtIndex(i) ~= Nick )
return i;
}
return -1;
}
function bool FindNick( string Nick )
{
if( GetUser(Nick) > -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
}