📄 chatpage.cpp
字号:
}
void __fastcall TChatForm::IrcMOTDEnd(AnsiString Content)
{
PrintStatus("--",ColNormal,false,false);
}
//---------------------------------------------------------------------------
void __fastcall TChatForm::IrcNames(AnsiString Channel, AnsiString Data)
{
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(!ChannelFrame)
return;
list<string> UserList = string_split(Data.c_str()," ");
for(list<string>::iterator itr = UserList.begin(); itr != UserList.end(); ++itr)
if(string_trim(*itr) != "")
ChannelFrame->AddUser((*itr).c_str());
}
void __fastcall TChatForm::IrcNick(AnsiString OldNick, AnsiString Address,
AnsiString NewNick)
{
// if we changed our own nick update nick edit and config
if(NewNick.AnsiCompareIC(Irc->CurrentNick) == 0) {
NickEdit->Text = Irc->CurrentNick;
Config->SetValue("chat/nick",Irc->CurrentNick.c_str());
PrintStatus(AnsiString("Changed nickname from ") + OldNick + " to " +
Irc->CurrentNick,ColInfo,true,true);
PrintStatus(AnsiString("--"),ColNormal,false,false);
}
// change nick in all channels it is in
for(int i = 0; i < PageCtrl->PageCount; i++) {
TChatChannelFrame* ChannelFrame = (TChatChannelFrame*)PageCtrl->Pages[i]->Tag;
if(ChannelFrame)
ChannelFrame->RenameUser(OldNick,NewNick,ColJoin);
}
}
void __fastcall TChatForm::IrcWhoIS(AnsiString Data)
{
PrintStatus(Data,ColNormal,false,false);
if(Data.LowerCase().Pos("end of /whois list") == 0)
PrintStatus("--",ColNormal,false,false);
}
void __fastcall TChatForm::IrcChannelMode(AnsiString Nick,
AnsiString Channel, AnsiString ModeStr)
{
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(!ChannelFrame)
return;
// print what we got to channel
ChannelFrame->Print(Nick + " sets mode: " + ModeStr,ColJoin,true,true);
#if 0
PrintStatus(Nick,ColWarn,false,false);
PrintStatus(Channel,ColWarn,false,false);
PrintStatus(ModeStr,ColWarn,false,false);
#endif
vector<string> Modes, Params;
list<string> Tokens;
Tokens = string_split(ModeStr.c_str()," ");
// IRC is one fucked up protocol
for(list<string>::iterator itr = Tokens.begin(); itr != Tokens.end(); ++itr) {
if((*itr)[0] == '+' || (*itr)[0] == '-') {
// process all changes we got so far in reverse order to match the
// params correctly
for(int i = 0; i < Modes.size(); i++) {
string Param = (i < Params.size()) ? Params[Params.size()-i-1].c_str() : "";
ChannelFrame->ModeChange(Modes[Modes.size()-i-1].c_str(),Param.c_str(),Nick,ColJoin);
}
Modes.clear();
Params.clear();
// parse next mode block
string m;
for(int i = 0; i < (*itr).size(); i++) {
if((*itr)[i] == '+' || (*itr)[i] == '-')
m = (*itr)[0];
else
Modes.push_back(m + (*itr)[i]);
}
} else {
Params.push_back(*itr);
}
}
// process the remaining modes
for(int i = 0; i < Modes.size(); i++) {
string Param = (i < Params.size()) ? Params[Params.size()-i-1].c_str() : "";
ChannelFrame->ModeChange(Modes[Modes.size()-i-1].c_str(),Param.c_str(),Nick,ColJoin);
}
}
void __fastcall TChatForm::IrcUserMode(AnsiString Modes)
{
// our mode was changed
PrintStatus(AnsiString("User mode change: ") + Modes,ColInfo,true,true);
PrintStatus("--",ColNormal,false,false);
}
//---------------------------------------------------------------------------
void __fastcall TChatForm::IrcJoin(AnsiString Nick, AnsiString Address,
AnsiString Channel)
{
if(Nick.AnsiCompareIC(Irc->CurrentNick) != 0) {
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(ChannelFrame)
ChannelFrame->JoinUser(Nick,Address,ColJoin);
return;
}
// we joined a new channel, if there already is a page reuse it, otherwise create one
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(!ChannelFrame)
ChannelFrame = NewChannelFrame(Channel,false);
// print first message
ChannelFrame->Print(AnsiString("Now talking in ") + Channel,ColJoin,true,true);
ChannelFrame->Print("Type /help for a list of available commands",ColInfo,true,true);
}
void __fastcall TChatForm::IrcPart(AnsiString Nick, AnsiString Address,
AnsiString Channel, AnsiString PartMsg)
{
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(!ChannelFrame)
return;
if(Nick.AnsiCompareIC(Irc->CurrentNick) != 0) {
ChannelFrame->PartUser(Nick,Address,PartMsg,ColJoin);
return;
}
// we left this channel, print a final message
ChannelFrame->Print(AnsiString("You have left ") + Channel,ColJoin,true,true);
// close channel page
// TODO: make this an option (and print part message to status window)?
#if 0
DeleteChannelFrame(ChannelFrame);
#endif
}
void __fastcall TChatForm::IrcQuit(AnsiString Nick, AnsiString Address,
AnsiString QuitMsg)
{
// remove nick from all channels it is in
for(int i = 0; i < PageCtrl->PageCount; i++) {
TChatChannelFrame* ChannelFrame = (TChatChannelFrame*)PageCtrl->Pages[i]->Tag;
if(ChannelFrame)
ChannelFrame->QuitUser(Nick,Address,QuitMsg,ColJoin);
}
}
//---------------------------------------------------------------------------
void __fastcall TChatForm::IrcKick(AnsiString Nick, AnsiString Address,
AnsiString Channel, AnsiString Person, AnsiString Reason)
{
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(!ChannelFrame)
return;
if(Person.AnsiCompareIC(Irc->CurrentNick) != 0) {
ChannelFrame->KickUser(Person,Reason,Nick,ColJoin);
return;
}
// we were kicked from channel, print a final message
ChannelFrame->Print(AnsiString("You were kicked from ") + Channel + " by " +
Nick + " (" + Reason + ")",ColJoin,true,true);
// close channel page
// TODO: make this an option (and print kick message to status window)?
#if 0
DeleteChannelFrame(ChannelFrame);
#endif
}
void __fastcall TChatForm::IrcKill(AnsiString Oper, AnsiString Victim,
AnsiString Reason)
{
// remove nick from all channels it is in
for(int i = 0; i < PageCtrl->PageCount; i++) {
TChatChannelFrame* ChannelFrame = (TChatChannelFrame*)PageCtrl->Pages[i]->Tag;
if(ChannelFrame)
ChannelFrame->KillUser(Victim,Reason,Oper,ColJoin);
}
}
//---------------------------------------------------------------------------
void __fastcall TChatForm::IrcTopic(AnsiString Channel, AnsiString Title)
{
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(ChannelFrame)
ChannelFrame->SetTopic(FilterColors(Title),ColJoin);
}
void __fastcall TChatForm::IrcTopicInfo(AnsiString Channel, AnsiString Who,
TDateTime When)
{
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(ChannelFrame)
ChannelFrame->SetTopicInfo(Who,When,ColJoin);
}
void __fastcall TChatForm::IrcTopicChange(AnsiString Channel,
AnsiString Who, AnsiString Topic)
{
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(ChannelFrame)
ChannelFrame->ChangeTopic(Who,FilterColors(Topic),ColJoin);
}
//---------------------------------------------------------------------------
void __fastcall TChatForm::IrcPrivMsg(AnsiString Nick, AnsiString Address,
AnsiString Dest, AnsiString Content)
{
TChatChannelFrame* ChannelFrame;
if(Dest.AnsiCompareIC(Irc->CurrentNick) == 0) {
// try to find user page
ChannelFrame = GetChannelFrame(Nick);
if(!ChannelFrame) {
ChannelFrame = NewChannelFrame(Nick,true);
ChannelFrame->Print(AnsiString("Now talking to ") + Nick,ColJoin,true,true);
}
} else {
ChannelFrame = GetChannelFrame(Dest);
if(!ChannelFrame)
return;
}
// print the message
ChannelFrame->Print(AnsiString("<") + Nick + "> " + FilterColors(Content),ColOthers,true);
}
void __fastcall TChatForm::IrcAction(AnsiString Nick, AnsiString Address,
AnsiString Channel, AnsiString Content)
{
TChatChannelFrame* ChannelFrame = GetChannelFrame(Channel);
if(ChannelFrame)
ChannelFrame->Print(Nick + " " + FilterColors(Content),ColAction,true,true);
}
void __fastcall TChatForm::IrcNotice(AnsiString From, AnsiString Dest,
AnsiString Content)
{
// check if currently active page has this user in it
TChatChannelFrame* ChannelFrame = (TChatChannelFrame*)PageCtrl->ActivePage->Tag;
if(!ChannelFrame || !ChannelFrame->ExistsUser(From)) {
// find _any_ page containing this user
for(int i = 0; i < PageCtrl->PageCount; i++) {
ChannelFrame = (TChatChannelFrame*)PageCtrl->Pages[i]->Tag;
if(ChannelFrame && ChannelFrame->ExistsUser(From))
break;
}
if(!ChannelFrame || !ChannelFrame->ExistsUser(From))
ChannelFrame = StatusFrame; // print to status frame
}
// print notice on this page
ChannelFrame->Print(AnsiString("-") + From + "- " + FilterColors(Content),ColNotice,true);
// *sigh*
if(ChannelFrame == StatusFrame)
PrintStatus("--",ColNormal,false,false);
}
//---------------------------------------------------------------------------
bool TChatForm::PrintStatus(AnsiString Msg, TColor Color, bool PrintTime, bool Star)
{
return StatusFrame->Print(Msg,Color,PrintTime,Star);
}
//---------------------------------------------------------------------------
TChatChannelFrame* TChatForm::NewChannelFrame(AnsiString Channel, bool UserChat)
{
TTabSheet* Sheet = new TTabSheet(PageCtrl);
TChatChannelFrame* ChannelFrame = new TChatChannelFrame(Sheet,Channel,UserChat);
ChannelFrame->OnCommand = ChannelFrameOnCommand;
Sheet->Caption = Channel;
#if 0
// set XP Theme support for new frame
if(MainForm->ThemeManager)
MainForm->ThemeManager->CollectForms(ChannelFrame);
#endif
// set text attributes
ChannelFrame->SetChatFont(ChatFont);
ChannelFrame->Parent = Sheet;
Sheet->Tag = (int)ChannelFrame;
Sheet->PageControl = PageCtrl;
PageCtrl->ActivePage = Sheet;
ChannelFrame->SendEdit->SetFocus();
return ChannelFrame;
}
bool TChatForm::DeleteChannelFrame(TChatChannelFrame* ChannelFrame)
{
// now remove frame
ChannelFrame->Hide();
TTabSheet* Sheet = (TTabSheet*)ChannelFrame->Parent;
// find a page to switch to
TTabSheet* NextSheet = PageCtrl->FindNextPage(Sheet,true,true);
if(NextSheet->Tag == 0)
NextSheet = PageCtrl->FindNextPage(Sheet,false,true);
Sheet->Tag = 0;
Sheet->PageControl = NULL;
Sheet->RemoveControl(ChannelFrame);
Sheet->RemoveComponent(ChannelFrame);
delete Sheet;
delete ChannelFrame;
// switch to next page
if(NextSheet->Tag != 0) {
PageCtrl->ActivePage = NextSheet;
((TChatChannelFrame*)NextSheet->Tag)->SendEdit->SetFocus();
} else {
PageCtrl->ActivePage = StatusSheet;
StatusFrame->SendEdit->SetFocus();
}
}
TChatChannelFrame* TChatForm::GetChannelFrame(AnsiString Channel)
{
TChatChannelFrame* ChannelFrame;
for(int i = 0; i < PageCtrl->PageCount; i++) {
ChannelFrame = (TChatChannelFrame*)PageCtrl->Pages[i]->Tag;
if(ChannelFrame && Channel.AnsiCompareIC(ChannelFrame->GetChannel()) == 0)
return ChannelFrame;
}
return NULL;
}
void __fastcall TChatForm::PageCtrlChange(TObject *Sender)
{
TChatChannelFrame* ChannelFrame = (TChatChannelFrame*)PageCtrl->ActivePage->Tag;
if(ChannelFrame)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -