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; } } }
STDMETHODIMP CShellExt::XMenuExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpici) { METHOD_PROLOGUE(CShellExt, MenuExt); if (HIWORD(lpici->lpVerb )) return E_FAIL; AddRef(); CStringArray &files = pThis->m_astrFileNames; switch (LOWORD(lpici->lpVerb)) { case IDM_AUTHENTICATION: { CAuthDlg dlg; dlg.DoModal(); break; } case IDM_ACL_SET: { CSetAfsAcl dlg; ASSERT(files.GetSize() == 1); dlg.SetDir(files[0]); dlg.DoModal(); break; } case IDM_VOLUME_PROPERTIES: { CVolumeInfo dlg; dlg.SetFiles(files); dlg.DoModal(); break; } case IDM_VOLUMEPARTITION_UPDATENAMEIDTABLE: CheckVolumes(); break; case IDM_MOUNTPOINT_SHOW: ListMount(files); break; case IDM_MOUNTPOINT_REMOVE: { int nChoice = ShowMessageBox(IDS_REALLY_DEL_MOUNT_POINTS, MB_ICONQUESTION | MB_YESNO, IDS_REALLY_DEL_MOUNT_POINTS); if (nChoice == IDYES) RemoveMount(files); break; } case IDM_MOUNTPOINT_MAKE: { CMakeMountPointDlg dlg; ASSERT(files.GetSize() == 1); dlg.SetDir(files[0]); dlg.DoModal(); break; } case IDM_FLUSH: Flush(files); break; case IDM_FLUSH_VOLUME: FlushVolume(files); break; case IDM_SHOW_SERVER: WhereIs(files); break; case IDM_SHOWCELL: WhichCell(files); break; case IDM_SERVER_STATUS: { CServerStatusDlg dlg; dlg.DoModal(); break; } /* case IDM_SUBMOUNTS_EDIT: { CSubmountsDlg dlg; dlg.DoModal(); break; } case IDM_SUBMOUNTS_CREATE: { ASSERT(files.GetSize() == 1); CSubmountsDlg dlg; dlg.SetAddOnlyMode(files[0]); dlg.DoModal(); break; } */ case IDM_SYMBOLICLINK_REMOVE: { if (files.GetSize()>1) break; CString msg=files.GetAt(0); int i; if ((i=msg.ReverseFind('\\'))>0) msg=msg.Left(i+1); else if ((i=msg.ReverseFind(':'))>0) msg=msg.Left(i+1)+"\\"; if (!SetCurrentDirectory(msg)) { MessageBeep((UINT)-1); ShowMessageBox(IDS_UNABLE_TO_SET_CURRENT_DIRECTORY,MB_OK,IDS_UNABLE_TO_SET_CURRENT_DIRECTORY); break; } msg=files.GetAt(0); if ((i=msg.ReverseFind('\\'))>0||((i=msg.ReverseFind(':'))>0)) msg=msg.Right(msg.GetLength()-i-1); int nChoice = ShowMessageBox(IDS_REALLY_REMOVE_SYMLINK, MB_ICONQUESTION | MB_YESNO, IDS_REALLY_REMOVE_SYMLINK,msg); if (nChoice == IDYES) RemoveSymlink(files.GetAt(0)); break; } case IDM_SYMBOLICLINK_ADD: { CStringA msg(files.GetAt(0)); int i; if ((i=msg.ReverseFind('\\'))>0) msg=msg.Left(i+1); else if ((i=msg.ReverseFind(':'))>0) msg=msg.Left(i+1)+"\\"; CMakeSymbolicLinkDlg dlg; dlg.Setbase(msg); dlg.DoModal(); break; } case IDM_SYMBOLICLINK_SHOW: ListSymlink(files); break; case IDM_REMOVE_SYMLINK: { if (files.GetSize()>1) break; int nChoice = ShowMessageBox(IDS_REALLY_REMOVE_SYMLINK, MB_ICONQUESTION | MB_YESNO, IDS_REALLY_REMOVE_SYMLINK); if (nChoice == IDYES) RemoveSymlink(files.GetAt(0)); } break; default: ASSERT(FALSE); Release(); return E_INVALIDARG; } Release(); return NOERROR; }