bool CChat::CreateChannel(LPCTSTR pszName, LPCTSTR pszPassword, CChatMember *pMember) { ADDTOCALLSTACK("CChat::CreateChannel"); if ( pMember ) { CClient *pClient = pMember->GetClient(); if ( pClient && !pClient->IsPriv(PRIV_GM) && !(g_Cfg.m_iChatFlags & CHATF_CHANNELCREATION) ) { CGString sName; FormatName(sName, NULL, true); pMember->SendChatMsg(CHATMSG_PlayerMessage, sName, " Channel creation is disabled."); return false; } } if ( !IsValidName(pszName, false) ) { if ( pMember ) pMember->SendChatMsg(CHATMSG_InvalidConferenceName); return false; } else if ( FindChannel(pszName) ) { if ( pMember ) pMember->SendChatMsg(CHATMSG_DuplicatedConferenceName); return false; } CChatChannel *pChannel = new CChatChannel(pszName, pszPassword, !pMember); m_Channels.InsertTail(pChannel); BroadcastAddChannel(pChannel); if ( pMember && (g_Cfg.m_iChatFlags & CHATF_CHANNELMODERATION) ) pChannel->SetModerator(pMember->GetChatName()); return true; }
void CChatChannel::AddMember(CChatMember *pMember) { ADDTOCALLSTACK("CChatChannel::AddMember"); pMember->SetChannel(this); m_Members.Add(pMember); LPCTSTR pszName = pMember->GetChatName(); if ( !IsModerator(pszName) ) { // Check if only moderators have voice by default if ( !m_bDefaultVoice ) SetVoice(pszName); // GMs always have moderation privs CClient *pClient = pMember->GetClient(); if ( pClient && pClient->IsPriv(PRIV_GM) ) SetModerator(pszName); } }
void CChat::DoCommand(CChatChanMember * pBy, LPCTSTR szMsg) { ADDTOCALLSTACK("CChat::DoCommand"); static LPCTSTR const sm_szCmd_Chat[] = { "ALLKICK", "BC", "BCALL", "CHATSOK", "CLEARIGNORE", "KILLCHATS", "NOCHATS", "SYSMSG", "WHEREIS" }; ASSERT(pBy != NULL); ASSERT(szMsg != NULL); TCHAR buffer[2048]; ASSERT(strlen(szMsg) < COUNTOF(buffer)); strcpy(buffer, szMsg); TCHAR * pszCommand = buffer; TCHAR * pszText = NULL; size_t iCommandLength = strlen(pszCommand); for (size_t i = 0; i < iCommandLength; i++) { ASSERT( i<COUNTOF(buffer)); if (pszCommand[i] == ' ') { pszCommand[i] = 0; pszText = pszCommand + i + 1; } } CGString sFrom; CChatChannel * pChannel = pBy->GetChannel(); CClient * pByClient = pBy->GetClient(); ASSERT(pByClient != NULL); switch ( FindTableSorted( pszCommand, sm_szCmd_Chat, COUNTOF(sm_szCmd_Chat))) { case 0: // "ALLKICK" { if (pChannel == NULL) { pBy->SendChatMsg(CHATMSG_MustBeInAConference); return; } if (!pChannel->IsModerator(pBy->GetChatName())) { pBy->SendChatMsg(CHATMSG_MustHaveOps); return; } pChannel->KickAll(pBy); DecorateName(sFrom, NULL, true); pBy->SendChatMsg(CHATMSG_PlayerTalk, sFrom, "All members have been kicked!", ""); return; } case 1: // "BC" { if ( ! pByClient->IsPriv( PRIV_GM )) { need_gm_privs: DecorateName(sFrom, NULL, true); pBy->SendChatMsg(CHATMSG_PlayerTalk, sFrom, "You need to have GM privs to use this command."); return; } Broadcast(pBy, pszText); return; } case 2: // "BCALL" { if ( ! pByClient->IsPriv( PRIV_GM )) goto need_gm_privs; Broadcast(pBy, pszText, "", true); return; } case 3: // "CHATSOK" { if ( ! pByClient->IsPriv( PRIV_GM )) goto need_gm_privs; if (!m_fChatsOK) { m_fChatsOK = true; Broadcast(NULL, "Conference creation is enabled."); } return; } case 4: // "CLEARIGNORE" { pBy->ClearIgnoreList(); return; } case 5: // "KILLCHATS" { if ( ! pByClient->IsPriv( PRIV_GM )) goto need_gm_privs; KillChannels(); return; } case 6: // "NOCHATS" { if ( ! pByClient->IsPriv( PRIV_GM )) goto need_gm_privs; if (m_fChatsOK) { Broadcast(NULL, "Conference creation is now disabled."); m_fChatsOK = false; } return; } case 7: // "SYSMSG" { if ( ! pByClient->IsPriv( PRIV_GM )) goto need_gm_privs; Broadcast(NULL, pszText, "", true); return; } case 8: // "WHEREIS" { WhereIs(pBy, pszText); return; } default: { TCHAR *pszMsg = Str_GetTemp(); sprintf(pszMsg, "Unknown command: '%s'", pszCommand); DecorateName(sFrom, NULL, true); pBy->SendChatMsg(CHATMSG_PlayerTalk, sFrom, pszMsg); return; } } }