To create new wiki account, please join us on #znc at Libera.Chat and ask admins to create a wiki account for you. You can say thanks to spambots for this inconvenience.

Savebuff/XChat

From ZNC
Jump to navigation Jump to search
XChat Plugin
  1. Save the code below as ~/.xchat2/znc-savebuff.c
  2. cd ~/.xchat2 && gcc -Wl,--export-dynamic -Wall -O1 -shared -fPIC -I/usr/include/xchat znc-savebuff.c -o znc-savebuff.so
    • Note: your include dir may be different from above
  3. In xchat go to the "Window" menu and choose "Plugins and Scripts..."
  4. Navigate to your compiled znc-savebuff.so file and choose "Load..."
  5. Restart xchat and the modes should now look pretty
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#ifdef _WIN32
#include <windows.h>
#endif

#include "xchat-plugin.h"

#ifdef _WIN32
static xchat_plugin *ph;
#endif

#define EMITPRINT( ... ) xchat_emit_print( plugin_handle, __VA_ARGS__ )
#define SHOWMODE "mode \00310%s\003 \002%s\002 by \002%s\002"
#define MODNAME "*savebuff"

void ShowMode( xchat_plugin *plugin_handle, const char *pChannel, const char *pModes, const char *pNick )
{
	char *pText;
	u_int iLength = strlen( SHOWMODE );
	iLength += strlen( pChannel );
	iLength += strlen( pModes );
	iLength += strlen( pNick ) + 1; // ( allow for NULL )

	pText = (char *)malloc( iLength );
	sprintf( pText, SHOWMODE, pChannel, pModes, pNick );

	EMITPRINT( "Generic Message", "-\00310-\002-\002\003",  pText, NULL );

	free( pText );
}

int ProcessPMSG( char **word, char **word_eol, void *userdata )
{
	xchat_plugin *plugin_handle = (xchat_plugin *)userdata;

	if ( ( word[1] ) && ( strncmp( (word[1]+1), MODNAME, strlen( MODNAME ) ) == 0 ) && ( word[4] ) && ( word[5] ) && (  word[6] ) )
	{
		char *pHostMask, *pType, *pChannel, *pArgs = NULL;
		char *pNick, *pHost;

		pChannel = word[3];
		pHostMask = word[5];
		pType = word[6];
		if ( word[7] )
			pArgs = word_eol[7];
		
		pNick = strdup( pHostMask );
		pHost = strrchr( pNick, '!' );

		if ( pHost )
			*pHost++ = '\0';
		
		if ( ( strcmp( "MODE", pType ) == 0 ) && ( pArgs ) )
		{
			ShowMode( plugin_handle, pChannel, pArgs, pNick );
		}
		else if ( strcmp( "JOIN", pType ) == 0 )
		{
			EMITPRINT( "Join", pNick, pChannel, pHost, NULL );
		}
		else if ( strcmp( "PART", pType ) == 0 )
		{
			EMITPRINT( "Part", pNick, pHost, pChannel, NULL );
		}
		else if ( strcmp( "NICK", pType ) == 0 )
		{
			if ( pArgs )
				EMITPRINT( "Change Nick", pNick, pArgs, NULL );
			else
				EMITPRINT( "Change Nick", pNick, "*shrug*", NULL );
		}
		else if ( strcmp( "QUIT", pType ) == 0 )
		{
			if ( pArgs )
				EMITPRINT( "Quit", pNick, pArgs, pHost, NULL );
			else
				EMITPRINT( "Quit", pNick, "No Reason", pHost, NULL );
		}
		else if ( ( strcmp( "KICK", pType ) == 0 ) && ( pArgs ) )
		{
			char *pNickB = strdup( word[7] );
			pHost = strrchr( pNickB, '!' );
			if ( pHost )
				*pHost++ = '\0';

			if ( word[8] )
				EMITPRINT( "Kick", pNickB, pNick, pChannel, word_eol[8], NULL );
			else
				EMITPRINT( "Kick", pNickB, pNick, pChannel, "No Reason", NULL );

			free( pNickB );
		}
		else
			fprintf( stderr, "Unhandled Text! [%s]\n", word_eol[4] );

		free( pNick );
		return( XCHAT_EAT_ALL );
	}
	
	return( XCHAT_EAT_NONE );
}

void xchat_plugin_get_info(char **name, char **desc, char **version, void **reserved)
{
	*name = "znc-xchat";
	*desc = "wraps messages sent by *savebuff module to fake modes and such";
	*version = "1.0";
	if ( reserved )
		*reserved = NULL;
}

int DontDisplay( char **word, void *userdata )
{
	return( XCHAT_EAT_XCHAT );
}

int ShowModes( char **word, char **word_eol, void *userdata )
{
	xchat_plugin *plugin_handle = (xchat_plugin *)userdata;
	char *pChannel = word[3], *pNick = strdup( (word[1]+1) ), *pModes = word_eol[4];
	char *pTmp;
	
	pTmp = strchr( pNick, '!' );
	if ( pTmp )
		*pTmp = '\0';

	ShowMode( plugin_handle, pChannel, pModes, pNick );

	free( pNick );
	return( XCHAT_EAT_NONE );
}

int xchat_plugin_init( xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char  *arg )
{
#ifdef _WIN32
	ph = plugin_handle;
#endif

	xchat_plugin_get_info (plugin_name, plugin_desc, plugin_version, NULL);
	xchat_hook_server( plugin_handle, "PRIVMSG", XCHAT_PRI_NORM, ProcessPMSG, (void *)plugin_handle );
	xchat_hook_server( plugin_handle, "MODE", XCHAT_PRI_NORM, ShowModes, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel Operator", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel DeOp", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel Voice", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel DeVoice", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel Ban", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel UnBan", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel Mode Generic", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel Set Key", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel Set Limit", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel Remove Keyword", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	xchat_hook_print( plugin_handle, "Channel Remove Limit", XCHAT_PRI_NORM, DontDisplay, (void *)plugin_handle );
	return( 1 );
}

int xchat_plugin_deinit( xchat_plugin *plugin_handle )
{
	return( 1 );
}