2007-07-16 17:30:04 +00:00
/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*
2009-01-02 18:16:05 +00:00
* InspIRCd : ( C ) 2002 - 2009 InspIRCd Development Team
2009-03-15 12:42:35 +00:00
* See : http : //wiki.inspircd.org/Credits
2007-07-16 17:30:04 +00:00
*
* 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
}
2008-06-11 11:35:23 +00:00
2008-05-05 00:21:24 +00:00
CmdResult Handle ( const std : : vector < std : : string > & parameters , User * user )
2007-07-16 17:30:04 +00:00
{
2007-10-15 20:59:05 +00:00
Channel * c = ServerInstance - > FindChan ( parameters [ 0 ] ) ;
2008-01-30 01:07:14 +00:00
std : : string line ;
2007-07-16 17:30:04 +00:00
if ( ! c )
{
2008-05-19 00:12:47 +00:00
user - > WriteNumeric ( 401 , " %s %s :No such channel " , user - > nick . c_str ( ) , parameters [ 0 ] . c_str ( ) ) ;
2007-07-16 17:30:04 +00:00
return CMD_FAILURE ;
}
2008-01-30 01:07:14 +00:00
if ( c - > HasUser ( user ) )
2007-07-16 17:30:04 +00:00
{
2008-05-19 21:16:42 +00:00
user - > WriteNumeric ( 480 , " %s :Can't KNOCK on %s, you are already on that channel. " , user - > nick . c_str ( ) , c - > name . c_str ( ) ) ;
2007-07-16 17:30:04 +00:00
return CMD_FAILURE ;
}
2008-01-30 01:07:14 +00:00
if ( c - > IsModeSet ( ' K ' ) )
2007-07-16 17:30:04 +00:00
{
2008-05-19 21:16:42 +00:00
user - > WriteNumeric ( 480 , " %s :Can't KNOCK on %s, +K is set. " , user - > nick . c_str ( ) , c - > name . c_str ( ) ) ;
2008-01-30 01:07:14 +00:00
return CMD_FAILURE ;
2007-07-16 17:30:04 +00:00
}
if ( ! c - > modes [ CM_INVITEONLY ] )
{
2008-05-19 21:16:42 +00:00
user - > WriteNumeric ( 480 , " %s :Can't KNOCK on %s, channel is not invite only so knocking is pointless! " , user - > nick . c_str ( ) , c - > name . c_str ( ) ) ;
2007-07-16 17:30:04 +00:00
return CMD_FAILURE ;
}
2008-05-05 00:21:24 +00:00
for ( int i = 1 ; i < ( int ) parameters . size ( ) - 1 ; i + + )
2008-01-30 01:07:14 +00:00
{
2008-05-05 00:21:24 +00:00
line = line + parameters [ i ] + " " ;
2008-01-30 01:07:14 +00:00
}
2008-05-05 00:21:24 +00:00
line = line + parameters [ parameters . size ( ) - 1 ] ;
2008-01-30 01:07:14 +00:00
2008-05-19 21:16:42 +00:00
c - > WriteChannelWithServ ( ( char * ) ServerInstance - > Config - > ServerName , " NOTICE %s :User %s is KNOCKing on %s (%s) " , c - > name . c_str ( ) , user - > nick . c_str ( ) , c - > name . c_str ( ) , line . c_str ( ) ) ;
user - > WriteServ ( " NOTICE %s :KNOCKing on %s " , user - > nick . c_str ( ) , c - > name . c_str ( ) ) ;
2007-07-16 17:30:04 +00:00
return CMD_SUCCESS ;
}
} ;
/** Handles channel mode +K
*/
2008-05-01 16:12:45 +00:00
class Knock : public SimpleChannelModeHandler
2007-07-16 17:30:04 +00:00
{
public :
2008-05-01 16:12:45 +00:00
Knock ( InspIRCd * Instance ) : SimpleChannelModeHandler ( Instance , ' K ' ) { }
2007-07-16 17:30:04 +00:00
} ;
class ModuleKnock : public Module
{
2009-09-02 00:43:04 +00:00
CommandKnock cmd ;
Knock kn ;
2007-07-16 17:30:04 +00:00
public :
2009-09-02 00:43:04 +00:00
ModuleKnock ( InspIRCd * Me ) : Module ( Me ) , cmd ( Me ) , kn ( Me )
2007-07-16 17:30:04 +00:00
{
2009-09-02 00:43:04 +00:00
if ( ! ServerInstance - > Modes - > AddMode ( & kn ) )
2007-07-16 17:30:04 +00:00
throw ModuleException ( " Could not add new modes! " ) ;
2009-09-02 00:43:04 +00:00
ServerInstance - > AddCommand ( & cmd ) ;
2007-11-04 18:30:43 +00:00
2007-07-16 17:30:04 +00:00
}
virtual ~ ModuleKnock ( )
{
2009-09-02 00:43:04 +00:00
ServerInstance - > Modes - > DelMode ( & kn ) ;
2007-07-16 17:30:04 +00:00
}
virtual Version GetVersion ( )
{
2008-08-25 20:35:51 +00:00
return Version ( " $Id$ " , VF_COMMON | VF_VENDOR , API_VERSION ) ;
2007-07-16 17:30:04 +00:00
}
} ;
MODULE_INIT ( ModuleKnock )