2007-07-16 17:30:04 +00:00
/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*
2008-01-10 13:27:07 +00:00
* InspIRCd : ( C ) 2002 - 2008 InspIRCd Development Team
2007-07-16 17:30:04 +00:00
* See : http : //www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software ; see
* the file COPYING for details .
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
# include "inspircd.h"
/* $ModDesc: Provides support for /KNOCK and mode +K */
/** Handles the /KNOCK command
*/
2007-10-21 21:43:48 +00:00
class CommandKnock : public Command
2007-07-16 17:30:04 +00:00
{
public :
2007-10-21 21:43:48 +00:00
CommandKnock ( InspIRCd * Instance ) : Command ( Instance , " KNOCK " , 0 , 2 )
2007-07-16 17:30:04 +00:00
{
this - > source = " m_knock.so " ;
syntax = " <channel> <reason> " ;
2007-08-27 16:05:59 +00:00
TRANSLATE3 ( TR_TEXT , TR_TEXT , TR_END ) ;
2007-07-16 17:30:04 +00:00
}
2007-10-15 20:59:05 +00:00
CmdResult Handle ( const char * * parameters , int pcnt , User * user )
2007-07-16 17:30:04 +00:00
{
2007-10-15 20:59:05 +00:00
Channel * c = ServerInstance - > FindChan ( parameters [ 0 ] ) ;
2007-07-16 17:30:04 +00:00
if ( ! c )
{
user - > WriteServ ( " 401 %s %s :No such channel " , user - > nick , parameters [ 0 ] ) ;
return CMD_FAILURE ;
}
std : : string line ;
if ( c - > IsModeSet ( ' K ' ) )
{
user - > WriteServ ( " 480 %s :Can't KNOCK on %s, +K is set. " , user - > nick , c - > name ) ;
return CMD_FAILURE ;
}
for ( int i = 1 ; i < pcnt - 1 ; i + + )
{
line = line + std : : string ( parameters [ i ] ) + " " ;
}
line = line + std : : string ( parameters [ pcnt - 1 ] ) ;
if ( ! c - > modes [ CM_INVITEONLY ] )
{
user - > WriteServ ( " 480 %s :Can't KNOCK on %s, channel is not invite only so knocking is pointless! " , user - > nick , c - > name ) ;
return CMD_FAILURE ;
}
c - > WriteChannelWithServ ( ( char * ) ServerInstance - > Config - > ServerName , " NOTICE %s :User %s is KNOCKing on %s (%s) " , c - > name , user - > nick , c - > name , line . c_str ( ) ) ;
user - > WriteServ ( " NOTICE %s :KNOCKing on %s " , user - > nick , c - > name ) ;
return CMD_SUCCESS ;
}
} ;
/** Handles channel mode +K
*/
class Knock : public ModeHandler
{
public :
Knock ( InspIRCd * Instance ) : ModeHandler ( Instance , ' K ' , 0 , 0 , false , MODETYPE_CHANNEL , false ) { }
2007-10-15 20:59:05 +00:00
ModeAction OnModeChange ( User * source , User * dest , Channel * channel , std : : string & parameter , bool adding )
2007-07-16 17:30:04 +00:00
{
if ( adding )
{
if ( ! channel - > IsModeSet ( ' K ' ) )
{
channel - > SetMode ( ' K ' , true ) ;
return MODEACTION_ALLOW ;
}
}
else
{
if ( channel - > IsModeSet ( ' K ' ) )
{
channel - > SetMode ( ' K ' , false ) ;
return MODEACTION_ALLOW ;
}
}
return MODEACTION_DENY ;
}
} ;
class ModuleKnock : public Module
{
2007-10-21 21:43:48 +00:00
CommandKnock * mycommand ;
2007-07-16 17:30:04 +00:00
Knock * kn ;
public :
ModuleKnock ( InspIRCd * Me ) : Module ( Me )
{
kn = new Knock ( ServerInstance ) ;
2007-08-28 19:27:19 +00:00
2008-01-17 23:40:18 +00:00
if ( ! ServerInstance - > Modes - > AddMode ( kn ) )
2007-07-16 17:30:04 +00:00
throw ModuleException ( " Could not add new modes! " ) ;
2007-08-28 19:27:19 +00:00
2007-10-21 21:43:48 +00:00
mycommand = new CommandKnock ( ServerInstance ) ;
2007-07-16 17:30:04 +00:00
ServerInstance - > AddCommand ( mycommand ) ;
2007-11-04 18:30:43 +00:00
2007-07-16 17:30:04 +00:00
}
virtual ~ ModuleKnock ( )
{
ServerInstance - > Modes - > DelMode ( kn ) ;
2007-08-28 19:27:19 +00:00
delete kn ;
2007-07-16 17:30:04 +00:00
}
virtual Version GetVersion ( )
{
2007-08-03 21:22:10 +00:00
return Version ( 1 , 1 , 0 , 1 , VF_COMMON | VF_VENDOR , API_VERSION ) ;
2007-07-16 17:30:04 +00:00
}
} ;
MODULE_INIT ( ModuleKnock )