src/mod/channels.mod/cmdschan.c File Reference

#include <ctype.h>
Include dependency graph for cmdschan.c:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

static void cmd_pls_ban (struct userrec *u, int idx, char *par)
static void cmd_pls_exempt (struct userrec *u, int idx, char *par)
static void cmd_pls_invite (struct userrec *u, int idx, char *par)
static void cmd_mns_ban (struct userrec *u, int idx, char *par)
static void cmd_mns_exempt (struct userrec *u, int idx, char *par)
static void cmd_mns_invite (struct userrec *u, int idx, char *par)
static void cmd_bans (struct userrec *u, int idx, char *par)
static void cmd_exempts (struct userrec *u, int idx, char *par)
static void cmd_invites (struct userrec *u, int idx, char *par)
static void cmd_info (struct userrec *u, int idx, char *par)
static void cmd_chinfo (struct userrec *u, int idx, char *par)
static void cmd_stick_yn (int idx, char *par, int yn)
static void cmd_stick (struct userrec *u, int idx, char *par)
static void cmd_unstick (struct userrec *u, int idx, char *par)
static void cmd_pls_chrec (struct userrec *u, int idx, char *par)
static void cmd_mns_chrec (struct userrec *u, int idx, char *par)
static void cmd_pls_chan (struct userrec *u, int idx, char *par)
static void cmd_mns_chan (struct userrec *u, int idx, char *par)
static void cmd_chaninfo (struct userrec *u, int idx, char *par)
static void cmd_chanset (struct userrec *u, int idx, char *par)
static void cmd_chansave (struct userrec *u, int idx, char *par)
static void cmd_chanload (struct userrec *u, int idx, char *par)

Variables

static struct flag_record user = { 0x00000001 | 0x00000004 , 0, 0, 0, 0, 0 }
static struct flag_record victim = { 0x00000001 | 0x00000004 , 0, 0, 0, 0, 0 }
static cmd_t C_dcc_irc []

Function Documentation

static void cmd_bans ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 756 of file cmdschan.c.

References dcc, egg_strcasecmp, LOG_CMDS, putlog, and tell_bans().

00757 {
00758   if (!egg_strcasecmp(par, "all")) {
00759     putlog(LOG_CMDS, "*", "#%s# bans all", dcc[idx].nick);
00760     tell_bans(idx, 1, "");
00761   } else {
00762     putlog(LOG_CMDS, "*", "#%s# bans %s", dcc[idx].nick, par);
00763     tell_bans(idx, 0, par);
00764   }
00765 }

Here is the call graph for this function:

static void cmd_chaninfo ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1265 of file cmdschan.c.

References chanset_t::aop_max, chanset_t::aop_min, chanset_t::ban_time, chanset_t::ban_type, CHAN_AUTOHALFOP, CHAN_AUTOVOICE, CHAN_BITCH, CHAN_CYCLE, CHAN_DONTKICKOPS, CHAN_DYNAMICBANS, CHAN_DYNAMICEXEMPTS, CHAN_DYNAMICINVITES, CHAN_ENFORCEBANS, CHAN_GREET, CHAN_INACTIVE, CHAN_LOGSTATUS, chan_master, CHAN_NODESYNCH, CHAN_NOUSERBANS, CHAN_NOUSEREXEMPTS, CHAN_NOUSERINVITES, CHAN_OPONJOIN, CHAN_PROTECTFRIENDS, CHAN_PROTECTHALFOPS, CHAN_PROTECTOPS, CHAN_REVENGE, CHAN_REVENGEBOT, CHAN_SECRET, CHAN_SEEN, CHAN_SHARED, CHAN_STATIC, channel_static, dcc, udef_struct::defined, chanset_t::dname, dprintf, egg_snprintf, chanset_t::exempt_time, findchan_by_dname, userrec::flags, chanset_t::flood_ctcp_thr, chanset_t::flood_ctcp_time, chanset_t::flood_deop_thr, chanset_t::flood_deop_time, chanset_t::flood_join_thr, chanset_t::flood_join_time, chanset_t::flood_kick_thr, chanset_t::flood_kick_time, chanset_t::flood_nick_thr, chanset_t::flood_nick_time, chanset_t::flood_pub_thr, chanset_t::flood_pub_time, get_mode_protect(), get_user_flagrec, getudef(), glob_master, chanset_t::idle_kick, chanset_t::invite_time, chanset_t::ircnet_status, LOG_CMDS, udef_struct::name, chanset_t::need_invite, chanset_t::need_key, chanset_t::need_limit, chanset_t::need_op, chanset_t::need_unban, newsplit, udef_struct::next, putlog, chanset_t::revenge_mode, chanset_t::status, chanset_t::stopnethack_mode, udef_struct::type, udef, UDEF_FLAG, UDEF_INT, UDEF_STR, USER_OWNER, and udef_struct::values.

01266 {
01267   char *chname, work[512];
01268   struct chanset_t *chan;
01269   int ii, tmp;
01270   struct udef_struct *ul;
01271 
01272   if (!par[0]) {
01273     chname = dcc[idx].u.chat->con_chan;
01274     if (chname[0] == '*') {
01275       dprintf(idx, "Your console channel is invalid.\n");
01276       return;
01277     }
01278   } else {
01279     chname = newsplit(&par);
01280     get_user_flagrec(u, &user, chname);
01281     if (!glob_master(user) && !chan_master(user)) {
01282       dprintf(idx, "You don't have access to %s.\n", chname);
01283       return;
01284     }
01285   }
01286   if (!(chan = findchan_by_dname(chname)))
01287     dprintf(idx, "No such channel defined.\n");
01288   else {
01289     dprintf(idx, "Settings for %s channel %s:\n",
01290             channel_static(chan) ? "static" : "dynamic", chan->dname);
01291     get_mode_protect(chan, work);
01292     dprintf(idx, "Protect modes (chanmode): %s\n", work[0] ? work : "None");
01293     if (chan->idle_kick)
01294       dprintf(idx, "Idle Kick after (idle-kick): %d\n", chan->idle_kick);
01295     else
01296       dprintf(idx, "Idle Kick after (idle-kick): DON'T!\n");
01297     if (chan->stopnethack_mode)
01298       dprintf(idx, "stopnethack-mode: %d\n", chan->stopnethack_mode);
01299     else
01300       dprintf(idx, "stopnethack: DON'T!\n");
01301     dprintf(idx, "aop-delay: %d:%d\n", chan->aop_min, chan->aop_max);
01302     if (chan->revenge_mode)
01303       dprintf(idx, "revenge-mode: %d\n", chan->revenge_mode);
01304     else
01305       dprintf(idx, "revenge-mode: 0\n");
01306     dprintf(idx, "ban-type: %d\n", chan->ban_type);
01307     if (chan->ban_time)
01308       dprintf(idx, "ban-time: %d\n", chan->ban_time);
01309     else
01310       dprintf(idx, "ban-time: 0\n");
01311     if (chan->exempt_time)
01312       dprintf(idx, "exempt-time: %d\n", chan->exempt_time);
01313     else
01314       dprintf(idx, "exempt-time: 0\n");
01315     if (chan->invite_time)
01316       dprintf(idx, "invite-time: %d\n", chan->invite_time);
01317     else
01318       dprintf(idx, "invite-time: 0\n");
01319     /* Only bot owners can see/change these (they're TCL commands) */
01320     if (u->flags & USER_OWNER) {
01321       if (chan->need_op[0])
01322         dprintf(idx, "To regain op's (need-op):\n%s\n", chan->need_op);
01323       if (chan->need_invite[0])
01324         dprintf(idx, "To get invite (need-invite):\n%s\n", chan->need_invite);
01325       if (chan->need_key[0])
01326         dprintf(idx, "To get key (need-key):\n%s\n", chan->need_key);
01327       if (chan->need_unban[0])
01328         dprintf(idx, "If I'm banned (need-unban):\n%s\n", chan->need_unban);
01329       if (chan->need_limit[0])
01330         dprintf(idx, "When channel full (need-limit):\n%s\n",
01331                 chan->need_limit);
01332     }
01333     dprintf(idx, "Other modes:\n");
01334     dprintf(idx,
01335             "     %cinactive       %cstatuslog      %csecret         "
01336             "%cshared\n", (chan->status & CHAN_INACTIVE) ? '+' : '-',
01337             (chan->status & CHAN_LOGSTATUS) ? '+' : '-',
01338             (chan->status & CHAN_SECRET) ? '+' : '-',
01339             (chan->status & CHAN_SHARED) ? '+' : '-');
01340     dprintf(idx,
01341             "     %cgreet          %cseen           %ccycle          "
01342             "%cdontkickops\n", (chan->status & CHAN_GREET) ? '+' : '-',
01343             (chan->status & CHAN_SEEN) ? '+' : '-',
01344             (chan->status & CHAN_CYCLE) ? '+' : '-',
01345             (chan->status & CHAN_DONTKICKOPS) ? '+' : '-');
01346     dprintf(idx,
01347             "     %cprotectops     %cprotectfriends %crevenge        "
01348             "%crevengebot\n", (chan->status & CHAN_PROTECTOPS) ? '+' : '-',
01349             (chan->status & CHAN_PROTECTFRIENDS) ? '+' : '-',
01350             (chan->status & CHAN_REVENGE) ? '+' : '-',
01351             (chan->status & CHAN_REVENGEBOT) ? '+' : '-');
01352     dprintf(idx,
01353             "     %cbitch          %cautoop         %cautovoice      "
01354             "%cnodesynch\n", (chan->status & CHAN_BITCH) ? '+' : '-',
01355             (chan->status & CHAN_OPONJOIN) ? '+' : '-',
01356             (chan->status & CHAN_AUTOVOICE) ? '+' : '-',
01357             (chan->status & CHAN_NODESYNCH) ? '+' : '-');
01358     dprintf(idx,
01359             "     %cenforcebans    %cdynamicbans    %cuserbans       "
01360             "%cautohalfop\n", (chan->status & CHAN_ENFORCEBANS) ? '+' : '-',
01361             (chan->status & CHAN_DYNAMICBANS) ? '+' : '-',
01362             (chan->status & CHAN_NOUSERBANS) ? '-' : '+',
01363             (chan->status & CHAN_AUTOHALFOP) ? '+' : '-');
01364     dprintf(idx, "     %cprotecthalfops %cstatic\n",
01365             (chan->status & CHAN_PROTECTHALFOPS) ? '+' : '-',
01366             (chan->status & CHAN_STATIC) ? '+' : '-');
01367     dprintf(idx,
01368             "     %cdynamicexempts %cuserexempts    %cdynamicinvites "
01369             "%cuserinvites\n",
01370             (chan->ircnet_status & CHAN_DYNAMICEXEMPTS) ? '+' : '-',
01371             (chan->ircnet_status & CHAN_NOUSEREXEMPTS) ? '-' : '+',
01372             (chan->ircnet_status & CHAN_DYNAMICINVITES) ? '+' : '-',
01373             (chan->ircnet_status & CHAN_NOUSERINVITES) ? '-' : '+');
01374 
01375     ii = 1;
01376     tmp = 0;
01377     for (ul = udef; ul; ul = ul->next)
01378       if (ul->defined && ul->type == UDEF_FLAG) {
01379         int work_len;
01380 
01381         if (!tmp) {
01382           dprintf(idx, "User defined channel flags:\n");
01383           tmp = 1;
01384         }
01385         if (ii == 1)
01386           egg_snprintf(work, sizeof work, "    ");
01387         work_len = strlen(work);
01388         egg_snprintf(work + work_len, sizeof(work) - work_len, " %c%s",
01389                      getudef(ul->values, chan->dname) ? '+' : '-', ul->name);
01390         ii++;
01391         if (ii > 4) {
01392           dprintf(idx, "%s\n", work);
01393           ii = 1;
01394         }
01395       }
01396     if (ii > 1)
01397       dprintf(idx, "%s\n", work);
01398 
01399     work[0] = 0;
01400     ii = 1;
01401     tmp = 0;
01402     for (ul = udef; ul; ul = ul->next)
01403       if (ul->defined && ul->type == UDEF_INT) {
01404         int work_len = strlen(work);
01405 
01406         if (!tmp) {
01407           dprintf(idx, "User defined channel settings:\n");
01408           tmp = 1;
01409         }
01410         egg_snprintf(work + work_len, sizeof(work) - work_len, "%s: %d   ",
01411                      ul->name, getudef(ul->values, chan->dname));
01412         ii++;
01413         if (ii > 4) {
01414           dprintf(idx, "%s\n", work);
01415           work[0] = 0;
01416           ii = 1;
01417         }
01418       }
01419     if (ii > 1)
01420       dprintf(idx, "%s\n", work);
01421 
01422     if (u->flags & USER_OWNER) {
01423       tmp = 0;
01424 
01425       for (ul = udef; ul; ul = ul->next) {
01426         if (ul->defined && ul->type == UDEF_STR) {
01427           char *p = (char *) getudef(ul->values, chan->dname);
01428 
01429           if (!p)
01430             p = "{}";
01431 
01432           if (!tmp) {
01433             dprintf(idx, "User defined channel strings:\n");
01434             tmp = 1;
01435           }
01436           dprintf(idx, "%s: %s\n", ul->name, p);
01437         }
01438       }
01439     }
01440 
01441 
01442     dprintf(idx, "flood settings: chan ctcp join kick deop nick\n");
01443     dprintf(idx, "number:          %3d  %3d  %3d  %3d  %3d  %3d\n",
01444             chan->flood_pub_thr, chan->flood_ctcp_thr,
01445             chan->flood_join_thr, chan->flood_kick_thr,
01446             chan->flood_deop_thr, chan->flood_nick_thr);
01447     dprintf(idx, "time  :          %3d  %3d  %3d  %3d  %3d  %3d\n",
01448             chan->flood_pub_time, chan->flood_ctcp_time,
01449             chan->flood_join_time, chan->flood_kick_time,
01450             chan->flood_deop_time, chan->flood_nick_time);
01451     putlog(LOG_CMDS, "*", "#%s# chaninfo %s", dcc[idx].nick, chname);
01452   }
01453 }

Here is the call graph for this function:

static void cmd_chanload ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1588 of file cmdschan.c.

References chanfile, dcc, dprintf, LOG_CMDS, putlog, and read_channels().

01589 {
01590   if (!chanfile[0])
01591     dprintf(idx, "No channel saving file defined.\n");
01592   else {
01593     dprintf(idx, "Reloading all dynamic channel settings.\n");
01594     putlog(LOG_CMDS, "*", "#%s# chanload", dcc[idx].nick);
01595     read_channels(1, 1);
01596   }
01597 }

Here is the call graph for this function:

static void cmd_chansave ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1577 of file cmdschan.c.

References chanfile, dcc, dprintf, LOG_CMDS, putlog, and write_channels().

01578 {
01579   if (!chanfile[0])
01580     dprintf(idx, "No channel saving file defined.\n");
01581   else {
01582     dprintf(idx, "Saving all dynamic channel settings.\n");
01583     putlog(LOG_CMDS, "*", "#%s# chansave", dcc[idx].nick);
01584     write_channels();
01585   }
01586 }

Here is the call graph for this function:

static void cmd_chanset ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1455 of file cmdschan.c.

References chan_master, CHANMETA, chanset, dcc, chanset_t::dname, dprintf, findchan_by_dname, userrec::flags, get_user_flagrec, glob_master, isowner, LOG_CMDS, must_be_owner, newsplit, chanset_t::next, nfree, nmalloc, NULL, putlog, tcl_channel_modify(), and USER_OWNER.

01456 {
01457   char *chname = NULL, answers[512], *parcpy;
01458   char *list[2], *bak, *buf;
01459   struct chanset_t *chan = NULL;
01460   int all = 0;
01461 
01462   if (!par[0])
01463     dprintf(idx, "Usage: chanset [%schannel] <settings>\n", CHANMETA);
01464   else {
01465     if (strlen(par) > 2 && par[0] == '*' && par[1] == ' ') {
01466       all = 1;
01467       get_user_flagrec(u, &user, chanset ? chanset->dname : "");
01468       if (!glob_master(user)) {
01469         dprintf(idx, "You need to be a global master to use .chanset *.\n");
01470         return;
01471       }
01472       newsplit(&par);
01473     } else {
01474       if (strchr(CHANMETA, par[0])) {
01475         chname = newsplit(&par);
01476         get_user_flagrec(u, &user, chname);
01477         if (!glob_master(user) && !chan_master(user)) {
01478           dprintf(idx, "You don't have access to %s. \n", chname);
01479           return;
01480         } else if (!(chan = findchan_by_dname(chname)) && (chname[0] != '+')) {
01481           dprintf(idx, "That channel doesn't exist!\n");
01482           return;
01483         }
01484         if (!chan) {
01485           if (par[0])
01486             *--par = ' ';
01487           par = chname;
01488         }
01489       }
01490       if (!par[0] || par[0] == '*') {
01491         dprintf(idx, "Usage: chanset [%schannel] <settings>\n", CHANMETA);
01492         return;
01493       }
01494       if (!chan &&
01495           !(chan = findchan_by_dname(chname = dcc[idx].u.chat->con_chan))) {
01496         dprintf(idx, "Invalid console channel.\n");
01497         return;
01498       }
01499     }
01500     if (all)
01501       chan = chanset;
01502     bak = par;
01503     buf = nmalloc(strlen(par) + 1);
01504     while (chan) {
01505       chname = chan->dname;
01506       strcpy(buf, bak);
01507       par = buf;
01508       list[0] = newsplit(&par);
01509       answers[0] = 0;
01510       while (list[0][0]) {
01511         if (list[0][0] == '+' || list[0][0] == '-' ||
01512             (!strcmp(list[0], "dont-idle-kick"))) {
01513             if (!strcmp(list[0] + 1, "static") && must_be_owner &&
01514                 !(isowner(dcc[idx].nick))) {
01515               dprintf(idx, "Only permanent owners can modify the static flag.\n");
01516               nfree(buf);
01517               return;
01518             }
01519           if (tcl_channel_modify(0, chan, 1, list) == TCL_OK) {
01520             strcat(answers, list[0]);
01521             strcat(answers, " ");
01522           } else if (!all || !chan->next)
01523             dprintf(idx, "Error trying to set %s for %s, invalid mode.\n",
01524                     list[0], all ? "all channels" : chname);
01525           list[0] = newsplit(&par);
01526           continue;
01527         }
01528         /* The rest have an unknown amount of args, so assume the rest of the
01529          * line is args. Woops nearly made a nasty little hole here :) we'll
01530          * just ignore any non global +n's trying to set the need-commands.
01531          */
01532         if (strncmp(list[0], "need-", 5) || (u->flags & USER_OWNER)) {
01533           if (!strncmp(list[0], "need-", 5) && !(isowner(dcc[idx].nick)) &&
01534               must_be_owner) {
01535             dprintf(idx, "Due to security concerns, only permanent owners can set these modes.\n");
01536             nfree(buf);
01537             return;
01538           }
01539           list[1] = par;
01540           /* Par gets modified in tcl_channel_modify under some
01541            * circumstances, so save it now.
01542            */
01543           parcpy = nmalloc(strlen(par) + 1);
01544           strcpy(parcpy, par);
01545           if (tcl_channel_modify(0, chan, 2, list) == TCL_OK) {
01546             strcat(answers, list[0]);
01547             strcat(answers, " { ");
01548             strcat(answers, parcpy);
01549             strcat(answers, " }");
01550           } else if (!all || !chan->next)
01551             dprintf(idx, "Error trying to set %s for %s, invalid option\n",
01552                     list[0], all ? "all channels" : chname);
01553           nfree(parcpy);
01554         }
01555         break;
01556       }
01557       if (!all && answers[0]) {
01558         dprintf(idx, "Successfully set modes { %s } on %s.\n", answers,
01559                 chname);
01560         putlog(LOG_CMDS, "*", "#%s# chanset %s %s", dcc[idx].nick, chname,
01561                answers);
01562       }
01563       if (!all)
01564         chan = NULL;
01565       else
01566         chan = chan->next;
01567     }
01568     if (all && answers[0]) {
01569       dprintf(idx, "Successfully set modes { %s } on all channels.\n",
01570               answers);
01571       putlog(LOG_CMDS, "*", "#%s# chanset * %s", dcc[idx].nick, answers);
01572     }
01573     nfree(buf);
01574   }
01575 }

Here is the call graph for this function:

static void cmd_chinfo ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 867 of file cmdschan.c.

References chan_owner, CHANMETA, dcc, dprintf, egg_strcasecmp, findchan_by_dname, userrec::flags, get_user_by_handle, get_user_flagrec, glob_owner, LOG_CMDS, newsplit, NULL, putlog, set_handle_chaninfo(), set_user, use_info, USER_BOT, USER_MASTER, USER_OWNER, USERENTRY_INFO, and userlist.

00868 {
00869   char *handle, *chname;
00870   struct userrec *u1;
00871 
00872   if (!use_info) {
00873     dprintf(idx, "Info storage is turned off.\n");
00874     return;
00875   }
00876   handle = newsplit(&par);
00877   if (!handle[0]) {
00878     dprintf(idx, "Usage: chinfo <handle> [channel] <new-info>\n");
00879     return;
00880   }
00881   u1 = get_user_by_handle(userlist, handle);
00882   if (!u1) {
00883     dprintf(idx, "No such user.\n");
00884     return;
00885   }
00886   if (par[0] && strchr(CHANMETA, par[0])) {
00887     chname = newsplit(&par);
00888     if (!findchan_by_dname(chname)) {
00889       dprintf(idx, "No such channel.\n");
00890       return;
00891     }
00892   } else
00893     chname = 0;
00894   if ((u1->flags & USER_BOT) && !(u->flags & USER_MASTER)) {
00895     dprintf(idx, "You have to be master to change bots info.\n");
00896     return;
00897   }
00898   if ((u1->flags & USER_OWNER) && !(u->flags & USER_OWNER)) {
00899     dprintf(idx, "You can't change info for the bot owner.\n");
00900     return;
00901   }
00902   if (chname) {
00903     get_user_flagrec(u, &user, chname);
00904     get_user_flagrec(u1, &victim, chname);
00905     if ((chan_owner(victim) || glob_owner(victim)) &&
00906         !(glob_owner(user) || chan_owner(user))) {
00907       dprintf(idx, "You can't change info for the channel owner.\n");
00908       return;
00909     }
00910   }
00911   putlog(LOG_CMDS, "*", "#%s# chinfo %s %s %s", dcc[idx].nick, handle,
00912          chname ? chname : par, chname ? par : "");
00913   if (!egg_strcasecmp(par, "none"))
00914     par[0] = 0;
00915   if (chname) {
00916     set_handle_chaninfo(userlist, handle, chname, par);
00917     if (par[0] == '@')
00918       dprintf(idx, "New info (LOCKED) for %s on %s: %s\n", handle, chname,
00919               &par[1]);
00920     else if (par[0])
00921       dprintf(idx, "New info for %s on %s: %s\n", handle, chname, par);
00922     else
00923       dprintf(idx, "Wiped info for %s on %s\n", handle, chname);
00924   } else {
00925     set_user(&USERENTRY_INFO, u1, par[0] ? par : NULL);
00926     if (par[0] == '@')
00927       dprintf(idx, "New default info (LOCKED) for %s: %s\n", handle, &par[1]);
00928     else if (par[0])
00929       dprintf(idx, "New default info for %s: %s\n", handle, par);
00930     else
00931       dprintf(idx, "Wiped default info for %s\n", handle);
00932   }
00933 }

Here is the call graph for this function:

static void cmd_exempts ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 767 of file cmdschan.c.

References dcc, dprintf, egg_strcasecmp, LOG_CMDS, putlog, tell_exempts(), and use_exempts.

00768 {
00769   if (!use_exempts) {
00770     dprintf(idx, "This command can only be used with use-exempts enabled.\n");
00771     return;
00772   }
00773   if (!egg_strcasecmp(par, "all")) {
00774     putlog(LOG_CMDS, "*", "#%s# exempts all", dcc[idx].nick);
00775     tell_exempts(idx, 1, "");
00776   } else {
00777     putlog(LOG_CMDS, "*", "#%s# exempts %s", dcc[idx].nick, par);
00778     tell_exempts(idx, 0, par);
00779   }
00780 }

Here is the call graph for this function:

static void cmd_info ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 797 of file cmdschan.c.

References CHANMETA, dcc, dprintf, egg_strcasecmp, findchan_by_dname, userrec::flags, get_handle_chaninfo(), get_user, LOG_CMDS, newsplit, NULL, putlog, set_handle_chaninfo(), set_user, use_info, USER_MASTER, USERENTRY_INFO, and userlist.

00798 {
00799   char s[512], *chname, *s1;
00800   int locked = 0;
00801 
00802   if (!use_info) {
00803     dprintf(idx, "Info storage is turned off.\n");
00804     return;
00805   }
00806   s1 = get_user(&USERENTRY_INFO, u);
00807   if (s1 && s1[0] == '@')
00808     locked = 1;
00809   if (par[0] && strchr(CHANMETA, par[0])) {
00810     chname = newsplit(&par);
00811     if (!findchan_by_dname(chname)) {
00812       dprintf(idx, "No such channel.\n");
00813       return;
00814     }
00815     get_handle_chaninfo(dcc[idx].nick, chname, s);
00816     if (s[0] == '@')
00817       locked = 1;
00818     s1 = s;
00819   } else
00820     chname = 0;
00821   if (!par[0]) {
00822     if (s1 && s1[0] == '@')
00823       s1++;
00824     if (s1 && s1[0]) {
00825       if (chname) {
00826         dprintf(idx, "Info on %s: %s\n", chname, s1);
00827         dprintf(idx, "Use '.info %s none' to remove it.\n", chname);
00828       } else {
00829         dprintf(idx, "Default info: %s\n", s1);
00830         dprintf(idx, "Use '.info none' to remove it.\n");
00831       }
00832     } else
00833       dprintf(idx, "No info has been set for you.\n");
00834     putlog(LOG_CMDS, "*", "#%s# info %s", dcc[idx].nick, chname ? chname : "");
00835     return;
00836   }
00837   if (locked && !(u && (u->flags & USER_MASTER))) {
00838     dprintf(idx, "Your info line is locked.  Sorry.\n");
00839     return;
00840   }
00841   if (!egg_strcasecmp(par, "none")) {
00842     if (chname) {
00843       par[0] = 0;
00844       set_handle_chaninfo(userlist, dcc[idx].nick, chname, NULL);
00845       dprintf(idx, "Removed your info line on %s.\n", chname);
00846       putlog(LOG_CMDS, "*", "#%s# info %s none", dcc[idx].nick, chname);
00847     } else {
00848       set_user(&USERENTRY_INFO, u, NULL);
00849       dprintf(idx, "Removed your default info line.\n");
00850       putlog(LOG_CMDS, "*", "#%s# info none", dcc[idx].nick);
00851     }
00852     return;
00853   }
00854 /*  if (par[0] == '@')    This is stupid, and prevents a users info from being locked */
00855 /*    par++;              without .tcl, or a tcl script, aka, 'half-assed' -poptix 4Jun01 */
00856   if (chname) {
00857     set_handle_chaninfo(userlist, dcc[idx].nick, chname, par);
00858     dprintf(idx, "Your info on %s is now: %s\n", chname, par);
00859     putlog(LOG_CMDS, "*", "#%s# info %s ...", dcc[idx].nick, chname);
00860   } else {
00861     set_user(&USERENTRY_INFO, u, par);
00862     dprintf(idx, "Your default info is now: %s\n", par);
00863     putlog(LOG_CMDS, "*", "#%s# info ...", dcc[idx].nick);
00864   }
00865 }

Here is the call graph for this function:

static void cmd_invites ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 782 of file cmdschan.c.

References dcc, dprintf, egg_strcasecmp, LOG_CMDS, putlog, tell_invites(), and use_invites.

00783 {
00784   if (!use_invites) {
00785     dprintf(idx, "This command can only be used with use-invites enabled.\n");
00786     return;
00787   }
00788   if (!egg_strcasecmp(par, "all")) {
00789     putlog(LOG_CMDS, "*", "#%s# invites all", dcc[idx].nick);
00790     tell_invites(idx, 1, "");
00791   } else {
00792     putlog(LOG_CMDS, "*", "#%s# invites %s", dcc[idx].nick, par);
00793     tell_invites(idx, 0, par);
00794   }
00795 }

Here is the call graph for this function:

static void cmd_mns_ban ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 422 of file cmdschan.c.

References add_mode, chan_t::ban, chanset_t::bans, chan_dehalfop, chan_deop, chan_halfop, chan_op, CHANMETA, chanset_t::channel, chanset, dcc, chanset_t::dname, dprintf, egg_snprintf, findchan_by_dname, userrec::flags, get_user_flagrec, glob_halfop, glob_op, global_bans, IRC_REMOVEDBAN, lastdeletedmask, LOG_CMDS, maskstruct::mask, newsplit, maskstruct::next, chanset_t::next, NULL, putlog, rfc_casecmp, str_isdigit, strncpyz, u_delban(), u_equals_mask(), UHOSTLEN, and USER_OP.

00423 {
00424   int console = 0, i = 0, j;
00425   struct chanset_t *chan = NULL;
00426   char s[UHOSTLEN], *ban, *chname, *mask;
00427   masklist *b;
00428 
00429   if (!par[0]) {
00430     dprintf(idx, "Usage: -ban <hostmask|ban #> [channel]\n");
00431     return;
00432   }
00433   ban = newsplit(&par);
00434   if (par[0] && strchr(CHANMETA, par[0]))
00435     chname = newsplit(&par);
00436   else {
00437     chname = dcc[idx].u.chat->con_chan;
00438     console = 1;
00439   }
00440   if (chname || !(u->flags & USER_OP)) {
00441     if (!chname)
00442       chname = dcc[idx].u.chat->con_chan;
00443     get_user_flagrec(u, &user, chname);
00444 
00445     if ((!chan_op(user) && (!glob_op(user) || chan_deop(user))) &&
00446         (!chan_halfop(user) && (!glob_halfop(user) || chan_dehalfop(user)))) {
00447       dprintf(idx, "You don't have access to remove bans on %s.\n", chname);
00448       return;
00449     }
00450   }
00451   strncpyz(s, ban, sizeof s);
00452   if (console) {
00453     i = u_delban(NULL, s, (u->flags & USER_OP));
00454     if (i > 0) {
00455       if (lastdeletedmask)
00456         mask = lastdeletedmask;
00457       else
00458         mask = s;
00459       putlog(LOG_CMDS, "*", "#%s# -ban %s", dcc[idx].nick, mask);
00460       dprintf(idx, "%s: %s\n", IRC_REMOVEDBAN, mask);
00461       for (chan = chanset; chan != NULL; chan = chan->next)
00462         add_mode(chan, '-', 'b', mask);
00463       return;
00464     }
00465   }
00466   /* Channel-specific ban? */
00467   if (chname)
00468     chan = findchan_by_dname(chname);
00469   if (!chan) {
00470     dprintf(idx, "Invalid channel.\n");
00471     return;
00472   }
00473   if (str_isdigit(ban)) {
00474     i = atoi(ban);
00475     /* substract the numer of global bans to get the number of the channel ban */
00476     egg_snprintf(s, sizeof s, "%d", i);
00477     j = u_delban(0, s, 0);
00478     if (j < 0) {
00479       egg_snprintf(s, sizeof s, "%d", -j);
00480       j = u_delban(chan, s, 1);
00481       if (j > 0) {
00482         if (lastdeletedmask)
00483           mask = lastdeletedmask;
00484         else
00485           mask = s;
00486         putlog(LOG_CMDS, "*", "#%s# (%s) -ban %s", dcc[idx].nick, chan->dname,
00487                mask);
00488         dprintf(idx, "Removed %s channel ban: %s\n", chan->dname, mask);
00489         add_mode(chan, '-', 'b', mask);
00490         return;
00491       }
00492     }
00493     i = 0;
00494     for (b = chan->channel.ban; b && b->mask && b->mask[0]; b = b->next) {
00495       if ((!u_equals_mask(global_bans, b->mask)) &&
00496           (!u_equals_mask(chan->bans, b->mask))) {
00497         i++;
00498         if (i == -j) {
00499           add_mode(chan, '-', 'b', b->mask);
00500           dprintf(idx, "%s '%s' on %s.\n", IRC_REMOVEDBAN,
00501                   b->mask, chan->dname);
00502           putlog(LOG_CMDS, "*", "#%s# (%s) -ban %s [on channel]",
00503                  dcc[idx].nick, dcc[idx].u.chat->con_chan, ban);
00504           return;
00505         }
00506       }
00507     }
00508   } else {
00509     j = u_delban(chan, ban, 1);
00510     if (j > 0) {
00511       putlog(LOG_CMDS, "*", "#%s# (%s) -ban %s", dcc[idx].nick,
00512              dcc[idx].u.chat->con_chan, ban);
00513       dprintf(idx, "Removed %s channel ban: %s\n", chname, ban);
00514       add_mode(chan, '-', 'b', ban);
00515       return;
00516     }
00517     for (b = chan->channel.ban; b && b->mask && b->mask[0]; b = b->next) {
00518       if (!rfc_casecmp(b->mask, ban)) {
00519         add_mode(chan, '-', 'b', b->mask);
00520         dprintf(idx, "%s '%s' on %s.\n", IRC_REMOVEDBAN, b->mask, chan->dname);
00521         putlog(LOG_CMDS, "*", "#%s# (%s) -ban %s [on channel]",
00522                dcc[idx].nick, dcc[idx].u.chat->con_chan, ban);
00523         return;
00524       }
00525     }
00526   }
00527   dprintf(idx, "No such ban.\n");
00528 }

Here is the call graph for this function:

static void cmd_mns_chan ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1226 of file cmdschan.c.

References CHANMETA, channel_static, dcc, dcc_total, DCT_CHAT, chanset_t::dname, dprintf, findchan, findchan_by_dname, LOG_CMDS, newsplit, putlog, remove_channel(), rfc_casecmp, and chanset_t::type.

01227 {
01228   char *chname;
01229   struct chanset_t *chan;
01230   int i;
01231 
01232   if (!par[0]) {
01233     dprintf(idx, "Usage: -chan [%s]<channel>\n", CHANMETA);
01234     return;
01235   }
01236   chname = newsplit(&par);
01237   chan = findchan_by_dname(chname);
01238   if (!chan) {
01239     if ((chan = findchan(chname)))
01240       dprintf(idx, "That channel exists with a short name of %s, use that.\n",
01241               chan->dname);
01242     else
01243       dprintf(idx, "That channel doesn't exist!\n");
01244     return;
01245   }
01246   if (channel_static(chan)) {
01247     dprintf(idx, "Cannot remove %s, it is a static channel!\n", chname);
01248     return;
01249   }
01250 
01251   for (i = 0; i < dcc_total; i++)
01252     if ((dcc[i].type->flags & DCT_CHAT) &&
01253         !rfc_casecmp(dcc[i].u.chat->con_chan, chan->dname)) {
01254       dprintf(i, "%s is no longer a valid channel, changing your console "
01255               "to '*'\n", chname);
01256       strcpy(dcc[i].u.chat->con_chan, "*");
01257     }
01258   remove_channel(chan);
01259   dprintf(idx, "Channel %s removed from the bot.\n", chname);
01260   dprintf(idx, "This includes any channel specific bans, invites, exemptions "
01261           "and user records that you set.\n");
01262   putlog(LOG_CMDS, "*", "#%s# -chan %s", dcc[idx].nick, chname);
01263 }

Here is the call graph for this function:

static void cmd_mns_chrec ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1128 of file cmdschan.c.

References chan_master, chan_owner, dcc, del_chanrec(), chanset_t::dname, dprintf, findchan_by_dname, get_chanrec(), get_user_by_handle, get_user_flagrec, glob_master, glob_owner, LOG_CMDS, newsplit, NULL, putlog, and userlist.

01129 {
01130   char *nick, *chn = NULL;
01131   struct userrec *u1;
01132   struct chanuserrec *chanrec;
01133 
01134   if (!par[0]) {
01135     dprintf(idx, "Usage: -chrec <user> [channel]\n");
01136     return;
01137   }
01138   nick = newsplit(&par);
01139   u1 = get_user_by_handle(userlist, nick);
01140   if (!u1) {
01141     dprintf(idx, "No such user.\n");
01142     return;
01143   }
01144   if (!par[0]) {
01145     struct chanset_t *chan;
01146 
01147     chan = findchan_by_dname(dcc[idx].u.chat->con_chan);
01148     if (chan)
01149       chn = chan->dname;
01150     else {
01151       dprintf(idx, "Invalid console channel.\n");
01152       return;
01153     }
01154   } else
01155     chn = newsplit(&par);
01156   get_user_flagrec(u, &user, chn);
01157   get_user_flagrec(u1, &victim, chn);
01158   if ((!glob_master(user) && !chan_master(user)) ||     /* drummer */
01159       (chan_owner(victim) && !chan_owner(user) && !glob_owner(user)) ||
01160       (glob_owner(victim) && !glob_owner(user))) {
01161     dprintf(idx, "You have no permission to do that.\n");
01162     return;
01163   }
01164   chanrec = get_chanrec(u1, chn);
01165   if (!chanrec) {
01166     dprintf(idx, "User %s doesn't have a channel record for %s.\n", nick, chn);
01167     return;
01168   }
01169   putlog(LOG_CMDS, "*", "#%s# -chrec %s %s", dcc[idx].nick, nick, chn);
01170   del_chanrec(u1, chn);
01171   dprintf(idx, "Removed %s channel record from %s.\n", chn, nick);
01172 }

Here is the call graph for this function:

static void cmd_mns_exempt ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 530 of file cmdschan.c.

References add_mode, chan_dehalfop, chan_deop, chan_halfop, chan_op, CHANMETA, chanset_t::channel, chanset, dcc, chanset_t::dname, dprintf, e, egg_snprintf, chan_t::exempt, chanset_t::exempts, findchan_by_dname, userrec::flags, get_user_flagrec, glob_halfop, glob_op, global_exempts, IRC_REMOVEDEXEMPT, lastdeletedmask, LOG_CMDS, maskstruct::mask, newsplit, maskstruct::next, chanset_t::next, NULL, putlog, rfc_casecmp, str_isdigit, strncpyz, u_delexempt(), u_equals_mask(), UHOSTLEN, use_exempts, and USER_OP.

00531 {
00532   int console = 0, i = 0, j;
00533   struct chanset_t *chan = NULL;
00534   char s[UHOSTLEN], *exempt, *chname, *mask;
00535   masklist *e;
00536 
00537   if (!use_exempts) {
00538     dprintf(idx, "This command can only be used with use-exempts enabled.\n");
00539     return;
00540   }
00541   if (!par[0]) {
00542     dprintf(idx, "Usage: -exempt <hostmask|exempt #> [channel]\n");
00543     return;
00544   }
00545   exempt = newsplit(&par);
00546   if (par[0] && strchr(CHANMETA, par[0]))
00547     chname = newsplit(&par);
00548   else {
00549     chname = dcc[idx].u.chat->con_chan;
00550     console = 1;
00551   }
00552   if (chname || !(u->flags & USER_OP)) {
00553     if (!chname)
00554       chname = dcc[idx].u.chat->con_chan;
00555     get_user_flagrec(u, &user, chname);
00556     if ((!chan_op(user) && (!glob_op(user) || chan_deop(user))) &&
00557         (!chan_halfop(user) && (!glob_halfop(user) || chan_dehalfop(user)))) {
00558       dprintf(idx, "You don't have access to remove exempts on %s.\n", chname);
00559       return;
00560     }
00561   }
00562   strncpyz(s, exempt, sizeof s);
00563   if (console) {
00564     i = u_delexempt(NULL, s, (u->flags & USER_OP));
00565     if (i > 0) {
00566       if (lastdeletedmask)
00567         mask = lastdeletedmask;
00568       else
00569         mask = s;
00570       putlog(LOG_CMDS, "*", "#%s# -exempt %s", dcc[idx].nick, mask);
00571       dprintf(idx, "%s: %s\n", IRC_REMOVEDEXEMPT, mask);
00572       for (chan = chanset; chan != NULL; chan = chan->next)
00573         add_mode(chan, '-', 'e', mask);
00574       return;
00575     }
00576   }
00577   /* Channel-specific exempt? */
00578   if (chname)
00579     chan = findchan_by_dname(chname);
00580   if (!chan) {
00581     dprintf(idx, "Invalid channel.\n");
00582     return;
00583   }
00584   if (str_isdigit(exempt)) {
00585     i = atoi(exempt);
00586     /* substract the numer of global exempts to get the number of the channel exempt */
00587     egg_snprintf(s, sizeof s, "%d", i);
00588     j = u_delexempt(0, s, 0);
00589     if (j < 0) {
00590       egg_snprintf(s, sizeof s, "%d", -j);
00591       j = u_delexempt(chan, s, 1);
00592       if (j > 0) {
00593         if (lastdeletedmask)
00594           mask = lastdeletedmask;
00595         else
00596           mask = s;
00597         putlog(LOG_CMDS, "*", "#%s# (%s) -exempt %s", dcc[idx].nick,
00598                chan->dname, mask);
00599         dprintf(idx, "Removed %s channel exempt: %s\n", chan->dname, mask);
00600         add_mode(chan, '-', 'e', mask);
00601         return;
00602       }
00603     }
00604     i = 0;
00605     for (e = chan->channel.exempt; e && e->mask && e->mask[0]; e = e->next) {
00606       if (!u_equals_mask(global_exempts, e->mask) &&
00607           !u_equals_mask(chan->exempts, e->mask)) {
00608         i++;
00609         if (i == -j) {
00610           add_mode(chan, '-', 'e', e->mask);
00611           dprintf(idx, "%s '%s' on %s.\n", IRC_REMOVEDEXEMPT,
00612                   e->mask, chan->dname);
00613           putlog(LOG_CMDS, "*", "#%s# (%s) -exempt %s [on channel]",
00614                  dcc[idx].nick, dcc[idx].u.chat->con_chan, exempt);
00615           return;
00616         }
00617       }
00618     }
00619   } else {
00620     j = u_delexempt(chan, exempt, 1);
00621     if (j > 0) {
00622       putlog(LOG_CMDS, "*", "#%s# (%s) -exempt %s", dcc[idx].nick,
00623              dcc[idx].u.chat->con_chan, exempt);
00624       dprintf(idx, "Removed %s channel exempt: %s\n", chname, exempt);
00625       add_mode(chan, '-', 'e', exempt);
00626       return;
00627     }
00628     for (e = chan->channel.exempt; e && e->mask && e->mask[0]; e = e->next) {
00629       if (!rfc_casecmp(e->mask, exempt)) {
00630         add_mode(chan, '-', 'e', e->mask);
00631         dprintf(idx, "%s '%s' on %s.\n",
00632                 IRC_REMOVEDEXEMPT, e->mask, chan->dname);
00633         putlog(LOG_CMDS, "*", "#%s# (%s) -exempt %s [on channel]",
00634                dcc[idx].nick, dcc[idx].u.chat->con_chan, exempt);
00635         return;
00636       }
00637     }
00638   }
00639   dprintf(idx, "No such exemption.\n");
00640 }

Here is the call graph for this function:

static void cmd_mns_invite ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 642 of file cmdschan.c.

References add_mode, chan_dehalfop, chan_deop, chan_halfop, chan_op, CHANMETA, chanset_t::channel, chanset, dcc, chanset_t::dname, dprintf, egg_snprintf, findchan_by_dname, userrec::flags, get_user_flagrec, glob_halfop, glob_op, global_invites, chan_t::invite, chanset_t::invites, IRC_REMOVEDINVITE, lastdeletedmask, LOG_CMDS, maskstruct::mask, newsplit, maskstruct::next, chanset_t::next, NULL, putlog, rfc_casecmp, str_isdigit, strncpyz, u_delinvite(), u_equals_mask(), UHOSTLEN, use_invites, and USER_OP.

00643 {
00644   int console = 0, i = 0, j;
00645   struct chanset_t *chan = NULL;
00646   char s[UHOSTLEN], *invite, *chname, *mask;
00647   masklist *inv;
00648 
00649   if (!use_invites) {
00650     dprintf(idx, "This command can only be used with use-invites enabled.\n");
00651     return;
00652   }
00653   if (!par[0]) {
00654     dprintf(idx, "Usage: -invite <hostmask|invite #> [channel]\n");
00655     return;
00656   }
00657   invite = newsplit(&par);
00658   if (par[0] && strchr(CHANMETA, par[0]))
00659     chname = newsplit(&par);
00660   else {
00661     chname = dcc[idx].u.chat->con_chan;
00662     console = 1;
00663   }
00664   if (chname || !(u->flags & USER_OP)) {
00665     if (!chname)
00666       chname = dcc[idx].u.chat->con_chan;
00667     get_user_flagrec(u, &user, chname);
00668     if ((!chan_op(user) && (!glob_op(user) || chan_deop(user))) &&
00669         (!chan_halfop(user) && (!glob_halfop(user) || chan_dehalfop(user)))) {
00670       dprintf(idx, "You don't have access to remove invites on %s.\n", chname);
00671       return;
00672     }
00673   }
00674   strncpyz(s, invite, sizeof s);
00675   if (console) {
00676     i = u_delinvite(NULL, s, (u->flags & USER_OP));
00677     if (i > 0) {
00678       if (lastdeletedmask)
00679         mask = lastdeletedmask;
00680       else
00681         mask = s;
00682       putlog(LOG_CMDS, "*", "#%s# -invite %s", dcc[idx].nick, mask);
00683       dprintf(idx, "%s: %s\n", IRC_REMOVEDINVITE, mask);
00684       for (chan = chanset; chan != NULL; chan = chan->next)
00685         add_mode(chan, '-', 'I', mask);
00686       return;
00687     }
00688   }
00689   /* Channel-specific invite? */
00690   if (chname)
00691     chan = findchan_by_dname(chname);
00692   if (!chan) {
00693     dprintf(idx, "Invalid channel.\n");
00694     return;
00695   }
00696   if (str_isdigit(invite)) {
00697     i = atoi(invite);
00698     /* substract the numer of global invites to get the number of the channel invite */
00699     egg_snprintf(s, sizeof s, "%d", i);
00700     j = u_delinvite(0, s, 0);
00701     if (j < 0) {
00702       egg_snprintf(s, sizeof s, "%d", -j);
00703       j = u_delinvite(chan, s, 1);
00704       if (j > 0) {
00705         if (lastdeletedmask)
00706           mask = lastdeletedmask;
00707         else
00708           mask = s;
00709         putlog(LOG_CMDS, "*", "#%s# (%s) -invite %s", dcc[idx].nick,
00710                chan->dname, mask);
00711         dprintf(idx, "Removed %s channel invite: %s\n", chan->dname, mask);
00712         add_mode(chan, '-', 'I', mask);
00713         return;
00714       }
00715     }
00716     i = 0;
00717     for (inv = chan->channel.invite; inv && inv->mask && inv->mask[0];
00718          inv = inv->next) {
00719       if (!u_equals_mask(global_invites, inv->mask) &&
00720           !u_equals_mask(chan->invites, inv->mask)) {
00721         i++;
00722         if (i == -j) {
00723           add_mode(chan, '-', 'I', inv->mask);
00724           dprintf(idx, "%s '%s' on %s.\n", IRC_REMOVEDINVITE,
00725                   inv->mask, chan->dname);
00726           putlog(LOG_CMDS, "*", "#%s# (%s) -invite %s [on channel]",
00727                  dcc[idx].nick, dcc[idx].u.chat->con_chan, invite);
00728           return;
00729         }
00730       }
00731     }
00732   } else {
00733     j = u_delinvite(chan, invite, 1);
00734     if (j > 0) {
00735       putlog(LOG_CMDS, "*", "#%s# (%s) -invite %s", dcc[idx].nick,
00736              dcc[idx].u.chat->con_chan, invite);
00737       dprintf(idx, "Removed %s channel invite: %s\n", chname, invite);
00738       add_mode(chan, '-', 'I', invite);
00739       return;
00740     }
00741     for (inv = chan->channel.invite; inv && inv->mask && inv->mask[0];
00742          inv = inv->next) {
00743       if (!rfc_casecmp(inv->mask, invite)) {
00744         add_mode(chan, '-', 'I', inv->mask);
00745         dprintf(idx, "%s '%s' on %s.\n",
00746                 IRC_REMOVEDINVITE, inv->mask, chan->dname);
00747         putlog(LOG_CMDS, "*", "#%s# (%s) -invite %s [on channel]",
00748                dcc[idx].nick, dcc[idx].u.chat->con_chan, invite);
00749         return;
00750       }
00751     }
00752   }
00753   dprintf(idx, "No such invite.\n");
00754 }

Here is the call graph for this function:

static void cmd_pls_ban ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 32 of file cmdschan.c.

References botuser, chan_dehalfop, chan_deop, chan_halfop, chan_op, CHANMETA, chanset, dcc, chanset_t::dname, dprintf, egg_snprintf, findchan_by_dname, userrec::flags, _module_entry::funcs, get_user_flagrec, glob_halfop, glob_op, hostname, IRC_CHECK_THIS_BAN, LOG_CMDS, MASKREASON_MAX, match_addr, module_find, newsplit, chanset_t::next, now, NULL, origbotname, putlog, SERVER_BOTNAME, SERVER_BOTUSERHOST, strncpyz, u_addban(), UHOSTLEN, UHOSTMAX, and USER_OP.

00033 {
00034   char *chname, *who, s[UHOSTLEN], s1[UHOSTLEN], *p, *p_expire;
00035   unsigned long int expire_time = 0, expire_foo;
00036   int sticky = 0;
00037   struct chanset_t *chan = NULL;
00038   module_entry *me;
00039 
00040   if (!par[0]) {
00041     dprintf(idx, "Usage: +ban <hostmask> [channel] [%%<XdXhXm>] [reason]\n");
00042   } else {
00043     who = newsplit(&par);
00044     if (par[0] && strchr(CHANMETA, par[0]))
00045       chname = newsplit(&par);
00046     else
00047       chname = 0;
00048     if (chname || !(u->flags & USER_OP)) {
00049       if (!chname)
00050         chname = dcc[idx].u.chat->con_chan;
00051       get_user_flagrec(u, &user, chname);
00052       chan = findchan_by_dname(chname);
00053       /* *shrug* ??? (guppy:10Feb1999) */
00054       if (!chan) {
00055         dprintf(idx, "That channel doesn't exist!\n");
00056         return;
00057       } else if (!((glob_op(user) && !chan_deop(user)) || (glob_halfop(user) &&
00058                !chan_dehalfop(user)) || chan_op(user) || chan_halfop(user))) {
00059         dprintf(idx, "You don't have access to set bans on %s.\n", chname);
00060         return;
00061       }
00062     } else
00063       chan = 0;
00064     /* Added by Q and Solal -- Requested by Arty2, special thanx :) */
00065     if (par[0] == '%') {
00066       p = newsplit(&par);
00067       p_expire = p + 1;
00068       while (*(++p) != 0) {
00069         switch (tolower((unsigned) *p)) {
00070         case 'd':
00071           *p = 0;
00072           expire_foo = strtol(p_expire, NULL, 10);
00073           if (expire_foo > 365)
00074             expire_foo = 365;
00075           expire_time += 86400 * expire_foo;
00076           p_expire = p + 1;
00077           break;
00078         case 'h':
00079           *p = 0;
00080           expire_foo = strtol(p_expire, NULL, 10);
00081           if (expire_foo > 8760)
00082             expire_foo = 8760;
00083           expire_time += 3600 * expire_foo;
00084           p_expire = p + 1;
00085           break;
00086         case 'm':
00087           *p = 0;
00088           expire_foo = strtol(p_expire, NULL, 10);
00089           if (expire_foo > 525600)
00090             expire_foo = 525600;
00091           expire_time += 60 * expire_foo;
00092           p_expire = p + 1;
00093         }
00094       }
00095     }
00096     if (!par[0])
00097       par = "requested";
00098     else if (strlen(par) > MASKREASON_MAX)
00099       par[MASKREASON_MAX] = 0;
00100     if (strlen(who) > UHOSTMAX - 4)
00101       who[UHOSTMAX - 4] = 0;
00102     /* Fix missing ! or @ BEFORE checking against myself */
00103     if (!strchr(who, '!')) {
00104       if (!strchr(who, '@'))
00105         egg_snprintf(s, sizeof s, "%s!*@*", who);       /* Lame nick ban */
00106       else
00107         egg_snprintf(s, sizeof s, "*!%s", who);
00108     } else if (!strchr(who, '@'))
00109       egg_snprintf(s, sizeof s, "%s@*", who);   /* brain-dead? */
00110     else
00111       strncpyz(s, who, sizeof s);
00112     if ((me = module_find("server", 0, 0)) && me->funcs)
00113       egg_snprintf(s1, sizeof s1, "%s!%s", me->funcs[SERVER_BOTNAME],
00114                    me->funcs[SERVER_BOTUSERHOST]);
00115     else
00116       egg_snprintf(s1, sizeof s1, "%s!%s@%s", origbotname, botuser, hostname);
00117     if (match_addr(s, s1)) {
00118       dprintf(idx, "I'm not going to ban myself.\n");
00119       putlog(LOG_CMDS, "*", "#%s# attempted +ban %s", dcc[idx].nick, s);
00120     } else {
00121       /* IRC can't understand bans longer than 70 characters */
00122       if (strlen(s) > 70) {
00123         s[69] = '*';
00124         s[70] = 0;
00125       }
00126       if (chan) {
00127         u_addban(chan, s, dcc[idx].nick, par,
00128                  expire_time ? now + expire_time : 0, 0);
00129         if (par[0] == '*') {
00130           sticky = 1;
00131           par++;
00132           putlog(LOG_CMDS, "*", "#%s# (%s) +ban %s %s (%s) (sticky)",
00133                  dcc[idx].nick, dcc[idx].u.chat->con_chan, s, chan->dname, par);
00134           dprintf(idx, "New %s sticky ban: %s (%s)\n", chan->dname, s, par);
00135         } else {
00136           putlog(LOG_CMDS, "*", "#%s# (%s) +ban %s %s (%s)", dcc[idx].nick,
00137                  dcc[idx].u.chat->con_chan, s, chan->dname, par);
00138           dprintf(idx, "New %s ban: %s (%s)\n", chan->dname, s, par);
00139         }
00140         /* Avoid unnesessary modes if you got +dynamicbans, and there is
00141          * no reason to set mode if irc.mod aint loaded. (dw 001120)
00142          */
00143         if ((me = module_find("irc", 0, 0)))
00144           (me->funcs[IRC_CHECK_THIS_BAN]) (chan, s, sticky);
00145       } else {
00146         u_addban(NULL, s, dcc[idx].nick, par,
00147                  expire_time ? now + expire_time : 0, 0);
00148         if (par[0] == '*') {
00149           sticky = 1;
00150           par++;
00151           putlog(LOG_CMDS, "*", "#%s# (GLOBAL) +ban %s (%s) (sticky)",
00152                  dcc[idx].nick, s, par);
00153           dprintf(idx, "New sticky ban: %s (%s)\n", s, par);
00154         } else {
00155           putlog(LOG_CMDS, "*", "#%s# (GLOBAL) +ban %s (%s)", dcc[idx].nick,
00156                  s, par);
00157           dprintf(idx, "New ban: %s (%s)\n", s, par);
00158         }
00159         if ((me = module_find("irc", 0, 0)))
00160           for (chan = chanset; chan != NULL; chan = chan->next)
00161             (me->funcs[IRC_CHECK_THIS_BAN]) (chan, s, sticky);
00162       }
00163     }
00164   }
00165 }

Here is the call graph for this function:

static void cmd_pls_chan ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1174 of file cmdschan.c.

References argc, argv, CHANMETA, dcc, chanset_t::dname, dprintf, EGG_CONST, findchan, findchan_by_dname, userrec::flags, isowner, LOG_CMDS, must_be_owner, newsplit, NULL, putlog, tcl_channel_add(), Tcl_Free, and USER_OWNER.

01175 {
01176   int i, argc;
01177   EGG_CONST char **argv;
01178   char *chname;
01179   struct chanset_t *chan;
01180 
01181   if (!par[0]) {
01182     dprintf(idx, "Usage: +chan [%s]<channel> [options]\n", CHANMETA);
01183     return;
01184   }
01185 
01186   chname = newsplit(&par);
01187   if (findchan_by_dname(chname)) {
01188     dprintf(idx, "That channel already exists!\n");
01189     return;
01190   } else if ((chan = findchan(chname))) {
01191     dprintf(idx, "That channel already exists as %s!\n", chan->dname);
01192     return;
01193   } else if (strchr(CHANMETA, chname[0]) == NULL) {
01194     dprintf(idx, "Invalid channel prefix.\n");
01195     return;
01196   } else if (strchr(chname, ',') != NULL) {
01197     dprintf(idx, "Invalid channel name.\n");
01198     return;
01199   }
01200 
01201   if (Tcl_SplitList(NULL, par, &argc, &argv ) == TCL_ERROR) {
01202     dprintf(idx, "Invalid channel options.\n");
01203     return;
01204   }
01205   for (i = 0; i < argc; i++) {
01206     if ((!strncmp(argv[i], "need-", 5) || !strcmp(argv[i] + 1, "static"))
01207         && (!(u->flags & USER_OWNER) || (!isowner(dcc[idx].nick)
01208         && must_be_owner))) {
01209       dprintf(idx, "Due to security concerns, only permanent owners can "
01210                    "set the need-* and +/-static modes.\n");
01211       Tcl_Free((char *) argv);
01212       return;
01213     }
01214     if (argv[i][0] == '-' || argv[i][0] == '+')
01215       continue;
01216     i++;
01217   }
01218   Tcl_Free((char *) argv);
01219 
01220   if (tcl_channel_add(0, chname, par) == TCL_ERROR)
01221     dprintf(idx, "Invalid channel or channel options.\n");
01222   else
01223     putlog(LOG_CMDS, "*", "#%s# +chan %s", dcc[idx].nick, chname);
01224 }

Here is the call graph for this function:

static void cmd_pls_chrec ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1082 of file cmdschan.c.

References add_chanrec(), chan_master, chan_owner, dcc, chanset_t::dname, dprintf, findchan_by_dname, get_chanrec(), get_user_by_handle, get_user_flagrec, glob_master, glob_owner, LOG_CMDS, newsplit, putlog, and userlist.

01083 {
01084   char *nick, *chn;
01085   struct chanset_t *chan;
01086   struct userrec *u1;
01087   struct chanuserrec *chanrec;
01088 
01089   if (!par[0]) {
01090     dprintf(idx, "Usage: +chrec <user> [channel]\n");
01091     return;
01092   }
01093   nick = newsplit(&par);
01094   u1 = get_user_by_handle(userlist, nick);
01095   if (!u1) {
01096     dprintf(idx, "No such user.\n");
01097     return;
01098   }
01099   if (!par[0])
01100     chan = findchan_by_dname(dcc[idx].u.chat->con_chan);
01101   else {
01102     chn = newsplit(&par);
01103     chan = findchan_by_dname(chn);
01104   }
01105   if (!chan) {
01106     dprintf(idx, "No such channel.\n");
01107     return;
01108   }
01109   get_user_flagrec(u, &user, chan->dname);
01110   get_user_flagrec(u1, &victim, chan->dname);
01111   if ((!glob_master(user) && !chan_master(user)) ||     /* drummer */
01112       (chan_owner(victim) && !chan_owner(user) && !glob_owner(user)) ||
01113       (glob_owner(victim) && !glob_owner(user))) {
01114     dprintf(idx, "You have no permission to do that.\n");
01115     return;
01116   }
01117   chanrec = get_chanrec(u1, chan->dname);
01118   if (chanrec) {
01119     dprintf(idx, "User %s already has a channel record for %s.\n",
01120             nick, chan->dname);
01121     return;
01122   }
01123   putlog(LOG_CMDS, "*", "#%s# +chrec %s %s", dcc[idx].nick, nick, chan->dname);
01124   add_chanrec(u1, chan->dname);
01125   dprintf(idx, "Added %s channel record for %s.\n", chan->dname, nick);
01126 }

Here is the call graph for this function:

static void cmd_pls_exempt ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 167 of file cmdschan.c.

References add_mode, botuser, chan_dehalfop, chan_deop, chan_halfop, chan_op, CHANMETA, chanset, dcc, chanset_t::dname, dprintf, egg_snprintf, findchan_by_dname, userrec::flags, _module_entry::funcs, get_user_flagrec, glob_halfop, glob_op, hostname, LOG_CMDS, MASKREASON_MAX, module_find, newsplit, chanset_t::next, now, NULL, origbotname, putlog, SERVER_BOTNAME, SERVER_BOTUSERHOST, strncpyz, u_addexempt(), UHOSTLEN, UHOSTMAX, use_exempts, and USER_OP.

00168 {
00169   char *chname, *who, s[UHOSTLEN], s1[UHOSTLEN], *p, *p_expire;
00170   unsigned long int expire_time = 0, expire_foo;
00171   struct chanset_t *chan = NULL;
00172   module_entry *me;
00173 
00174   if (!use_exempts) {
00175     dprintf(idx, "This command can only be used with use-exempts enabled.\n");
00176     return;
00177   }
00178   if (!par[0]) {
00179     dprintf(idx, "Usage: +exempt <hostmask> [channel] [%%<XdXhXm>] [reason]\n");
00180   } else {
00181     who = newsplit(&par);
00182     if (par[0] && strchr(CHANMETA, par[0]))
00183       chname = newsplit(&par);
00184     else
00185       chname = 0;
00186     if (chname || !(u->flags & USER_OP)) {
00187       if (!chname)
00188         chname = dcc[idx].u.chat->con_chan;
00189       get_user_flagrec(u, &user, chname);
00190       chan = findchan_by_dname(chname);
00191       /* *shrug* ??? (guppy:10Feb99) */
00192       if (!chan) {
00193         dprintf(idx, "That channel doesn't exist!\n");
00194         return;
00195       } else if (!((glob_op(user) && !chan_deop(user)) || (glob_halfop(user) &&
00196                !chan_dehalfop(user)) || chan_op(user) || chan_halfop(user))) {
00197         dprintf(idx, "You don't have access to set exempts on %s.\n", chname);
00198         return;
00199       }
00200     } else
00201       chan = 0;
00202     /* Added by Q and Solal  - Requested by Arty2, special thanx :) */
00203     if (par[0] == '%') {
00204       p = newsplit(&par);
00205       p_expire = p + 1;
00206       while (*(++p) != 0) {
00207         switch (tolower((unsigned) *p)) {
00208         case 'd':
00209           *p = 0;
00210           expire_foo = strtol(p_expire, NULL, 10);
00211           if (expire_foo > 365)
00212             expire_foo = 365;
00213           expire_time += 86400 * expire_foo;
00214           p_expire = p + 1;
00215           break;
00216         case 'h':
00217           *p = 0;
00218           expire_foo = strtol(p_expire, NULL, 10);
00219           if (expire_foo > 8760)
00220             expire_foo = 8760;
00221           expire_time += 3600 * expire_foo;
00222           p_expire = p + 1;
00223           break;
00224         case 'm':
00225           *p = 0;
00226           expire_foo = strtol(p_expire, NULL, 10);
00227           if (expire_foo > 525600)
00228             expire_foo = 525600;
00229           expire_time += 60 * expire_foo;
00230           p_expire = p + 1;
00231         }
00232       }
00233     }
00234     if (!par[0])
00235       par = "requested";
00236     else if (strlen(par) > MASKREASON_MAX)
00237       par[MASKREASON_MAX] = 0;
00238     if (strlen(who) > UHOSTMAX - 4)
00239       who[UHOSTMAX - 4] = 0;
00240     /* Fix missing ! or @ BEFORE checking against myself */
00241     if (!strchr(who, '!')) {
00242       if (!strchr(who, '@'))
00243         egg_snprintf(s, sizeof s, "%s!*@*", who);       /* Lame nick exempt */
00244       else
00245         egg_snprintf(s, sizeof s, "*!%s", who);
00246     } else if (!strchr(who, '@'))
00247       egg_snprintf(s, sizeof s, "%s@*", who);   /* brain-dead? */
00248     else
00249       strncpyz(s, who, sizeof s);
00250     if ((me = module_find("server", 0, 0)) && me->funcs)
00251       egg_snprintf(s1, sizeof s1, "%s!%s", me->funcs[SERVER_BOTNAME],
00252                    me->funcs[SERVER_BOTUSERHOST]);
00253     else
00254       egg_snprintf(s1, sizeof s1, "%s!%s@%s", origbotname, botuser, hostname);
00255 
00256     /* IRC can't understand exempts longer than 70 characters */
00257     if (strlen(s) > 70) {
00258       s[69] = '*';
00259       s[70] = 0;
00260     }
00261     if (chan) {
00262       u_addexempt(chan, s, dcc[idx].nick, par,
00263                   expire_time ? now + expire_time : 0, 0);
00264       if (par[0] == '*') {
00265         par++;
00266         putlog(LOG_CMDS, "*", "#%s# (%s) +exempt %s %s (%s) (sticky)",
00267                dcc[idx].nick, dcc[idx].u.chat->con_chan, s, chan->dname, par);
00268         dprintf(idx, "New %s sticky exempt: %s (%s)\n", chan->dname, s, par);
00269       } else {
00270         putlog(LOG_CMDS, "*", "#%s# (%s) +exempt %s %s (%s)", dcc[idx].nick,
00271                dcc[idx].u.chat->con_chan, s, chan->dname, par);
00272         dprintf(idx, "New %s exempt: %s (%s)\n", chan->dname, s, par);
00273       }
00274       add_mode(chan, '+', 'e', s);
00275     } else {
00276       u_addexempt(NULL, s, dcc[idx].nick, par,
00277                   expire_time ? now + expire_time : 0, 0);
00278       if (par[0] == '*') {
00279         par++;
00280         putlog(LOG_CMDS, "*", "#%s# (GLOBAL) +exempt %s (%s) (sticky)",
00281                dcc[idx].nick, s, par);
00282         dprintf(idx, "New sticky exempt: %s (%s)\n", s, par);
00283       } else {
00284         putlog(LOG_CMDS, "*", "#%s# (GLOBAL) +exempt %s (%s)", dcc[idx].nick,
00285                s, par);
00286         dprintf(idx, "New exempt: %s (%s)\n", s, par);
00287       }
00288       for (chan = chanset; chan != NULL; chan = chan->next)
00289         add_mode(chan, '+', 'e', s);
00290     }
00291   }
00292 }

Here is the call graph for this function:

static void cmd_pls_invite ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 294 of file cmdschan.c.

References add_mode, botuser, chan_dehalfop, chan_deop, chan_halfop, chan_op, CHANMETA, chanset, dcc, chanset_t::dname, dprintf, egg_snprintf, findchan_by_dname, userrec::flags, _module_entry::funcs, get_user_flagrec, glob_halfop, glob_op, hostname, LOG_CMDS, MASKREASON_MAX, module_find, newsplit, chanset_t::next, now, NULL, origbotname, putlog, SERVER_BOTNAME, SERVER_BOTUSERHOST, strncpyz, u_addinvite(), UHOSTLEN, UHOSTMAX, use_invites, and USER_OP.

00295 {
00296   char *chname, *who, s[UHOSTLEN], s1[UHOSTLEN], *p, *p_expire;
00297   unsigned long int expire_time = 0, expire_foo;
00298   struct chanset_t *chan = NULL;
00299   module_entry *me;
00300 
00301   if (!use_invites) {
00302     dprintf(idx, "This command can only be used with use-invites enabled.\n");
00303     return;
00304   }
00305 
00306   if (!par[0]) {
00307     dprintf(idx, "Usage: +invite <hostmask> [channel] [%%<XdXhXm>] [reason]\n");
00308   } else {
00309     who = newsplit(&par);
00310     if (par[0] && strchr(CHANMETA, par[0]))
00311       chname = newsplit(&par);
00312     else
00313       chname = 0;
00314     if (chname || !(u->flags & USER_OP)) {
00315       if (!chname)
00316         chname = dcc[idx].u.chat->con_chan;
00317       get_user_flagrec(u, &user, chname);
00318       chan = findchan_by_dname(chname);
00319       /* *shrug* ??? (guppy:10Feb99) */
00320       if (!chan) {
00321         dprintf(idx, "That channel doesn't exist!\n");
00322         return;
00323       } else if (!((glob_op(user) && !chan_deop(user)) || (glob_halfop(user) &&
00324                !chan_dehalfop(user)) || chan_op(user) || chan_halfop(user))) {
00325         dprintf(idx, "You don't have access to set invites on %s.\n", chname);
00326         return;
00327       }
00328     } else
00329       chan = 0;
00330     /* Added by Q and Solal  - Requested by Arty2, special thanx :) */
00331     if (par[0] == '%') {
00332       p = newsplit(&par);
00333       p_expire = p + 1;
00334       while (*(++p) != 0) {
00335         switch (tolower((unsigned) *p)) {
00336         case 'd':
00337           *p = 0;
00338           expire_foo = strtol(p_expire, NULL, 10);
00339           if (expire_foo > 365)
00340             expire_foo = 365;
00341           expire_time += 86400 * expire_foo;
00342           p_expire = p + 1;
00343           break;
00344         case 'h':
00345           *p = 0;
00346           expire_foo = strtol(p_expire, NULL, 10);
00347           if (expire_foo > 8760)
00348             expire_foo = 8760;
00349           expire_time += 3600 * expire_foo;
00350           p_expire = p + 1;
00351           break;
00352         case 'm':
00353           *p = 0;
00354           expire_foo = strtol(p_expire, NULL, 10);
00355           if (expire_foo > 525600)
00356             expire_foo = 525600;
00357           expire_time += 60 * expire_foo;
00358           p_expire = p + 1;
00359         }
00360       }
00361     }
00362     if (!par[0])
00363       par = "requested";
00364     else if (strlen(par) > MASKREASON_MAX)
00365       par[MASKREASON_MAX] = 0;
00366     if (strlen(who) > UHOSTMAX - 4)
00367       who[UHOSTMAX - 4] = 0;
00368     /* Fix missing ! or @ BEFORE checking against myself */
00369     if (!strchr(who, '!')) {
00370       if (!strchr(who, '@'))
00371         egg_snprintf(s, sizeof s, "%s!*@*", who);       /* Lame nick invite */
00372       else
00373         egg_snprintf(s, sizeof s, "*!%s", who);
00374     } else if (!strchr(who, '@'))
00375       egg_snprintf(s, sizeof s, "%s@*", who);   /* brain-dead? */
00376     else
00377       strncpyz(s, who, sizeof s);
00378     if ((me = module_find("server", 0, 0)) && me->funcs)
00379       egg_snprintf(s1, sizeof s1, "%s!%s", me->funcs[SERVER_BOTNAME],
00380                    me->funcs[SERVER_BOTUSERHOST]);
00381     else
00382       egg_snprintf(s1, sizeof s1, "%s!%s@%s", origbotname, botuser, hostname);
00383 
00384     /* IRC can't understand invites longer than 70 characters */
00385     if (strlen(s) > 70) {
00386       s[69] = '*';
00387       s[70] = 0;
00388     }
00389     if (chan) {
00390       u_addinvite(chan, s, dcc[idx].nick, par,
00391                   expire_time ? now + expire_time : 0, 0);
00392       if (par[0] == '*') {
00393         par++;
00394         putlog(LOG_CMDS, "*", "#%s# (%s) +invite %s %s (%s) (sticky)",
00395                dcc[idx].nick, dcc[idx].u.chat->con_chan, s, chan->dname, par);
00396         dprintf(idx, "New %s sticky invite: %s (%s)\n", chan->dname, s, par);
00397       } else {
00398         putlog(LOG_CMDS, "*", "#%s# (%s) +invite %s %s (%s)", dcc[idx].nick,
00399                dcc[idx].u.chat->con_chan, s, chan->dname, par);
00400         dprintf(idx, "New %s invite: %s (%s)\n", chan->dname, s, par);
00401       }
00402       add_mode(chan, '+', 'I', s);
00403     } else {
00404       u_addinvite(NULL, s, dcc[idx].nick, par,
00405                   expire_time ? now + expire_time : 0, 0);
00406       if (par[0] == '*') {
00407         par++;
00408         putlog(LOG_CMDS, "*", "#%s# (GLOBAL) +invite %s (%s) (sticky)",
00409                dcc[idx].nick, s, par);
00410         dprintf(idx, "New sticky invite: %s (%s)\n", s, par);
00411       } else {
00412         putlog(LOG_CMDS, "*", "#%s# (GLOBAL) +invite %s (%s)", dcc[idx].nick,
00413                s, par);
00414         dprintf(idx, "New invite: %s (%s)\n", s, par);
00415       }
00416       for (chan = chanset; chan != NULL; chan = chan->next)
00417         add_mode(chan, '+', 'I', s);
00418     }
00419   }
00420 }

Here is the call graph for this function:

static void cmd_stick ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1072 of file cmdschan.c.

References cmd_stick_yn().

01073 {
01074   cmd_stick_yn(idx, par, 1);
01075 }

Here is the call graph for this function:

static void cmd_stick_yn ( int  idx,
char *  par,
int  yn 
) [static]

Definition at line 935 of file cmdschan.c.

References chanset, dcc, dprintf, egg_snprintf, egg_strcasecmp, findchan_by_dname, _module_entry::funcs, IRC_CHECK_THIS_BAN, LOG_CMDS, module_find, newsplit, chanset_t::next, NULL, putlog, str_isdigit, strncpyz, u_setsticky_ban, u_setsticky_exempt, u_setsticky_invite, UHOSTLEN, use_exempts, use_invites, and USER_OP.

Referenced by cmd_stick(), and cmd_unstick().

00936 {
00937   int i = 0, j;
00938   struct chanset_t *chan, *achan;
00939   char *stick_type, s[UHOSTLEN], chname[81];
00940   module_entry *me;
00941 
00942   stick_type = newsplit(&par);
00943   strncpyz(s, newsplit(&par), sizeof s);
00944   strncpyz(chname, newsplit(&par), sizeof chname);
00945 
00946   if (egg_strcasecmp(stick_type, "exempt") &&
00947       egg_strcasecmp(stick_type, "invite") &&
00948       egg_strcasecmp(stick_type, "ban")) {
00949     strncpyz(chname, s, sizeof chname);
00950     strncpyz(s, stick_type, sizeof s);
00951   }
00952   if (!s[0]) {
00953     dprintf(idx, "Usage: %sstick [ban/exempt/invite] <hostmask or number> "
00954             "[channel]\n", yn ? "" : "un");
00955     return;
00956   }
00957   /* Now deal with exemptions */
00958   if (!egg_strcasecmp(stick_type, "exempt")) {
00959     if (!use_exempts) {
00960       dprintf(idx, "This command can only be used with use-exempts "
00961               "enabled.\n");
00962       return;
00963     }
00964     if (!chname[0]) {
00965       i = u_setsticky_exempt(NULL, s,
00966                              (dcc[idx].user->flags & USER_OP) ? yn : -1);
00967       if (i > 0) {
00968         putlog(LOG_CMDS, "*", "#%s# %sstick exempt %s",
00969                dcc[idx].nick, yn ? "" : "un", s);
00970         dprintf(idx, "%stuck exempt: %s\n", yn ? "S" : "Uns", s);
00971         return;
00972       }
00973       strncpyz(chname, dcc[idx].u.chat->con_chan, sizeof chname);
00974     }
00975     /* Channel-specific exempt? */
00976     if (!(chan = findchan_by_dname(chname))) {
00977       dprintf(idx, "No such channel.\n");
00978       return;
00979     }
00980     if (str_isdigit(s)) {
00981       /* substract the numer of global exempts to get the number of the channel exempt */
00982       j = u_setsticky_exempt(NULL, s, -1);
00983       if (j < 0)
00984         egg_snprintf(s, sizeof s, "%d", -j);
00985     }
00986     j = u_setsticky_exempt(chan, s, yn);
00987     if (j > 0) {
00988       putlog(LOG_CMDS, "*", "#%s# %sstick exempt %s %s", dcc[idx].nick,
00989              yn ? "" : "un", s, chname);
00990       dprintf(idx, "%stuck %s exempt: %s\n", yn ? "S" : "Uns", chname, s);
00991       return;
00992     }
00993     dprintf(idx, "No such exempt.\n");
00994     return;
00995   }
00996   /* Now the invites */
00997   else if (!egg_strcasecmp(stick_type, "invite")) {
00998     if (!use_invites) {
00999       dprintf(idx, "This command can only be used with use-invites enabled.\n");
01000       return;
01001     }
01002     if (!chname[0]) {
01003       i = u_setsticky_invite(NULL, s,
01004                              (dcc[idx].user->flags & USER_OP) ? yn : -1);
01005       if (i > 0) {
01006         putlog(LOG_CMDS, "*", "#%s# %sstick invite %s",
01007                dcc[idx].nick, yn ? "" : "un", s);
01008         dprintf(idx, "%stuck invite: %s\n", yn ? "S" : "Uns", s);
01009         return;
01010       }
01011       strncpyz(chname, dcc[idx].u.chat->con_chan, sizeof chname);
01012     }
01013     /* Channel-specific invite? */
01014     if (!(chan = findchan_by_dname(chname))) {
01015       dprintf(idx, "No such channel.\n");
01016       return;
01017     }
01018     if (str_isdigit(s)) {
01019       /* substract the numer of global invites to get the number of the channel invite */
01020       j = u_setsticky_invite(NULL, s, -1);
01021       if (j < 0)
01022         egg_snprintf(s, sizeof s, "%d", -j);
01023     }
01024     j = u_setsticky_invite(chan, s, yn);
01025     if (j > 0) {
01026       putlog(LOG_CMDS, "*", "#%s# %sstick invite %s %s", dcc[idx].nick,
01027              yn ? "" : "un", s, chname);
01028       dprintf(idx, "%stuck %s invite: %s\n", yn ? "S" : "Uns", chname, s);
01029       return;
01030     }
01031     dprintf(idx, "No such invite.\n");
01032     return;
01033   }
01034   if (!chname[0]) {
01035     i = u_setsticky_ban(NULL, s,
01036                         (dcc[idx].user->flags & USER_OP) ? yn : -1);
01037     if (i > 0) {
01038       putlog(LOG_CMDS, "*", "#%s# %sstick ban %s",
01039              dcc[idx].nick, yn ? "" : "un", s);
01040       dprintf(idx, "%stuck ban: %s\n", yn ? "S" : "Uns", s);
01041       if ((me = module_find("irc", 0, 0)))
01042         for (achan = chanset; achan != NULL; achan = achan->next)
01043           (me->funcs[IRC_CHECK_THIS_BAN]) (achan, s, yn);
01044       return;
01045     }
01046     strncpyz(chname, dcc[idx].u.chat->con_chan, sizeof chname);
01047   }
01048   /* Channel-specific ban? */
01049   if (!(chan = findchan_by_dname(chname))) {
01050     dprintf(idx, "No such channel.\n");
01051     return;
01052   }
01053   if (str_isdigit(s)) {
01054     /* substract the numer of global bans to get the number of the channel ban */
01055     j = u_setsticky_ban(NULL, s, -1);
01056     if (j < 0)
01057       egg_snprintf(s, sizeof s, "%d", -j);
01058   }
01059   j = u_setsticky_ban(chan, s, yn);
01060   if (j > 0) {
01061     putlog(LOG_CMDS, "*", "#%s# %sstick ban %s %s", dcc[idx].nick,
01062            yn ? "" : "un", s, chname);
01063     dprintf(idx, "%stuck %s ban: %s\n", yn ? "S" : "Uns", chname, s);
01064     if ((me = module_find("irc", 0, 0)))
01065       (me->funcs[IRC_CHECK_THIS_BAN]) (chan, s, yn);
01066     return;
01067   }
01068   dprintf(idx, "No such ban.\n");
01069 }

Here is the caller graph for this function:

static void cmd_unstick ( struct userrec u,
int  idx,
char *  par 
) [static]

Definition at line 1077 of file cmdschan.c.

References cmd_stick_yn().

01078 {
01079   cmd_stick_yn(idx, par, 0);
01080 }

Here is the call graph for this function:


Variable Documentation

cmd_t C_dcc_irc[] [static]
Initial value:
 {
  {"+ban",     "ol|ol", (IntFunc) cmd_pls_ban,     0 },
  {"+exempt",  "ol|ol", (IntFunc) cmd_pls_exempt,  0 },
  {"+invite",  "ol|ol", (IntFunc) cmd_pls_invite,  0 },
  {"+chan",    "n",     (IntFunc) cmd_pls_chan,    0 },
  {"+chrec",   "m|m",   (IntFunc) cmd_pls_chrec,   0 },
  {"-ban",     "ol|ol", (IntFunc) cmd_mns_ban,     0 },
  {"-chan",    "n",     (IntFunc) cmd_mns_chan,    0 },
  {"-chrec",   "m|m",   (IntFunc) cmd_mns_chrec,   0 },
  {"bans",     "ol|ol", (IntFunc) cmd_bans,        0 },
  {"-exempt",  "ol|ol", (IntFunc) cmd_mns_exempt,  0 },
  {"-invite",  "ol|ol", (IntFunc) cmd_mns_invite,  0 },
  {"exempts",  "ol|ol", (IntFunc) cmd_exempts,     0 },
  {"invites",  "ol|ol", (IntFunc) cmd_invites,     0 },
  {"chaninfo", "m|m",   (IntFunc) cmd_chaninfo,    0 },
  {"chanload", "n|n",   (IntFunc) cmd_chanload,    0 },
  {"chanset",  "n|n",   (IntFunc) cmd_chanset,     0 },
  {"chansave", "n|n",   (IntFunc) cmd_chansave,    0 },
  {"chinfo",   "m|m",   (IntFunc) cmd_chinfo,      0 },
  {"info",     "",      (IntFunc) cmd_info,        0 },
  {"stick",    "ol|ol", (IntFunc) cmd_stick,       0 },
  {"unstick",  "ol|ol", (IntFunc) cmd_unstick,     0 },
  { 0 ,        0 ,     0 ,                       0 }
}

Definition at line 1606 of file cmdschan.c.

Referenced by channels_close(), and channels_start().

struct flag_record user = { 0x00000001 | 0x00000004 , 0, 0, 0, 0, 0 } [static]

Definition at line 28 of file cmdschan.c.

Referenced by bot_actchan(), bot_away(), bot_chan2(), bot_chat(), bot_idle(), bot_join(), bot_nickchange(), bot_nlinked(), bot_part(), bot_reject(), bot_thisbot(), bot_version(), botlink(), botnet_send_assoc(), botnet_send_reject(), channels_chon(), channels_report(), check_expired_tbufs(), check_tcl_fil(), check_this_ban(), cmd_adduser(), cmd_botattr(), cmd_channel(), cmd_chattr(), cmd_chdir(), cmd_console(), cmd_dehalfop(), cmd_deluser(), cmd_deop(), cmd_desc(), cmd_devoice(), cmd_file_help(), cmd_filestats(), cmd_halfop(), cmd_kick(), cmd_kickban(), cmd_reset(), cmd_voice(), comment_display(), console_chon(), console_display(), console_dostore(), cont_link(), dcc_bot_check_digest(), dcc_chat_hostresolved(), dcc_chat_pass(), dcc_chatter(), dcc_files(), dcc_telnet_id(), dcc_telnet_new(), dcc_telnet_pass(), dcc_telnet_pw(), dump_links(), filesys_dcc_send_hostresolved(), finish_share(), fwd_display(), geticon(), got352(), got354(), greet_new_bot(), has_op(), has_oporhalfop(), int(), irc_report(), link_assoc(), main(), send_tand_but(), share_chattr(), share_chchinfo(), share_mns_banchan(), share_mns_chrec(), share_mns_exemptchan(), share_mns_invitechan(), share_pls_banchan(), share_pls_chrec(), share_pls_exemptchan(), share_pls_invitechan(), share_resyncq(), share_stick_ban(), share_stick_exempt(), share_stick_invite(), share_userfileq(), share_version(), shareout_but(), shareout_mod(), show_banner(), show_motd(), start_sending_users(), sub_lang(), void(), welcome_to_files(), write_bans(), write_exempts(), and write_invites().

struct flag_record victim = { 0x00000001 | 0x00000004 , 0, 0, 0, 0, 0 } [static]

Definition at line 29 of file cmdschan.c.

Referenced by cmd_dehalfop(), cmd_deop(), cmd_halfop(), cmd_kick(), cmd_kickban(), cmd_op(), and maybe_revenge().


Generated on 7 Sep 2016 for Eggdrop by  doxygen 1.6.1