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

Etiketlenen Kullanıcılar

11Beğeni(ler)

Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 07 Şubat 2012, 01:43   #61
Ç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




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ı eglen sohbet reklamver
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
Çevrimdışı
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

 
Alıntı ile Cevapla

Alt 06 Şubat 2014, 05:08   #66
Ç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




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
Çözüldü !temizle kodunun sadece kanal yetkilileri tarafından kullanılması Zalimsin mIRC Scripting Sorunları 2 09 Aralık 2018 12:48
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
temizle MoRtaL_ mIRC Scripting Sorunları 4 09 Şubat 2008 21:21