IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  sohbet

 Kayıt ol  Topluluk
11Beğeni(ler)

Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 07 Şubat 2012, 01:43   #61
Çevrimiçi
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Cevap: /cs temizle #kanal




PHP Kod:   Kodu kopyalamak için üzerine çift tıklayın!
/* Main ChanServ module.
 *
 * IRC Services is copyright (c) 1996-2007 Andrew Church.
 *     E-mail: <achurch[MENTION=117372]ach[/MENTION]urch.org>
 * Parts written by Andrew Kempe and others.
 * This program is free but copyrighted software; see the file COPYING for
 * details.
 */

/*************************************************************************/

#include "services.h"
#include "modules.h"
#include "conffile.h"
#include "language.h"
#include "commands.h"
#include "encrypt.h"
#include "modules/nickserv/nickserv.h"
#include "modules/operserv/operserv.h"

#include "chanserv.h"
#include "cs-local.h"

/*************************************************************************/
/************************** Declaration section **************************/
/*************************************************************************/

static Module *module;
static 
Module *module_nickserv;

static 
int cb_clear     = -1;
static 
int cb_command   = -1;
static 
int cb_help      = -1;
static 
int cb_help_cmds = -1;
static 
int cb_invite    = -1;
static 
int cb_unban     = -1;

static 
int db_opened 0;

       
char *s_ChanServ;
static 
char *desc_ChanServ;
static 
char *ChanDBName;
EXPORT_VAR(char *,s_ChanServ)

static 
int    CSEnableRegister;
       
int    CSRegisteredOnly;
       
int32  CSMaxReg;
       
int32  CSDefFlags;
       
time_t C***pire;
       
int    CSShowPassword;
       
int32  CSAccessMax;
       
int32  CSAutokickMax;
       
char CSAutokickReason;
       
time_t CSInhabit;
       
time_t CSRestrictDelay;
       
int    CSListOpersOnly;
       
int32  CSListMax;
       
time_t CSSuspendExpire;
       
time_t CSSuspendGrace;
       
int    CSForbidShortChannel;
EXPORT_VAR(int32,CSMaxReg)

/*************************************************************************/

/* Channel option list. */

#define CHANOPT(x) \
    
#x, CI_##x, CHAN_INFO_OPT_##x, \
      
CHAN_SET_##x##_ON, CHAN_SET_##x##_OFF, CHAN_SET_##x##_SYNTAX }
ChanOpt chanopts[] = {
    
CHANOPT(KEEPTOPIC),
    
CHANOPT(TOPICLOCK),
    
CHANOPT(PRIVATE),
    
CHANOPT(SECUREOPS),
    
CHANOPT(LEAVEOPS),
    
CHANOPT(RESTRICTED),
    
CHANOPT(SECURE),
    
CHANOPT(OPNOTICE),
    
CHANOPT(ENFORCE),
    { 
"NOEXPIRE"CI_NOEXPIRE, -1CHAN_SET_NOEXPIRE_ON,
      
CHAN_SET_NOEXPIRE_OFFCHAN_SET_NOEXPIRE_SYNTAX },
    { 
NULL }
};
#undef CHANOPT

/*************************************************************************/

/* Local functions. */

static void do_help(User *u);
static 
void do_register(User *u);
static 
void do_identify(User *u);
static 
void do_drop(User *u);
static 
void do_info(User *u);
static 
void do_list(User *u);
static 
void do_op(User *u);
static 
void do_deop(User *u);
static 
void do_voice(User *u);
static 
void do_devoice(User *u);
static 
void do_halfop(User *u);
static 
void do_dehalfop(User *u);
static 
void do_protect(User *u);
static 
void do_deprotect(User *u);
static 
void do_invite(User *u);
static 
void do_unban(User *u);
static 
void do_cskick(User *u);
static 
void do_cstopic(User *u);
static 
void do_clear(User *u);
static 
void do_getpass(User *u);
static 
void do_forbid(User *u);
static 
void do_suspend(User *u);
static 
void do_unsuspend(User *u);
static 
void do_status(User *u);

/*************************************************************************/

/* Command list. */

static Command cmds[] = {
    { 
"HELP",     do_help,     NULL,  -1,                       -1,-},
    { 
"REGISTER"do_registerNULL,  CHAN_HELP_REGISTER,       -1,-},
    { 
"IDENTIFY"do_identifyNULL,  CHAN_HELP_IDENTIFY,       -1,-},
    { 
"DROP",     do_drop,     NULL,  -1,
        
CHAN_HELP_DROPCHAN_OPER_HELP_DROP },
    { 
"SET",      do_set,      NULL,  CHAN_HELP_SET, -1CHAN_OPER_HELP_SET },
    { 
"SET FOUNDER",    NULL,  NULL,  CHAN_HELP_SET_FOUNDER,    -1,-},
    { 
"SET SUCCESSOR",  NULL,  NULL,  CHAN_HELP_SET_SUCCESSOR,  -1,-},
    { 
"SET PASSWORD",   NULL,  NULL,  CHAN_HELP_SET_PASSWORD,   -1,-},
    { 
"SET DESC",       NULL,  NULL,  CHAN_HELP_SET_DESC,       -1,-},
    { 
"SET URL",        NULL,  NULL,  CHAN_HELP_SET_URL,        -1,-},
    { 
"SET EMAIL",      NULL,  NULL,  CHAN_HELP_SET_EMAIL,      -1,-},
    { 
"SET ENTRYMSG",   NULL,  NULL,  CHAN_HELP_SET_ENTRYMSG,   -1,-},
    { 
"SET KEEPTOPIC",  NULL,  NULL,  CHAN_HELP_SET_KEEPTOPIC,  -1,-},
    { 
"SET TOPICLOCK",  NULL,  NULL,  CHAN_HELP_SET_TOPICLOCK,  -1,-},
    { 
"SET MLOCK",      NULL,  NULL,  CHAN_HELP_SET_MLOCK,      -1,-},
    { 
"SET HIDE",       NULL,  NULL,  CHAN_HELP_SET_HIDE,       -1,-},
    { 
"SET PRIVATE",    NULL,  NULL,  CHAN_HELP_SET_PRIVATE,    -1,-},
    { 
"SET RESTRICTED"NULL,  NULL,  CHAN_HELP_SET_RESTRICTED, -1,-},
    { 
"SET SECURE",     NULL,  NULL,  CHAN_HELP_SET_SECURE,     -1,-},
    { 
"SET SECUREOPS",  NULL,  NULL,  CHAN_HELP_SET_SECUREOPS,  -1,-},
    { 
"SET LEAVEOPS",   NULL,  NULL,  CHAN_HELP_SET_LEAVEOPS,   -1,-},
    { 
"SET OPNOTICE",   NULL,  NULL,  CHAN_HELP_SET_OPNOTICE,   -1,-},
    { 
"SET ENFORCE",    NULL,  NULL,  CHAN_HELP_SET_ENFORCE,    -1,-},
    { 
"SET NOEXPIRE",   NULL,  NULL,  -1, -1CHAN_OPER_HELP_SET_NOEXPIRE },
    { 
"UNSET",    do_unset,    NULL,  CHAN_HELP_UNSET,
        -
1CHAN_OPER_HELP_UNSET },
    { 
"INFO",     do_info,     NULL,  CHAN_HELP_INFO,
        -
1CHAN_OPER_HELP_INFO },
    { 
"LIST",     do_list,     NULL,  -1,
        
CHAN_HELP_LISTCHAN_OPER_HELP_LIST },
    { 
"AKICK",    do_akick,    NULL,  CHAN_HELP_AKICK,          -1,-1,
        (
void *)ACCLEV_SOP },
    { 
"OP",       do_op,       NULL,  CHAN_HELP_OP,             -1,-1,
        (
void *)ACCLEV_AOP },
    { 
"DEOP",     do_deop,     NULL,  CHAN_HELP_DEOP,           -1,-1,
        (
void *)ACCLEV_AOP },
    { 
"VOICE",    do_voice,    NULL,  CHAN_HELP_VOICE,          -1,-1,
        (
void *)ACCLEV_VOP },
    { 
"DEVOICE",  do_devoice,  NULL,  CHAN_HELP_DEVOICE,        -1,-1,
        (
void *)ACCLEV_VOP },
    { 
"INVITE",   do_invite,   NULL,  CHAN_HELP_INVITE,         -1,-1,
        (
void *)ACCLEV_AOP },
    { 
"UNBAN",    do_unban,    NULL,  CHAN_HELP_UNBAN,          -1,-1,
        (
void *)ACCLEV_AOP },
    { 
"KICK",     do_cskick,   NULL,  CHAN_HELP_KICK,           -1,-1,
        (
void *)ACCLEV_AOP },
    { 
"TOPIC",    do_cstopic,  NULL,  CHAN_HELP_TOPIC,          -1,-1,
        (
void *)ACCLEV_AOP },
    { 
"CLEAR",    do_clear,    NULL,  CHAN_HELP_CLEAR,          -1,-1,
        (
void *)ACCLEV_SOP },
    { 
"STATUS",   do_status,   NULL,  CHAN_HELP_STATUS,         -1,-1,
        (
void *)ACCLEV_SOP },
    { 
"GETPASS",  do_getpass,  is_services_admin,  -1,
        -
1CHAN_OPER_HELP_GETPASS },
    { 
"FORBID",   do_forbid,   is_services_admin,  -1,
        -
1CHAN_OPER_HELP_FORBID },
    { 
"SUSPEND",  do_suspend,  is_services_admin,  -1,
        -
1CHAN_OPER_HELP_SUSPEND },
    { 
"UNSUSPEND",do_unsuspend,is_services_admin,  -1,
        -
1CHAN_OPER_HELP_UNSUSPEND },
    { 
NULL }
};

static 
Command cmds_halfop[] = {
    { 
"HALFOP",   do_halfop,   NULL,  CHAN_HELP_HALFOP,         -1,-1,
        (
void *)ACCLEV_AOP },
    { 
"DEHALFOP"do_dehalfopNULL,  CHAN_HELP_DEHALFOP,       -1,-1,
        (
void *)ACCLEV_AOP },
    { 
NULL }
};

static 
Command cmds_chanprot[] = {
    { 
"PROTECT",  do_protect,  NULL,  CHAN_HELP_PROTECT,        -1,-1,
        (
void *)ACCLEV_AOP },
    { 
"DEPROTECT",do_deprotect,NULL,  CHAN_HELP_DEPROTECT,      -1,-1,
        (
void *)ACCLEV_AOP },
    { 
NULL }
};

/*************************************************************************/
/************************ Main ChanServ routines *************************/
/*************************************************************************/

/* Introduce the ChanServ pseudoclient. */

static int introduce_chanserv(const char *nick)
{
    if (!
nick || irc_stricmp(nicks_ChanServ) == 0) {
    
char modebuf[BUFSIZE];
    
snprintf(modebufsizeof(modebuf), "o%s"pseudoclient_modes);
    
send_nick(s_ChanServServiceUserServiceHostServerName,
          
desc_ChanServmodebuf);
    return 
nick 0;
    }
    return 
0;
}

/*************************************************************************/

/* Main ChanServ routine. */

static int chanserv(const char *source, const char *targetchar *buf)
{
    
char *cmd;
    
User *get_user(source);

    if (
irc_stricmp(targets_ChanServ) != 0)
    return 
0;

    if (!
u) {
    
module_log("user record for %s not found"source);
    
notice(s_ChanServsourcegetstring(NULLINTERNAL_ERROR));
    return 
1;
    }

    
cmd strtok(buf" ");

    if (!
cmd) {
    return 
1;
    } else if (
stricmp(cmd"\1PING") == 0) {
    const 
char *s;
    if (!(
strtok(NULL"")))
        
"\1";
    
notice(s_ChanServsource"\1PING %s"s);
    } else {
    if (
call_callback_2(modulecb_commanducmd) <= 0)
        
run_cmd(s_ChanServumodulecmd);
    }
    return 
1;
}

/*************************************************************************/

/* Return a /WHOIS response for ChanServ. */

static int chanserv_whois(const char *sourcechar *whochar *extra)
{
    if (
irc_stricmp(whos_ChanServ) != 0)
    return 
0;
    
send_cmd(ServerName"311 %s %s %s %s * :%s"sourcewho,
         
ServiceUserServiceHostdesc_ChanServ);
    
send_cmd(ServerName"312 %s %s %s :%s"sourcewho,
         
ServerNameServerDesc);
    
send_cmd(ServerName"318 %s %s End of /WHOIS response."sourcewho);
    return 
1;
}

/*************************************************************************/

/* Save channel database. */

static int do_save_data()
{
    
sync_channel_db(ChanDBName);
    return 
0;
}

/*************************************************************************/

/* Callback for newly-created channels. */

static int do_channel_create(Channel *cUser *uint32 modes)
{
    
/* Store ChannelInfo pointer in channel record */
    
c->ci get_channelinfo(c->name);
    if (
c->ci) {
    
/* Store return pointer in ChannelInfo record */
    
c->ci->c;
    }

    
/* Restore locked modes and saved topic */
    /* Note: these should be outside the c->ci test to ensure any spurious
     *       +r modes are cleared */
    
check_modes(c);
    
restore_topic(c);

    return 
0;
}

/*************************************************************************/

/* Callback for users trying to join channels. */

static int do_channel_join_check(const char *channelUser *user)
{
    return 
check_kick(userchannel);
}

/*************************************************************************/

/* Callback for users joining channels. */

static int do_channel_join(Channel *cstruct c_userlist *u)
{
    
User *user u->user;
    
ChannelInfo *ci c->ci;

    
check_chan_user_modes(NULLuc, -1);
    if (
ci && ci->entry_message)
    
notice(s_ChanServuser->nick"(%s) %s"ci->nameci->entry_message);
    return 
0;
}

/*************************************************************************/

/* Callback for users leaving channels.  Update the channel's last used
 * time if the user was an auto-op user.
 */

static int do_channel_part(Channel *cUser *u, const char *reason)
{
    if (
c->ci && check_access(uc->ciCA_AUTOOP)) {
    
c->ci->last_used time(NULL);
    
put_channelinfo(c->ci);
    }
    return 
0;
}

/*************************************************************************/

/* Callback for channels being deleted. */

static int do_channel_delete(Channel *c)
{
    if (
c->ci)
    
c->ci->NULL;
    return 
0;
}

/*************************************************************************/

/* Callback for channel mode changes. */

static int do_channel_mode_change(const char *source_unusedChannel *c)
{
    
check_modes(c);
    return 
0;
}

/*************************************************************************/

/* Callback for channel user mode changes. */

static int do_channel_umode_change(const char *sourceChannel *c,
                   
struct c_userlist *uint32 oldmodes)
{
    if (!(
u->mode CUMODE_o))
    
u->flags &= ~CUFLAG_DEOPPED;
    
check_chan_user_modes(sourceucoldmodes);
    return 
0;
}

/*************************************************************************/

/* Callback for channel topic changes. */

static int do_channel_topic(Channel *c, const char *topic, const char *setter,
                
time_t topic_time)
{
    
ChannelInfo *ci c->ci;

    if (
check_topiclock(ctopic_time))
    return 
1;
    
record_topic(citopicsettertopic_time);
    return 
0;
}

/*************************************************************************/

/* Callback for NickServ REGISTER/LINK check; we disallow
 * registration/linking of the ChanServ pseudoclient nickname.
 */

static int do_reglink_check(const User *u, const char *nick,
                const 
char *pass, const char *email)
{
    return 
irc_stricmp(nicks_ChanServ) == 0;
}

/*************************************************************************/

/* Callback for users who have identified to their nicks: give them modes
 * as if they had just joined the channel.
 */

static int do_nick_identified(User *uint old_authstat)
{
    
struct u_chanlist *uc;    /* Node in list of channels the user is in */
    
struct c_userlist *cu;    /* Node in list of users in a channel */

    
LIST_FOREACH (ucu->chans) {
    
LIST_SEARCH_SCALAR(uc->chan->usersuserucu);
    if (!
cu) {
        
module_log("do_nick_identified(): BUG: user record not found in"
               " channel %s for user %s"
uc->chan->nameu->nick);
        continue;
    }
    
/* Use an empty source to force a mode recheck */
    
check_chan_user_modes(""cuuc->chan, -1);
    }
    return 
0;
}

/*************************************************************************/

/* Remove a (deleted or expired) nickname group from all channel lists. */

static int do_nickgroup_delete(const NickGroupInfo *ngi, const char *oldnick)
{
    
int i;
    
int id ngi->id;
    
ChannelInfo *ci;

    for (
ci first_channelinfo(); cici next_channelinfo()) {
    
int modified 0;
    if (
ci->founder == id) {
        
int was_suspended = (ci->suspendinfo != NULL);
        
char name_save[CHANMAX];
        if (
was_suspended)
        
strscpy(name_saveci->nameCHANMAX);
        if (
ci->successor) {
        
NickGroupInfo *ngi2 get_ngi_id(ci->successor);
        if (!
ngi2) {
            
module_log("Unable to access successor group %u for"
                   " deleted channel %s, deleting channel"
,
                   
ci->successorci->name);
            goto 
delete;
        } else if (
check_channel_limit(ngi2NULL) < 0) {
            
module_log("Transferring foundership of %s from deleted"
                   " nick %s to successor %s"
ci->name,
                   
oldnickngi_mainnick(ngi2));
            
uncount_chan(ci);
            
ci->founder ci->successor;
            
ci->successor 0;
            
count_chan(ci);
        } else {
            
module_log("Successor (%s) of %s owns too many channels,"
                   " deleting channel"
ngi_mainnick(ngi2),
                   
ci->name);
            goto 
delete;
        }
        } else {
        
module_log("Deleting channel %s owned by deleted nick %s",
               
ci->nameoldnick);
          
delete:
        
delchan(ci);
        if (
was_suspended) {
            
/* Channel was suspended, so make it forbidden */
            
module_log("Channel %s was suspended, forbidding it",
                   
name_save);
            
ci makechan(name_save);
            
ci->flags |= CI_VERBOTEN;
        }
        continue;
        }
        
modified 1;
    }
    if (
ci->successor == id) {
        
ci->successor 0;
        
modified 1;
    }
    
ARRAY_FOREACH (ici->access) {
        if (
ci->access[i].nickgroup == id) {
        
ci->access[i].nickgroup 0;
        
modified 1;
        }
    }
    if (
modified)
        
put_channelinfo(ci);
    }
    return 
0;
}

/*************************************************************************/
/*********************** ChanServ command routines ***********************/
/*************************************************************************/

/* Short routine for do_help() to return the proper access level string for
 * a given level based on which access modules are loaded.  Assumes numeric
 * levels if no access module is loaded.
 */
static const char *getstring_cmdacc(NickGroupInfo *ngiint16 level)
{
    
int str_levxopstr_levstr_xop;

    switch (
level) {
      case 
ACCLEV_SOP:
    
str_levxop CHAN_HELP_REQSOP_LEVXOP;
    
str_lev    CHAN_HELP_REQSOP_LEV;
    
str_xop    CHAN_HELP_REQSOP_XOP;
    break;
      case 
ACCLEV_AOP:
    
str_levxop CHAN_HELP_REQAOP_LEVXOP;
    
str_lev    CHAN_HELP_REQAOP_LEV;
    
str_xop    CHAN_HELP_REQAOP_XOP;
    break;
      case 
ACCLEV_HOP:
    
str_levxop CHAN_HELP_REQHOP_LEVXOP;
    
str_lev    CHAN_HELP_REQHOP_LEV;
    
str_xop    CHAN_HELP_REQHOP_XOP;
    break;
      case 
ACCLEV_VOP:
    
str_levxop CHAN_HELP_REQVOP_LEVXOP;
    
str_lev    CHAN_HELP_REQVOP_LEV;
    
str_xop    CHAN_HELP_REQVOP_XOP;
    break;
      default:
    
module_log("BUG: weird level (%d) in getstring_cmdacc()"level);
    return 
"???";
    }
    if (
find_module("chanserv/access-xop")) {
    if (
find_module("chanserv/access-levels"))
        return 
getstring(ngistr_levxop);
    else
        return 
getstring(ngistr_xop);
    } else {
    return 
getstring(ngistr_lev);
    } 
}


static 
void do_help(User *u)
{
    
char *cmd strtok_remaining();
    
Command *cmdrec;

    if (!
cmd) {
    
notice_help(s_ChanServuCHAN_HELP);
    if (
C***pire)
        
notice_help(s_ChanServuCHAN_HELP_EXPIRES,
            
maketime(u->ngi,C***pire,0));
    } else if (
call_callback_2(modulecb_helpucmd) > 0) {
    return;
    } else if (
stricmp(cmd"COMMANDS") == 0) {
    
notice_help(s_ChanServuCHAN_HELP_COMMANDS);
    if (
find_module("chanserv/sendpass"))
        
notice_help(s_ChanServuCHAN_HELP_COMMANDS_SENDPASS);
    
notice_help(s_ChanServuCHAN_HELP_COMMANDS_DROP);
    if (
find_module("chanserv/access-levels"))
        
notice_help(s_ChanServuCHAN_HELP_COMMANDS_LEVELS);
    if (
find_module("chanserv/access-xop")) {
        
notice_help(s_ChanServuCHAN_HELP_COMMANDS_XOP);
        if (
protocol_features PF_HALFOP)
        
notice_help(s_ChanServuCHAN_HELP_COMMANDS_HOP);
    }
    
notice_help(s_ChanServuCHAN_HELP_COMMANDS_OPVOICE);
    if (
protocol_features PF_HALFOP)
        
notice_help(s_ChanServuCHAN_HELP_COMMANDS_HALFOP);
    if (
protocol_features PF_CHANPROT)
        
notice_help(s_ChanServuCHAN_HELP_COMMANDS_PROTECT);
    
notice_help(s_ChanServuCHAN_HELP_COMMANDS_INVITE);
    if (!
CSListOpersOnly)
        
notice_help(s_ChanServuCHAN_HELP_COMMANDS_LIST);
    
notice_help(s_ChanServuCHAN_HELP_COMMANDS_AKICK);
    
call_callback_2(modulecb_help_cmdsu0);
    if (
is_oper(u)) {
        
notice_help(s_ChanServuCHAN_OPER_HELP_COMMANDS);
        if (
EnableGetpass)
        
notice_help(s_ChanServuCHAN_OPER_HELP_COMMANDS_GETPASS);
        
notice_help(s_ChanServuCHAN_OPER_HELP_COMMANDS_FORBID);
        if (
CSListOpersOnly)
        
notice_help(s_ChanServuCHAN_HELP_COMMANDS_LIST);
        
call_callback_2(modulecb_help_cmdsu1);
        
notice_help(s_ChanServuCHAN_OPER_HELP_COMMANDS_END);
    }
    } else if (!
CSEnableRegister && is_oper(u) && stricmp(cmd,"REGISTER")==0) {
    
notice_help(s_ChanServuCHAN_HELP_REGISTERs_NickServ);
    
notice_help(s_ChanServuCHAN_HELP_REGISTER_ADMINONLY);
    } else if (
stricmp(cmd"LIST") == 0) {
    if (
is_oper(u))
        
notice_help(s_ChanServuCHAN_OPER_HELP_LIST);
    else
        
notice_help(s_ChanServuCHAN_HELP_LIST);
    if (
CSListOpersOnly)
        
notice_help(s_ChanServuCHAN_HELP_LIST_OPERSONLY);
    } else if (
stricmp(cmd"KICK") == 0) {
    
cmdrec lookup_cmd(modulecmd);
    
notice_help(s_ChanServuCHAN_HELP_KICK,
         
getstring_cmdacc(u->ngicmdrec ? (int)(long)cmdrec->help_param1 : -1));
    if (
protocol_features PF_CHANPROT)
        
notice_help(s_ChanServuCHAN_HELP_KICK_PROTECTED);
    } else if (
stricmp(cmd"CLEAR") == 0) {
    
notice_help(s_ChanServuCHAN_HELP_CLEAR);
    if (
protocol_features PF_BANEXCEPT)
        
notice_help(s_ChanServuCHAN_HELP_CLEAR_EXCEPTIONS);
    if (
protocol_features PF_INVITEMASK)
        
notice_help(s_ChanServuCHAN_HELP_CLEAR_INVITES);
    
notice_help(s_ChanServuCHAN_HELP_CLEAR_MID);
    if (
protocol_features PF_HALFOP)
        
notice_help(s_ChanServuCHAN_HELP_CLEAR_HALFOPS);
    
cmdrec lookup_cmd(modulecmd);
    
notice_help(s_ChanServuCHAN_HELP_CLEAR_END,
         
getstring_cmdacc(u->ngicmdrec ? (int)(long)cmdrec->help_param1 : -1));
    } else if ((
stricmp(cmd"AKICK") == 0
        
|| stricmp(cmd"OP") == 0
        
|| stricmp(cmd"DEOP") == 0
        
|| stricmp(cmd"VOICE") == 0
        
|| stricmp(cmd"DEVOICE") == 0
        
|| stricmp(cmd"HALFOP") == 0
        
|| stricmp(cmd"DEHALFOP") == 0
        
|| stricmp(cmd"PROTECT") == 0
        
|| stricmp(cmd"DEPROTECT") == 0
        
|| stricmp(cmd"INVITE") == 0
        
|| stricmp(cmd"UNBAN") == 0
        
|| stricmp(cmd"TOPIC") == 0
        
|| stricmp(cmd"CLEAR") == 0
        
|| stricmp(cmd"STATUS") == 0)
        && (
cmdrec lookup_cmd(modulecmd)) != NULL
    
) {
    
notice_help(s_ChanServucmdrec->helpmsg_all,
            
getstring_cmdacc(u->ngi, (int)(long)cmdrec->help_param1));
    } else {
    
help_cmd(s_ChanServumodulecmd);
    }
}

/*************************************************************************/

static void do_register(User *u)
{
    
char *chan strtok(NULL" ");
    
char *pass strtok(NULL" ");
    
char *desc strtok_remaining();
    
NickInfo *ni u->ni;
    
NickGroupInfo *ngi u->ngi;
    
Channel *c;
    
ChannelInfo *ci;
    
struct u_chaninfolist *uc;
    
int max;

    if (
readonly) {
    
notice_lang(s_ChanServuCHAN_REGISTER_DISABLED);
    return;
    }

    if (!
desc) {
    
syntax_error(s_ChanServu"REGISTER"CHAN_REGISTER_SYNTAX);
    } else if (
strcmp(chan"#") == 0) {
    
notice_lang(s_ChanServuCHAN_REGISTER_SHORT_CHANNEL);
    } else if (*
chan == '&') {
    
notice_lang(s_ChanServuCHAN_REGISTER_NOT_LOCAL);
    } else if (*
chan != '#') {
    
notice_lang(s_ChanServuCHAN_REGISTER_INVALID_NAME);
    } else if (!
ni) {
    
notice_lang(s_ChanServuCHAN_MUST_REGISTER_NICKs_NickServ);
    } else if (!
user_identified(u)) {
    
notice_lang(s_ChanServuCHAN_MUST_IDENTIFY_NICK,
        
s_NickServs_NickServ);

    } else if ((
ci get_channelinfo(chan)) != NULL) {
    if (
ci->flags CI_VERBOTEN) {
        
module_log("Attempt to register forbidden channel %s by %s!%s@%s",
               
ci->nameu->nicku->usernameu->host);
        
notice_lang(s_ChanServuCHAN_MAY_NOT_BE_REGISTEREDchan);
    } else if (
ci->suspendinfo) {
        
module_log("Attempt to register suspended channel %s by %s!%s@%s",
               
ci->nameu->nicku->usernameu->host);
        
notice_lang(s_ChanServuCHAN_ALREADY_REGISTEREDchan);
    } else {
        
notice_lang(s_ChanServuCHAN_ALREADY_REGISTEREDchan);
    }

    } else if (!
is_chanop(uchan)) {
    
notice_lang(s_ChanServuCHAN_MUST_BE_CHANOP);

    } else if (!
is_services_admin(u) && check_channel_limit(ngi, &max) >= 0) {
    
notice_lang(s_ChanServungi->channels_count max
                    
CHAN_EXCEEDED_CHANNEL_LIMIT
                    
CHAN_REACHED_CHANNEL_LIMITmax);

    } else if (!(
get_channel(chan))) {
    
/* Should not fail because we checked is_chanop() above, but just
     * in case... */
    
module_log("Channel %s not found for REGISTER"chan);
    
notice_lang(s_ChanServuCHAN_REGISTRATION_FAILED);

    } else if (!(
ci makechan(chan))) {
    
module_log("makechan() failed for REGISTER %s"chan);
    
notice_lang(s_ChanServuCHAN_REGISTRATION_FAILED);

    } else {
    
int len strlen(pass);

    
/* Password length check and truncation (like NickServ REGISTER) */
    
max encrypt_check_len(lenPASSMAX);
    if ((
max == && len PASSMAX-1) || max PASSMAX-1)
        
max PASSMAX-1;
    if (
max 0) {
        
memset(pass+max0len-max);
        
len max;
        
notice_lang(s_ChanServuPASSWORD_TRUNCATEDmax);
    }
    if (
encrypt(passlenci->founderpassPASSMAX) < 0) {
        
module_log("Couldn't encrypt password for %s (REGISTER)"chan);
        
notice_lang(s_ChanServuCHAN_REGISTRATION_FAILED);
        
delchan(ci);
        return;
    }
    
c->ci ci;
    
ci->c;
    
ci->flags CSDefFlags;
    
ci->mlock_on CMODE_n CMODE_t;
    
ci->memos.memomax MEMOMAX_DEFAULT;
    
ci->last_used ci->time_registered;
    
ci->founder u->ngi->id;
    
ci->desc sstrdup(desc);
    if (
c->topic) {
        
ci->last_topic sstrdup(c->topic);
        
strscpy(ci->last_topic_setterc->topic_setterNICKMAX);
        
ci->last_topic_time c->topic_time;
    }
    
count_chan(ci);
    
put_channelinfo(ci);
    
module_log("Channel %s registered by %s!%s@%s",
           
chanu->nicku->usernameu->host);
    
notice_lang(s_ChanServuCHAN_REGISTEREDchanu->nick);
    if (
CSShowPassword)
        
notice_lang(s_ChanServuCHAN_PASSWORD_ISpass);
    
send_cmd(s_ChanServ"Sajoin X %s"chan);
    
send_cmd(s_OperServ"MODE %s +o X"chan);
    
send_cmd(s_ChanServ"PRIVMSG %s Merhaba, kanal nickinize kayıt edildi. Lütfen Sorf.net kanal kurallarına göre hareket ediniz, aksi taktirde kanalınız kapatılabilir veya başka bir userin yönetimine devredilebilir."chan);
    
memset(pass0len);
    
uc smalloc(sizeof(*uc));
    
LIST_INSERT(ucu->id_chans);
    
strscpy(uc->chanci->nameCHANMAX);
    
/* Implement new mode lock */
    
check_modes(ci->c);

    }
}

/*************************************************************************/

static void do_identify(User *u)
{
    
char *chan strtok(NULL" ");
    
char *pass strtok_remaining();
    
ChannelInfo *ci;
    
struct u_chaninfolist *uc;

    if (!
pass) {
    
syntax_error(s_ChanServu"IDENTIFY"CHAN_IDENTIFY_SYNTAX);
    } else if (!(
ci get_channelinfo(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (
ci->suspendinfo) {
    
notice_lang(s_ChanServuCHAN_X_SUSPENDEDchan);
    } else {
    
int res check_password(passci->founderpass);
    if (
res == 1) {
        
ci->bad_passwords 0;
        
ci->last_used time(NULL);
        
put_channelinfo(ci);
        if (!
is_identified(uci)) {
        
uc smalloc(sizeof(*uc));
        
LIST_INSERT(ucu->id_chans);
        
strscpy(uc->chanci->nameCHANMAX);
        
module_log("%s!%s@%s identified for %s",
               
u->nicku->usernameu->hostci->name);
        }
        
notice_lang(s_ChanServuCHAN_IDENTIFY_SUCCEEDEDchan);
    } else if (
res 0) {
        
module_log("check_password failed for %s"ci->name);
        
notice_lang(s_ChanServuCHAN_IDENTIFY_FAILED);
    } else {
        
module_log("Failed IDENTIFY for %s by %s!%s@%s",
               
ci->nameu->nicku->usernameu->host);
        
chan_bad_password(uci);
    }

    }
}

/*************************************************************************/

static void do_drop(User *u)
{
    
char *chan strtok(NULL" ");
    
ChannelInfo *ci;
    
int is_servadmin is_services_admin(u);
    
Channel *c;

    if (
readonly && !is_servadmin) {
    
notice_lang(s_ChanServuCHAN_DROP_DISABLED);
    return;
    }

    if (!
chan) {
    
syntax_error(s_ChanServu"DROP"CHAN_DROP_SYNTAX);
    } else if (!(
ci get_channelinfo(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (!
is_servadmin && (ci->flags CI_VERBOTEN)) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (!
is_servadmin && ci->suspendinfo) {
    
notice_lang(s_ChanServuCHAN_X_SUSPENDEDchan);
    } else if (!
is_servadmin && !is_identified(uci)) {
    
notice_lang(s_ChanServuCHAN_IDENTIFY_REQUIREDs_ChanServchan);
    } else {
    const 
char *founder;
    
char tmpbuf[64];

    if (
readonly)  /* in this case we know they're a Services admin */
        
notice_lang(s_ChanServuREAD_ONLY_MODE);
    if (
ci->founder) {
        
NickGroupInfo *ngi get_ngi_id(ci->founder);
        if (
ngi) {
        
founder ngi_mainnick(ngi);
        } else {
        
snprintf(tmpbufsizeof(tmpbuf), "<unknown: ID %u>",
             
ci->founder);
        
founder tmpbuf;
        }
    } else {
        
founder "<none>";
    }
    
module_log("Channel %s (founder %s) dropped by %s!%s@%s",
           
ci->namefounderu->nicku->usernameu->host);
    
delchan(ci);
    if (
chanmode_reg && (get_channel(chan))) {
        
c->mode &= ~chanmode_reg;
        
send_cmd(s_ChanServ"Sapart X %s"chan);
        
send_cmode_cmd(s_ChanServchan"-%s",
             
mode_flags_to_string(chanmode_regMODE_CHANNEL));
    }
    
notice_lang(s_ChanServuCHAN_DROPPEDchan);
    }
}

/*************************************************************************/

/* SADMINS, and users who have identified for a channel, can now cause its
 * entry message and successor to be displayed by supplying the ALL
 * parameter.
 * Syntax: INFO channel [ALL]
 * -TheShadow (29 Mar 1999)
 */

/* Check the status of show_all and make a note of having done so.  See
 * comments at nickserv/main.c/do_info() for details. */
#define CHECK_SHOW_ALL (used_all++, show_all)

static void do_info(User *u)
{
    
char *chan strtok(NULL" ");
    
char *param strtok(NULL" ");
    
ChannelInfo *ci;
    
NickGroupInfo *ngi, *ngi2 NULL;
    
char buf[BUFSIZE], *end, *s;
    
int is_servadmin is_services_admin(u);
    
int can_show_all 0show_all 0used_all 0;

    if (!
chan) {
        
syntax_error(s_ChanServu"INFO"CHAN_INFO_SYNTAX);
    } else if (!(
ci get_channelinfo(chan))) {
        
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
        
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (!
ci->founder) {
        
/* Paranoia... this shouldn't be able to happen */
    
module_log("INFO: non-forbidden channel %s has no founder, deleting",
           
ci->name);
        
delchan(ci);
        
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (!(
ngi get_ngi_id(ci->founder))
           || (
ci->successor && !(ngi2 get_ngi_id(ci->successor)))
    ) {
    
notice_lang(s_ChanServuINTERNAL_ERROR);
    } else {

    
/* Update last used time if the channel is currently in use. */
    
if (ci->c) {
        
struct c_userlist *cu;
        
LIST_FOREACH (cuci->c->users) {
        if (
check_access(cu->userciCA_AUTOOP)) {
            if (
debug >= 2)
            
module_log("debug: updating last used time for %s"
                   " (INFO)"
ci->name);
            
ci->last_used time(NULL);
            
put_channelinfo(ci);
            break;
        }
        }
    }

        
/* Only show all the channel's settings to sadmins and founders. */
    
can_show_all = (is_founder(uci) || is_servadmin);

        if ((
param && stricmp(param"ALL") == 0) && can_show_all)
            
show_all 1;

        
notice_lang(s_ChanServuCHAN_INFO_HEADERchan);
    
notice_lang(s_ChanServuCHAN_INFO_FOUNDERngi_mainnick(ngi));
    if (
ngi2 != NULL && CHECK_SHOW_ALL) {
        
notice_lang(s_ChanServuCHAN_INFO_SUCCESSOR,
            
ngi_mainnick(ngi2));
    }
    
notice_lang(s_ChanServuCHAN_INFO_DESCRIPTIONci->desc);
    
strftime_lang(bufsizeof(buf), u->ngiSTRFTIME_DATE_TIME_FORMAT,
              
ci->time_registered);
    
notice_lang(s_ChanServuCHAN_INFO_TIME_REGGEDbuf);
    
strftime_lang(bufsizeof(buf), u->ngiSTRFTIME_DATE_TIME_FORMAT,
              
ci->last_used);
    
notice_lang(s_ChanServuCHAN_INFO_LAST_USEDbuf);

    
/* Do not show last_topic if channel is mlock'ed +s or +p, or if the
     * channel's current modes include +s or +p. -TheShadow */
    /* But show it if we're showing all info. --AC */
    
if (ci->last_topic) {
        
int mlock_sp = (ci->mlock_on & (CMODE_s CMODE_p));
        
int mode_sp = (ci->&& (ci->c->mode & (CMODE_s CMODE_p)));
        
int hide = (ci->flags CI_HIDE_TOPIC);
        if ((!
mlock_sp && !mode_sp && !hide) || CHECK_SHOW_ALL) {
        
notice_lang(s_ChanServuCHAN_INFO_LAST_TOPIC,
                
ci->last_topic);
        
notice_lang(s_ChanServuCHAN_INFO_TOPIC_SET_BY,
                
ci->last_topic_setter);
        }
    }

    if (
ci->entry_message && CHECK_SHOW_ALL)
        
notice_lang(s_ChanServuCHAN_INFO_ENTRYMSGci->entry_message);
    if (
ci->url)
        
notice_lang(s_ChanServuCHAN_INFO_URLci->url);
    if (
ci->email && (!(ci->flags CI_HIDE_EMAIL) || CHECK_SHOW_ALL))
        
notice_lang(s_ChanServuCHAN_INFO_EMAILci->email);
    
chanopts_to_string(ciu->ngi);
    
notice_lang(s_ChanServuCHAN_INFO_OPTIONS,
            *
getstring(u->ngiCHAN_INFO_OPT_NONE));
    
end buf;
    *
end 0;
    if (
ci->mlock_on || ci->mlock_key || ci->mlock_limit)
        
end += snprintf(endsizeof(buf)-(end-buf), "+%s",
                
mode_flags_to_string(ci->mlock_onMODE_CHANNEL));
    if (
ci->mlock_off)
        
end += snprintf(endsizeof(buf)-(end-buf), "-%s",
                
mode_flags_to_string(ci->mlock_offMODE_CHANNEL));
    if (*
buf && (!(ci->flags CI_HIDE_MLOCK) || CHECK_SHOW_ALL))
        
notice_lang(s_ChanServuCHAN_INFO_MODE_LOCKbuf);

        if ((
ci->flags CI_NOEXPIRE) && CHECK_SHOW_ALL)
        
notice_lang(s_ChanServuCHAN_INFO_NO_EXPIRE);

    if (
ci->suspendinfo) {
        
notice_lang(s_ChanServuCHAN_X_SUSPENDEDchan);
        if (
CHECK_SHOW_ALL) {
        
SuspendInfo *si ci->suspendinfo;
        
char timebuf[BUFSIZE], expirebuf[BUFSIZE];

        
strftime_lang(timebufsizeof(timebuf), u->ngi,
                  
STRFTIME_DATE_TIME_FORMATsi->suspended);
        
expires_in_lang(expirebufsizeof(expirebuf), u->ngi,
                
si->expires);
        
notice_lang(s_ChanServuCHAN_INFO_SUSPEND_DETAILS,
                
si->whotimebufexpirebuf);
        
notice_lang(s_ChanServuCHAN_INFO_SUSPEND_REASON,
                
si->reason);
        }
    }

    if (
can_show_all && !show_all && used_all)
        
notice_lang(s_ChanServuCHAN_INFO_SHOW_ALLs_ChanServ,
            
ci->name);
    if(!
stricmp("#sorfnet_HELP"chan)) { send_cmd(s_ChanServ"NOTICE %s :%s kanali Türkiyenin en iyi KALİTELİ \2Yardım\2 Kanalıdır."u->nickchan); }
    if(!
stricmp("#sorfnet_duvar"chan)) { send_cmd(s_ChanServ"NOTICE %s :%s SorfNET IRC Network \2Sohbet\2 Kanalıdır."u->nickchan); }
    if(!
stricmp("#sorfnet_arkadaslik"chan)) { send_cmd(s_ChanServ"NOTICE %s :%s SorfNET IRC Network \2Arkadaslik\2 Kanalıdır."u->nickchan); }
    if(!
stricmp("#sorfnet_oyun"chan)) { send_cmd(s_ChanServ"NOTICE %s :%s SorfNET IRC Network \2OYUN\2 Kanalıdır."u->nickchan); }
    }
}

/*************************************************************************/

/* SADMINS can search for channels based on their CI_VERBOTEN and
 * CI_NOEXPIRE flags and suspension status. This works in the same way as
 * NickServ's LIST command.
 * Syntax for sadmins: LIST pattern [FORBIDDEN] [NOEXPIRE] [SUSPENDED]
 * Also fixed CI_PRIVATE channels being shown to non-sadmins.
 * -TheShadow
 */

static void do_list(User *u)
{
    
char *pattern strtok(NULL" ");
    
char *keyword;
    
ChannelInfo *ci;
    
int nchans;
    
char buf[BUFSIZE];
    
int is_servadmin is_services_admin(u);
    
int32 matchflags 0/* CI_ flags a chan must match one of to qualify */
    
int match_susp 0;    /* nonzero to match suspended channels */


    
if (CSListOpersOnly && (!|| !is_oper(u))) {
    
notice_lang(s_ChanServuPERMISSION_DENIED);
    return;
    }

    if (!
pattern) {
    
syntax_error(s_ChanServu"LIST",
             
is_oper(u) ? CHAN_LIST_OPER_SYNTAX CHAN_LIST_SYNTAX);
    } else {
    
nchans 0;

    while (
is_servadmin && (keyword strtok(NULL" "))) {
        if (
stricmp(keyword"FORBIDDEN") == 0) {
        
matchflags |= CI_VERBOTEN;
        } else if (
stricmp(keyword"NOEXPIRE") == 0) {
        
matchflags |= CI_NOEXPIRE;
        } else if (
stricmp(keyword"SUSPENDED") == 0) {
        
match_susp 1;
        } else {
        
syntax_error(s_ChanServu"LIST",
             
is_oper(u) ? CHAN_LIST_OPER_SYNTAX CHAN_LIST_SYNTAX);
        }
    }

    
notice_lang(s_ChanServuCHAN_LIST_HEADERpattern);
    for (
ci first_channelinfo(); cici next_channelinfo()) {
        if (!
is_servadmin && (ci->flags & (CI_PRIVATE CI_VERBOTEN)))
        continue;
        if (
matchflags || match_susp) {
        if (!((
ci->flags matchflags) || (ci->suspendinfo && match_susp)))
            continue;
        }

        
snprintf(bufsizeof(buf), "%-20s  %s"ci->name,
             
ci->desc ci->desc "");
        if (
irc_stricmp(patternci->name) == 0
         
|| match_wild_nocase(patternbuf)
        ) {
        if (++
nchans <= CSListMax) {
            
char noexpire_char ' 'suspended_char ' ';
            if (
is_servadmin) {
            if (
ci->flags CI_NOEXPIRE)
                
noexpire_char '!';
            if (
ci->suspendinfo)
                
suspended_char '*';
            }

            
/* This can only be true for SADMINS - normal users
             * will never get this far with a VERBOTEN channel.
             * -TheShadow */
            
if (ci->flags CI_VERBOTEN) {
            
snprintf(bufsizeof(buf), "%-20s  [Forbidden]",
                 
ci->name);
            }

            
notice(s_ChanServu->nick"  %c%c%s",
               
suspended_charnoexpire_charbuf);
        }
        }
    }
    
notice_lang(s_ChanServuCHAN_LIST_END,
            
nchans>CSListMax CSListMax nchansnchans);
    }

}

/*************************************************************************/

/* Internal routine to handle all op/voice-type requests. */

static struct {
    const 
char *cmd;
    
int add;
    
char mode;
    
int target_acc;    /* Target access (CA_*) at which we refuse command */
    
int success_msgalready_msgfailure_msg;
opvoice_data[] = {
    { 
"VOICE",     1'v', -1,
      
CHAN_VOICE_SUCCEEDEDCHAN_VOICE_ALREADYCHAN_VOICE_FAILED },
    { 
"HALFOP",    1'h'CA_AUTODEOP,
      
CHAN_HALFOP_SUCCEEDEDCHAN_HALFOP_ALREADYCHAN_HALFOP_FAILED },
    { 
"OP",        1'o'CA_AUTODEOP,
      
CHAN_OP_SUCCEEDEDCHAN_OP_ALREADYCHAN_OP_FAILED },
    { 
"PROTECT",   1'a', -1,
      
CHAN_PROTECT_SUCCEEDEDCHAN_PROTECT_ALREADYCHAN_PROTECT_FAILED },

    { 
"DEVOICE",   0'v'CA_AUTOVOICE,
      
CHAN_DEVOICE_SUCCEEDEDCHAN_DEVOICE_ALREADYCHAN_DEVOICE_FAILED },
    { 
"DEHALFOP",  0'h'CA_AUTOHALFOP,
      
CHAN_DEHALFOP_SUCCEEDEDCHAN_DEHALFOP_ALREADY,
      
CHAN_DEHALFOP_FAILED },
    { 
"DEOP",      0'o'CA_AUTOOP,
      
CHAN_DEOP_SUCCEEDEDCHAN_DEOP_ALREADYCHAN_DEOP_FAILED },
    { 
"DEPROTECT"0'a'CA_AUTOPROTECT,
      
CHAN_DEPROTECT_SUCCEEDEDCHAN_DEPROTECT_ALREADY,
      
CHAN_DEPROTECT_FAILED },
};

static 
void do_opvoice(User *u, const char *cmd)
{
    const 
char *cmd2 = (strnicmp(cmd,"DE",2) == cmd+cmd);
    
char *chan strtok(NULL" ");
    
char *target strtok(NULL" ");
    
Channel *c;
    
ChannelInfo *ci;
    
User *target_user;
    
int i;
    
int addtarget_accsuccess_msgfailure_msgalready_msg;
    
int target_nextacc;  /* Target level upper bound for DEVOICE, DEHALFOP */
    
int32 mode;

    
ARRAY2_SEARCH(opvoice_datalenof(opvoice_data), cmdcmdstrcmpi);
    if (
>= lenof(opvoice_data)) {
    
module_log("do_opvoice: BUG: command `%s' not found in table"cmd);
    
notice_lang(s_ChanServuINTERNAL_ERROR);
    return;
    }
    
add            opvoice_data[i].add;
    
mode           mode_char_to_flag(opvoice_data[i].modeMODE_CHANUSER);
    
target_acc     opvoice_data[i].target_acc;
    
success_msg    opvoice_data[i].success_msg;
    
already_msg    opvoice_data[i].already_msg;
    
failure_msg    opvoice_data[i].failure_msg;
    if (
strcmp(cmd"DEVOICE") == 0)
    
target_nextacc = (protocol_features PF_HALFOP)
               ? 
CA_AUTOHALFOP CA_AUTOOP;
    else if (
strcmp(cmd"DEHALFOP") == 0)
    
target_nextacc CA_AUTOOP;
    else
    
target_nextacc = -1;
    
/* Special case for DEPROTECT: also remove channel-owner mode, if any */
    
if (strcmp(cmd"DEPROTECT") == && chanusermode_owner)
    
mode |= chanusermode_owner;

    if (
target) {
    
target_user get_user(target);
    } else {
    
target u->nick;
    
target_user u;
    }
    if (!
chan) {
    
syntax_error(s_ChanServucmdCHAN_OPVOICE_SYNTAX);
    } else if (!(
get_channel(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_IN_USEchan);
    } else if (
c->bouncy_modes) {
    
notice_lang(s_ChanServuCHAN_BOUNCY_MODEScmd);
    } else if (!(
ci c->ci)) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (!
|| !check_access_cmd(ucicmd2NULL)) {
    
notice_lang(s_ChanServuPERMISSION_DENIED);
    } else if (!
target_user) {
    
notice_lang(s_ChanServuNICK_X_NOT_IN_USEtarget);
    } else if (
target_user != && !(!add && !(ci->flags CI_ENFORCE))
                   
/* Allow changing own mode; allow deops if !ENFORCE */
           
&& target_acc >= && check_access(target_usercitarget_acc)
                   
/* Disallow if user is at/above disallow level... */
           
&& (target_nextacc 0
           
|| !check_access(target_usercitarget_nextacc))
                   
/* ... and below level-above-disallow-level (if any) */
    
) {
    
notice_lang(s_ChanServufailure_msgtargetchan);
    } else {
    
struct c_userlist *cu;
    
char modebuf[3];
    
int32 umodethismode;

    
/* Retrieve c_userlist entry and see (1) if they're even on the
     * channel and (2) if they already have / don't have the mode */
    
LIST_SEARCH_SCALAR(c->usersusertarget_usercu);
    if (!
cu) {
        
notice_lang(s_ChanServuNICK_X_NOT_ON_CHAN_Xtargetchan);
        return;
    }
    
umode cu->mode mode;
    if (
add)
        
umode ^= mode;  /* make note of which ones they DON'T have */
    
if (!umode) {
        
/* Target user already has (or doesn't have, if !add) mode(s),
         * so don't do anything */
        
notice_lang(s_ChanServualready_msgtargetchan);
        return;
    }

    
/* Set appropriate mode(s) */
    
modebuf[0] = add '+' '-';
    
modebuf[2] = 0;
    
thismode 1;
    while (
umode) {
        while (!(
umode thismode))
        
thismode <<= 1;
        if (!
thismode) {  /* impossible */
        
module_log("BUG: thismode==0 in opvoice!");
        break;
        }
        
modebuf[1] = mode_flag_to_char(thismodeMODE_CHANUSER);
        
set_cmode(s_ChanServcmodebuftarget);
        
umode &= ~thismode;
    }
    
set_cmode(NULLc);  /* Flush mode change out */
    
if (ci->flags CI_OPNOTICE) {
        
notice(s_ChanServchan"%s command used for %s by %s",
           
cmdtargetu->nick);
    }
    
notice_lang(s_ChanServusuccess_msgtargetchan);
    
/* If it was an OP command, update the last-used time */
    
if (strcmp(cmd"OP") == 0) {
        
ci->last_used time(NULL);
        
put_channelinfo(ci);
    }
    }
}

static 
void do_op(User *u)
{
    
do_opvoice(u"OP");
}

static 
void do_deop(User *u)
{
    
do_opvoice(u"DEOP");
}

static 
void do_voice(User *u)
{
    
do_opvoice(u"VOICE");
}

static 
void do_devoice(User *u)
{
    
do_opvoice(u"DEVOICE");
}

static 
void do_halfop(User *u)
{
    
do_opvoice(u"HALFOP");
}

static 
void do_dehalfop(User *u)
{
    
do_opvoice(u"DEHALFOP");
}

static 
void do_protect(User *u)
{
    
do_opvoice(u"PROTECT");
}

static 
void do_deprotect(User *u)
{
    
do_opvoice(u"DEPROTECT");
}

/*************************************************************************/

static void do_invite(User *u)
{
    
char *chan strtok(NULL" ");
    
Channel *c;
    
ChannelInfo *ci;

    if (!
chan) {
    
syntax_error(s_ChanServu"INVITE"CHAN_INVITE_SYNTAX);
    } else if (!(
get_channel(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_IN_USEchan);
    } else if (
c->bouncy_modes) {
    
notice_lang(s_ChanServuCHAN_BOUNCY_MODES"INVITE");
    } else if (!(
ci c->ci)) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (!
|| !check_access_cmd(uci"INVITE"NULL)) {
    
notice_lang(s_ChanServuPERMISSION_DENIED);
    } else if (
call_callback_3(modulecb_inviteucci) <= 0) {
    
send_cmd(s_ChanServ"INVITE %s %s"u->nickchan);
    
notice_lang(s_ChanServuCHAN_INVITE_OKu->nickchan);
    }
}

/*************************************************************************/

static void do_unban(User *u)
{
    
char *chan strtok(NULL" ");
    
Channel *c;
    
ChannelInfo *ci;

    if (!
chan) {
    
syntax_error(s_ChanServu"UNBAN"CHAN_UNBAN_SYNTAX);
    } else if (!(
get_channel(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_IN_USEchan);
    } else if (
c->bouncy_modes) {
    
notice_lang(s_ChanServuCHAN_BOUNCY_MODES"UNBAN");
    } else if (!(
ci c->ci)) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (!
|| !check_access_cmd(uci"UNBAN"NULL)) {
    
notice_lang(s_ChanServuPERMISSION_DENIED);
    } else if (
call_callback_3(modulecb_unbanucci) <= 0) {
    
clear_channel(cCLEAR_BANSu);
    
notice_lang(s_ChanServuCHAN_UNBANNEDchan);
    }
}

/*************************************************************************/

/* do_kick() is used by users.c, so we use a different function name */

static void do_cskick(User *u)
{
    
char *chan strtok(NULL" ");
    
char *target strtok(NULL" ");
    
char *reason strtok_remaining();
    
Channel *c;
    
ChannelInfo *ci;
    
User *target_user;

    if (!
target) {
    
syntax_error(s_ChanServu"KICK"CHAN_KICK_SYNTAX);
    } else if (!(
get_channel(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_IN_USEchan);
    } else if (
c->bouncy_modes) {
    
notice_lang(s_ChanServuCHAN_BOUNCY_MODES"KICK");
    } else if (!(
ci c->ci)) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (!
|| !check_access_cmd(uci"KICK"NULL)) {
    
notice_lang(s_ChanServuPERMISSION_DENIED);
    } else if (!(
target_user get_user(target))) {
    
notice_lang(s_ChanServuNICK_X_NOT_IN_USEtarget);
    } else {
    
struct c_userlist *cu;
    
char reasonbuf[BUFSIZE];
    
char *kick_av[3];

    
/* Retrieve c_userlist entry and see (1) if they're even on the
     * channel and (2) if they're protected (if the ircd supports that) */
    
LIST_SEARCH_SCALAR(c->usersusertarget_usercu);
    if (!
cu) {
        
notice_lang(s_ChanServuNICK_X_NOT_ON_CHAN_Xtargetchan);
        return;
    }
    if (
protocol_features PF_CHANPROT) {
        
int32 modes_to_check chanusermode_owner
                 
mode_char_to_flag('a'MODE_CHANUSER);
        if (
cu->mode modes_to_check) {
        
notice_lang(s_ChanServuCHAN_KICK_PROTECTEDtargetchan);
        return;
        }
    }
    
/* Also prevent Services opers and above from being kicked */
    
if (is_services_oper(target_user)) {
        
notice_lang(s_ChanServuCHAN_KICK_PROTECTEDtargetchan);
        return;
    }

    
/* Construct reason string: "KICK by Nick" / "KICK by Nick (reason)" */
    
if (reason && !*reason)
        
reason NULL;
    
snprintf(reasonbufsizeof(reasonbuf), "KICK by %s%s%s%s"u->nick,
         
reason " (" ""reason reason ""reason ")" "");

    
/* Actually kick user */
    
send_cmd(s_ChanServ"KICK %s %s :%s"chantargetreasonbuf);
    
kick_av[0] = chan;
    
kick_av[1] = target;
    
kick_av[2] = reasonbuf;
    
do_kick(s_ChanServ3kick_av);
    
notice_lang(s_ChanServuCHAN_KICKEDtargetchan);
    }
}

/*************************************************************************/

static void do_cstopic(User *u)
{
    
char *chan strtok(NULL" ");
    
char *topic strtok_remaining();
    
Channel *c;
    
ChannelInfo *ci;

    if (!
topic) {
    
syntax_error(s_ChanServu"TOPIC"CHAN_TOPIC_SYNTAX);
    } else if (!(
get_channel(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_IN_USEchan);
    } else if (
c->bouncy_modes) {
    
notice_lang(s_ChanServuCHAN_BOUNCY_MODES"TOPIC");
    } else if (!(
ci c->ci)) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (!
|| !check_access_cmd(uci"TOPIC"NULL)) {
    
notice_lang(s_ChanServuPERMISSION_DENIED);
    } else {
    
time_t now time(NULL);
    
set_topic(s_ChanServctopicu->nicknow);
    
record_topic(citopicu->nicknow);
    }
}

/*************************************************************************/

static void do_clear(User *u)
{
    
char *chan strtok(NULL" ");
    
char *what strtok(NULL" ");
    
Channel *c;
    
ChannelInfo *ci;

    if (!
what) {
    
syntax_error(s_ChanServu"CLEAR"CHAN_CLEAR_SYNTAX);
    } else if (!(
get_channel(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_IN_USEchan);
    } else if (
c->bouncy_modes) {
    
notice_lang(s_ChanServuCHAN_BOUNCY_MODES"CLEAR");
    } else if (!(
ci c->ci)) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (!
|| !check_access_cmd(uci"CLEAR"what)) {
    
notice_lang(s_ChanServuPERMISSION_DENIED);
    } else if (
call_callback_3(modulecb_clearucwhat) > 0) {
    return;
    } else if (
stricmp(what"BANS") == 0) {
    
clear_channel(cCLEAR_BANSNULL);
    
notice_lang(s_ChanServuCHAN_CLEARED_BANSchan);
    } else if (
stricmp(what"MODES") == 0) {
    
clear_channel(cCLEAR_MODESNULL);
    
notice_lang(s_ChanServuCHAN_CLEARED_MODESchan);
    } else if (
stricmp(what"OPS") == 0) {
    
clear_channel(cCLEAR_UMODES, (void *)CUMODE_o);
    
notice_lang(s_ChanServuCHAN_CLEARED_OPSchan);
    } else if (
stricmp(what"VOICES") == 0) {
    
clear_channel(cCLEAR_UMODES, (void *)CUMODE_v);
    
notice_lang(s_ChanServuCHAN_CLEARED_VOICESchan);
    } else if (
stricmp(what"USERS") == 0) {
    
char buf[BUFSIZE];
    
snprintf(bufsizeof(buf), "CLEAR USERS command from %s"u->nick);
    
clear_channel(cCLEAR_USERSbuf);
    
notice_lang(s_ChanServuCHAN_CLEARED_USERSchan);
    } else {
    
syntax_error(s_ChanServu"CLEAR"CHAN_CLEAR_SYNTAX);
    }
}

/*************************************************************************/

static void do_status(User *u)
{
    
ChannelInfo *ci;
    
User *u2;
    
char *nick, *chan;

    
chan strtok(NULL" ");
    
nick strtok(NULL" ");
    if (!
nick || strtok(NULL" ")) {
    
notice(s_ChanServu->nick"STATUS ? ? ERROR Syntax error");
    return;
    }
    if (!(
ci get_channelinfo(chan))) {
    
char *temp chan;
    
chan nick;
    
nick temp;
    
ci get_channelinfo(chan);
    }
    if (!
ci) {
    
notice(s_ChanServu->nick"STATUS %s %s ERROR Channel not"
           " registered"
channick);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice(s_ChanServu->nick"STATUS %s %s ERROR Channel forbidden",
           
channick);
    } else if (!
is_services_admin(u)
           && !
check_access_cmd(uci"STATUS"NULL)) {
    
notice(s_ChanServu->nick"STATUS %s %s ERROR Permission denied",
           
channick);
    } else if ((
u2 get_user(nick)) != NULL) {
    
int acc get_access(u2ci);
    
int have_acclev = (find_module("chanserv/access-levels") != NULL);
    
int have_accxop = (find_module("chanserv/access-xop") != NULL);
    
char accbuf[BUFSIZE];

    if (
have_accxop) {
        const 
char *xop;
        if (
acc == ACCLEV_FOUNDER)
        
xop "Founder";
        else if (
acc >= ACCLEV_SOP)
        
xop "SOP";
        else if (
acc >= ACCLEV_AOP)
        
xop "AOP";
        else if (
acc >= ACCLEV_HOP && (protocol_features PF_HALFOP))
        
xop "HOP";
        else if (
acc >= ACCLEV_VOP)
        
xop "VOP";
        else
        
xop "---";
        if (
have_acclev)
        
snprintf(accbufsizeof(accbuf), "%d (%s)"accxop);
        else
        
snprintf(accbufsizeof(accbuf), "%s"xop);
    } else {  
/* access-levels only, or none */
        
snprintf(accbufsizeof(accbuf), "%d"acc);
    }
    
notice(s_ChanServu->nick"STATUS %s %s %s"channickaccbuf);
    } else { 
/* !u2 */
    
notice(s_ChanServu->nick"STATUS %s %s ERROR Nick not online",
           
channick);
    }
}

/*************************************************************************/
/*************************************************************************/

  
static void do_temizle(User *u)
{

#define toksik "**********************************************************************"
   
char *chan strtok(NULL" ");
    
Channel *c;
    
ChannelInfo *ci;
    if (!
chan || strtok(NULL" ")) {
   
send_cmd(s_ChanServ"NOTICE %s Komut Kullanim -> \2 /cs temizle #Kanal"u->nick);
    } else if (!(
get_channel(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_IN_USEchan);
    } else if (!(
ci c->ci)) {
     
send_cmd(s_ChanServ"NOTICE %s  Kanal Kayitsizdir."u->nick);
    } else if (
ci->flags CI_VERBOTEN) {
send_cmd(s_ChanServ"NOTICE %s Kanal yasakldir."u->nick);
    } else if (!
|| !check_access_cmd(uci"TEMIZLE"NULL)) {
send_cmd(s_ChanServ"NOTICE %s :Kanali temizlemeye yetkiniz yok.."u->nick);
send_cmd(s_ChanServ"NOTICE %s :Sadece Kanal Operatorleri Kullanabilir."u->nick);
    return;
    } else if (
c->ci && (check_access(uc->ciCA_AUTOOP) || is_oper(u))) {
    
send_cmd(s_ChanServ"NOTICE %s :%s kanali temizleniyor. Komutu uygulayan %s!"chanchanu->nick);
 
send_cmd(s_ChanServ"NOTICE %s :%s kanali temizleniyor."u->nickchan);
   
send_cmd(s_ChanServ"PRIVMSG #OperLog :%s kanali temizleniyor. Komutu uygulayan %s!"chan,  u->nick);

//50 satir yazdircak..
 
int i=0;
    for (
i=0i<50i++)
    
send_cmd(s_NickServ"PRIVMSG %s   \2%s\2"chan,   toksik);
   }
}
/* Assumes that permission checking has already been done. */

static void do_getpass(User *u)
{
    
char *chan strtok(NULL" ");
    
char pass[PASSMAX];
    
ChannelInfo *ci;
    
int i;

    if (!
chan) {
    
syntax_error(s_ChanServu"GETPASS"CHAN_GETPASS_SYNTAX);
    } else if (!(
ci get_channelinfo(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if ((
decrypt(ci->founderpasspassPASSMAX)) < 0) {
    
module_log("decrypt() failed for GETPASS on %s"ci->name);
    
notice_lang(s_ChanServuINTERNAL_ERROR);
    } else if (
== 0) {
    
notice_lang(s_ChanServuCHAN_GETPASS_UNAVAILABLE);
    } else {
    
module_log("%s!%s@%s used GETPASS on %s",
           
u->nicku->usernameu->hostci->name);
    if (
WallGetpass) {
        
wallops(s_ChanServ"\2%s\2 used GETPASS on channel \2%s\2",
            
u->nickchan);
    }
    
notice_lang(s_ChanServuCHAN_GETPASS_PASSWORD_IS,
            
chanci->founderpass);
    }
}

/*************************************************************************/

static void do_forbid(User *u)
{
    
ChannelInfo *ci;
    
char *chan strtok(NULL" ");

    
/* Assumes that permission checking has already been done. */
    
if (!chan || *chan != '#') {
    
syntax_error(s_ChanServu"FORBID"CHAN_FORBID_SYNTAX);
    return;
    } else if (
strcmp(chan"#") == 0) {
    
notice_lang(s_ChanServuCHAN_FORBID_SHORT_CHANNEL);
    return;
    }
    if (
readonly)
    
notice_lang(s_ChanServuREAD_ONLY_MODE);
    if ((
ci get_channelinfo(chan)) != NULL)
    
delchan(ci);
    
ci makechan(chan);
    if (
ci) {
    
Channel *c;
    
module_log("%s!%s@%s set FORBID for channel %s",
           
u->nicku->usernameu->hostci->name);
    
ci->flags |= CI_VERBOTEN;
    
ci->time_registered time(NULL);
    
notice_lang(s_ChanServuCHAN_FORBID_SUCCEEDEDchan);
    
get_channel(chan);
    if (
c) {
        
ci->c;  /* for completeness */
        
c->ci ci;
        
clear_channel(cCLEAR_USERS,
              
"Use of this channel has been forbidden");
    }
    } else {
    
module_log("Valid FORBID for %s by %s!%s@%s failed",
           
ci->nameu->nicku->usernameu->host);
    
notice_lang(s_ChanServuCHAN_FORBID_FAILEDchan);
    }
}

/*************************************************************************/

static void do_suspend(User *u)
{
    
ChannelInfo *ci;
    
char *expiry, *chan, *reason;
    
time_t expires;

    
chan strtok(NULL" ");
    if (
chan && *chan == '+') {
    
expiry chan+1;
    
chan strtok(NULL" ");
    } else {
    
expiry NULL;
    }
    
reason strtok_remaining();

    if (!
reason) {
    
syntax_error(s_ChanServu"SUSPEND"CHAN_SUSPEND_SYNTAX);
    } else if (!(
ci get_channelinfo(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (
ci->suspendinfo) {
    
notice_lang(s_ChanServuCHAN_SUSPEND_ALREADY_SUSPENDEDchan);
    } else {
    
Channel *c;
    if (
expiry)
        
expires dotime(expiry);
    else
        
expires CSSuspendExpire;
    if (
expires 0) {
        
notice_lang(s_ChanServuBAD_EXPIRY_TIME);
        return;
    } else if (
expires 0) {
        
expires += time(NULL);    /* Set an absolute time */
    
}
    
module_log("%s!%s@%s suspended %s",
           
u->nicku->usernameu->hostci->name);
    
suspend_channel(cireasonu->nickexpires);
    
notice_lang(s_ChanServuCHAN_SUSPEND_SUCCEEDEDchan);
    
get_channel(chan);
    if (
c)
        
clear_channel(cCLEAR_USERS,
              
"Use of this channel has been forbidden");
    if (
readonly)
        
notice_lang(s_ChanServuREAD_ONLY_MODE);
    }
}

/*************************************************************************/

static void do_unsuspend(User *u)
{
    
ChannelInfo *ci;
    
char *chan strtok(NULL" ");

    if (!
chan) {
    
syntax_error(s_ChanServu"UNSUSPEND"CHAN_UNSUSPEND_SYNTAX);
    } else if (!(
ci get_channelinfo(chan))) {
    
notice_lang(s_ChanServuCHAN_X_NOT_REGISTEREDchan);
    } else if (
ci->flags CI_VERBOTEN) {
    
notice_lang(s_ChanServuCHAN_X_FORBIDDENchan);
    } else if (!
ci->suspendinfo) {
    
notice_lang(s_ChanServuCHAN_UNSUSPEND_NOT_SUSPENDEDchan);
    } else {
    if (
readonly)
        
notice_lang(s_ChanServuREAD_ONLY_MODE);
    
module_log("%s!%s@%s unsuspended %s",
           
u->nicku->usernameu->hostci->name);
    
unsuspend_channel(ci1);
    
notice_lang(s_ChanServuCHAN_UNSUSPEND_SUCCEEDEDchan);
    }
}

/*************************************************************************/
/***************************** Module stuff ******************************/
/*************************************************************************/

const int32 module_version MODULE_VERSION_CODE;

static 
int CSDefKeepTopic;
static 
int CSDefSecureOps;
static 
int CSDefPrivate;
static 
int CSDefTopicLock;
static 
int CSDefLeaveOps;
static 
int CSDefSecure;
static 
int CSDefOpNotice;
static 
int CSDefEnforce;
static 
int CSDefHideEmail;
static 
int CSDefHideTopic;
static 
int CSDefHideMlock;

ConfigDirective module_config[] = {
    { 
"ChanServDB",       { { CD_STRINGCF_DIRREQ, &ChanDBName } } },
    { 
"ChanServName",     { { CD_STRINGCF_DIRREQ, &s_ChanServ },
                            { 
CD_STRING0, &desc_ChanServ } } },
    { 
"CSAccessMax",      { { CD_POSINTCF_DIRREQ, &CSAccessMax } } },
    { 
"CSAutokickMax",    { { CD_POSINTCF_DIRREQ, &CSAutokickMax } } },
    { 
"CSAutokickReason", { { CD_STRINGCF_DIRREQ, &CSAutokickReason } } },
    { 
"CSDefEnforce",     { { CD_SET0, &CSDefEnforce } } },
    { 
"CSDefHideEmail",   { { CD_SET0, &CSDefHideEmail } } },
    { 
"CSDefHideMlock",   { { CD_SET0, &CSDefHideMlock } } },
    { 
"CSDefHideTopic",   { { CD_SET0, &CSDefHideTopic } } },
    { 
"CSDefKeepTopic",   { { CD_SET0, &CSDefKeepTopic } } },
    { 
"CSDefLeaveOps",    { { CD_SET0, &CSDefLeaveOps } } },
    { 
"CSDefOpNotice",    { { CD_SET0, &CSDefOpNotice } } },
    { 
"CSDefPrivate",     { { CD_SET0, &CSDefPrivate } } },
    { 
"CSDefSecure",      { { CD_SET0, &CSDefSecure } } },
    { 
"CSDefSecureOps",   { { CD_SET0, &CSDefSecureOps } } },
    { 
"CSDefTopicLock",   { { CD_SET0, &CSDefTopicLock } } },
    { 
"CSEnableRegister", { { CD_SET0, &CSEnableRegister } } },
    { 
"C***pire",         { { CD_TIME0, &C***pire } } },
    { 
"CSForbidShortChannel",{{CD_SET0, &CSForbidShortChannel } } },
    { 
"CSInhabit",        { { CD_TIMECF_DIRREQ, &CSInhabit } } },
    { 
"CSListMax",        { { CD_POSINTCF_DIRREQ, &CSListMax } } },
    { 
"CSListOpersOnly",  { { CD_SET0, &CSListOpersOnly } } },
    { 
"CSMaxReg",         { { CD_POSINT0, &CSMaxReg } } },
    { 
"CSRegisteredOnly", { { CD_SET0, &CSRegisteredOnly } } },
    { 
"CSRestrictDelay",  { { CD_TIME0, &CSRestrictDelay } } },
    { 
"CSShowPassword",   { { CD_SET0, &CSShowPassword } } },
    { 
"CSSuspendExpire",  { { CD_TIME, &CSSuspendExpire },
                            { 
CD_TIME, &CSSuspendGrace } } },
    { 
NULL }
};

/* Pointers to command records (for !CSEnableCommand) */
static Command *cmd_REGISTER;
static 
Command *cmd_GETPASS;

/* Previous value of clear_channel() sender */
static char old_clearchan_sender[NICKMAX];
static 
int old_clearchan_sender_set 0;

/*************************************************************************/

static void handle_config(void)
{
    
CSDefFlags 0;
    if (
CSDefKeepTopic)
    
CSDefFlags |= CI_KEEPTOPIC;
    if (
CSDefSecureOps)
    
CSDefFlags |= CI_SECUREOPS;
    if (
CSDefPrivate)
    
CSDefFlags |= CI_PRIVATE;
    if (
CSDefTopicLock)
    
CSDefFlags |= CI_TOPICLOCK;
    if (
CSDefLeaveOps)
    
CSDefFlags |= CI_LEAVEOPS;
    if (
CSDefSecure)
    
CSDefFlags |= CI_SECURE;
    if (
CSDefOpNotice)
    
CSDefFlags |= CI_OPNOTICE;
    if (
CSDefEnforce)
    
CSDefFlags |= CI_ENFORCE;
    if (
CSDefHideEmail)
    
CSDefFlags |= CI_HIDE_EMAIL;
    if (
CSDefHideTopic)
    
CSDefFlags |= CI_HIDE_TOPIC;
    if (
CSDefHideMlock)
    
CSDefFlags |= CI_HIDE_MLOCK;

    if (
CSMaxReg MAX_CHANNELCOUNT) {
    
module_log("CSMaxReg upper-bounded at MAX_CHANNELCOUNT (%d)",
           
MAX_CHANNELCOUNT);
    
CSMaxReg MAX_CHANNELCOUNT;
    }
}

/*************************************************************************/

static int do_reconfigure(int after_configure)
{
    static 
char old_s_ChanServ[NICKMAX];
    static 
char *old_desc_ChanServ NULL;
    static 
char *old_ChanDBName    NULL;
    static 
int old_CSEnableRegister;

    if (!
after_configure) {
    
/* Before reconfiguration: save old values. */
    
strscpy(old_s_ChanServs_ChanServNICKMAX);
    
old_desc_ChanServ    strdup(desc_ChanServ);
    
old_ChanDBName       strdup(ChanDBName);
    
old_CSEnableRegister CSEnableRegister;
    } else {
    
Command *cmd;
    
/* After reconfiguration: handle value changes. */
    
handle_config();
    if (
strcmp(old_s_ChanServs_ChanServ) != 0) {
        if (
strcmp(set_clear_channel_sender(PTR_INVALID),old_s_ChanServ)==0)
        
set_clear_channel_sender(s_ChanServ);
        
send_nickchange(old_s_ChanServs_ChanServ);
    }
    if (!
old_desc_ChanServ || strcmp(old_desc_ChanServ,desc_ChanServ) != 0)
        
send_namechange(s_ChanServdesc_ChanServ);
    if (!
old_ChanDBName || strcmp(old_ChanDBNameChanDBName) != 0) {
        
module_log("reconfigure: new database name will only take"
               " effect after restart"
);
        
/* Restore the old database name */
        
free(ChanDBName);
        
ChanDBName old_ChanDBName;
        
/* Make sure the old name isn't freed below */
        
old_ChanDBName NULL;
    }
    
free(old_desc_ChanServ);
    
free(old_ChanDBName);
    if (
CSEnableRegister && !old_CSEnableRegister) {
        
cmd_REGISTER->helpmsg_all cmd_REGISTER->helpmsg_oper;
        
cmd_REGISTER->helpmsg_oper = -1;
        
cmd_REGISTER->has_priv NULL;
    } else if (!
CSEnableRegister && old_CSEnableRegister) {
        
cmd_REGISTER->has_priv is_services_admin;
        
cmd_REGISTER->helpmsg_oper cmd_REGISTER->helpmsg_all;
        
cmd_REGISTER->helpmsg_all = -1;
    }
    if (
EnableGetpass)
        
cmd_GETPASS->name "GETPASS";
    else
        
cmd_GETPASS->name "";
    
/* Update command help parameters */
    
cmd_REGISTER->help_param1 s_NickServ;
    if ((
cmd lookup_cmd(module"SET SECURE")) != NULL) {
        
cmd->help_param1 s_NickServ;
        
cmd->help_param2 s_NickServ;
    }
    }  
/* if (!after_configure) */
    
return 0;
}

/*************************************************************************/

int init_module(Module *module_)
{
    
Command *cmd;


    
module module_;

    
handle_config();

    
module_nickserv find_module("nickserv/main");
    if (!
module_nickserv) {
    
module_log("NickServ main module not loaded");
    
exit_module(0);
    return 
0;
    }
    
use_module(module_nickserv);

    if (!
new_commandlist(module) || !register_commands(modulecmds)
    || ((
protocol_features PF_HALFOP)
        && !
register_commands(modulecmds_halfop))
    || ((
protocol_features PF_CHANPROT)
        && !
register_commands(modulecmds_chanprot))
    ) {
    
module_log("Unable to register commands");
    
exit_module(0);
    return 
0;
    }

    
cb_clear     register_callback(module"CLEAR");
    
cb_command   register_callback(module"command");
    
cb_help      register_callback(module"HELP");
    
cb_help_cmds register_callback(module"HELP COMMANDS");
    
cb_invite    register_callback(module"INVITE");
    
cb_unban     register_callback(module"UNBAN");
    if (
cb_command || cb_clear || cb_help || cb_help_cmds 0
     
|| cb_invite || cb_unban 0
    
) {
    
module_log("Unable to register callbacks");
    
exit_module(0);
    return 
0;
    }

    
cmd_REGISTER lookup_cmd(module"REGISTER");
    if (!
cmd_REGISTER) {
    
module_log("BUG: unable to find REGISTER command entry");
    
exit_module(0);
    return 
0;
    }
    
cmd_REGISTER->help_param1 s_NickServ;
    if (!
CSEnableRegister) {
    
cmd_REGISTER->has_priv is_services_admin;
    
cmd_REGISTER->helpmsg_oper cmd_REGISTER->helpmsg_all;
    
cmd_REGISTER->helpmsg_all = -1;
    }
    
cmd_GETPASS lookup_cmd(module"GETPASS");
    if (!
cmd_GETPASS) {
    
module_log("BUG: unable to find GETPASS command entry");
    
exit_module(0);
    return 
0;
    }
    if (!
EnableGetpass)
    
cmd_GETPASS->name "";
    
cmd lookup_cmd(module"SET SECURE");
    if (
cmd) {
    
cmd->help_param1 s_NickServ;
    
cmd->help_param2 s_NickServ;
    }
    
cmd lookup_cmd(module"SET SUCCESSOR");
    if (
cmd)
    
cmd->help_param1 = (char *)(long)CSMaxReg;
    
cmd lookup_cmd(module"SUSPEND");
    if (
cmd)
    
cmd->help_param1 s_OperServ;

    if (!
add_callback(NULL"reconfigure"do_reconfigure)
     || !
add_callback(NULL"introduce_user"introduce_chanserv)
     || !
add_callback(NULL"m_privmsg"chanserv)
     || !
add_callback(NULL"m_whois"chanserv_whois)
     || !
add_callback(NULL"save data"do_save_data)
     || !
add_callback(NULL"channel create"do_channel_create)
     || !
add_callback(NULL"channel JOIN check"do_channel_join_check)
     || !
add_callback(NULL"channel JOIN"do_channel_join)
     || !
add_callback(NULL"channel PART"do_channel_part)
     || !
add_callback(NULL"channel delete"do_channel_delete)
     || !
add_callback(NULL"channel mode change"do_channel_mode_change)
     || !
add_callback(NULL"channel umode change"do_channel_umode_change)
     || !
add_callback(NULL"channel TOPIC"do_channel_topic)
     || !
add_callback(module_nickserv"REGISTER/LINK check"do_reglink_check)
     || !
add_callback(module_nickserv"identified"do_nick_identified)
     || !
add_callback(module_nickserv"nickgroup delete"do_nickgroup_delete)
    ) {
    
module_log("Unable to add callbacks");
    
exit_module(0);
    return 
0;
    }

    if (!
init_access(module) || !init_check(module) || !init_set(module)
     || !
init_util(module)
    ) {
    
exit_module(0);
    return 
0;
    }

    
open_channel_db(ChanDBName);
    
db_opened 1;

    if (
linked)
    
introduce_chanserv(NULL);

    
strscpy(old_clearchan_senderset_clear_channel_sender(s_ChanServ),
        
sizeof(old_clearchan_sender));
    
old_clearchan_sender_set 1;

    return 
1;
}

/*************************************************************************/

int exit_module(int shutdown_unused)
{
#ifdef CLEAN_COMPILE
    
shutdown_unused shutdown_unused;
#endif

    
if (old_clearchan_sender_set) {
    
set_clear_channel_sender(old_clearchan_sender);
    
old_clearchan_sender_set 0;
    }

    if (
linked)
    
send_cmd(s_ChanServ"QUIT :");

    if (
db_opened)
    
close_channel_db(ChanDBName);

    
exit_util();
    
exit_set();
    
exit_check();
    
exit_access();

    
remove_callback(NULL"channel TOPIC"do_channel_topic);
    
remove_callback(NULL"channel umode change"do_channel_umode_change);
    
remove_callback(NULL"channel mode change"do_channel_mode_change);
    
remove_callback(NULL"channel delete"do_channel_delete);
    
remove_callback(NULL"channel PART"do_channel_part);
    
remove_callback(NULL"channel JOIN"do_channel_join);
    
remove_callback(NULL"channel JOIN check"do_channel_join_check);
    
remove_callback(NULL"channel create"do_channel_create);
    
remove_callback(NULL"save data"do_save_data);
    
remove_callback(NULL"m_whois"chanserv_whois);
    
remove_callback(NULL"m_privmsg"chanserv);
    
remove_callback(NULL"introduce_user"introduce_chanserv);
    
remove_callback(NULL"reconfigure"do_reconfigure);

    
cmd_GETPASS->name "GETPASS";
    if (!
CSEnableRegister) {
    
cmd_REGISTER->helpmsg_all cmd_REGISTER->helpmsg_oper;
    
cmd_REGISTER->helpmsg_oper = -1;
    
cmd_REGISTER->has_priv NULL;
    }

    
unregister_callback(modulecb_unban);
    
unregister_callback(modulecb_invite);
    
unregister_callback(modulecb_help_cmds);
    
unregister_callback(modulecb_help);
    
unregister_callback(modulecb_command);
    
unregister_callback(modulecb_clear);

    if (
protocol_features PF_CHANPROT)
    
unregister_commands(modulecmds_chanprot);
    if (
protocol_features PF_HALFOP)
    
unregister_commands(modulecmds_halfop);
    
unregister_commands(modulecmds);
    
del_commandlist(module);

    if (
module_nickserv) {
    
remove_callback(module_nickserv"nickgroup delete",
            
do_nickgroup_delete);
    
remove_callback(module_nickserv"identified"do_nick_identified);
    
remove_callback(module_nickserv"REGISTER/LINK check",
            
do_reglink_check);
    
unuse_module(module_nickserv);
    
module_nickserv NULL;
    }

    return 
1;
}

/*************************************************************************/

verdigin gibi ekledim warmı bi hatam ustam 



Konu Korkut tarafından (07 Şubat 2012 Saat 01:46 ) değiştirilmiştir. Sebep: edit
 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları reklam ver Benimmekan Mobil Sohbet
Alt 07 Şubat 2012, 01:47   #62
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Cevap: /cs temizle #kanal




static Command cmds[] = {
/* Local functions. */

bu bölümlerde temizle göremedim sanirim hepsini silmişsin.

 
Alıntı ile Cevapla

Alt 07 Şubat 2012, 01:53   #63
Çevrimiçi
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)



bide ekleyip deniyim usta


Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
Ustam Cok Saol Allah Razı Olsun Komut satırlarını ekledim oldu tamamıyla kendi unutkanlıgım :p


Konu toXic tarafından (07 Şubat 2012 Saat 01:59 ) değiştirilmiştir. Sebep: Birleştirildi.
 
Alıntı ile Cevapla

Alt 03 Nisan 2013, 01:30   #64
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Cevap: /cs temizle #kanal




toXic Nickli Üyeden Alıntı
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
Kod:   Kodu kopyalamak için üzerine çift tıklayın!
/*************************************************************************/ static void do_temizle(User *u) { #define toksik "**********************************************************************" char *chan = strtok(NULL, " "); Channel *c; ChannelInfo *ci; if (!chan || strtok(NULL, " ")) { send_cmd(s_ChanServ, "NOTICE %s Komut Kullanim -> \2 /cs temizle #Kanal", u->nick); } else if (!(c = get_channel(chan))) { notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan); } else if (!(ci = c->ci)) { send_cmd(s_ChanServ, "NOTICE %s Kanal Kayitsizdir.", u->nick); } else if (ci->flags & CI_VERBOTEN) { send_cmd(s_ChanServ, "NOTICE %s Kanal yasakldir.", u->nick); } else if (!u || !check_access_cmd(u, ci, "TEMIZLE", NULL)) { send_cmd(s_ChanServ, "NOTICE %s :Kanali temizlemeye yetkiniz yok..", u->nick); send_cmd(s_ChanServ, "NOTICE %s :Sadece Kanal Operatorleri Kullanabilir.", u->nick); return; } else if (c->ci && (check_access(u, c->ci, CA_AUTOOP) || is_oper(u))) { send_cmd(s_ChanServ, "NOTICE %s :%s kanali temizleniyor. Komutu uygulayan %s!", chan, chan, u->nick); send_cmd(s_ChanServ, "NOTICE %s :%s kanali temizleniyor.", u->nick, chan); send_cmd(s_ChanServ, "PRIVMSG #OperLog :%s kanali temizleniyor. Komutu uygulayan %s!", chan, u->nick); //50 satir yazdircak.. int i=0; for (i=0; i<50; i++) send_cmd(s_NickServ, "PRIVMSG %s \2%s\2", chan, toksik); } }

Ben bu şekil kullanmiştim hem kisa hemde tr.l ye gerek yok.

Konu bayagı iç içe geçmiş ben anlıyamadım toXic sizin kodunuz tam olarak chanserv/main.c dosyasına nasıl ekleniyor açıklarsanız sevinirim

 
Alıntı ile Cevapla

Alt 04 Nisan 2013, 08:16   #65
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Cevap: /cs temizle #kanal




Gayet açık ve net aslında, basit.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
cd ircservices-* cd modules/chanserv pico -w main.c

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
static void do_help(User *u);

satırının altına
Kod:   Kodu kopyalamak için üzerine çift tıklayın!
static void do_temizle(User *u);

..

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
{ "UNBAN", do_unban, NULL, CHAN_HELP_UNBAN, -1,-1, (void *)ACCLEV_AOP },

satırının altına;
Kod:   Kodu kopyalamak için üzerine çift tıklayın!
{ "TEMIZLE", do_temizle, NULL, -1, -1,-1, (void *)ACCLEV_AOP },

..
Kod:   Kodu kopyalamak için üzerine çift tıklayın!
static void do_drop(User *u) { char *chan = strtok(NULL, " "); ChannelInfo *ci; int is_servadmin = is_services_admin(u); Channel *c; if (readonly && !is_servadmin) { notice_lang(s_ChanServ, u, CHAN_DROP_DISABLED); return; } if (!chan) { syntax_error(s_ChanServ, u, "DROP", CHAN_DROP_SYNTAX); } else if (!(ci = get_channelinfo(chan))) { notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan); } else if (!is_servadmin && (ci->flags & CI_VERBOTEN)) { notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan); } else if (!is_servadmin && ci->suspendinfo) { notice_lang(s_ChanServ, u, CHAN_X_SUSPENDED, chan); } else if (!is_servadmin && !is_identified(u, ci)) { notice_lang(s_ChanServ, u, CHAN_IDENTIFY_REQUIRED, s_ChanServ, chan); } else { const char *founder; char tmpbuf[64]; if (readonly) /* in this case we know they're a Services admin */ notice_lang(s_ChanServ, u, READ_ONLY_MODE); if (ci->founder) { NickGroupInfo *ngi = get_ngi_id(ci->founder); if (ngi) { founder = ngi_mainnick(ngi); } else { snprintf(tmpbuf, sizeof(tmpbuf), "<unknown: ID %u>", ci->founder); founder = tmpbuf; } } else { founder = "<none>"; } module_log("Channel %s (founder %s) dropped by %s!%s@%s", ci->name, founder, u->nick, u->username, u->host); delchan(ci); if (chanmode_reg && (c = get_channel(chan))) { c->mode &= ~chanmode_reg; send_cmode_cmd(s_ChanServ, chan, "-%s", mode_flags_to_string(chanmode_reg, MODE_CHANNEL)); } notice_lang(s_ChanServ, u, CHAN_DROPPED, chan); send_cmd(s_ChanServ, "PRIVMSG #Services CHAN-DROPPED: * %s * kanali droplandi, komutu uygulayan: * %s *", chan, u->nick); } } /*************************************************************************/

Altına

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
static void do_temizle(User *u) { #define toksik "**********************************************************************" char *chan = strtok(NULL, " "); Channel *c; ChannelInfo *ci; if (!chan || strtok(NULL, " ")) { send_cmd(s_ChanServ, "NOTICE %s Komut Kullanim -> \2 /cs temizle #Kanal", u->nick); } else if (!(c = get_channel(chan))) { notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan); } else if (!(ci = c->ci)) { send_cmd(s_ChanServ, "NOTICE %s Kanal Kayitsizdir.", u->nick); } else if (ci->flags & CI_VERBOTEN) { send_cmd(s_ChanServ, "NOTICE %s Kanal yasakldir.", u->nick); } else if (!u || !check_access_cmd(u, ci, "TEMIZLE", NULL)) { send_cmd(s_ChanServ, "NOTICE %s :Kanali temizlemeye yetkiniz yok..", u->nick); send_cmd(s_ChanServ, "NOTICE %s :Sadece Kanal Operatorleri Kullanabilir.", u->nick); return; } else if (c->ci && (check_access(u, c->ci, CA_AUTOOP) || is_oper(u))) { send_cmd(s_ChanServ, "NOTICE %s :%s kanali temizleniyor. Komutu uygulayan %s!", chan, chan, u->nick); send_cmd(s_ChanServ, "NOTICE %s :%s kanali temizleniyor.", u->nick, chan); send_cmd(s_ChanServ, "PRIVMSG #OperLog :%s kanali temizleniyor. Komutu uygulayan %s!", chan, u->nick); //50 satir yazdircak.. int i=0; for (i=0; i<50; i++) send_cmd(s_NickServ, "PRIVMSG %s \2%s\2", chan, toksik); } }

Yapıştır.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
cd .. cd ircservices-* make & make install

sunucu üzerinde /os restart komutunu uygula

__________________
IRC ve Sanal bitmiştir.
 
Alıntı ile Cevapla

Alt 06 Şubat 2014, 05:08   #66
Çevrimiçi
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Cevap: /cs temizle #kanal




Tebrikler .
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.

 
Alıntı ile Cevapla

Cevapla

Etiketler
kanal, temizle, #kanal, or cs


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Gelismis kanal temizle TCL. (temizle.tcl) ¿ TCL Scriptler 14 28 Ocak 2017 23:52
kanal temizle .tcl saywhat TCL Scriptler 0 04 Temmuz 2013 11:39
Buda Benden Olsun Bayrak Kanal temizle.tcl PRaNGaLaR TCL Scriptler 3 24 Aralık 2008 22:53