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

232 lines
5.1 KiB
Ucode

class KFMOTD extends UT2K4Browser_MOTD;
var String myMOTD;
var String getRequest;
var String getResponse;
var String newsIPAddr;
var int myRetryCount;
var int myRetryMax;
var ROBufferedTCPLink myLink;
var string LinkClassName;
var bool sendGet;
var bool pageWait;
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
super.InitComponent(MyController, MyOwner);
GetNewNews();
lb_MOTD.MyScrollText.SetContent(myMOTD);
}
event Opened(GUIComponent Sender)
{
l_Version.Caption = VersionString@PlayerOwner().Level.ROVersion;
super(Ut2k4Browser_Page).Opened(Sender);
}
protected function ROBufferedTCPLink CreateNewLink()
{
local class<ROBufferedTCPLink> NewLinkClass;
local ROBufferedTCPLink NewLink;
if ( PlayerOwner() == None )
return None;
if ( LinkClassName != "" )
{
NewLinkClass = class<ROBufferedTCPLink>(DynamicLoadObject( LinkClassName, class'Class'));
}
if ( NewLinkClass != None )
{
NewLink = PlayerOwner().Spawn( NewLinkClass );
}
NewLink.ResetBuffer();
return NewLink;
}
function ReceivedMOTD(MasterServerClient.EMOTDResponse Command, string Data)
{
}
function GetNewNews()
{
if(myLink == None)
{
myLink = CreateNewLink();
}
if(myLink != None)
{
myLink.ServerIpAddr.Port = 0;
sendGet = true;
myLink.Resolve(newsIPAddr); // NOTE: This is a non-blocking operation
SetTimer(ReReadyPause, true);
}
else
{
myMOTD = myMOTD$"|| myLink is None";
}
}
event Timer()
{
local string text;
local string page;
local string command;
if(myLink != None)
{
if ( myLink.ServerIpAddr.Port != 0)
{
if(myLink.IsConnected())
{
if(sendGet)
{
command = getRequest$myLink.CRLF$"Host: "$newsIPAddr$myLink.CRLF$myLink.CRLF;
myLink.SendCommand(command);
pageWait = true;
myLink.WaitForCount(1,20,1); // 20 sec timeout
sendGet = false;
}
else
{
if(pageWait)
{
myMOTD = myMOTD$".";
lb_MOTD.MyScrollText.SetContent(myMOTD);
}
}
}
else
{
if(sendGet)
{
myMOTD = myMOTD$"|| Could not connect to news server";
lb_MOTD.MyScrollText.SetContent(myMOTD);
}
}
}
else
{
if (myRetryCount++ > myRetryMax)
{
myMOTD = myMOTD$"|| Retries Failed";
KillTimer();
lb_MOTD.MyScrollText.SetContent(myMOTD);
}
}
if(myLink.PeekChar() != 0)
{
pageWait = false;
// data waiting
page = "";
while(myLink.ReadBufferedLine(text))
{
page = page$text;
}
NewsParse(page);
myMOTD = "|"$page;
lb_MOTD.MyScrollText.SetContent(myMOTD);
myLink.DestroyLink();
myLink = none;
KillTimer();
}
}
SetTimer(ReReadyPause, true);
}
function NewsParse(out string page)
{
local string junk;
local int i;
junk = page;
Caps(junk);
i = InStr(junk, "<BODY>");
if ( i > -1 )
{
// remove all header from string
page = Right(page, len(page) - i - 6);
}
junk = page;
Caps(junk);
i = InStr(junk, "</BODY>");
if ( i > -1 )
{
// remove all footers from string
page = Left(page, i);
}
page = Repl(page, "<br>", "|", false);
}
defaultproperties
{
Begin Object Class=GUIScrollTextBox Name=MyMOTDText
bNoTeletype=True
CharDelay=0.050000
EOLDelay=0.100000
bVisibleWhenEmpty=True
OnCreateComponent=MyMOTDText.InternalOnCreateComponent
WinTop=0.001679
WinHeight=0.833203
WinLeft=0.01
WinWidth=0.99
RenderWeight=0.600000
TabOrder=1
bNeverFocus=True
End Object
lb_MOTD=GUIScrollTextBox'KFGui.KFMOTD.MyMOTDText'
Begin Object Class=GUILabel Name=VersionNum
TextAlign=TXTA_Right
StyleName="TextLabel"
WinTop=-0.043415
WinLeft=0.738500
WinWidth=0.252128
WinHeight=0.040000
RenderWeight=20.700001
End Object
l_Version=GUILabel'KFGui.KFMOTD.VersionNum'
VersionString="KF Version"
PanelCaption="News from Tripwire Interactive"
b_QuickConnect=None
myMOTD = "||Connecting To News Server"
newsIPAddr = "redorchestragame.com"
getRequest = "GET /kfnews.htm HTTP/1.1"
ReReadyPause=0.250000
myRetryCount=0
myRetryMax=40
LinkClassName="ROInterface.ROBufferedTCPLink"
sendGet = true;
}