#include "bzfsAPI.h" #include #include BZ_GET_PLUGIN_VERSION class AdminListener : public bz_EventHandler { public: virtual void process( bz_EventData *eventData ); }; AdminListener adminListener; BZF_PLUGIN_CALL int bz_Load( const char* ) { bz_debugMessage(4,"adminListener plugin loaded"); bz_registerEvent( bz_eChatMessageEvent, &adminListener ); return 0; } BZF_PLUGIN_CALL int bz_Unload( void ) { bz_debugMessage(4,"adminListener plugin unloaded"); bz_removeEvent( bz_eChatMessageEvent, &adminListener ); return 0; } void AdminListener::process( bz_EventData *eventData ) { bz_ChatEventData *messageEvent = (bz_ChatEventData*) eventData; std::ostringstream oss; oss << messageEvent->team; oss << " from player "; oss << messageEvent->from; oss << " to player "; oss << messageEvent->to; if( messageEvent->team == eRogueTeam || messageEvent->team == eRedTeam || messageEvent->team == eGreenTeam || messageEvent->team == eBlueTeam || messageEvent->team == ePurpleTeam || messageEvent->team == eHunterTeam ) { bz_PlayerRecord *sender = bz_getPlayerByIndex( messageEvent->from ); if( ! sender ) return; std::string senderCallsign = (sender->callsign).c_str(); bz_freePlayerRecord( sender ); bzAPIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList( playerList ); std::string message = std::string( "[Player to team] " ) + senderCallsign + std::string( ": " ) + std::string( (messageEvent->message).c_str() ); for( unsigned int i = 0; i < playerList->size(); i++ ) { bz_PlayerRecord *player = bz_getPlayerByIndex( i ); if( ! player ) return; if( player->admin && player->team == eObservers ) { bz_sendTextMessage( i, i, message.c_str() ); } bz_freePlayerRecord( player ); } } else if( messageEvent->to >= 0 && messageEvent->from >= 0) { // Send to admins if it is a PM sent from a non-admin // to a non-admin bz_PlayerRecord *sender = bz_getPlayerByIndex( messageEvent->from ); bz_PlayerRecord *receiver = bz_getPlayerByIndex( messageEvent->to ); if( ! sender || ! receiver ) return; if( sender->admin || receiver->admin ) return; std::string messageString = std::string("[") + sender->callsign.c_str() + "->" + receiver->callsign.c_str() + "] " + messageEvent->message.c_str(); bz_freePlayerRecord( sender ); bz_freePlayerRecord( receiver ); bzAPIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList( playerList ); for( unsigned int i = 0; i < playerList->size(); i++ ) { bz_PlayerRecord *player = bz_getPlayerByIndex( i ); if( !player ) return; if( player->admin && player->team == eObservers ) { bz_sendTextMessage( i, i, messageString.c_str() ); } bz_freePlayerRecord( player ); } } }