diff --git a/modules/modperl.cpp b/modules/modperl.cpp index 83f228b8..5b0b6d29 100644 --- a/modules/modperl.cpp +++ b/modules/modperl.cpp @@ -415,19 +415,49 @@ XS(XS_ZNC_COREAddTimer) } } -XS(XS_ZNC_PutIRC) +XS(XS_ZNC_CORERemTimer) { dXSARGS; - if ( items != 1 ) - Perl_croak( aTHX_ "Usage: PutIRC( sLine )" ); + if ( items != 2 ) + Perl_croak( aTHX_ "Usage: CORERemTimer( modname, funcname )" ); + SP -= items; + ax = (SP - PL_stack_base) + 1 ; + { + if ( g_ModPerl ) + { + CString sModName = (char *)SvPV(ST(0),PL_na); + CString sFuncName = (char *)SvPV(ST(1),PL_na); + CString sUserName = g_ModPerl->GetUser()->GetUserName(); + CString sLabel = sUserName + sModName + sFuncName; + CTimer *pTimer = g_ModPerl->FindTimer( sLabel ); + if ( pTimer ) + pTimer->Stop(); + else + g_ModPerl->PutModule( "Unable to find Timer!" ); + } + PUTBACK; + } +} +XS(XS_ZNC_COREPuts) +{ + dXSARGS; + if ( items != 2 ) + Perl_croak( aTHX_ "Usage: COREPuts( sWHich, sLine )" ); SP -= items; ax = (SP - PL_stack_base) + 1 ; { if ( g_ModPerl ) { - CString sLine = (char *)SvPV(ST(0),PL_na); - g_ModPerl->PutIRC( sLine ); + CString sWhich = (char *)SvPV(ST(0),PL_na); + CString sLine = (char *)SvPV(ST(1),PL_na); + + if ( sWhich == "IRC" ) + g_ModPerl->PutIRC( sLine ); + else if ( sWhich == "Status" ) + g_ModPerl->PutStatus( sLine ); + else if ( sWhich == "User" ) + g_ModPerl->PutUser( sLine ); } PUTBACK; } @@ -469,90 +499,30 @@ XS(XS_ZNC_UnLoadMod) } } -XS(XS_ZNC_PutUser) +XS(XS_ZNC_COREPutModule) { dXSARGS; - if ( items != 1 ) - Perl_croak( aTHX_ "Usage: PutUser( sLine )" ); + if ( items != 4 ) + Perl_croak( aTHX_ "Usage: COREPutModule( sWhich sLine, sIdent, sHost )" ); SP -= items; ax = (SP - PL_stack_base) + 1 ; { if ( g_ModPerl ) { - CString sLine = (char *)SvPV(ST(0),PL_na); - g_ModPerl->PutUser( sLine ); + CString sWhich = (char *)SvPV(ST(0),PL_na); + CString sLine = (char *)SvPV(ST(1),PL_na); + CString sIdent = (char *)SvPV(ST(2),PL_na); + CString sHost = (char *)SvPV(ST(3),PL_na); + if ( sWhich == "Module" ) + g_ModPerl->PutModule( sLine, sIdent, sHost ); + else + g_ModPerl->PutModNotice( sLine, sIdent, sHost ); } PUTBACK; } } - -XS(XS_ZNC_PutStatus) -{ - dXSARGS; - if ( items != 1 ) - Perl_croak( aTHX_ "Usage: PutStatus( sLine )" ); - - SP -= items; - ax = (SP - PL_stack_base) + 1 ; - { - if ( g_ModPerl ) - { - CString sLine = (char *)SvPV(ST(0),PL_na); - g_ModPerl->PutStatus( sLine ); - } - PUTBACK; - } -} - -XS(XS_ZNC_PutModule) -{ - dXSARGS; - if ( items < 1 ) - Perl_croak( aTHX_ "Usage: PutModule( sLine, sIdent, sHost )" ); - - SP -= items; - ax = (SP - PL_stack_base) + 1 ; - { - if ( g_ModPerl ) - { - CString sLine, sIdent, sHost; - sLine = (char *)SvPV(ST(0),PL_na); - if ( items >= 2 ) - sIdent = (char *)SvPV(ST(1),PL_na); - if ( items >= 3 ) - sHost = (char *)SvPV(ST(2),PL_na); - g_ModPerl->PutModule( sLine, sIdent, sHost ); - } - PUTBACK; - } -} - -XS(XS_ZNC_PutModNotice) -{ - dXSARGS; - if ( items < 1 ) - Perl_croak( aTHX_ "Usage: PutModNotice( sLine, sIdent, sHost )" ); - - SP -= items; - ax = (SP - PL_stack_base) + 1 ; - { - if ( g_ModPerl ) - { - CString sLine, sIdent, sHost; - sLine = (char *)SvPV(ST(0),PL_na); - if ( items >= 2 ) - sIdent = (char *)SvPV(ST(1),PL_na); - if ( items >= 3 ) - sHost = (char *)SvPV(ST(2),PL_na); - g_ModPerl->PutModNotice( sLine, sIdent, sHost ); - } - PUTBACK; - } -} - - XS(XS_ZNC_GetNicks) { dXSARGS; @@ -736,15 +706,16 @@ bool CModPerl::OnLoad( const CString & sArgs ) char *file = __FILE__; + /* system functions */ newXS( "DynaLoader::boot_DynaLoader", boot_DynaLoader, (char *)file ); - newXS( "ZNC::PutIRC", XS_ZNC_PutIRC, (char *)file ); - newXS( "ZNC::PutUser", XS_ZNC_PutUser, (char *)file ); - newXS( "ZNC::PutStatus", XS_ZNC_PutStatus, (char *)file ); - newXS( "ZNC::PutModule", XS_ZNC_PutModule, (char *)file ); - newXS( "ZNC::PutModNotice", XS_ZNC_PutModNotice, (char *)file ); + newXS( "ZNC::COREPutModule", XS_ZNC_COREPutModule, (char *)file ); + newXS( "ZNC::COREAddTimer", XS_ZNC_COREAddTimer, (char *)file ); + newXS( "ZNC::CORERemTimer", XS_ZNC_CORERemTimer, (char *)file ); + newXS( "ZNC::COREPuts", XS_ZNC_COREPuts, (char *)file ); + + /* user functions */ newXS( "ZNC::GetNicks", XS_ZNC_GetNicks, (char *)file ); newXS( "ZNC::GetString", XS_ZNC_GetString, (char *)file ); - newXS( "ZNC::COREAddTimer", XS_ZNC_COREAddTimer, (char *)file ); newXS( "ZNC::LoadMod", XS_ZNC_LoadMod, (char *)file ); newXS( "ZNC::UnLoadMod", XS_ZNC_UnLoadMod, (char *)file ); diff --git a/modules/modperl.pm b/modules/modperl.pm index 372256f0..e43a541e 100644 --- a/modules/modperl.pm +++ b/modules/modperl.pm @@ -1,6 +1,20 @@ # # TODO need to add socket support +# OnConnect( $sockhandle ) +# OnError( $sockhandle, $errno ) +# OnConnectionRefused( $sockhandle ) +# OnTimeout( $sockhandle ) +# OnDisconnect( $sockhandle ) +# OnData( $sockhandle, $bytes, $length ) +# OnReadLine( $sockhandle, $bytes, $length ) +# ZNC::WriteSock( $sockhandle, $bytes, $length ) +# my $sockhandle = ZNC::ConnectSock( $host, $port, $timeout, $enablereadline ) +# my $sockhandle = ZNC::ConnectSockSSL( $host, $port, $timeout, $enablereadline ) # +# $sockhandle = 'Csock::GetSockName()' +# +# store the sockhandle in their class, before every action call 'TestSock', if its true then call the event +# otherwise close the socket package ZNC; use strict; @@ -169,6 +183,77 @@ sub CORECallTimer return( HALTMODS() ); } +###################### +# Ease Of use USER functions +sub AddTimer +{ + my ( $mod, $funcname, $description, $interval, $cycles ) = @_; + + COREAddTimer( $mod->{ZNC_Name}, $funcname, $description, $interval, $cycles ); +} + +sub RemTimer +{ + my ( $mod, $funcname ) = @_; + CORERemTimer( $mod->{ZNC_Name}, $funcname ); +} + +sub PutModule +{ + my ( $line, $ident, $host ) = @_; + + if ( !$ident ) + { + $ident = "znc"; + } + if ( !$host ) + { + $host = "znc.com"; + } + + COREPutModule( "Module", $line, $ident, $host ); +} + +sub PutModNotice +{ + my ( $line, $ident, $host ) = @_; + + if ( !$ident ) + { + $ident = "znc"; + } + if ( !$host ) + { + $host = "znc.com"; + } + + COREPutModule( "ModNotice", $line, $ident, $host ); +} + +sub PutIRC +{ + my ( $line ) = @_; + COREPuts( "IRC", $line ); +} + +sub PutStatus +{ + my ( $line ) = @_; + COREPuts( "Status", $line ); +} + +sub PutUser +{ + my ( $line ) = @_; + COREPuts( "User", $line ); +} + +sub PutTarget +{ + my ( $target, $line ) = @_; + PutIRC( "PRIVMSG $target :$line" ); +} + 1;