All pastes #622807 Raw Edit

adminListener.cpp

public text v1 · immutable
·published 2007-07-17 03:14 UTC
rendered paste body
#include "bzfsAPI.h"
#include <string>

#include <sstream>

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 );
                }
        }
}