⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatpage.cpp

📁 Last change: 2008-02-03 This is the source code of KCeasy。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}

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 + -