src/cmds.c File Reference

#include "main.h"
#include "tandem.h"
#include "modules.h"
#include <ctype.h>
Include dependency graph for cmds.c:

Go to the source code of this file.

Functions

static char * btos (unsigned long)
static int add_bot_hostmask (int idx, char *nick)
static void tell_who (struct userrec *u, int idx, int chan)
static void cmd_botinfo (struct userrec *u, int idx, char *par)
static void cmd_whom (struct userrec *u, int idx, char *par)
static void cmd_me (struct userrec *u, int idx, char *par)
static void cmd_motd (struct userrec *u, int idx, char *par)
static void cmd_away (struct userrec *u, int idx, char *par)
static void cmd_back (struct userrec *u, int idx, char *par)
static void cmd_newpass (struct userrec *u, int idx, char *par)
static void cmd_bots (struct userrec *u, int idx, char *par)
static void cmd_bottree (struct userrec *u, int idx, char *par)
static void cmd_vbottree (struct userrec *u, int idx, char *par)
static void cmd_rehelp (struct userrec *u, int idx, char *par)
static void cmd_help (struct userrec *u, int idx, char *par)
static void cmd_addlog (struct userrec *u, int idx, char *par)
static void cmd_who (struct userrec *u, int idx, char *par)
static void cmd_whois (struct userrec *u, int idx, char *par)
static void cmd_match (struct userrec *u, int idx, char *par)
static void cmd_uptime (struct userrec *u, int idx, char *par)
static void cmd_status (struct userrec *u, int idx, char *par)
static void cmd_dccstat (struct userrec *u, int idx, char *par)
static void cmd_boot (struct userrec *u, int idx, char *par)
static void cmd_console (struct userrec *u, int idx, char *par)
static void cmd_pls_bot (struct userrec *u, int idx, char *par)
static void cmd_chhandle (struct userrec *u, int idx, char *par)
static void cmd_handle (struct userrec *u, int idx, char *par)
static void cmd_chpass (struct userrec *u, int idx, char *par)
static void cmd_chaddr (struct userrec *u, int idx, char *par)
static void cmd_comment (struct userrec *u, int idx, char *par)
static void cmd_restart (struct userrec *u, int idx, char *par)
static void cmd_rehash (struct userrec *u, int idx, char *par)
static void cmd_reload (struct userrec *u, int idx, char *par)
void cmd_die (struct userrec *u, int idx, char *par)
static void cmd_debug (struct userrec *u, int idx, char *par)
static void cmd_simul (struct userrec *u, int idx, char *par)
static void cmd_link (struct userrec *u, int idx, char *par)
static void cmd_unlink (struct userrec *u, int idx, char *par)
static void cmd_relay (struct userrec *u, int idx, char *par)
static void cmd_save (struct userrec *u, int idx, char *par)
static void cmd_backup (struct userrec *u, int idx, char *par)
static void cmd_trace (struct userrec *u, int idx, char *par)
static void cmd_binds (struct userrec *u, int idx, char *par)
static void cmd_banner (struct userrec *u, int idx, char *par)
int check_dcc_attrs (struct userrec *u, int oatr)
int check_dcc_chanattrs (struct userrec *u, char *chname, int chflags, int ochatr)
static void cmd_chattr (struct userrec *u, int idx, char *par)
static void cmd_botattr (struct userrec *u, int idx, char *par)
static void cmd_chat (struct userrec *u, int idx, char *par)
static void cmd_echo (struct userrec *u, int idx, char *par)
int stripmodes (char *s)
char * stripmasktype (int x)
static char * stripmaskname (int x)
static void cmd_strip (struct userrec *u, int idx, char *par)
static void cmd_su (struct userrec *u, int idx, char *par)
static void cmd_fixcodes (struct userrec *u, int idx, char *par)
static void cmd_page (struct userrec *u, int idx, char *par)
static void cmd_tcl (struct userrec *u, int idx, char *msg)
static void cmd_set (struct userrec *u, int idx, char *msg)
static void cmd_module (struct userrec *u, int idx, char *par)
static void cmd_loadmod (struct userrec *u, int idx, char *par)
static void cmd_unloadmod (struct userrec *u, int idx, char *par)
static void cmd_pls_ignore (struct userrec *u, int idx, char *par)
static void cmd_mns_ignore (struct userrec *u, int idx, char *par)
static void cmd_ignores (struct userrec *u, int idx, char *par)
static void cmd_pls_user (struct userrec *u, int idx, char *par)
static void cmd_mns_user (struct userrec *u, int idx, char *par)
static void cmd_pls_host (struct userrec *u, int idx, char *par)
static void cmd_mns_host (struct userrec *u, int idx, char *par)
static void cmd_modules (struct userrec *u, int idx, char *par)
static void cmd_traffic (struct userrec *u, int idx, char *par)
static void cmd_whoami (struct userrec *u, int idx, char *par)

Variables

struct chanset_tchanset
struct dcc_tdcc
struct userrecuserlist
tcl_timer_ttimer
tcl_timer_tutimer
int dcc_total
int remote_boots
int backgrd
int make_userfile
int do_restart
int conmask
int require_p
int must_be_owner
int strict_host
unsigned long otraffic_irc
unsigned long otraffic_irc_today
unsigned long itraffic_irc
unsigned long itraffic_irc_today
unsigned long otraffic_bn
unsigned long otraffic_bn_today
unsigned long itraffic_bn
unsigned long itraffic_bn_today
unsigned long otraffic_dcc
unsigned long otraffic_dcc_today
unsigned long itraffic_dcc
unsigned long itraffic_dcc_today
unsigned long otraffic_trans
unsigned long otraffic_trans_today
unsigned long itraffic_trans
unsigned long itraffic_trans_today
unsigned long otraffic_unknown
unsigned long otraffic_unknown_today
unsigned long itraffic_unknown
unsigned long itraffic_unknown_today
Tcl_Interpinterp
char botnetnick []
char origbotname []
char ver []
char network []
char owner []
char quit_msg []
time_t now
time_t online_since
module_entrymodule_list
static char traffictxt [20]
cmd_t C_dcc []

Function Documentation

static int add_bot_hostmask ( int  idx,
char *  nick 
) [static]

Definition at line 56 of file cmds.c.

References addhost_by_handle, channel_active, chanset_t::dname, dprintf, egg_snprintf, get_user_by_host, userrec::handle, ismember, chanset_t::next, memstruct::nick, strict_host, UHOSTLEN, and memstruct::userhost.

Referenced by cmd_pls_bot().

00057 {
00058   struct chanset_t *chan;
00059 
00060   for (chan = chanset; chan; chan = chan->next)
00061     if (channel_active(chan)) {
00062       memberlist *m = ismember(chan, nick);
00063 
00064       if (m) {
00065         char s[UHOSTLEN];
00066         struct userrec *u;
00067 
00068         egg_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
00069         u = get_user_by_host(s);
00070         if (u) {
00071           dprintf(idx, "(Can't add hostmask for %s because it matches %s)\n",
00072                   nick, u->handle);
00073           return 0;
00074         }
00075         if (strchr("~^+=-", m->userhost[0]))
00076           egg_snprintf(s, sizeof s, "*!%s%s", strict_host ? "?" : "",
00077                        m->userhost + 1);
00078         else
00079           egg_snprintf(s, sizeof s, "*!%s", m->userhost);
00080         dprintf(idx, "(Added hostmask for %s from %s)\n", nick, chan->dname);
00081         addhost_by_handle(nick, s);
00082         return 1;
00083       }
00084     }
00085   return 0;
00086 }

Here is the caller graph for this function:

static char * btos ( unsigned long  bytes  )  [static]

Definition at line 2718 of file cmds.c.

References traffictxt.

Referenced by cmd_traffic().

02719 {
02720   char unit[10];
02721   float xbytes;
02722 
02723   sprintf(unit, "Bytes");
02724   xbytes = bytes;
02725   if (xbytes > 1024.0) {
02726     sprintf(unit, "KBytes");
02727     xbytes = xbytes / 1024.0;
02728   }
02729   if (xbytes > 1024.0) {
02730     sprintf(unit, "MBytes");
02731     xbytes = xbytes / 1024.0;
02732   }
02733   if (xbytes > 1024.0) {
02734     sprintf(unit, "GBytes");
02735     xbytes = xbytes / 1024.0;
02736   }
02737   if (xbytes > 1024.0) {
02738     sprintf(unit, "TBytes");
02739     xbytes = xbytes / 1024.0;
02740   }
02741   if (bytes > 1024)
02742     sprintf(traffictxt, "%.2f %s", xbytes, unit);
02743   else
02744     sprintf(traffictxt, "%lu Bytes", bytes);
02745   return traffictxt;
02746 }

Here is the caller graph for this function:

int check_dcc_attrs ( struct userrec u,
int  oatr 
)

Definition at line 1255 of file cmds.c.

References bot_flags, BOT_LEAF, botnet_send_join_idx, chanout_but, file_info::chat, dcc_t::chat, check_conflags, chat_info::con_flags, conmask, DCC_BOT, DCC_CHAT, dcc_total, DCT_FILES, DCT_MASTER, dprintf, egg_strcasecmp, dcc_t::file, userrec::flags, FR_CHAN, FR_GLOBAL, get_user_flagrec, GLOBAL_CHANS, userrec::handle, isowner, killsock, LOG_MISC, lostdcc, nfree, dcc_t::nick, putlog, require_p, sanity_check, STAT_CHAT, STAT_LEAF, STAT_PARTY, STAT_WARNED, dcc_t::status, dcc_t::type, dcc_t::u, USER_BOTMAST, USER_MASTER, USER_OP, USER_OWNER, USER_PARTY, and USER_XFER.

01256 {
01257   int i, stat;
01258   struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 };
01259 
01260   if (!u)
01261     return 0;
01262   /* Make sure default owners are +n */
01263   if (isowner(u->handle)) {
01264     u->flags = sanity_check(u->flags | USER_OWNER);
01265   }
01266   for (i = 0; i < dcc_total; i++) {
01267     if ((dcc[i].type->flags & DCT_MASTER) &&
01268         (!egg_strcasecmp(u->handle, dcc[i].nick))) {
01269       stat = dcc[i].status;
01270       if ((dcc[i].type == &DCC_CHAT) &&
01271           ((u->flags & (USER_OP | USER_MASTER | USER_OWNER | USER_BOTMAST)) !=
01272           (oatr & (USER_OP | USER_MASTER | USER_OWNER | USER_BOTMAST)))) {
01273         botnet_send_join_idx(i, -1);
01274       }
01275       if ((oatr & USER_MASTER) && !(u->flags & USER_MASTER)) {
01276         dprintf(i, "*** POOF! ***\n");
01277         dprintf(i, "You are no longer a master on this bot.\n");
01278       }
01279       if (!(oatr & USER_MASTER) && (u->flags & USER_MASTER)) {
01280         dcc[i].u.chat->con_flags |= conmask;
01281         dprintf(i, "*** POOF! ***\n");
01282         dprintf(i, "You are now a master on this bot.\n");
01283       }
01284       if (!(oatr & USER_BOTMAST) && (u->flags & USER_BOTMAST)) {
01285         dprintf(i, "### POOF! ###\n");
01286         dprintf(i, "You are now a botnet master on this bot.\n");
01287       }
01288       if ((oatr & USER_BOTMAST) && !(u->flags & USER_BOTMAST)) {
01289         dprintf(i, "### POOF! ###\n");
01290         dprintf(i, "You are no longer a botnet master on this bot.\n");
01291       }
01292       if (!(oatr & USER_OWNER) && (u->flags & USER_OWNER)) {
01293         dprintf(i, "@@@ POOF! @@@\n");
01294         dprintf(i, "You are now an OWNER of this bot.\n");
01295       }
01296       if ((oatr & USER_OWNER) && !(u->flags & USER_OWNER)) {
01297         dprintf(i, "@@@ POOF! @@@\n");
01298         dprintf(i, "You are no longer an owner of this bot.\n");
01299       }
01300       get_user_flagrec(u, &fr, dcc[i].u.chat->con_chan);
01301       dcc[i].u.chat->con_flags = check_conflags(&fr,
01302                                                 dcc[i].u.chat->con_flags);
01303       if ((stat & STAT_PARTY) && (u->flags & USER_OP))
01304         stat &= ~STAT_PARTY;
01305       if (!(stat & STAT_PARTY) && !(u->flags & USER_OP) &&
01306           !(u->flags & USER_MASTER))
01307         stat |= STAT_PARTY;
01308       if ((stat & STAT_CHAT) && !(u->flags & USER_PARTY) &&
01309           !(u->flags & USER_MASTER) && (!(u->flags & USER_OP) || require_p))
01310         stat &= ~STAT_CHAT;
01311       if ((dcc[i].type->flags & DCT_FILES) && !(stat & STAT_CHAT) &&
01312           ((u->flags & USER_MASTER) || (u->flags & USER_PARTY) ||
01313           ((u->flags & USER_OP) && !require_p)))
01314         stat |= STAT_CHAT;
01315       dcc[i].status = stat;
01316       /* Check if they no longer have access to wherever they are.
01317        *
01318        * NOTE: DON'T kick someone off the party line just cuz they lost +p
01319        *       (pinvite script removes +p after 5 mins automatically)
01320        */
01321       if ((dcc[i].type->flags & DCT_FILES) && !(u->flags & USER_XFER) &&
01322           !(u->flags & USER_MASTER)) {
01323         dprintf(i, "-+- POOF! -+-\n");
01324         dprintf(i, "You no longer have file area access.\n\n");
01325         putlog(LOG_MISC, "*", "DCC user [%s]%s removed from file system",
01326                dcc[i].nick, dcc[i].host);
01327         if (dcc[i].status & STAT_CHAT) {
01328           struct chat_info *ci;
01329 
01330           ci = dcc[i].u.file->chat;
01331           nfree(dcc[i].u.file);
01332           dcc[i].u.chat = ci;
01333           dcc[i].status &= (~STAT_CHAT);
01334           dcc[i].type = &DCC_CHAT;
01335           if (dcc[i].u.chat->channel >= 0) {
01336             chanout_but(-1, dcc[i].u.chat->channel,
01337                         "*** %s has returned.\n", dcc[i].nick);
01338             if (dcc[i].u.chat->channel < GLOBAL_CHANS)
01339               botnet_send_join_idx(i, -1);
01340           }
01341         } else {
01342           killsock(dcc[i].sock);
01343           lostdcc(i);
01344         }
01345       }
01346     }
01347 
01348     if (dcc[i].type == &DCC_BOT && !egg_strcasecmp(u->handle, dcc[i].nick)) {
01349       if ((dcc[i].status & STAT_LEAF) && !(bot_flags(u) & BOT_LEAF))
01350         dcc[i].status &= ~(STAT_LEAF | STAT_WARNED);
01351       if (!(dcc[i].status & STAT_LEAF) && (bot_flags(u) & BOT_LEAF))
01352         dcc[i].status |= STAT_LEAF;
01353     }
01354   }
01355 
01356   return u->flags;
01357 }

int check_dcc_chanattrs ( struct userrec u,
char *  chname,
int  chflags,
int  ochatr 
)

Definition at line 1359 of file cmds.c.

References botnet_send_join_idx, flag_record::chan, dcc_t::chat, check_conflags, chat_info::con_flags, conmask, DCC_CHAT, dcc_total, DCT_MASTER, chanset_t::dname, dprintf, egg_strcasecmp, FR_CHAN, FR_GLOBAL, get_user_flagrec, userrec::handle, flag_record::match, chanset_t::next, dcc_t::nick, chanset_t::type, dcc_t::u, USER_MASTER, USER_OP, and USER_OWNER.

01361 {
01362   int i, found = 0;
01363   struct flag_record fr = { FR_CHAN, 0, 0, 0, 0, 0 };
01364   struct chanset_t *chan;
01365 
01366   if (!u)
01367     return 0;
01368   for (i = 0; i < dcc_total; i++) {
01369     if ((dcc[i].type->flags & DCT_MASTER) &&
01370         !egg_strcasecmp(u->handle, dcc[i].nick)) {
01371       if ((dcc[i].type == &DCC_CHAT) &&
01372           ((chflags & (USER_OP | USER_MASTER | USER_OWNER)) !=
01373           (ochatr & (USER_OP | USER_MASTER | USER_OWNER))))
01374         botnet_send_join_idx(i, -1);
01375       if ((ochatr & USER_MASTER) && !(chflags & USER_MASTER)) {
01376         dprintf(i, "*** POOF! ***\n");
01377         dprintf(i, "You are no longer a master on %s.\n", chname);
01378       }
01379       if (!(ochatr & USER_MASTER) && (chflags & USER_MASTER)) {
01380         dcc[i].u.chat->con_flags |= conmask;
01381         dprintf(i, "*** POOF! ***\n");
01382         dprintf(i, "You are now a master on %s.\n", chname);
01383       }
01384       if (!(ochatr & USER_OWNER) && (chflags & USER_OWNER)) {
01385         dprintf(i, "@@@ POOF! @@@\n");
01386         dprintf(i, "You are now an OWNER of %s.\n", chname);
01387       }
01388       if ((ochatr & USER_OWNER) && !(chflags & USER_OWNER)) {
01389         dprintf(i, "@@@ POOF! @@@\n");
01390         dprintf(i, "You are no longer an owner of %s.\n", chname);
01391       }
01392       if (((ochatr & (USER_OP | USER_MASTER | USER_OWNER)) &&
01393           (!(chflags & (USER_OP | USER_MASTER | USER_OWNER)))) ||
01394           ((chflags & (USER_OP | USER_MASTER | USER_OWNER)) &&
01395           (!(ochatr & (USER_OP | USER_MASTER | USER_OWNER))))) {
01396 
01397         for (chan = chanset; chan && !found; chan = chan->next) {
01398           get_user_flagrec(u, &fr, chan->dname);
01399           if (fr.chan & (USER_OP | USER_MASTER | USER_OWNER))
01400             found = 1;
01401         }
01402         if (!chan)
01403           chan = chanset;
01404         if (chan)
01405           strcpy(dcc[i].u.chat->con_chan, chan->dname);
01406         else
01407           strcpy(dcc[i].u.chat->con_chan, "*");
01408       }
01409       fr.match = (FR_CHAN | FR_GLOBAL);
01410       get_user_flagrec(u, &fr, dcc[i].u.chat->con_chan);
01411       dcc[i].u.chat->con_flags = check_conflags(&fr,
01412                                                 dcc[i].u.chat->con_flags);
01413     }
01414   }
01415   return chflags;
01416 }

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

Definition at line 470 of file cmds.c.

References dprintf, LOG_MISC, and putlog.

00471 {
00472   if (!par[0]) {
00473     dprintf(idx, "Usage: addlog <message>\n");
00474     return;
00475   }
00476   dprintf(idx, "Placed entry in the log file.\n");
00477   putlog(LOG_MISC, "*", "%s: %s", dcc[idx].nick, par);
00478 }

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

Definition at line 381 of file cmds.c.

References set_away().

00382 {
00383   if (strlen(par) > 60)
00384     par[60] = 0;
00385   set_away(idx, par);
00386 }

Here is the call graph for this function:

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

Definition at line 388 of file cmds.c.

References not_away().

00389 {
00390   not_away(idx);
00391 }

Here is the call graph for this function:

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

Definition at line 1200 of file cmds.c.

References call_hook, dprintf, HOOK_BACKUP, LOG_CMDS, and putlog.

01201 {
01202   putlog(LOG_CMDS, "*", "#%s# backup", dcc[idx].nick);
01203   dprintf(idx, "Backing up the channel & user files...\n");
01204   call_hook(HOOK_BACKUP);
01205 }

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

Definition at line 1237 of file cmds.c.

References dcc_total, DCT_MASTER, dprintf, and simple_sprintf.

01238 {
01239   char s[1024];
01240   int i;
01241 
01242   if (!par[0]) {
01243     dprintf(idx, "Usage: banner <message>\n");
01244     return;
01245   }
01246   simple_sprintf(s, "\007### Botwide: [%s] %s\n", dcc[idx].nick, par);
01247   for (i = 0; i < dcc_total; i++)
01248     if (dcc[i].type->flags & DCT_MASTER)
01249       dprintf(i, "%s", s);
01250 }

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

Definition at line 1231 of file cmds.c.

References LOG_CMDS, putlog, and tell_binds().

01232 {
01233   putlog(LOG_CMDS, "*", "#%s# binds %s", dcc[idx].nick, par);
01234   tell_binds(idx, par);
01235 }

Here is the call graph for this function:

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

Definition at line 587 of file cmds.c.

References botnet_send_reject(), botnetnick, dcc_total, DCT_CANBOOT, DCT_FILES, do_boot(), dprintf, egg_strcasecmp, dcc_table::flags, userrec::flags, get_user_by_handle, HANDLEN, LOG_BOTS, LOG_CMDS, newsplit, nextbot, NULL, putlog, remote_boots, splitcn(), dcc_t::type, USER_MASTER, and USER_OWNER.

00588 {
00589   int i, files = 0, ok = 0;
00590   char *who;
00591   struct userrec *u2;
00592 
00593   if (!par[0]) {
00594     dprintf(idx, "Usage: boot nick[@bot]\n");
00595     return;
00596   }
00597   who = newsplit(&par);
00598   if (strchr(who, '@') != NULL) {
00599     char whonick[HANDLEN + 1];
00600 
00601     splitcn(whonick, who, '@', HANDLEN + 1);
00602     if (!egg_strcasecmp(who, botnetnick)) {
00603       cmd_boot(u, idx, whonick);
00604       return;
00605     }
00606     if (remote_boots > 0) {
00607       i = nextbot(who);
00608       if (i < 0) {
00609         dprintf(idx, "No such bot connected.\n");
00610         return;
00611       }
00612       botnet_send_reject(i, dcc[idx].nick, botnetnick, whonick,
00613                          who, par[0] ? par : dcc[idx].nick);
00614       putlog(LOG_BOTS, "*", "#%s# boot %s@%s (%s)", dcc[idx].nick, whonick,
00615              who, par[0] ? par : dcc[idx].nick);
00616     } else
00617       dprintf(idx, "Remote boots are disabled here.\n");
00618     return;
00619   }
00620   for (i = 0; i < dcc_total; i++)
00621     if (!egg_strcasecmp(dcc[i].nick, who) && !ok &&
00622         (dcc[i].type->flags & DCT_CANBOOT)) {
00623       u2 = get_user_by_handle(userlist, dcc[i].nick);
00624       if (u2 && (u2->flags & USER_OWNER) &&
00625           egg_strcasecmp(dcc[idx].nick, who)) {
00626         dprintf(idx, "You can't boot a bot owner.\n");
00627         return;
00628       }
00629       if (u2 && (u2->flags & USER_MASTER) && !(u && (u->flags & USER_MASTER))) {
00630         dprintf(idx, "You can't boot a bot master.\n");
00631         return;
00632       }
00633       files = (dcc[i].type->flags & DCT_FILES);
00634       if (files)
00635         dprintf(idx, "Booted %s from the file area.\n", dcc[i].nick);
00636       else
00637         dprintf(idx, "Booted %s from the party line.\n", dcc[i].nick);
00638       putlog(LOG_CMDS, "*", "#%s# boot %s %s", dcc[idx].nick, who, par);
00639       do_boot(i, dcc[idx].nick, par);
00640       ok = 1;
00641     }
00642   if (!ok)
00643     dprintf(idx, "Who?  No such person on the party line.\n");
00644 }

Here is the call graph for this function:

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

Definition at line 1600 of file cmds.c.

References Assert, flag_record::bot, BOT_BOT, BOT_GLOBAL, BOT_SHARE, break_down_flags, build_flags, flag_record::chan, CHANMETA, DCC_FORK_BOT, DCC_RELAY, dcc_total, chanset_t::dname, dprintf, egg_strcasecmp, findchan_by_dname, userrec::flags, FR_BOT, FR_CHAN, FR_GLOBAL, get_user_by_handle, get_user_flagrec, glob_botmast, glob_owner, flag_record::global, LOG_CMDS, flag_record::match, newsplit, nfree, nmalloc, NULL, putlog, set_user_flagrec, flag_record::udef_chan, user, and USER_BOT.

01601 {
01602   char *hand, *chg = NULL, *arg = NULL, *tmpchg = NULL, work[1024];
01603   struct chanset_t *chan = NULL;
01604   struct userrec *u2;
01605   struct flag_record  pls = { 0, 0, 0, 0, 0, 0 },
01606                       mns = { 0, 0, 0, 0, 0, 0 },
01607                       user = { 0, 0, 0, 0, 0, 0 };
01608   int idx2;
01609 
01610   if (!par[0]) {
01611     dprintf(idx, "Usage: botattr <handle> [changes] [channel]\n");
01612     return;
01613   }
01614   hand = newsplit(&par);
01615   u2 = get_user_by_handle(userlist, hand);
01616   if (!u2 || !(u2->flags & USER_BOT)) {
01617     dprintf(idx, "No such bot!\n");
01618     return;
01619   }
01620   for (idx2 = 0; idx2 < dcc_total; idx2++)
01621     if (dcc[idx2].type != &DCC_RELAY && dcc[idx2].type != &DCC_FORK_BOT &&
01622         !egg_strcasecmp(dcc[idx2].nick, hand))
01623       break;
01624   if (idx2 != dcc_total) {
01625     dprintf(idx,
01626             "You may not change the attributes of a directly linked bot.\n");
01627     return;
01628   }
01629   /* Parse args */
01630   if (par[0]) {
01631     arg = newsplit(&par);
01632     if (par[0]) {
01633       /* .botattr <handle> <changes> <channel> */
01634       chg = arg;
01635       arg = newsplit(&par);
01636       chan = findchan_by_dname(arg);
01637     } else {
01638       chan = findchan_by_dname(arg);
01639       /* Consider modeless channels, starting with '+' */
01640       if (!(arg[0] == '+' && chan) &&
01641           !(arg[0] != '+' && strchr(CHANMETA, arg[0]))) {
01642         /* .botattr <handle> <changes> */
01643         chg = arg;
01644         chan = NULL; /* uh, !strchr (CHANMETA, channel[0]) && channel found?? */
01645         arg = NULL;
01646       }
01647       /* .botattr <handle> <channel>: nothing to do... */
01648     }
01649   }
01650   /* arg:  pointer to channel name, NULL if none specified
01651    * chan: pointer to channel structure, NULL if none found or none specified
01652    * chg:  pointer to changes, NULL if none specified
01653    */
01654   Assert(!(!arg && chan));
01655   if (arg && !chan) {
01656     dprintf(idx, "No channel record for %s.\n", arg);
01657     return;
01658   }
01659   if (chg) {
01660     if (!arg && strpbrk(chg, "&|")) {
01661       /* botattr <handle> *[&|]*: use console channel if found... */
01662       if (!strcmp((arg = dcc[idx].u.chat->con_chan), "*"))
01663         arg = NULL;
01664       else
01665         chan = findchan_by_dname(arg);
01666       if (arg && !chan) {
01667         dprintf(idx, "Invalid console channel %s.\n", arg);
01668         return;
01669       }
01670     } else if (arg && !strpbrk(chg, "&|")) {
01671       tmpchg = nmalloc(strlen(chg) + 2);
01672       strcpy(tmpchg, "|");
01673       strcat(tmpchg, chg);
01674       chg = tmpchg;
01675     }
01676   }
01677   par = arg;
01678 
01679   user.match = FR_GLOBAL;
01680   get_user_flagrec(u, &user, chan ? chan->dname : 0);
01681   if (!glob_botmast(user)) {
01682     dprintf(idx, "You do not have Bot Master privileges.\n");
01683     if (tmpchg)
01684       nfree(tmpchg);
01685     return;
01686   }
01687   if (chg) {
01688     user.match = FR_BOT | (chan ? FR_CHAN : 0);
01689     pls.match = user.match;
01690     break_down_flags(chg, &pls, &mns);
01691     /* No-one can change these flags on-the-fly */
01692     pls.global &=~BOT_BOT;
01693     mns.global &=~BOT_BOT;
01694 
01695     if (chan && glob_owner(user)) {
01696       pls.chan &= BOT_SHARE;
01697       mns.chan &= BOT_SHARE;
01698     } else {
01699       pls.chan = 0;
01700       mns.chan = 0;
01701     }
01702     if (!glob_owner(user)) {
01703       pls.bot &= ~(BOT_SHARE | BOT_GLOBAL);
01704       mns.bot &= ~(BOT_SHARE | BOT_GLOBAL);
01705     }
01706     user.match = FR_BOT | (chan ? FR_CHAN : 0);
01707     get_user_flagrec(u2, &user, par);
01708     user.bot = (user.bot | pls.bot) & ~mns.bot;
01709     if ((user.bot & BOT_SHARE) == BOT_SHARE)
01710       user.bot &= ~BOT_SHARE;
01711     if (chan)
01712       user.chan = (user.chan | pls.chan) & ~mns.chan;
01713     set_user_flagrec(u2, &user, par);
01714   }
01715   if (chan)
01716     putlog(LOG_CMDS, "*", "#%s# (%s) botattr %s %s",
01717            dcc[idx].nick, chan->dname, hand, chg ? chg : "");
01718   else
01719     putlog(LOG_CMDS, "*", "#%s# botattr %s %s", dcc[idx].nick, hand,
01720            chg ? chg : "");
01721   /* get current flags and display them */
01722   if (!chan || pls.bot || mns.bot) {
01723     user.match = FR_BOT;
01724     get_user_flagrec(u2, &user, NULL);
01725     build_flags(work, &user, NULL);
01726     if (work[0] != '-')
01727       dprintf(idx, "Bot flags for %s are now +%s.\n", hand, work);
01728     else
01729       dprintf(idx, "There are no bot flags for %s.\n", hand);
01730   }
01731   if (chan) {
01732     user.match = FR_CHAN;
01733     get_user_flagrec(u2, &user, par);
01734     user.chan &= BOT_SHARE;
01735     user.udef_chan = 0; /* udef chan flags are user only */
01736     build_flags(work, &user, NULL);
01737     if (work[0] != '-')
01738       dprintf(idx, "Bot flags for %s on %s are now +%s.\n", hand,
01739               chan->dname, work);
01740     else
01741       dprintf(idx, "There are no bot flags for %s on %s.\n", hand, chan->dname);
01742   }
01743   if (tmpchg)
01744     nfree(tmpchg);
01745 }

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

Definition at line 241 of file cmds.c.

References BOT_NOCHANNELS, botnet_send_infoq(), botnetnick, channel_secret, days, chanset_t::dname, dprintf, LOG_CMDS, module_find, network, chanset_t::next, now, online_since, putlog, simple_sprintf, time_t, and ver.

00242 {
00243   char s[512], s2[32];
00244   struct chanset_t *chan;
00245   time_t now2;
00246   int hr, min;
00247 
00248   now2 = now - online_since;
00249   s2[0] = 0;
00250   if (now2 > 86400) {
00251     int days = now2 / 86400;
00252 
00253     /* Days */
00254     sprintf(s2, "%d day", days);
00255     if (days >= 2)
00256       strcat(s2, "s");
00257     strcat(s2, ", ");
00258     now2 -= days * 86400;
00259   }
00260   hr = (time_t) ((int) now2 / 3600);
00261   now2 -= (hr * 3600);
00262   min = (time_t) ((int) now2 / 60);
00263   sprintf(&s2[strlen(s2)], "%02d:%02d", (int) hr, (int) min);
00264   putlog(LOG_CMDS, "*", "#%s# botinfo", dcc[idx].nick);
00265   simple_sprintf(s, "%d:%s@%s", dcc[idx].sock, dcc[idx].nick, botnetnick);
00266   botnet_send_infoq(-1, s);
00267   s[0] = 0;
00268   if (module_find("server", 0, 0)) {
00269     for (chan = chanset; chan; chan = chan->next) {
00270       if (!channel_secret(chan)) {
00271         if ((strlen(s) + strlen(chan->dname) + strlen(network)
00272              + strlen(botnetnick) + strlen(ver) + 1) >= 490) {
00273           strcat(s, "++  ");
00274           break;                /* yeesh! */
00275         }
00276         strcat(s, chan->dname);
00277         strcat(s, ", ");
00278       }
00279     }
00280 
00281     if (s[0]) {
00282       s[strlen(s) - 2] = 0;
00283       dprintf(idx, "*** [%s] %s <%s> (%s) [UP %s]\n", botnetnick,
00284               ver, network, s, s2);
00285     } else
00286       dprintf(idx, "*** [%s] %s <%s> (%s) [UP %s]\n", botnetnick,
00287               ver, network, BOT_NOCHANNELS, s2);
00288   } else
00289     dprintf(idx, "*** [%s] %s <NO_IRC> [UP %s]\n", botnetnick, ver, s2);
00290 }

Here is the call graph for this function:

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

Definition at line 413 of file cmds.c.

References LOG_CMDS, putlog, and tell_bots().

00414 {
00415   putlog(LOG_CMDS, "*", "#%s# bots", dcc[idx].nick);
00416   tell_bots(idx);
00417 }

Here is the call graph for this function:

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

Definition at line 419 of file cmds.c.

References LOG_CMDS, putlog, and tell_bottree.

00420 {
00421   putlog(LOG_CMDS, "*", "#%s# bottree", dcc[idx].nick);
00422   tell_bottree(idx, 0);
00423 }

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

Definition at line 944 of file cmds.c.

References bot_addr::address, bot_flags, BOT_SHARE, dprintf, userrec::flags, get_user, get_user_by_handle, userrec::handle, LOG_CMDS, newsplit, putlog, bot_addr::relay_port, set_user, strncpyz, bot_addr::telnet_port, UHOSTMAX, USER_BOT, user_malloc, USER_OWNER, and USERENTRY_BOTADDR.

00945 {
00946   int telnet_port = 3333, relay_port = 3333;
00947   char *handle, *addr, *p, *q;
00948   struct bot_addr *bi;
00949   struct userrec *u1;
00950 
00951   handle = newsplit(&par);
00952   if (!par[0]) {
00953     dprintf(idx, "Usage: chaddr <botname> "
00954             "<address[:telnet-port[/relay-port]]>\n");
00955     return;
00956   }
00957   addr = newsplit(&par);
00958   if (strlen(addr) > UHOSTMAX)
00959     addr[UHOSTMAX] = 0;
00960   u1 = get_user_by_handle(userlist, handle);
00961   if (!u1 || !(u1->flags & USER_BOT)) {
00962     dprintf(idx, "This command is only useful for tandem bots.\n");
00963     return;
00964   }
00965   if ((bot_flags(u1) & BOT_SHARE) && (!u || !(u->flags & USER_OWNER))) {
00966     dprintf(idx, "You can't change a share bot's address.\n");
00967     return;
00968   }
00969   putlog(LOG_CMDS, "*", "#%s# chaddr %s %s", dcc[idx].nick, handle, addr);
00970   dprintf(idx, "Changed bot's address.\n");
00971 
00972   bi = (struct bot_addr *) get_user(&USERENTRY_BOTADDR, u1);
00973   if (bi) {
00974     telnet_port = bi->telnet_port;
00975     relay_port = bi->relay_port;
00976   }
00977 
00978   bi = user_malloc(sizeof(struct bot_addr));
00979 
00980   q = strchr(addr, ':');
00981   if (!q) {
00982     bi->address = user_malloc(strlen(addr) + 1);
00983     strcpy(bi->address, addr);
00984     bi->telnet_port = telnet_port;
00985     bi->relay_port = relay_port;
00986   } else {
00987     bi->address = user_malloc(q - addr + 1);
00988     strncpyz(bi->address, addr, q - addr + 1);
00989     p = q + 1;
00990     bi->telnet_port = atoi(p);
00991     q = strchr(p, '/');
00992     if (!q) {
00993       bi->relay_port = bi->telnet_port;
00994     } else {
00995       bi->relay_port = atoi(q + 1);
00996     }
00997   }
00998   set_user(&USERENTRY_BOTADDR, u1, bi);
00999 }

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

Definition at line 1747 of file cmds.c.

References chat_info::away, botnet_send_join_idx, botnet_send_part_idx, botnetnick, chat_info::channel, chanout_but, dcc_t::chat, check_tcl_chjn, check_tcl_chpt(), CONSOLE_DOSTORE, dprintf, egg_strcasecmp, _module_entry::funcs, geticon, GLOBAL_CHANS, interp, module_find, newsplit, dcc_t::nick, not_away(), NULL, tcl_resultempty(), tcl_resultint(), and dcc_t::u.

01748 {
01749   char *arg;
01750   int newchan, oldchan;
01751   module_entry *me;
01752 
01753   arg = newsplit(&par);
01754   if (!egg_strcasecmp(arg, "off")) {
01755     /* Turn chat off */
01756     if (dcc[idx].u.chat->channel < 0) {
01757       dprintf(idx, "You weren't in chat anyway!\n");
01758       return;
01759     } else {
01760       dprintf(idx, "Leaving chat mode...\n");
01761       check_tcl_chpt(botnetnick, dcc[idx].nick, dcc[idx].sock,
01762                      dcc[idx].u.chat->channel);
01763       chanout_but(-1, dcc[idx].u.chat->channel,
01764                   "*** %s left the party line.\n", dcc[idx].nick);
01765       if (dcc[idx].u.chat->channel < GLOBAL_CHANS)
01766         botnet_send_part_idx(idx, "");
01767     }
01768     dcc[idx].u.chat->channel = -1;
01769   } else {
01770     if (arg[0] == '*') {
01771       if (((arg[1] < '0') || (arg[1] > '9'))) {
01772         if (!arg[1])
01773           newchan = 0;
01774         else {
01775           Tcl_SetVar(interp, "_chan", arg, 0);
01776           if ((Tcl_VarEval(interp, "assoc ", "$_chan", NULL) == TCL_OK) &&
01777               !tcl_resultempty())
01778             newchan = tcl_resultint();
01779           else
01780             newchan = -1;
01781         }
01782         if (newchan < 0) {
01783           dprintf(idx, "No channel exists by that name.\n");
01784           return;
01785         }
01786       } else
01787         newchan = GLOBAL_CHANS + atoi(arg + 1);
01788       if (newchan < GLOBAL_CHANS || newchan > 199999) {
01789         dprintf(idx, "Channel number out of range: local channels must be "
01790                 "*0-*99999.\n");
01791         return;
01792       }
01793     } else {
01794       if (((arg[0] < '0') || (arg[0] > '9')) && (arg[0])) {
01795         if (!egg_strcasecmp(arg, "on"))
01796           newchan = 0;
01797         else {
01798           Tcl_SetVar(interp, "_chan", arg, 0);
01799           if ((Tcl_VarEval(interp, "assoc ", "$_chan", NULL) == TCL_OK) &&
01800               !tcl_resultempty())
01801             newchan = tcl_resultint();
01802           else
01803             newchan = -1;
01804         }
01805         if (newchan < 0) {
01806           dprintf(idx, "No channel exists by that name.\n");
01807           return;
01808         }
01809       } else
01810         newchan = atoi(arg);
01811       if ((newchan < 0) || (newchan >= GLOBAL_CHANS)) {
01812         dprintf(idx, "Channel number out of range: must be between 0 and %d."
01813                 "\n", GLOBAL_CHANS);
01814         return;
01815       }
01816     }
01817     /* If coming back from being off the party line, make sure they're
01818      * not away.
01819      */
01820     if ((dcc[idx].u.chat->channel < 0) && (dcc[idx].u.chat->away != NULL))
01821       not_away(idx);
01822     if (dcc[idx].u.chat->channel == newchan) {
01823       if (!newchan) {
01824         dprintf(idx, "You're already on the party line!\n");
01825         return;
01826       } else {
01827         dprintf(idx, "You're already on channel %s%d!\n",
01828                 (newchan < GLOBAL_CHANS) ? "" : "*", newchan % GLOBAL_CHANS);
01829         return;
01830       }
01831     } else {
01832       oldchan = dcc[idx].u.chat->channel;
01833       if (oldchan >= 0)
01834         check_tcl_chpt(botnetnick, dcc[idx].nick, dcc[idx].sock, oldchan);
01835       if (!oldchan)
01836         chanout_but(-1, 0, "*** %s left the party line.\n", dcc[idx].nick);
01837       else if (oldchan > 0)
01838         chanout_but(-1, oldchan, "*** %s left the channel.\n", dcc[idx].nick);
01839       dcc[idx].u.chat->channel = newchan;
01840       if (!newchan) {
01841         dprintf(idx, "Entering the party line...\n");
01842         chanout_but(-1, 0, "*** %s joined the party line.\n", dcc[idx].nick);
01843       } else {
01844         dprintf(idx, "Joining channel '%s'...\n", arg);
01845         chanout_but(-1, newchan, "*** %s joined the channel.\n", dcc[idx].nick);
01846       }
01847       check_tcl_chjn(botnetnick, dcc[idx].nick, newchan, geticon(idx),
01848                      dcc[idx].sock, dcc[idx].host);
01849       if (newchan < GLOBAL_CHANS)
01850         botnet_send_join_idx(idx, oldchan);
01851       else if (oldchan < GLOBAL_CHANS)
01852         botnet_send_part_idx(idx, "");
01853     }
01854   }
01855   /* New style autosave here too -- rtc, 09/28/1999 */
01856   if ((me = module_find("console", 1, 1))) {
01857     Function *func = me->funcs;
01858 
01859     (func[CONSOLE_DOSTORE]) (idx);
01860   }
01861 }

Here is the call graph for this function:

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

Definition at line 1418 of file cmds.c.

References Assert, BOT_SHARE, break_down_flags, build_flags, flag_record::chan, chan_master, chan_owner, chan_sanity_check(), CHANMETA, check_dcc_attrs, check_dcc_chanattrs, chanset_t::dname, dprintf, findchan_by_dname, FR_CHAN, FR_GLOBAL, _module_entry::funcs, get_user_by_handle, get_user_flagrec, glob_botmast, glob_master, glob_owner, flag_record::global, IRC_CHECK_THIS_USER, LOG_CMDS, flag_record::match, module_find, newsplit, nfree, nmalloc, NULL, putlog, sanity_check, set_user_flagrec, flag_record::udef_chan, flag_record::udef_global, user, USER_BOT, USER_BOTMAST, USER_MASTER, USER_OWNER, USER_PARTY, USER_UNSHARED, and USER_XFER.

01419 {
01420   char *hand, *arg = NULL, *tmpchg = NULL, *chg = NULL, work[1024];
01421   struct chanset_t *chan = NULL;
01422   struct userrec *u2;
01423   struct flag_record pls = { 0, 0, 0, 0, 0, 0 },
01424                      mns = { 0, 0, 0, 0, 0, 0 },
01425                      user = { 0, 0, 0, 0, 0, 0 };
01426   module_entry *me;
01427   int fl = -1, of = 0, ocf = 0;
01428 
01429   if (!par[0]) {
01430     dprintf(idx, "Usage: chattr <handle> [changes] [channel]\n");
01431     return;
01432   }
01433   hand = newsplit(&par);
01434   u2 = get_user_by_handle(userlist, hand);
01435   if (!u2) {
01436     dprintf(idx, "No such user!\n");
01437     return;
01438   }
01439 
01440   /* Parse args */
01441   if (par[0]) {
01442     arg = newsplit(&par);
01443     if (par[0]) {
01444       /* .chattr <handle> <changes> <channel> */
01445       chg = arg;
01446       arg = newsplit(&par);
01447       chan = findchan_by_dname(arg);
01448     } else {
01449       chan = findchan_by_dname(arg);
01450       /* Consider modeless channels, starting with '+' */
01451       if (!(arg[0] == '+' && chan) &&
01452           !(arg[0] != '+' && strchr(CHANMETA, arg[0]))) {
01453         /* .chattr <handle> <changes> */
01454         chg = arg;
01455         chan = NULL; /* uh, !strchr (CHANMETA, channel[0]) && channel found?? */
01456         arg = NULL;
01457       }
01458       /* .chattr <handle> <channel>: nothing to do... */
01459     }
01460   }
01461   /* arg:  pointer to channel name, NULL if none specified
01462    * chan: pointer to channel structure, NULL if none found or none specified
01463    * chg:  pointer to changes, NULL if none specified
01464    */
01465   Assert(!(!arg && chan));
01466   if (arg && !chan) {
01467     dprintf(idx, "No channel record for %s.\n", arg);
01468     return;
01469   }
01470   if (chg) {
01471     if (!arg && strpbrk(chg, "&|")) {
01472       /* .chattr <handle> *[&|]*: use console channel if found... */
01473       if (!strcmp((arg = dcc[idx].u.chat->con_chan), "*"))
01474         arg = NULL;
01475       else
01476         chan = findchan_by_dname(arg);
01477       if (arg && !chan) {
01478         dprintf(idx, "Invalid console channel %s.\n", arg);
01479         return;
01480       }
01481     } else if (arg && !strpbrk(chg, "&|")) {
01482       tmpchg = nmalloc(strlen(chg) + 2);
01483       strcpy(tmpchg, "|");
01484       strcat(tmpchg, chg);
01485       chg = tmpchg;
01486     }
01487   }
01488   par = arg;
01489   user.match = FR_GLOBAL;
01490   if (chan)
01491     user.match |= FR_CHAN;
01492   get_user_flagrec(u, &user, chan ? chan->dname : 0);
01493   if (!chan && !glob_botmast(user)) {
01494     dprintf(idx, "You do not have Bot Master privileges.\n");
01495     if (tmpchg)
01496       nfree(tmpchg);
01497     return;
01498   }
01499   if (chan && !glob_master(user) && !chan_master(user)) {
01500     dprintf(idx, "You do not have channel master privileges for channel %s.\n",
01501             par);
01502     if (tmpchg)
01503       nfree(tmpchg);
01504     return;
01505   }
01506   user.match &= fl;
01507   if (chg) {
01508     pls.match = user.match;
01509     break_down_flags(chg, &pls, &mns);
01510     /* No-one can change these flags on-the-fly */
01511     pls.global &=~(USER_BOT);
01512     mns.global &=~(USER_BOT);
01513 
01514     if (chan) {
01515       pls.chan &= ~(BOT_SHARE);
01516       mns.chan &= ~(BOT_SHARE);
01517     }
01518     if (!glob_owner(user)) {
01519       pls.global &=~(USER_OWNER | USER_MASTER | USER_BOTMAST | USER_UNSHARED);
01520       mns.global &=~(USER_OWNER | USER_MASTER | USER_BOTMAST | USER_UNSHARED);
01521 
01522       if (chan) {
01523         pls.chan &= ~USER_OWNER;
01524         mns.chan &= ~USER_OWNER;
01525       }
01526       if (!glob_master(user)) {
01527         pls.global &=USER_PARTY | USER_XFER;
01528         mns.global &=USER_PARTY | USER_XFER;
01529 
01530         if (!glob_botmast(user)) {
01531           pls.global = 0;
01532           mns.global = 0;
01533         }
01534       }
01535     }
01536     if (chan && !chan_owner(user) && !glob_owner(user)) {
01537       pls.chan &= ~USER_MASTER;
01538       mns.chan &= ~USER_MASTER;
01539       if (!chan_master(user) && !glob_master(user)) {
01540         pls.chan = 0;
01541         mns.chan = 0;
01542       }
01543     }
01544     get_user_flagrec(u2, &user, par);
01545     if (user.match & FR_GLOBAL) {
01546       of = user.global;
01547       user.global = sanity_check((user.global |pls.global) &~mns.global);
01548 
01549       user.udef_global = (user.udef_global | pls.udef_global)
01550                          & ~mns.udef_global;
01551     }
01552     if (chan) {
01553       ocf = user.chan;
01554       user.chan = chan_sanity_check((user.chan | pls.chan) & ~mns.chan,
01555                                     user.global);
01556 
01557       user.udef_chan = (user.udef_chan | pls.udef_chan) & ~mns.udef_chan;
01558     }
01559     set_user_flagrec(u2, &user, par);
01560   }
01561   if (chan)
01562     putlog(LOG_CMDS, "*", "#%s# (%s) chattr %s %s",
01563            dcc[idx].nick, chan ? chan->dname : "*", hand, chg ? chg : "");
01564   else
01565     putlog(LOG_CMDS, "*", "#%s# chattr %s %s", dcc[idx].nick, hand,
01566            chg ? chg : "");
01567   /* Get current flags and display them */
01568   if (user.match & FR_GLOBAL) {
01569     user.match = FR_GLOBAL;
01570     if (chg)
01571       check_dcc_attrs(u2, of);
01572     get_user_flagrec(u2, &user, NULL);
01573     build_flags(work, &user, NULL);
01574     if (work[0] != '-')
01575       dprintf(idx, "Global flags for %s are now +%s.\n", hand, work);
01576     else
01577       dprintf(idx, "No global flags for %s.\n", hand);
01578   }
01579   if (chan) {
01580     user.match = FR_CHAN;
01581     get_user_flagrec(u2, &user, par);
01582     user.chan &= ~BOT_SHARE;
01583     if (chg)
01584       check_dcc_chanattrs(u2, chan->dname, user.chan, ocf);
01585     build_flags(work, &user, NULL);
01586     if (work[0] != '-')
01587       dprintf(idx, "Channel flags for %s on %s are now +%s.\n", hand,
01588               chan->dname, work);
01589     else
01590       dprintf(idx, "No flags for %s on %s.\n", hand, chan->dname);
01591   }
01592   if (chg && (me = module_find("irc", 0, 0))) {
01593     Function *func = me->funcs;
01594     (func[IRC_CHECK_THIS_USER]) (hand, 0, NULL);
01595   }
01596   if (tmpchg)
01597     nfree(tmpchg);
01598 }

Here is the call graph for this function:

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

Definition at line 823 of file cmds.c.

References BADHANDCHARS, bot_flags, BOT_SHARE, botnetnick, change_handle, dprintf, egg_strcasecmp, userrec::flags, get_user_by_handle, HANDLEN, isowner, LOG_CMDS, newsplit, nextbot, NULL, putlog, strncpyz, USER_BOT, USER_BOTMAST, USER_MASTER, and USER_OWNER.

00824 {
00825   char hand[HANDLEN + 1], newhand[HANDLEN + 1];
00826   int i, atr = u ? u->flags : 0, atr2;
00827   struct userrec *u2;
00828 
00829   strncpyz(hand, newsplit(&par), sizeof hand);
00830   strncpyz(newhand, newsplit(&par), sizeof newhand);
00831 
00832   if (!hand[0] || !newhand[0]) {
00833     dprintf(idx, "Usage: chhandle <oldhandle> <newhandle>\n");
00834     return;
00835   }
00836   for (i = 0; i < strlen(newhand); i++)
00837     if (((unsigned char) newhand[i] <= 32) || (newhand[i] == '@'))
00838       newhand[i] = '?';
00839   if (strchr(BADHANDCHARS, newhand[0]) != NULL)
00840     dprintf(idx, "Bizarre quantum forces prevent nicknames from starting with "
00841             "'%c'.\n", newhand[0]);
00842   else if (get_user_by_handle(userlist, newhand) &&
00843            egg_strcasecmp(hand, newhand))
00844     dprintf(idx, "Somebody is already using %s.\n", newhand);
00845   else {
00846     u2 = get_user_by_handle(userlist, hand);
00847     atr2 = u2 ? u2->flags : 0;
00848     if ((atr & USER_BOTMAST) && !(atr & USER_MASTER) && !(atr2 & USER_BOT))
00849       dprintf(idx, "You can't change handles for non-bots.\n");
00850     else if ((bot_flags(u2) & BOT_SHARE) && !(atr & USER_OWNER))
00851       dprintf(idx, "You can't change share bot's nick.\n");
00852     else if ((atr2 & USER_OWNER) && !(atr & USER_OWNER) &&
00853              egg_strcasecmp(dcc[idx].nick, hand))
00854       dprintf(idx, "You can't change a bot owner's handle.\n");
00855     else if (isowner(hand) && egg_strcasecmp(dcc[idx].nick, hand))
00856       dprintf(idx, "You can't change a permanent bot owner's handle.\n");
00857     else if (!egg_strcasecmp(newhand, botnetnick) && (!(atr2 & USER_BOT) ||
00858              nextbot(hand) != -1))
00859       dprintf(idx, "Hey! That's MY name!\n");
00860     else if (change_handle(u2, newhand)) {
00861       putlog(LOG_CMDS, "*", "#%s# chhandle %s %s", dcc[idx].nick,
00862              hand, newhand);
00863       dprintf(idx, "Changed.\n");
00864     } else
00865       dprintf(idx, "Failed.\n");
00866   }
00867 }

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

Definition at line 902 of file cmds.c.

References bot_flags, BOT_SHARE, dprintf, egg_strcasecmp, userrec::flags, get_user_by_handle, userrec::handle, isowner, LOG_CMDS, newsplit, NULL, putlog, set_user, USER_BOT, USER_BOTMAST, USER_MASTER, USER_OWNER, and USERENTRY_PASS.

00903 {
00904   char *handle, *new;
00905   int atr = u ? u->flags : 0, l;
00906 
00907   if (!par[0])
00908     dprintf(idx, "Usage: chpass <handle> [password]\n");
00909   else {
00910     handle = newsplit(&par);
00911     u = get_user_by_handle(userlist, handle);
00912     if (!u)
00913       dprintf(idx, "No such user.\n");
00914     else if ((atr & USER_BOTMAST) && !(atr & USER_MASTER) &&
00915              !(u->flags & USER_BOT))
00916       dprintf(idx, "You can't change passwords for non-bots.\n");
00917     else if ((bot_flags(u) & BOT_SHARE) && !(atr & USER_OWNER))
00918       dprintf(idx, "You can't change a share bot's password.\n");
00919     else if ((u->flags & USER_OWNER) && !(atr & USER_OWNER) &&
00920              egg_strcasecmp(handle, dcc[idx].nick))
00921       dprintf(idx, "You can't change a bot owner's password.\n");
00922     else if (isowner(handle) && egg_strcasecmp(dcc[idx].nick, handle))
00923       dprintf(idx, "You can't change a permanent bot owner's password.\n");
00924     else if (!par[0]) {
00925       putlog(LOG_CMDS, "*", "#%s# chpass %s [nothing]", dcc[idx].nick, handle);
00926       set_user(&USERENTRY_PASS, u, NULL);
00927       dprintf(idx, "Removed password.\n");
00928     } else {
00929       l = strlen(new = newsplit(&par));
00930       if (l > 16)
00931         new[16] = 0;
00932       if (l < 6)
00933         dprintf(idx, "Please use at least 6 characters.\n");
00934       else {
00935         set_user(&USERENTRY_PASS, u, new);
00936         putlog(LOG_CMDS, "*", "#%s# chpass %s [something]", dcc[idx].nick,
00937                handle);
00938         dprintf(idx, "Changed password.\n");
00939       }
00940     }
00941   }
00942 }

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

Definition at line 1001 of file cmds.c.

References dprintf, egg_strcasecmp, userrec::flags, get_user_by_handle, LOG_CMDS, newsplit, NULL, putlog, set_user, USER_OWNER, and USERENTRY_COMMENT.

01002 {
01003   char *handle;
01004   struct userrec *u1;
01005 
01006   handle = newsplit(&par);
01007   if (!par[0]) {
01008     dprintf(idx, "Usage: comment <handle> <newcomment>\n");
01009     return;
01010   }
01011   u1 = get_user_by_handle(userlist, handle);
01012   if (!u1) {
01013     dprintf(idx, "No such user!\n");
01014     return;
01015   }
01016   if ((u1->flags & USER_OWNER) && !(u && (u->flags & USER_OWNER)) &&
01017       egg_strcasecmp(handle, dcc[idx].nick)) {
01018     dprintf(idx, "You can't change comment on a bot owner.\n");
01019     return;
01020   }
01021   putlog(LOG_CMDS, "*", "#%s# comment %s %s", dcc[idx].nick, handle, par);
01022   if (!egg_strcasecmp(par, "none")) {
01023     dprintf(idx, "Okay, comment blanked.\n");
01024     set_user(&USERENTRY_COMMENT, u1, NULL);
01025     return;
01026   }
01027   dprintf(idx, "Changed comment.\n");
01028   set_user(&USERENTRY_COMMENT, u1, par);
01029 }

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

Definition at line 646 of file cmds.c.

References chan_deop, chan_op, CHANMETA, dcc_t::chat, check_conflags, chat_info::con_flags, CONSOLE_DOSTORE, DCC_CHAT, dcc_total, dprintf, egg_strcasecmp, findchan_by_dname, FR_CHAN, FR_GLOBAL, _module_entry::funcs, get_user_flagrec, glob_master, glob_op, LOG_CMDS, logmodes, maskname(), masktype, module_find, newsplit, putlog, strncpyz, dcc_t::u, and user.

00647 {
00648   char *nick, s[2], s1[512];
00649   int dest = 0, i, ok = 0, pls;
00650   struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 };
00651   module_entry *me;
00652 
00653   if (!par[0]) {
00654     dprintf(idx, "Your console is %s: %s (%s).\n",
00655             dcc[idx].u.chat->con_chan,
00656             masktype(dcc[idx].u.chat->con_flags),
00657             maskname(dcc[idx].u.chat->con_flags));
00658     return;
00659   }
00660   get_user_flagrec(u, &fr, dcc[idx].u.chat->con_chan);
00661   strcpy(s1, par);
00662   nick = newsplit(&par);
00663   /* Don't remove '+' as someone couldn't have '+' in CHANMETA cause
00664    * he doesn't use IRCnet ++rtc.
00665    */
00666   if (nick[0] && !strchr(CHANMETA "+-*", nick[0]) && glob_master(fr)) {
00667     for (i = 0; i < dcc_total; i++)
00668       if (!egg_strcasecmp(nick, dcc[i].nick) &&
00669           (dcc[i].type == &DCC_CHAT) && (!ok)) {
00670         ok = 1;
00671         dest = i;
00672       }
00673     if (!ok) {
00674       dprintf(idx, "No such user on the party line!\n");
00675       return;
00676     }
00677     nick[0] = 0;
00678   } else
00679     dest = idx;
00680   if (!nick[0])
00681     nick = newsplit(&par);
00682   /* Consider modeless channels, starting with '+' */
00683   if ((nick[0] == '+' && findchan_by_dname(nick)) ||
00684       (nick[0] != '+' && strchr(CHANMETA "*", nick[0]))) {
00685     if (strcmp(nick, "*") && !findchan_by_dname(nick)) {
00686       dprintf(idx, "Invalid console channel: %s.\n", nick);
00687       return;
00688     }
00689     get_user_flagrec(u, &fr, nick);
00690     if (!chan_op(fr) && !(glob_op(fr) && !chan_deop(fr))) {
00691       dprintf(idx, "You don't have op or master access to channel %s.\n",
00692               nick);
00693       return;
00694     }
00695     strncpyz(dcc[dest].u.chat->con_chan, nick, 81);
00696     nick[0] = 0;
00697     if (dest != idx)
00698       get_user_flagrec(dcc[dest].user, &fr, dcc[dest].u.chat->con_chan);
00699   }
00700   if (!nick[0])
00701     nick = newsplit(&par);
00702   pls = 1;
00703   if (nick[0]) {
00704     if ((nick[0] != '+') && (nick[0] != '-'))
00705       dcc[dest].u.chat->con_flags = 0;
00706     for (; *nick; nick++) {
00707       if (*nick == '+')
00708         pls = 1;
00709       else if (*nick == '-')
00710         pls = 0;
00711       else {
00712         s[0] = *nick;
00713         s[1] = 0;
00714         if (pls)
00715           dcc[dest].u.chat->con_flags |= logmodes(s);
00716         else
00717           dcc[dest].u.chat->con_flags &= ~logmodes(s);
00718       }
00719     }
00720   }
00721   dcc[dest].u.chat->con_flags = check_conflags(&fr,
00722                                                dcc[dest].u.chat->con_flags);
00723   putlog(LOG_CMDS, "*", "#%s# console %s", dcc[idx].nick, s1);
00724   if (dest == idx) {
00725     dprintf(idx, "Set your console to %s: %s (%s).\n",
00726             dcc[idx].u.chat->con_chan,
00727             masktype(dcc[idx].u.chat->con_flags),
00728             maskname(dcc[idx].u.chat->con_flags));
00729   } else {
00730     dprintf(idx, "Set console of %s to %s: %s (%s).\n", dcc[dest].nick,
00731             dcc[dest].u.chat->con_chan,
00732             masktype(dcc[dest].u.chat->con_flags),
00733             maskname(dcc[dest].u.chat->con_flags));
00734     dprintf(dest, "%s set your console to %s: %s (%s).\n", dcc[idx].nick,
00735             dcc[dest].u.chat->con_chan,
00736             masktype(dcc[dest].u.chat->con_flags),
00737             maskname(dcc[dest].u.chat->con_flags));
00738   }
00739   /* New style autosave -- drummer,07/25/1999 */
00740   if ((me = module_find("console", 1, 1))) {
00741     Function *func = me->funcs;
00742 
00743     (func[CONSOLE_DOSTORE]) (dest);
00744   }
00745 }

Here is the call graph for this function:

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

Definition at line 581 of file cmds.c.

References LOG_CMDS, putlog, and tell_dcc().

00582 {
00583   putlog(LOG_CMDS, "*", "#%s# dccstat", dcc[idx].nick);
00584   tell_dcc(idx);
00585 }

Here is the call graph for this function:

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

Definition at line 1090 of file cmds.c.

References debug_help(), debug_mem_to_dcc(), egg_strcasecmp, LOG_CMDS, and putlog.

01091 {
01092   if (!egg_strcasecmp(par, "help")) {
01093     putlog(LOG_CMDS, "*", "#%s# debug help", dcc[idx].nick);
01094     debug_help(idx);
01095   } else {
01096     putlog(LOG_CMDS, "*", "#%s# debug", dcc[idx].nick);
01097     debug_mem_to_dcc(idx);
01098   }
01099 }

Here is the call graph for this function:

void cmd_die ( struct userrec u,
int  idx,
char *  par 
)

Definition at line 1070 of file cmds.c.

References egg_snprintf, kill_bot, LOG_CMDS, putlog, quit_msg, and strncpyz.

01071 {
01072   char s1[1024], s2[1024];
01073 
01074   putlog(LOG_CMDS, "*", "#%s# die %s", dcc[idx].nick, par);
01075   if (par[0]) {
01076     egg_snprintf(s1, sizeof s1, "BOT SHUTDOWN (%s: %s)", dcc[idx].nick, par);
01077     egg_snprintf(s2, sizeof s2, "DIE BY %s!%s (%s)", dcc[idx].nick,
01078                  dcc[idx].host, par);
01079     strncpyz(quit_msg, par, 1024);
01080   } else {
01081     egg_snprintf(s1, sizeof s1, "BOT SHUTDOWN (Authorized by %s)",
01082                  dcc[idx].nick);
01083     egg_snprintf(s2, sizeof s2, "DIE BY %s!%s (request)", dcc[idx].nick,
01084                  dcc[idx].host);
01085     strncpyz(quit_msg, dcc[idx].nick, 1024);
01086   }
01087   kill_bot(s1, s2);
01088 }

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

Definition at line 1863 of file cmds.c.

References CONSOLE_DOSTORE, dprintf, egg_strcasecmp, _module_entry::funcs, module_find, STAT_ECHO, and dcc_t::status.

01864 {
01865   module_entry *me;
01866 
01867   if (!par[0]) {
01868     dprintf(idx, "Echo is currently %s.\n", dcc[idx].status & STAT_ECHO ?
01869             "on" : "off");
01870     return;
01871   }
01872   if (!egg_strcasecmp(par, "on")) {
01873     dprintf(idx, "Echo turned on.\n");
01874     dcc[idx].status |= STAT_ECHO;
01875   } else if (!egg_strcasecmp(par, "off")) {
01876     dprintf(idx, "Echo turned off.\n");
01877     dcc[idx].status &= ~STAT_ECHO;
01878   } else {
01879     dprintf(idx, "Usage: echo <on/off>\n");
01880     return;
01881   }
01882   /* New style autosave here too -- rtc, 09/28/1999 */
01883   if ((me = module_find("console", 1, 1))) {
01884     Function *func = me->funcs;
01885 
01886     (func[CONSOLE_DOSTORE]) (idx);
01887   }
01888 }

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

Definition at line 2120 of file cmds.c.

References dprintf, LOG_CMDS, putlog, STAT_ECHO, STAT_TELNET, and dcc_t::status.

02121 {
02122   if (dcc[idx].status & STAT_TELNET) {
02123     dcc[idx].status |= STAT_ECHO;
02124     dcc[idx].status &= ~STAT_TELNET;
02125     dprintf(idx, "Turned off telnet codes.\n");
02126     putlog(LOG_CMDS, "*", "#%s# fixcodes (telnet off)", dcc[idx].nick);
02127   } else {
02128     dcc[idx].status |= STAT_TELNET;
02129     dcc[idx].status &= ~STAT_ECHO;
02130     dprintf(idx, "Turned on telnet codes.\n");
02131     putlog(LOG_CMDS, "*", "#%s# fixcodes (telnet on)", dcc[idx].nick);
02132   }
02133 }

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

Definition at line 869 of file cmds.c.

References BADHANDCHARS, botnetnick, change_handle, dprintf, egg_strcasecmp, get_user_by_handle, HANDLEN, LOG_CMDS, newsplit, NULL, putlog, and strncpyz.

00870 {
00871   char oldhandle[HANDLEN + 1], newhandle[HANDLEN + 1];
00872   int i;
00873 
00874   strncpyz(newhandle, newsplit(&par), sizeof newhandle);
00875 
00876   if (!newhandle[0]) {
00877     dprintf(idx, "Usage: handle <new-handle>\n");
00878     return;
00879   }
00880   for (i = 0; i < strlen(newhandle); i++)
00881     if (((unsigned char) newhandle[i] <= 32) || (newhandle[i] == '@'))
00882       newhandle[i] = '?';
00883   if (strchr(BADHANDCHARS, newhandle[0]) != NULL)
00884     dprintf(idx,
00885             "Bizarre quantum forces prevent handle from starting with '%c'.\n",
00886             newhandle[0]);
00887   else if (get_user_by_handle(userlist, newhandle) &&
00888            egg_strcasecmp(dcc[idx].nick, newhandle))
00889     dprintf(idx, "Somebody is already using %s.\n", newhandle);
00890   else if (!egg_strcasecmp(newhandle, botnetnick))
00891     dprintf(idx, "Hey!  That's MY name!\n");
00892   else {
00893     strncpyz(oldhandle, dcc[idx].nick, sizeof oldhandle);
00894     if (change_handle(u, newhandle)) {
00895       putlog(LOG_CMDS, "*", "#%s# handle %s", oldhandle, newhandle);
00896       dprintf(idx, "Okay, changed.\n");
00897     } else
00898       dprintf(idx, "Failed.\n");
00899   }
00900 }

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

Definition at line 438 of file cmds.c.

References chan_op, FR_CHAN, FR_GLOBAL, get_user_flagrec, glob_botmast, glob_op, LOG_CMDS, putlog, tellallhelp(), tellhelp, and tellwildhelp().

00439 {
00440   struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 };
00441 
00442   get_user_flagrec(u, &fr, dcc[idx].u.chat->con_chan);
00443   if (par[0]) {
00444     putlog(LOG_CMDS, "*", "#%s# help %s", dcc[idx].nick, par);
00445     if (!strcmp(par, "all"))
00446       tellallhelp(idx, "all", &fr);
00447     else if (strchr(par, '*') || strchr(par, '?')) {
00448       char *p = par;
00449 
00450       /* Check if the search pattern only consists of '*' and/or '?'
00451        * If it does, show help for "all" instead of listing all help
00452        * entries.
00453        */
00454       for (p = par; *p && ((*p == '*') || (*p == '?')); p++);
00455       if (*p)
00456         tellwildhelp(idx, par, &fr);
00457       else
00458         tellallhelp(idx, "all", &fr);
00459     } else
00460       tellhelp(idx, par, &fr, 0);
00461   } else {
00462     putlog(LOG_CMDS, "*", "#%s# help", dcc[idx].nick);
00463     if (glob_op(fr) || glob_botmast(fr) || chan_op(fr))
00464       tellhelp(idx, "help", &fr, 0);
00465     else
00466       tellhelp(idx, "partyline", &fr, 0);
00467   }
00468 }

Here is the call graph for this function:

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

Definition at line 2398 of file cmds.c.

References LOG_CMDS, putlog, and tell_ignores().

02399 {
02400   putlog(LOG_CMDS, "*", "#%s# ignores %s", dcc[idx].nick, par);
02401   tell_ignores(idx, par);
02402 }

Here is the call graph for this function:

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

Definition at line 1128 of file cmds.c.

References botlink(), botnet_send_link(), botnetnick, dprintf, egg_strcasecmp, LOG_CMDS, newsplit, nextbot, putlog, and simple_sprintf.

01129 {
01130   char *s;
01131   int i;
01132 
01133   if (!par[0]) {
01134     dprintf(idx, "Usage: link [some-bot] <new-bot>\n");
01135     return;
01136   }
01137   putlog(LOG_CMDS, "*", "#%s# link %s", dcc[idx].nick, par);
01138   s = newsplit(&par);
01139   if (!par[0] || !egg_strcasecmp(par, botnetnick))
01140     botlink(dcc[idx].nick, idx, s);
01141   else {
01142     char x[40];
01143 
01144     i = nextbot(s);
01145     if (i < 0) {
01146       dprintf(idx, "No such bot online.\n");
01147       return;
01148     }
01149     simple_sprintf(x, "%d:%s@%s", dcc[idx].sock, dcc[idx].nick, botnetnick);
01150     botnet_send_link(i, x, s, par);
01151   }
01152 }

Here is the call graph for this function:

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

Definition at line 2267 of file cmds.c.

References dprintf, isowner, LOG_CMDS, MISC_NOSUCHCMD, MISC_USAGE, MOD_LOADED, MOD_LOADERROR, module_load, must_be_owner, and putlog.

02268 {
02269   const char *p;
02270 
02271   if (!(isowner(dcc[idx].nick)) && (must_be_owner)) {
02272     dprintf(idx, MISC_NOSUCHCMD);
02273     return;
02274   }
02275   if (!par[0]) {
02276     dprintf(idx, "%s: loadmod <module>\n", MISC_USAGE);
02277   } else {
02278     p = module_load(par);
02279     if (p)
02280       dprintf(idx, "%s: %s %s\n", par, MOD_LOADERROR, p);
02281     else {
02282       putlog(LOG_CMDS, "*", "#%s# loadmod %s", dcc[idx].nick, par);
02283       dprintf(idx, MOD_LOADED, par);
02284       dprintf(idx, "\n");
02285     }
02286   }
02287 }

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

Definition at line 525 of file cmds.c.

References CHANMETA, dprintf, userrec::flags, LOG_CMDS, newsplit, NULL, putlog, tell_users_match(), and USER_MASTER.

00526 {
00527   int start = 1, limit = 20;
00528   char *s, *s1, *chname;
00529 
00530   if (!par[0]) {
00531     dprintf(idx, "Usage: match <nick/host> [[skip] count]\n");
00532     return;
00533   }
00534   putlog(LOG_CMDS, "*", "#%s# match %s", dcc[idx].nick, par);
00535   s = newsplit(&par);
00536   if (strchr(CHANMETA, par[0]) != NULL)
00537     chname = newsplit(&par);
00538   else
00539     chname = "";
00540   if (atoi(par) > 0) {
00541     s1 = newsplit(&par);
00542     if (atoi(par) > 0) {
00543       start = atoi(s1);
00544       limit = atoi(par);
00545     } else
00546       limit = atoi(s1);
00547   }
00548   tell_users_match(idx, s, start, limit, u ? (u->flags & USER_MASTER) : 0,
00549                    chname);
00550 }

Here is the call graph for this function:

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

Definition at line 329 of file cmds.c.

References botnet_send_act(), botnetnick, chat_info::channel, dcc_t::chat, check_tcl_act, dcc_total, DCT_CHAT, dprintf, not_away(), NULL, STAT_ECHO, dcc_t::status, chanset_t::type, and dcc_t::u.

00330 {
00331   int i;
00332 
00333   if (dcc[idx].u.chat->channel < 0) {
00334     dprintf(idx, "You have chat turned off.\n");
00335     return;
00336   }
00337   if (!par[0]) {
00338     dprintf(idx, "Usage: me <action>\n");
00339     return;
00340   }
00341   if (dcc[idx].u.chat->away != NULL)
00342     not_away(idx);
00343   for (i = 0; i < dcc_total; i++)
00344     if ((dcc[i].type->flags & DCT_CHAT) &&
00345         (dcc[i].u.chat->channel == dcc[idx].u.chat->channel) &&
00346         ((i != idx) || (dcc[i].status & STAT_ECHO)))
00347       dprintf(i, "* %s %s\n", dcc[idx].nick, par);
00348   botnet_send_act(idx, botnetnick, dcc[idx].nick,
00349                   dcc[idx].u.chat->channel, par);
00350   check_tcl_act(dcc[idx].nick, dcc[idx].u.chat->channel, par);
00351 }

Here is the call graph for this function:

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

Definition at line 2558 of file cmds.c.

References bot_flags, BOT_SHARE, chan_deop, chan_kick, chan_master, chan_owner, delhost_by_handle, dprintf, egg_strcasecmp, fr, FR_ANYWH, FR_CHAN, FR_GLOBAL, _module_entry::funcs, get_user_by_handle, get_user_flagrec, glob_bot, glob_botmast, glob_deop, glob_kick, glob_master, glob_owner, IRC_CHECK_THIS_USER, LOG_CMDS, module_find, newsplit, dcc_t::nick, NULL, and putlog.

02559 {
02560   char *handle, *host;
02561   struct userrec *u2;
02562   struct flag_record fr2 = { FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0, 0, 0 },
02563                       fr = { FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0, 0, 0 };
02564   module_entry *me;
02565 
02566   if (!par[0]) {
02567     dprintf(idx, "Usage: -host [handle] <hostmask>\n");
02568     return;
02569   }
02570   handle = newsplit(&par);
02571   if (par[0]) {
02572     host = newsplit(&par);
02573     u2 = get_user_by_handle(userlist, handle);
02574   } else {
02575     host = handle;
02576     handle = dcc[idx].nick;
02577     u2 = u;
02578   }
02579   if (!u2 || !u) {
02580     dprintf(idx, "No such user.\n");
02581     return;
02582   }
02583 
02584   get_user_flagrec(u, &fr, NULL);
02585   get_user_flagrec(u2, &fr2, NULL);
02586   /* check to see if user is +d or +k and don't let them remove hosts */
02587   if (((glob_deop(fr) || glob_kick(fr)) && !glob_master(fr)) ||
02588       ((chan_deop(fr) || chan_kick(fr)) && !chan_master(fr))) {
02589     dprintf(idx, "You can't remove hostmasks while having the +d or +k "
02590             "flag.\n");
02591     return;
02592   }
02593 
02594   if (egg_strcasecmp(handle, dcc[idx].nick)) {
02595     if (!glob_master(fr) && !glob_bot(fr2) && !chan_master(fr)) {
02596       dprintf(idx, "You can't remove hostmasks from non-bots.\n");
02597       return;
02598     }
02599     if (glob_bot(fr2) && (bot_flags(u2) & BOT_SHARE) && !glob_owner(fr)) {
02600       dprintf(idx, "You can't remove hostmasks from a share bot.\n");
02601       return;
02602     }
02603     if ((glob_owner(fr2) || glob_master(fr2)) && !glob_owner(fr)) {
02604       dprintf(idx, "You can't remove hostmasks from a bot owner/master.\n");
02605       return;
02606     }
02607     if ((chan_owner(fr2) || chan_master(fr2)) && !glob_master(fr) &&
02608         !glob_owner(fr) && !chan_owner(fr)) {
02609       dprintf(idx, "You can't remove hostmasks from a channel owner/master.\n");
02610       return;
02611     }
02612     if (!glob_botmast(fr) && !glob_master(fr) && !chan_master(fr)) {
02613       dprintf(idx, "Permission denied.\n");
02614       return;
02615     }
02616   }
02617   if (delhost_by_handle(handle, host)) {
02618     putlog(LOG_CMDS, "*", "#%s# -host %s %s", dcc[idx].nick, handle, host);
02619     dprintf(idx, "Removed '%s' from %s.\n", host, handle);
02620     if ((me = module_find("irc", 0, 0))) {
02621       Function *func = me->funcs;
02622 
02623       (func[IRC_CHECK_THIS_USER]) (handle, 2, host);
02624     }
02625   } else
02626     dprintf(idx, "Failed.\n");
02627 }

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

Definition at line 2382 of file cmds.c.

References delignore, dprintf, LOG_CMDS, putlog, strncpyz, and UHOSTLEN.

02383 {
02384   char buf[UHOSTLEN];
02385 
02386   if (!par[0]) {
02387     dprintf(idx, "Usage: -ignore <hostmask | ignore #>\n");
02388     return;
02389   }
02390   strncpyz(buf, par, sizeof buf);
02391   if (delignore(buf)) {
02392     putlog(LOG_CMDS, "*", "#%s# -ignore %s", dcc[idx].nick, buf);
02393     dprintf(idx, "No longer ignoring: %s\n", buf);
02394   } else
02395     dprintf(idx, "That ignore cannot be found.\n");
02396 }

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

Definition at line 2430 of file cmds.c.

References bot_flags, BOT_SHARE, DCC_FORK_BOT, DCC_RELAY, dcc_total, deluser, dprintf, egg_strcasecmp, userrec::flags, _module_entry::funcs, get_user_by_handle, userrec::handle, IRC_CHECK_THIS_USER, isowner, LOG_CMDS, module_find, newsplit, NULL, putlog, USER_BOT, USER_BOTMAST, USER_MASTER, and USER_OWNER.

02431 {
02432   int idx2;
02433   char *handle;
02434   struct userrec *u2;
02435   module_entry *me;
02436 
02437   if (!par[0]) {
02438     dprintf(idx, "Usage: -user <hand>\n");
02439     return;
02440   }
02441   handle = newsplit(&par);
02442   u2 = get_user_by_handle(userlist, handle);
02443   if (!u2 || !u) {
02444     dprintf(idx, "No such user!\n");
02445     return;
02446   }
02447   if (isowner(u2->handle)) {
02448     dprintf(idx, "You can't remove a permanent bot owner!\n");
02449     return;
02450   }
02451   if ((u2->flags & USER_OWNER) && !(u->flags & USER_OWNER)) {
02452     dprintf(idx, "You can't remove a bot owner!\n");
02453     return;
02454   }
02455   if (u2->flags & USER_BOT) {
02456     if ((bot_flags(u2) & BOT_SHARE) && !(u->flags & USER_OWNER)) {
02457       dprintf(idx, "You can't remove share bots.\n");
02458       return;
02459     }
02460     for (idx2 = 0; idx2 < dcc_total; idx2++)
02461       if (dcc[idx2].type != &DCC_RELAY && dcc[idx2].type != &DCC_FORK_BOT &&
02462           !egg_strcasecmp(dcc[idx2].nick, handle))
02463         break;
02464     if (idx2 != dcc_total) {
02465       dprintf(idx, "You can't remove a directly linked bot.\n");
02466       return;
02467     }
02468   }
02469   if ((u->flags & USER_BOTMAST) && !(u->flags & USER_MASTER) &&
02470       !(u2->flags & USER_BOT)) {
02471     dprintf(idx, "You can't remove users who aren't bots!\n");
02472     return;
02473   }
02474   if ((me = module_find("irc", 0, 0))) {
02475     Function *func = me->funcs;
02476 
02477     (func[IRC_CHECK_THIS_USER]) (handle, 1, NULL);
02478   }
02479   if (deluser(handle)) {
02480     putlog(LOG_CMDS, "*", "#%s# -user %s", dcc[idx].nick, handle);
02481     dprintf(idx, "Deleted %s.\n", handle);
02482   } else
02483     dprintf(idx, "Failed.\n");
02484 }

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

Definition at line 2261 of file cmds.c.

References do_module_report(), LOG_CMDS, NULL, and putlog.

02262 {
02263   putlog(LOG_CMDS, "*", "#%s# module %s", dcc[idx].nick, par);
02264   do_module_report(idx, 2, par[0] ? par : NULL);
02265 }

Here is the call graph for this function:

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

Definition at line 2629 of file cmds.c.

References flag_record::bot, botnetnick, dprintf, LOG_CMDS, _module_entry::major, _module_entry::minor, _module_entry::name, newsplit, _module_entry::next, nextbot, and putlog.

02630 {
02631   int ptr;
02632   char *bot;
02633   module_entry *me;
02634 
02635   putlog(LOG_CMDS, "*", "#%s# modules %s", dcc[idx].nick, par);
02636 
02637   if (!par[0]) {
02638     dprintf(idx, "Modules loaded:\n");
02639     for (me = module_list; me; me = me->next)
02640       dprintf(idx, "  Module: %s (v%d.%d)\n", me->name, me->major, me->minor);
02641     dprintf(idx, "End of modules list.\n");
02642   } else {
02643     bot = newsplit(&par);
02644     if ((ptr = nextbot(bot)) >= 0)
02645       dprintf(ptr, "v %s %s %d:%s\n", botnetnick, bot, dcc[idx].sock,
02646               dcc[idx].nick);
02647     else
02648       dprintf(idx, "No such bot online.\n");
02649   }
02650 }

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

Definition at line 353 of file cmds.c.

References botnet_send_motd(), botnetnick, dprintf, egg_strcasecmp, userrec::flags, LOG_CMDS, nextbot, dcc_t::nick, putlog, show_motd, simple_sprintf, dcc_t::sock, STAT_TELNET, dcc_t::status, and USER_HIGHLITE.

00354 {
00355   int i;
00356 
00357   if (par[0]) {
00358     putlog(LOG_CMDS, "*", "#%s# motd %s", dcc[idx].nick, par);
00359     if (!egg_strcasecmp(par, botnetnick))
00360       show_motd(idx);
00361     else {
00362       i = nextbot(par);
00363       if (i < 0)
00364         dprintf(idx, "That bot isn't connected.\n");
00365       else {
00366         char x[40];
00367 
00368         simple_sprintf(x, "%s%d:%s@%s",
00369                        (u->flags & USER_HIGHLITE) ?
00370                        ((dcc[idx].status & STAT_TELNET) ? "#" : "!") : "",
00371                        dcc[idx].sock, dcc[idx].nick, botnetnick);
00372         botnet_send_motd(i, x, par);
00373       }
00374     }
00375   } else {
00376     putlog(LOG_CMDS, "*", "#%s# motd", dcc[idx].nick);
00377     show_motd(idx);
00378   }
00379 }

Here is the call graph for this function:

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

Definition at line 393 of file cmds.c.

References dprintf, LOG_CMDS, newsplit, putlog, set_user, and USERENTRY_PASS.

00394 {
00395   char *new;
00396 
00397   if (!par[0]) {
00398     dprintf(idx, "Usage: newpass <newpassword>\n");
00399     return;
00400   }
00401   new = newsplit(&par);
00402   if (strlen(new) > 16)
00403     new[16] = 0;
00404   if (strlen(new) < 6) {
00405     dprintf(idx, "Please use at least 6 characters.\n");
00406     return;
00407   }
00408   set_user(&USERENTRY_PASS, u, new);
00409   putlog(LOG_CMDS, "*", "#%s# newpass...", dcc[idx].nick);
00410   dprintf(idx, "Changed password to '%s'.\n", new);
00411 }

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

Definition at line 2135 of file cmds.c.

References dcc_t::chat, CONSOLE_DOSTORE, chat_info::current_lines, dprintf, egg_strcasecmp, flush_lines, _module_entry::funcs, chat_info::line_count, LOG_CMDS, chat_info::max_line, module_find, putlog, STAT_PAGE, dcc_t::status, and dcc_t::u.

02136 {
02137   int a;
02138   module_entry *me;
02139 
02140   if (!par[0]) {
02141     if (dcc[idx].status & STAT_PAGE) {
02142       dprintf(idx, "Currently paging outputs to %d lines.\n",
02143               dcc[idx].u.chat->max_line);
02144     } else
02145       dprintf(idx, "You don't have paging on.\n");
02146     return;
02147   }
02148   a = atoi(par);
02149   if ((!a && !par[0]) || !egg_strcasecmp(par, "off")) {
02150     dcc[idx].status &= ~STAT_PAGE;
02151     dcc[idx].u.chat->max_line = 0x7ffffff;      /* flush_lines needs this */
02152     while (dcc[idx].u.chat->buffer)
02153       flush_lines(idx, dcc[idx].u.chat);
02154     dprintf(idx, "Paging turned off.\n");
02155     putlog(LOG_CMDS, "*", "#%s# page off", dcc[idx].nick);
02156   } else if (a > 0) {
02157     dprintf(idx, "Paging turned on, stopping every %d line%s.\n", a,
02158             (a != 1) ? "s" : "");
02159     dcc[idx].status |= STAT_PAGE;
02160     dcc[idx].u.chat->max_line = a;
02161     dcc[idx].u.chat->line_count = 0;
02162     dcc[idx].u.chat->current_lines = 0;
02163     putlog(LOG_CMDS, "*", "#%s# page %d", dcc[idx].nick, a);
02164   } else {
02165     dprintf(idx, "Usage: page <off or #>\n");
02166     return;
02167   }
02168   /* New style autosave here too -- rtc, 09/28/1999 */
02169   if ((me = module_find("console", 1, 1))) {
02170     Function *func = me->funcs;
02171 
02172     (func[CONSOLE_DOSTORE]) (idx);
02173   }
02174 }

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

Definition at line 747 of file cmds.c.

References add_bot_hostmask(), addhost_by_handle, bot_addr::address, adduser, BADHANDCHARS, dprintf, get_user_by_handle, HANDLEN, LOG_CMDS, newsplit, NULL, putlog, bot_addr::relay_port, set_user, bot_addr::telnet_port, USER_BOT, user_malloc, and USERENTRY_BOTADDR.

00748 {
00749   char *handle, *addr, *p, *q, *host;
00750   struct userrec *u1;
00751   struct bot_addr *bi;
00752 
00753   if (!par[0]) {
00754     dprintf(idx, "Usage: +bot <handle> [address[:telnet-port[/relay-port]]] "
00755             "[host]\n");
00756     return;
00757   }
00758 
00759   handle = newsplit(&par);
00760   addr = newsplit(&par);
00761   host = newsplit(&par);
00762 
00763   if (strlen(handle) > HANDLEN)
00764     handle[HANDLEN] = 0;
00765 
00766   if (get_user_by_handle(userlist, handle)) {
00767     dprintf(idx, "Someone already exists by that name.\n");
00768     return;
00769   }
00770 
00771   if (strchr(BADHANDCHARS, handle[0]) != NULL) {
00772     dprintf(idx, "You can't start a botnick with '%c'.\n", handle[0]);
00773     return;
00774   }
00775 
00776   if (strlen(addr) > 60)
00777     addr[60] = 0;
00778 
00779   putlog(LOG_CMDS, "*", "#%s# +bot %s%s%s%s%s", dcc[idx].nick, handle,
00780          addr[0] ? " " : "", addr, host[0] ? " " : "", host);
00781   userlist = adduser(userlist, handle, "none", "-", USER_BOT);
00782   u1 = get_user_by_handle(userlist, handle);
00783   bi = user_malloc(sizeof(struct bot_addr));
00784 
00785   q = strchr(addr, ':');
00786   if (!q) {
00787     bi->address = user_malloc(strlen(addr) + 1);
00788     strcpy(bi->address, addr);
00789     bi->telnet_port = 3333;
00790     bi->relay_port = 3333;
00791   } else {
00792     bi->address = user_malloc(q - addr + 1);
00793     strncpy(bi->address, addr, q - addr);
00794     bi->address[q - addr] = 0;
00795     p = q + 1;
00796     bi->telnet_port = atoi(p);
00797     q = strchr(p, '/');
00798     if (!q) {
00799       bi->relay_port = bi->telnet_port;
00800     } else  {
00801       bi->relay_port = atoi(q + 1);
00802     }
00803   }
00804 
00805   set_user(&USERENTRY_BOTADDR, u1, bi);
00806   if (addr[0]) {
00807     dprintf(idx, "Added bot '%s' with address '%s' and %s%s%s.\n", handle,
00808             addr, host[0] ? "hostmask '" : "no hostmask", host[0] ? host : "",
00809             host[0] ? "'" : "");
00810   } else{
00811     dprintf(idx, "Added bot '%s' with no address and %s%s%s.\n", handle,
00812             host[0] ? "hostmask '" : "no hostmask", host[0] ? host : "",
00813             host[0] ? "'" : "");
00814   }
00815   if (host[0]) {
00816     addhost_by_handle(handle, host);
00817   } else if (!add_bot_hostmask(idx, handle)) {
00818     dprintf(idx, "You'll want to add a hostmask if this bot will ever be on "
00819             "any channels that I'm on.\n");
00820   }
00821 }

Here is the call graph for this function:

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

Definition at line 2486 of file cmds.c.

References addhost_by_handle, bot_flags, BOT_SHARE, chan_master, chan_owner, dprintf, egg_strcasecmp, list_type::extra, fr, FR_ANYWH, FR_CHAN, FR_GLOBAL, _module_entry::funcs, get_user, get_user_by_handle, get_user_by_host, get_user_flagrec, glob_bot, glob_botmast, glob_master, glob_owner, userrec::handle, IRC_CHECK_THIS_USER, LOG_CMDS, module_find, newsplit, list_type::next, dcc_t::nick, NULL, putlog, and USERENTRY_HOSTS.

02487 {
02488   char *handle, *host;
02489   struct userrec *u2;
02490   struct list_type *q;
02491   struct flag_record fr2 = { FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0, 0, 0 },
02492                       fr = { FR_GLOBAL | FR_CHAN | FR_ANYWH, 0, 0, 0, 0, 0 };
02493   module_entry *me;
02494 
02495   if (!par[0]) {
02496     dprintf(idx, "Usage: +host [handle] <newhostmask>\n");
02497     return;
02498   }
02499 
02500   handle = newsplit(&par);
02501 
02502   if (par[0]) {
02503     host = newsplit(&par);
02504     u2 = get_user_by_handle(userlist, handle);
02505   } else {
02506     host = handle;
02507     handle = dcc[idx].nick;
02508     u2 = u;
02509   }
02510   if (!u2 || !u) {
02511     dprintf(idx, "No such user.\n");
02512     return;
02513   }
02514   get_user_flagrec(u, &fr, NULL);
02515   if (egg_strcasecmp(handle, dcc[idx].nick)) {
02516     get_user_flagrec(u2, &fr2, NULL);
02517     if (!glob_master(fr) && !glob_bot(fr2) && !chan_master(fr)) {
02518       dprintf(idx, "You can't add hostmasks to non-bots.\n");
02519       return;
02520     }
02521     if (!glob_owner(fr) && glob_bot(fr2) && (bot_flags(u2) & BOT_SHARE)) {
02522       dprintf(idx, "You can't add hostmasks to share bots.\n");
02523       return;
02524     }
02525     if ((glob_owner(fr2) || glob_master(fr2)) && !glob_owner(fr)) {
02526       dprintf(idx, "You can't add hostmasks to a bot owner/master.\n");
02527       return;
02528     }
02529     if ((chan_owner(fr2) || chan_master(fr2)) && !glob_master(fr) &&
02530         !glob_owner(fr) && !chan_owner(fr)) {
02531       dprintf(idx, "You can't add hostmasks to a channel owner/master.\n");
02532       return;
02533     }
02534     if (!glob_botmast(fr) && !glob_master(fr) && !chan_master(fr)) {
02535       dprintf(idx, "Permission denied.\n");
02536       return;
02537     }
02538   }
02539   if (!glob_botmast(fr) && !chan_master(fr) && get_user_by_host(host)) {
02540     dprintf(idx, "You cannot add a host matching another user!\n");
02541     return;
02542   }
02543   for (q = get_user(&USERENTRY_HOSTS, u); q; q = q->next)
02544     if (!egg_strcasecmp(q->extra, host)) {
02545       dprintf(idx, "That hostmask is already there.\n");
02546       return;
02547     }
02548   putlog(LOG_CMDS, "*", "#%s# +host %s %s", dcc[idx].nick, handle, host);
02549   addhost_by_handle(handle, host);
02550   dprintf(idx, "Added '%s' to %s.\n", host, handle);
02551   if ((me = module_find("irc", 0, 0))) {
02552     Function *func = me->funcs;
02553 
02554     (func[IRC_CHECK_THIS_USER]) (handle, 0, NULL);
02555   }
02556 }

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

Definition at line 2310 of file cmds.c.

References addignore, dprintf, LOG_CMDS, match_ignore, newsplit, now, NULL, putlog, simple_sprintf, UHOSTLEN, and UHOSTMAX.

02311 {
02312   char *who, s[UHOSTLEN];
02313   unsigned long int expire_time = 0;
02314 
02315   if (!par[0]) {
02316     dprintf(idx, "Usage: +ignore <hostmask> [%%<XdXhXm>] [comment]\n");
02317     return;
02318   }
02319 
02320   who = newsplit(&par);
02321   if (par[0] == '%') {
02322     char *p, *p_expire;
02323     unsigned long int expire_foo;
02324 
02325     p = newsplit(&par);
02326     p_expire = p + 1;
02327     while (*(++p) != 0) {
02328       switch (tolower((unsigned) *p)) {
02329       case 'd':
02330         *p = 0;
02331         expire_foo = strtol(p_expire, NULL, 10);
02332         if (expire_foo > 365)
02333           expire_foo = 365;
02334         expire_time += 86400 * expire_foo;
02335         p_expire = p + 1;
02336         break;
02337       case 'h':
02338         *p = 0;
02339         expire_foo = strtol(p_expire, NULL, 10);
02340         if (expire_foo > 8760)
02341           expire_foo = 8760;
02342         expire_time += 3600 * expire_foo;
02343         p_expire = p + 1;
02344         break;
02345       case 'm':
02346         *p = 0;
02347         expire_foo = strtol(p_expire, NULL, 10);
02348         if (expire_foo > 525600)
02349           expire_foo = 525600;
02350         expire_time += 60 * expire_foo;
02351         p_expire = p + 1;
02352       }
02353     }
02354   }
02355   if (!par[0])
02356     par = "requested";
02357   else if (strlen(par) > 65)
02358     par[65] = 0;
02359   if (strlen(who) > UHOSTMAX - 4)
02360     who[UHOSTMAX - 4] = 0;
02361 
02362   /* Fix missing ! or @ BEFORE continuing */
02363   if (!strchr(who, '!')) {
02364     if (!strchr(who, '@'))
02365       simple_sprintf(s, "%s!*@*", who);
02366     else
02367       simple_sprintf(s, "*!%s", who);
02368   } else if (!strchr(who, '@'))
02369     simple_sprintf(s, "%s@*", who);
02370   else
02371     strcpy(s, who);
02372 
02373   if (match_ignore(s))
02374     dprintf(idx, "That already matches an existing ignore.\n");
02375   else {
02376     dprintf(idx, "Now ignoring: %s (%s)\n", s, par);
02377     addignore(s, dcc[idx].nick, par, expire_time ? now + expire_time : 0L);
02378     putlog(LOG_CMDS, "*", "#%s# +ignore %s %s", dcc[idx].nick, s, par);
02379   }
02380 }

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

Definition at line 2404 of file cmds.c.

References adduser, BADNICKCHARS, botnetnick, dprintf, egg_strcasecmp, get_user_by_handle, HANDLEN, LOG_CMDS, newsplit, NULL, and putlog.

02405 {
02406   char *handle, *host;
02407 
02408   if (!par[0]) {
02409     dprintf(idx, "Usage: +user <handle> [hostmask]\n");
02410     return;
02411   }
02412   handle = newsplit(&par);
02413   host = newsplit(&par);
02414   if (strlen(handle) > HANDLEN)
02415     handle[HANDLEN] = 0;
02416   if (get_user_by_handle(userlist, handle))
02417     dprintf(idx, "Someone already exists by that name.\n");
02418   else if (strchr(BADNICKCHARS, handle[0]) != NULL)
02419     dprintf(idx, "You can't start a nick with '%c'.\n", handle[0]);
02420   else if (!egg_strcasecmp(handle, botnetnick))
02421     dprintf(idx, "Hey! That's MY name!\n");
02422   else {
02423     putlog(LOG_CMDS, "*", "#%s# +user %s %s", dcc[idx].nick, handle, host);
02424     userlist = adduser(userlist, handle, host, "-", 0);
02425     dprintf(idx, "Added %s (%s) with no password and no flags.\n", handle,
02426             host[0] ? host : "no host");
02427   }
02428 }

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

Definition at line 1050 of file cmds.c.

References do_restart, dprintf, LOG_CMDS, LOG_MISC, make_userfile, putlog, and write_userfile.

01051 {
01052   putlog(LOG_CMDS, "*", "#%s# rehash", dcc[idx].nick);
01053   dprintf(idx, "Rehashing.\n");
01054   if (make_userfile) {
01055     putlog(LOG_MISC, "*", "Uh, guess you don't need to create a new userfile.");
01056     make_userfile = 0;
01057   }
01058   write_userfile(-1);
01059   putlog(LOG_MISC, "*", "Rehashing ...");
01060   do_restart = -2;
01061 }

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

Definition at line 431 of file cmds.c.

References dprintf, LOG_CMDS, putlog, and reload_help_data().

00432 {
00433   putlog(LOG_CMDS, "*", "#%s# rehelp", dcc[idx].nick);
00434   dprintf(idx, "Reload help cache...\n");
00435   reload_help_data();
00436 }

Here is the call graph for this function:

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

Definition at line 1183 of file cmds.c.

References dprintf, LOG_CMDS, putlog, and tandem_relay().

01184 {
01185   if (!par[0]) {
01186     dprintf(idx, "Usage: relay <bot>\n");
01187     return;
01188   }
01189   putlog(LOG_CMDS, "*", "#%s# relay %s", dcc[idx].nick, par);
01190   tandem_relay(idx, par, 0);
01191 }

Here is the call graph for this function:

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

Definition at line 1063 of file cmds.c.

References dprintf, LOG_CMDS, putlog, and reload().

01064 {
01065   putlog(LOG_CMDS, "*", "#%s# reload", dcc[idx].nick);
01066   dprintf(idx, "Reloading user file...\n");
01067   reload();
01068 }

Here is the call graph for this function:

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

Definition at line 1031 of file cmds.c.

References backgrd, do_restart, dprintf, interp, LOG_CMDS, LOG_MISC, make_userfile, putlog, wipe_timers(), and write_userfile.

01032 {
01033   putlog(LOG_CMDS, "*", "#%s# restart", dcc[idx].nick);
01034   if (!backgrd) {
01035     dprintf(idx, "You cannot .restart a bot when running -n (due to Tcl).\n");
01036     return;
01037   }
01038   dprintf(idx, "Restarting.\n");
01039   if (make_userfile) {
01040     putlog(LOG_MISC, "*", "Uh, guess you don't need to create a new userfile.");
01041     make_userfile = 0;
01042   }
01043   write_userfile(-1);
01044   putlog(LOG_MISC, "*", "Restarting ...");
01045   wipe_timers(interp, &utimer);
01046   wipe_timers(interp, &timer);
01047   do_restart = idx;
01048 }

Here is the call graph for this function:

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

Definition at line 1193 of file cmds.c.

References dprintf, LOG_CMDS, putlog, and write_userfile.

01194 {
01195   putlog(LOG_CMDS, "*", "#%s# save", dcc[idx].nick);
01196   dprintf(idx, "Saving user file...\n");
01197   write_userfile(-1);
01198 }

static void cmd_set ( struct userrec u,
int  idx,
char *  msg 
) [static]

Definition at line 2215 of file cmds.c.

References dprintf, dumplots(), interp, isowner, LOG_CMDS, MISC_NOSUCHCMD, must_be_owner, NULL, putlog, and tcl_resultstring().

02216 {
02217   int code;
02218   char s[512], *result;
02219 #ifdef USE_TCL_ENCODING
02220   Tcl_DString dstr;
02221 #endif
02222 
02223   if (!(isowner(dcc[idx].nick)) && (must_be_owner)) {
02224     dprintf(idx, MISC_NOSUCHCMD);
02225     return;
02226   }
02227   putlog(LOG_CMDS, "*", "#%s# set %s", dcc[idx].nick, msg);
02228   strcpy(s, "set ");
02229   if (!msg[0]) {
02230     strcpy(s, "info globals");
02231     Tcl_Eval(interp, s);
02232     dumplots(idx, "Global vars: ", tcl_resultstring());
02233     return;
02234   }
02235   strcpy(s + 4, msg);
02236   code = Tcl_Eval(interp, s);
02237 
02238 #ifdef USE_TCL_ENCODING
02239   /* properly convert string to system encoding. */
02240   Tcl_DStringInit(&dstr);
02241   Tcl_UtfToExternalDString(NULL, tcl_resultstring(), -1, &dstr);
02242   result = Tcl_DStringValue(&dstr);
02243 #else
02244   /* use old pre-Tcl 8.1 way. */
02245   result = tcl_resultstring();
02246 #endif
02247 
02248   if (code == TCL_OK) {
02249     if (!strchr(msg, ' '))
02250       dumplots(idx, "Currently: ", result);
02251     else
02252       dprintf(idx, "Ok, set.\n");
02253   } else
02254     dprintf(idx, "Error: %s\n", result);
02255 
02256 #ifdef USE_TCL_ENCODING
02257   Tcl_DStringFree(&dstr);
02258 #endif
02259 }

Here is the call graph for this function:

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

Definition at line 1101 of file cmds.c.

References dcc_table::activity, dcc_total, DCT_SIMUL, dprintf, egg_strcasecmp, isowner, LOG_CMDS, newsplit, putlog, and dcc_t::type.

01102 {
01103   char *nick;
01104   int i, ok = 0;
01105 
01106   nick = newsplit(&par);
01107   if (!par[0]) {
01108     dprintf(idx, "Usage: simul <hand> <text>\n");
01109     return;
01110   }
01111   if (isowner(nick)) {
01112     dprintf(idx, "Unable to '.simul' permanent owners.\n");
01113     return;
01114   }
01115   for (i = 0; i < dcc_total; i++)
01116     if (!egg_strcasecmp(nick, dcc[i].nick) && !ok &&
01117         (dcc[i].type->flags & DCT_SIMUL)) {
01118       putlog(LOG_CMDS, "*", "#%s# simul %s %s", dcc[idx].nick, nick, par);
01119       if (dcc[i].type && dcc[i].type->activity) {
01120         dcc[i].type->activity(i, par, strlen(par));
01121         ok = 1;
01122       }
01123     }
01124   if (!ok)
01125     dprintf(idx, "No such user on the party line.\n");
01126 }

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

Definition at line 558 of file cmds.c.

References do_module_report(), dprintf, egg_strcasecmp, userrec::flags, LOG_CMDS, NULL, putlog, tell_mem_status_dcc(), tell_settings(), tell_verbose_status(), and USER_MASTER.

00559 {
00560   int atr = u ? u->flags : 0;
00561 
00562   if (!egg_strcasecmp(par, "all")) {
00563     if (!(atr & USER_MASTER)) {
00564       dprintf(idx, "You do not have Bot Master privileges.\n");
00565       return;
00566     }
00567     putlog(LOG_CMDS, "*", "#%s# status all", dcc[idx].nick);
00568     tell_verbose_status(idx);
00569     tell_mem_status_dcc(idx);
00570     dprintf(idx, "\n");
00571     tell_settings(idx);
00572     do_module_report(idx, 1, NULL);
00573   } else {
00574     putlog(LOG_CMDS, "*", "#%s# status", dcc[idx].nick);
00575     tell_verbose_status(idx);
00576     tell_mem_status_dcc(idx);
00577     do_module_report(idx, 0, NULL);
00578   }
00579 }

Here is the call graph for this function:

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

Definition at line 1969 of file cmds.c.

References dcc_t::chat, CONSOLE_DOSTORE, DCC_CHAT, dcc_total, dprintf, egg_strcasecmp, userrec::flags, _module_entry::funcs, LOG_CMDS, md, module_find, newsplit, putlog, STRIP_BOLD, chat_info::strip_flags, stripmaskname(), stripmasktype, stripmodes, dcc_t::u, USER_HIGHLITE, and USER_MASTER.

01970 {
01971   char *nick, *changes, *c, s[2];
01972   int dest = 0, i, pls, md, ok = 0;
01973   module_entry *me;
01974 
01975   if (!par[0]) {
01976     dprintf(idx, "Your current strip settings are: %s (%s).\n",
01977             stripmasktype(dcc[idx].u.chat->strip_flags),
01978             stripmaskname(dcc[idx].u.chat->strip_flags));
01979     return;
01980   }
01981   nick = newsplit(&par);
01982   if ((nick[0] != '+') && (nick[0] != '-') && u && (u->flags & USER_MASTER)) {
01983     for (i = 0; i < dcc_total; i++)
01984       if (!egg_strcasecmp(nick, dcc[i].nick) && dcc[i].type == &DCC_CHAT && !ok) {
01985         ok = 1;
01986         dest = i;
01987       }
01988     if (!ok) {
01989       dprintf(idx, "No such user on the party line!\n");
01990       return;
01991     }
01992     changes = par;
01993   } else {
01994     changes = nick;
01995     nick = "";
01996     dest = idx;
01997   }
01998   c = changes;
01999   if ((c[0] != '+') && (c[0] != '-'))
02000     dcc[dest].u.chat->strip_flags = 0;
02001   s[1] = 0;
02002   for (pls = 1; *c; c++) {
02003     switch (*c) {
02004     case '+':
02005       pls = 1;
02006       break;
02007     case '-':
02008       pls = 0;
02009       break;
02010     default:
02011       s[0] = *c;
02012       md = stripmodes(s);
02013       if (pls == 1)
02014         dcc[dest].u.chat->strip_flags |= md;
02015       else
02016         dcc[dest].u.chat->strip_flags &= ~md;
02017     }
02018   }
02019   if (nick[0])
02020     putlog(LOG_CMDS, "*", "#%s# strip %s %s", dcc[idx].nick, nick, changes);
02021   else
02022     putlog(LOG_CMDS, "*", "#%s# strip %s", dcc[idx].nick, changes);
02023   if (dest == idx) {
02024     dprintf(idx, "Your strip settings are: %s (%s).\n",
02025             stripmasktype(dcc[idx].u.chat->strip_flags),
02026             stripmaskname(dcc[idx].u.chat->strip_flags));
02027   } else {
02028     dprintf(idx, "Strip setting for %s: %s (%s).\n", dcc[dest].nick,
02029             stripmasktype(dcc[dest].u.chat->strip_flags),
02030             stripmaskname(dcc[dest].u.chat->strip_flags));
02031     dprintf(dest, "%s set your strip settings to: %s (%s).\n", dcc[idx].nick,
02032             stripmasktype(dcc[dest].u.chat->strip_flags),
02033             stripmaskname(dcc[dest].u.chat->strip_flags));
02034   }
02035   /* Set highlight flag here so user is able to control stripping of
02036    * bold also as intended -- dw 27/12/1999
02037    */
02038   if (dcc[dest].u.chat->strip_flags & STRIP_BOLD && u->flags & USER_HIGHLITE) {
02039     u->flags &= ~USER_HIGHLITE;
02040   } else if (!(dcc[dest].u.chat->strip_flags & STRIP_BOLD) &&
02041            !(u->flags & USER_HIGHLITE)) {
02042     u->flags |= USER_HIGHLITE;
02043   }
02044   /* New style autosave here too -- rtc, 09/28/1999 */
02045   if ((me = module_find("console", 1, 1))) {
02046     Function *func = me->funcs;
02047 
02048     (func[CONSOLE_DOSTORE]) (dest);
02049   }
02050 }

Here is the call graph for this function:

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

Definition at line 2052 of file cmds.c.

References chat_info::away, botnet_send_part_idx, chan_op, chanout_but, dcc_t::chat, chat_info::con_flags, conmask, correct_handle(), DCC_CHAT_PASS, dcc_chatter(), dprintf, userrec::flags, FR_ANYWH, FR_CHAN, FR_GLOBAL, get_data_ptr, get_user_by_handle, get_user_flagrec, glob_op, glob_party, GLOBAL_CHANS, isowner, LOG_CMDS, nfree, dcc_t::nick, NULL, putlog, require_p, STAT_TELNET, chat_info::su_nick, TLN_ECHO_C, TLN_IAC_C, TLN_WILL_C, dcc_t::type, dcc_t::u, u_pass_match, dcc_t::user, USER_BOT, USER_BOTMAST, USER_MASTER, and USER_OWNER.

02053 {
02054   int atr = u ? u->flags : 0;
02055   struct flag_record fr = { FR_ANYWH | FR_CHAN | FR_GLOBAL, 0, 0, 0, 0, 0 };
02056 
02057   u = get_user_by_handle(userlist, par);
02058 
02059   if (!par[0])
02060     dprintf(idx, "Usage: su <user>\n");
02061   else if (!u)
02062     dprintf(idx, "No such user.\n");
02063   else if (u->flags & USER_BOT)
02064     dprintf(idx, "You can't su to a bot... then again, why would you wanna?\n");
02065   else if (dcc[idx].u.chat->su_nick)
02066     dprintf(idx, "You cannot currently double .su; try .su'ing directly.\n");
02067   else {
02068     get_user_flagrec(u, &fr, NULL);
02069     if ((!glob_party(fr) && (require_p || !(glob_op(fr) || chan_op(fr)))) &&
02070         !(atr & USER_BOTMAST))
02071       dprintf(idx, "No party line access permitted for %s.\n", par);
02072     else {
02073       correct_handle(par);
02074       putlog(LOG_CMDS, "*", "#%s# su %s", dcc[idx].nick, par);
02075       if (!(atr & USER_OWNER) || ((u->flags & USER_OWNER) && (isowner(par)) &&
02076           !(isowner(dcc[idx].nick)))) {
02077         /* This check is only important for non-owners */
02078         if (u_pass_match(u, "-")) {
02079           dprintf(idx, "No password set for user. You may not .su to them.\n");
02080           return;
02081         }
02082         if (dcc[idx].u.chat->channel < GLOBAL_CHANS)
02083           botnet_send_part_idx(idx, "");
02084         chanout_but(-1, dcc[idx].u.chat->channel,
02085                     "*** %s left the party line.\n", dcc[idx].nick);
02086         /* Store the old nick in the away section, for weenies who can't get
02087          * their password right ;)
02088          */
02089         if (dcc[idx].u.chat->away != NULL)
02090           nfree(dcc[idx].u.chat->away);
02091         dcc[idx].u.chat->away = get_data_ptr(strlen(dcc[idx].nick) + 1);
02092         strcpy(dcc[idx].u.chat->away, dcc[idx].nick);
02093         dcc[idx].u.chat->su_nick = get_data_ptr(strlen(dcc[idx].nick) + 1);
02094         strcpy(dcc[idx].u.chat->su_nick, dcc[idx].nick);
02095         dcc[idx].user = u;
02096         strcpy(dcc[idx].nick, par);
02097         /* Display password prompt and turn off echo (send IAC WILL ECHO). */
02098         dprintf(idx, "Enter password for %s%s\n", par,
02099                 (dcc[idx].status & STAT_TELNET) ? TLN_IAC_C TLN_WILL_C
02100                 TLN_ECHO_C : "");
02101         dcc[idx].type = &DCC_CHAT_PASS;
02102       } else if (atr & USER_OWNER) {
02103         if (dcc[idx].u.chat->channel < GLOBAL_CHANS)
02104           botnet_send_part_idx(idx, "");
02105         chanout_but(-1, dcc[idx].u.chat->channel,
02106                     "*** %s left the party line.\n", dcc[idx].nick);
02107         dprintf(idx, "Setting your username to %s.\n", par);
02108         if (atr & USER_MASTER)
02109           dcc[idx].u.chat->con_flags = conmask;
02110         dcc[idx].u.chat->su_nick = get_data_ptr(strlen(dcc[idx].nick) + 1);
02111         strcpy(dcc[idx].u.chat->su_nick, dcc[idx].nick);
02112         dcc[idx].user = u;
02113         strcpy(dcc[idx].nick, par);
02114         dcc_chatter(idx);
02115       }
02116     }
02117   }
02118 }

Here is the call graph for this function:

static void cmd_tcl ( struct userrec u,
int  idx,
char *  msg 
) [static]

Definition at line 2178 of file cmds.c.

References debug1, dprintf, dumplots(), interp, isowner, MISC_NOSUCHCMD, must_be_owner, NULL, and tcl_resultstring().

02179 {
02180   int code;
02181   char *result;
02182 #ifdef USE_TCL_ENCODING
02183   Tcl_DString dstr;
02184 #endif
02185 
02186   if (!(isowner(dcc[idx].nick)) && (must_be_owner)) {
02187     dprintf(idx, MISC_NOSUCHCMD);
02188     return;
02189   }
02190   debug1("tcl: evaluate (.tcl): %s", msg);
02191   code = Tcl_GlobalEval(interp, msg);
02192 
02193 #ifdef USE_TCL_ENCODING
02194   /* properly convert string to system encoding. */
02195   Tcl_DStringInit(&dstr);
02196   Tcl_UtfToExternalDString(NULL, tcl_resultstring(), -1, &dstr);
02197   result = Tcl_DStringValue(&dstr);
02198 #else
02199   /* use old pre-Tcl 8.1 way. */
02200   result = tcl_resultstring();
02201 #endif
02202 
02203   if (code == TCL_OK)
02204     dumplots(idx, "Tcl: ", result);
02205   else
02206     dumplots(idx, "Tcl error: ", result);
02207 
02208 #ifdef USE_TCL_ENCODING
02209   Tcl_DStringFree(&dstr);
02210 #endif
02211 }

Here is the call graph for this function:

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

Definition at line 1207 of file cmds.c.

References botnet_send_trace(), botnetnick, dprintf, egg_strcasecmp, LOG_CMDS, nextbot, NOTENAMELEN, now, putlog, and simple_sprintf.

01208 {
01209   int i;
01210   char x[NOTENAMELEN + 11], y[11];
01211 
01212   if (!par[0]) {
01213     dprintf(idx, "Usage: trace <botname>\n");
01214     return;
01215   }
01216   if (!egg_strcasecmp(par, botnetnick)) {
01217     dprintf(idx, "That's me!  Hiya! :)\n");
01218     return;
01219   }
01220   i = nextbot(par);
01221   if (i < 0) {
01222     dprintf(idx, "Unreachable bot.\n");
01223     return;
01224   }
01225   putlog(LOG_CMDS, "*", "#%s# trace %s", dcc[idx].nick, par);
01226   simple_sprintf(x, "%d:%s@%s", dcc[idx].sock, dcc[idx].nick, botnetnick);
01227   simple_sprintf(y, ":%d", now);
01228   botnet_send_trace(i, x, par, y);
01229 }

Here is the call graph for this function:

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

Definition at line 2652 of file cmds.c.

References btos(), dprintf, itraffic_bn, itraffic_bn_today, itraffic_dcc, itraffic_dcc_today, itraffic_irc, itraffic_irc_today, itraffic_trans, itraffic_trans_today, itraffic_unknown, itraffic_unknown_today, LOG_CMDS, otraffic_bn, otraffic_bn_today, otraffic_dcc, otraffic_dcc_today, otraffic_irc, otraffic_irc_today, otraffic_trans, otraffic_trans_today, otraffic_unknown, otraffic_unknown_today, and putlog.

02653 {
02654   unsigned long itmp, itmp2;
02655 
02656   dprintf(idx, "Traffic since last restart\n");
02657   dprintf(idx, "==========================\n");
02658   if (otraffic_irc > 0 || itraffic_irc > 0 || otraffic_irc_today > 0 ||
02659       itraffic_irc_today > 0) {
02660     dprintf(idx, "IRC:\n");
02661     dprintf(idx, "  out: %s", btos(otraffic_irc + otraffic_irc_today));
02662     dprintf(idx, " (%s today)\n", btos(otraffic_irc_today));
02663     dprintf(idx, "   in: %s", btos(itraffic_irc + itraffic_irc_today));
02664     dprintf(idx, " (%s today)\n", btos(itraffic_irc_today));
02665   }
02666   if (otraffic_bn > 0 || itraffic_bn > 0 || otraffic_bn_today > 0 ||
02667       itraffic_bn_today > 0) {
02668     dprintf(idx, "Botnet:\n");
02669     dprintf(idx, "  out: %s", btos(otraffic_bn + otraffic_bn_today));
02670     dprintf(idx, " (%s today)\n", btos(otraffic_bn_today));
02671     dprintf(idx, "   in: %s", btos(itraffic_bn + itraffic_bn_today));
02672     dprintf(idx, " (%s today)\n", btos(itraffic_bn_today));
02673   }
02674   if (otraffic_dcc > 0 || itraffic_dcc > 0 || otraffic_dcc_today > 0 ||
02675       itraffic_dcc_today > 0) {
02676     dprintf(idx, "Partyline:\n");
02677     itmp = otraffic_dcc + otraffic_dcc_today;
02678     itmp2 = otraffic_dcc_today;
02679     dprintf(idx, "  out: %s", btos(itmp));
02680     dprintf(idx, " (%s today)\n", btos(itmp2));
02681     dprintf(idx, "   in: %s", btos(itraffic_dcc + itraffic_dcc_today));
02682     dprintf(idx, " (%s today)\n", btos(itraffic_dcc_today));
02683   }
02684   if (otraffic_trans > 0 || itraffic_trans > 0 || otraffic_trans_today > 0 ||
02685       itraffic_trans_today > 0) {
02686     dprintf(idx, "Transfer.mod:\n");
02687     dprintf(idx, "  out: %s", btos(otraffic_trans + otraffic_trans_today));
02688     dprintf(idx, " (%s today)\n", btos(otraffic_trans_today));
02689     dprintf(idx, "   in: %s", btos(itraffic_trans + itraffic_trans_today));
02690     dprintf(idx, " (%s today)\n", btos(itraffic_trans_today));
02691   }
02692   if (otraffic_unknown > 0 || otraffic_unknown_today > 0) {
02693     dprintf(idx, "Misc:\n");
02694     dprintf(idx, "  out: %s", btos(otraffic_unknown + otraffic_unknown_today));
02695     dprintf(idx, " (%s today)\n", btos(otraffic_unknown_today));
02696     dprintf(idx, "   in: %s", btos(itraffic_unknown + itraffic_unknown_today));
02697     dprintf(idx, " (%s today)\n", btos(itraffic_unknown_today));
02698   }
02699   dprintf(idx, "---\n");
02700   dprintf(idx, "Total:\n");
02701   itmp = otraffic_irc + otraffic_bn + otraffic_dcc + otraffic_trans +
02702          otraffic_unknown + otraffic_irc_today + otraffic_bn_today +
02703          otraffic_dcc_today + otraffic_trans_today + otraffic_unknown_today;
02704   itmp2 = otraffic_irc_today + otraffic_bn_today + otraffic_dcc_today +
02705           otraffic_trans_today + otraffic_unknown_today;
02706   dprintf(idx, "  out: %s", btos(itmp));
02707   dprintf(idx, " (%s today)\n", btos(itmp2));
02708   dprintf(idx, "   in: %s", btos(itraffic_irc + itraffic_bn + itraffic_dcc +
02709           itraffic_trans + itraffic_unknown + itraffic_irc_today +
02710           itraffic_bn_today + itraffic_dcc_today + itraffic_trans_today +
02711           itraffic_unknown_today));
02712   dprintf(idx, " (%s today)\n", btos(itraffic_irc_today + itraffic_bn_today +
02713           itraffic_dcc_today + itraffic_trans_today + itraffic_unknown_today));
02714   putlog(LOG_CMDS, "*", "#%s# traffic", dcc[idx].nick);
02715 }

Here is the call graph for this function:

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

Definition at line 1154 of file cmds.c.

References botnet_send_unlink(), botnetnick, botunlink(), dprintf, egg_strcasecmp, lastbot(), LOG_CMDS, newsplit, nextbot, putlog, and simple_sprintf.

01155 {
01156   int i;
01157   char *bot;
01158 
01159   if (!par[0]) {
01160     dprintf(idx, "Usage: unlink <bot> [reason]\n");
01161     return;
01162   }
01163   putlog(LOG_CMDS, "*", "#%s# unlink %s", dcc[idx].nick, par);
01164   bot = newsplit(&par);
01165   i = nextbot(bot);
01166   if (i < 0) {
01167     botunlink(idx, bot, par, dcc[idx].nick);
01168     return;
01169   }
01170   /* If we're directly connected to that bot, just do it
01171    * (is nike gunna sue?)
01172    */
01173   if (!egg_strcasecmp(dcc[i].nick, bot))
01174     botunlink(idx, bot, par, dcc[i].nick);
01175   else {
01176     char x[40];
01177 
01178     simple_sprintf(x, "%d:%s@%s", dcc[idx].sock, dcc[idx].nick, botnetnick);
01179     botnet_send_unlink(i, x, lastbot(bot), bot, par);
01180   }
01181 }

Here is the call graph for this function:

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

Definition at line 2289 of file cmds.c.

References dprintf, isowner, LOG_CMDS, MISC_NOSUCHCMD, MISC_USAGE, MOD_UNLOADED, MOD_UNLOADERROR, module_unload, must_be_owner, and putlog.

02290 {
02291   char *p;
02292 
02293   if (!(isowner(dcc[idx].nick)) && (must_be_owner)) {
02294     dprintf(idx, MISC_NOSUCHCMD);
02295     return;
02296   }
02297   if (!par[0])
02298     dprintf(idx, "%s: unloadmod <module>\n", MISC_USAGE);
02299   else {
02300     p = module_unload(par, dcc[idx].nick);
02301     if (p)
02302       dprintf(idx, "%s %s: %s\n", MOD_UNLOADERROR, par, p);
02303     else {
02304       putlog(LOG_CMDS, "*", "#%s# unloadmod %s", dcc[idx].nick, par);
02305       dprintf(idx, "%s %s\n", MOD_UNLOADED, par);
02306     }
02307   }
02308 }

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

Definition at line 552 of file cmds.c.

References LOG_CMDS, putlog, and tell_verbose_uptime().

00553 {
00554   putlog(LOG_CMDS, "*", "#%s# uptime", dcc[idx].nick);
00555   tell_verbose_uptime(idx);
00556 }

Here is the call graph for this function:

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

Definition at line 425 of file cmds.c.

References LOG_CMDS, putlog, and tell_bottree.

00426 {
00427   putlog(LOG_CMDS, "*", "#%s# vbottree", dcc[idx].nick);
00428   tell_bottree(idx, 1);
00429 }

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

Definition at line 480 of file cmds.c.

References botnet_send_who(), botnetnick, dprintf, egg_strcasecmp, GLOBAL_CHANS, LOG_CMDS, nextbot, putlog, simple_sprintf, and tell_who().

00481 {
00482   int i;
00483 
00484   if (par[0]) {
00485     if (dcc[idx].u.chat->channel < 0) {
00486       dprintf(idx, "You have chat turned off.\n");
00487       return;
00488     }
00489     putlog(LOG_CMDS, "*", "#%s# who %s", dcc[idx].nick, par);
00490     if (!egg_strcasecmp(par, botnetnick))
00491       tell_who(u, idx, dcc[idx].u.chat->channel);
00492     else {
00493       i = nextbot(par);
00494       if (i < 0) {
00495         dprintf(idx, "That bot isn't connected.\n");
00496       } else if (dcc[idx].u.chat->channel >= GLOBAL_CHANS)
00497         dprintf(idx, "You are on a local channel.\n");
00498       else {
00499         char s[40];
00500 
00501         simple_sprintf(s, "%d:%s@%s", dcc[idx].sock, dcc[idx].nick, botnetnick);
00502         botnet_send_who(i, s, par, dcc[idx].u.chat->channel);
00503       }
00504     }
00505   } else {
00506     putlog(LOG_CMDS, "*", "#%s# who", dcc[idx].nick);
00507     if (dcc[idx].u.chat->channel < 0)
00508       tell_who(u, idx, 0);
00509     else
00510       tell_who(u, idx, dcc[idx].u.chat->channel);
00511   }
00512 }

Here is the call graph for this function:

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

Definition at line 2748 of file cmds.c.

References botnetnick, dprintf, LOG_CMDS, and putlog.

02749 {
02750   dprintf(idx, "You are %s@%s.\n", dcc[idx].nick, botnetnick);
02751   putlog(LOG_CMDS, "*", "#%s# whoami", dcc[idx].nick);
02752 }

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

Definition at line 514 of file cmds.c.

References dprintf, userrec::flags, LOG_CMDS, putlog, tell_user_ident(), and USER_MASTER.

00515 {
00516   if (!par[0]) {
00517     dprintf(idx, "Usage: whois <handle>\n");
00518     return;
00519   }
00520 
00521   putlog(LOG_CMDS, "*", "#%s# whois %s", dcc[idx].nick, par);
00522   tell_user_ident(idx, par, u ? (u->flags & USER_MASTER) : 0);
00523 }

Here is the call graph for this function:

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

Definition at line 292 of file cmds.c.

References answer_local_whom(), dprintf, GLOBAL_CHANS, interp, LOG_CMDS, NULL, putlog, tcl_resultempty(), and tcl_resultint().

00293 {
00294   if (par[0] == '*') {
00295     putlog(LOG_CMDS, "*", "#%s# whom %s", dcc[idx].nick, par);
00296     answer_local_whom(idx, -1);
00297     return;
00298   } else if (dcc[idx].u.chat->channel < 0) {
00299     dprintf(idx, "You have chat turned off.\n");
00300     return;
00301   }
00302   putlog(LOG_CMDS, "*", "#%s# whom %s", dcc[idx].nick, par);
00303   if (!par[0]) {
00304     answer_local_whom(idx, dcc[idx].u.chat->channel);
00305   } else {
00306     int chan = -1;
00307 
00308     if ((par[0] < '0') || (par[0] > '9')) {
00309       Tcl_SetVar(interp, "_chan", par, 0);
00310       if ((Tcl_VarEval(interp, "assoc ", "$_chan", NULL) == TCL_OK) &&
00311           !tcl_resultempty()) {
00312         chan = tcl_resultint();
00313       }
00314       if (chan <= 0) {
00315         dprintf(idx, "No such channel exists.\n");
00316         return;
00317       }
00318     } else
00319       chan = atoi(par);
00320     if ((chan < 0) || (chan >= GLOBAL_CHANS)) {
00321       dprintf(idx, "Channel number out of range: must be between 0 and %d."
00322               "\n", GLOBAL_CHANS);
00323       return;
00324     }
00325     answer_local_whom(idx, chan);
00326   }
00327 }

Here is the call graph for this function:

static char* stripmaskname ( int  x  )  [static]

Definition at line 1944 of file cmds.c.

References my_strcpy, STRIP_ANSI, STRIP_BELLS, STRIP_BOLD, STRIP_COLOR, STRIP_REV, and STRIP_UNDER.

Referenced by cmd_strip().

01945 {
01946   static char s[161];
01947   int i = 0;
01948 
01949   s[i] = 0;
01950   if (x & STRIP_BOLD)
01951     i += my_strcpy(s + i, "bold, ");
01952   if (x & STRIP_COLOR)
01953     i += my_strcpy(s + i, "color, ");
01954   if (x & STRIP_REV)
01955     i += my_strcpy(s + i, "reverse, ");
01956   if (x & STRIP_UNDER)
01957     i += my_strcpy(s + i, "underline, ");
01958   if (x & STRIP_ANSI)
01959     i += my_strcpy(s + i, "ansi, ");
01960   if (x & STRIP_BELLS)
01961     i += my_strcpy(s + i, "bells, ");
01962   if (!i)
01963     strcpy(s, "none");
01964   else
01965     s[i - 2] = 0;
01966   return s;
01967 }

Here is the caller graph for this function:

char* stripmasktype ( int  x  ) 

Definition at line 1921 of file cmds.c.

References STRIP_ANSI, STRIP_BELLS, STRIP_BOLD, STRIP_COLOR, STRIP_REV, and STRIP_UNDER.

01922 {
01923   static char s[20];
01924   char *p = s;
01925 
01926   if (x & STRIP_BOLD)
01927     *p++ = 'b';
01928   if (x & STRIP_COLOR)
01929     *p++ = 'c';
01930   if (x & STRIP_REV)
01931     *p++ = 'r';
01932   if (x & STRIP_UNDER)
01933     *p++ = 'u';
01934   if (x & STRIP_ANSI)
01935     *p++ = 'a';
01936   if (x & STRIP_BELLS)
01937     *p++ = 'g';
01938   if (p == s)
01939     *p++ = '-';
01940   *p = 0;
01941   return s;
01942 }

int stripmodes ( char *  s  ) 

Definition at line 1890 of file cmds.c.

References STRIP_ALL, STRIP_ANSI, STRIP_BELLS, STRIP_BOLD, STRIP_COLOR, STRIP_REV, and STRIP_UNDER.

01891 {
01892   int res = 0;
01893 
01894   for (; *s; s++)
01895     switch (tolower((unsigned) *s)) {
01896     case 'b':
01897       res |= STRIP_BOLD;
01898       break;
01899     case 'c':
01900       res |= STRIP_COLOR;
01901       break;
01902     case 'r':
01903       res |= STRIP_REV;
01904       break;
01905     case 'u':
01906       res |= STRIP_UNDER;
01907       break;
01908     case 'a':
01909       res |= STRIP_ANSI;
01910       break;
01911     case 'g':
01912       res |= STRIP_BELLS;
01913       break;
01914     case '*':
01915       res |= STRIP_ALL;
01916       break;
01917     }
01918   return res;
01919 }

static void tell_who ( struct userrec u,
int  idx,
int  chan 
) [static]

Definition at line 88 of file cmds.c.

References BOT_PARTYMEMBS, BOT_PEOPLEONCHAN, days, DCC_BOT, DCC_CHAT, dcc_total, DCT_SHOWWHO, dprintf, egg_snprintf, egg_strftime(), userrec::flags, geticon, GLOBAL_CHANS, interp, masktype, now, NULL, simple_sprintf, STAT_CALLED, STAT_CHAT, STAT_SHARE, tcl_resultempty(), tcl_resultstring(), dcc_t::timeval, dcc_t::type, USER_MASTER, and USER_OWNER.

Referenced by cmd_who().

00089 {
00090   int i, k, ok = 0, atr = u ? u->flags : 0;
00091   int nicklen;
00092   char format[81];
00093   char s[1024]; /* temp fix - 1.4 has a better one */
00094 
00095   if (!chan)
00096     dprintf(idx, "%s (* = owner, + = master, %% = botmaster, @ = op, "
00097             "^ = halfop)\n", BOT_PARTYMEMBS);
00098   else {
00099     simple_sprintf(s, "assoc %d", chan);
00100     if ((Tcl_Eval(interp, s) != TCL_OK) || tcl_resultempty())
00101       dprintf(idx, "%s %s%d: (* = owner, + = master, %% = botmaster, @ = op, "
00102               "^ = halfop)\n", BOT_PEOPLEONCHAN, (chan < GLOBAL_CHANS) ? "" :
00103               "*", chan % GLOBAL_CHANS);
00104     else
00105       dprintf(idx, "%s '%s' (%s%d): (* = owner, + = master, %% = botmaster, @ = op, "
00106               "^ = halfop)\n", BOT_PEOPLEONCHAN, tcl_resultstring(),
00107               (chan < GLOBAL_CHANS) ? "" : "*", chan % GLOBAL_CHANS);
00108   }
00109 
00110   /* calculate max nicklen */
00111   nicklen = 0;
00112   for (i = 0; i < dcc_total; i++) {
00113     if (strlen(dcc[i].nick) > nicklen)
00114       nicklen = strlen(dcc[i].nick);
00115   }
00116   if (nicklen < 9)
00117     nicklen = 9;
00118 
00119   for (i = 0; i < dcc_total; i++)
00120     if (dcc[i].type == &DCC_CHAT)
00121       if (dcc[i].u.chat->channel == chan) {
00122         if (atr & USER_OWNER) {
00123           egg_snprintf(format, sizeof format, "  [%%.2lu]  %%c%%-%us %%s",
00124                        nicklen);
00125           sprintf(s, format, dcc[i].sock,
00126                   (geticon(i) == '-' ? ' ' : geticon(i)), dcc[i].nick,
00127                   dcc[i].host);
00128         } else {
00129           egg_snprintf(format, sizeof format, "  %%c%%-%us %%s", nicklen);
00130           sprintf(s, format,
00131                   (geticon(i) == '-' ? ' ' : geticon(i)),
00132                   dcc[i].nick, dcc[i].host);
00133         }
00134         if (atr & USER_MASTER) {
00135           if (dcc[i].u.chat->con_flags)
00136             sprintf(&s[strlen(s)], " (con:%s)",
00137                     masktype(dcc[i].u.chat->con_flags));
00138         }
00139         if (now - dcc[i].timeval > 300) {
00140           unsigned long days, hrs, mins;
00141 
00142           days = (now - dcc[i].timeval) / 86400;
00143           hrs = ((now - dcc[i].timeval) - (days * 86400)) / 3600;
00144           mins = ((now - dcc[i].timeval) - (hrs * 3600)) / 60;
00145           if (days > 0)
00146             sprintf(&s[strlen(s)], " (idle %lud%luh)", days, hrs);
00147           else if (hrs > 0)
00148             sprintf(&s[strlen(s)], " (idle %luh%lum)", hrs, mins);
00149           else
00150             sprintf(&s[strlen(s)], " (idle %lum)", mins);
00151         }
00152         dprintf(idx, "%s\n", s);
00153         if (dcc[i].u.chat->away != NULL)
00154           dprintf(idx, "      AWAY: %s\n", dcc[i].u.chat->away);
00155       }
00156   for (i = 0; i < dcc_total; i++)
00157     if (dcc[i].type == &DCC_BOT) {
00158       if (!ok) {
00159         ok = 1;
00160         dprintf(idx, "Bots connected:\n");
00161       }
00162       egg_strftime(s, 14, "%d %b %H:%M", localtime(&dcc[i].timeval));
00163       if (atr & USER_OWNER) {
00164         egg_snprintf(format, sizeof format,
00165                      "  [%%.2lu]  %%s%%c%%-%us (%%s) %%s\n", nicklen);
00166         dprintf(idx, format, dcc[i].sock,
00167                 dcc[i].status & STAT_CALLED ? "<-" : "->",
00168                 dcc[i].status & STAT_SHARE ? '+' : ' ', dcc[i].nick, s,
00169                 dcc[i].u.bot->version);
00170       } else {
00171         egg_snprintf(format, sizeof format, "  %%s%%c%%-%us (%%s) %%s\n",
00172                      nicklen);
00173         dprintf(idx, format, dcc[i].status & STAT_CALLED ? "<-" : "->",
00174                 dcc[i].status & STAT_SHARE ? '+' : ' ', dcc[i].nick, s,
00175                 dcc[i].u.bot->version);
00176       }
00177     }
00178   ok = 0;
00179   for (i = 0; i < dcc_total; i++) {
00180     if ((dcc[i].type == &DCC_CHAT) && (dcc[i].u.chat->channel != chan)) {
00181       if (!ok) {
00182         ok = 1;
00183         dprintf(idx, "Other people on the bot:\n");
00184       }
00185       if (atr & USER_OWNER) {
00186         egg_snprintf(format, sizeof format, "  [%%.2lu]  %%c%%-%us ", nicklen);
00187         sprintf(s, format, dcc[i].sock,
00188                 (geticon(i) == '-' ? ' ' : geticon(i)), dcc[i].nick);
00189       } else {
00190         egg_snprintf(format, sizeof format, "  %%c%%-%us ", nicklen);
00191         sprintf(s, format, (geticon(i) == '-' ? ' ' : geticon(i)), dcc[i].nick);
00192       }
00193       if (atr & USER_MASTER) {
00194         if (dcc[i].u.chat->channel < 0)
00195           strcat(s, "(-OFF-) ");
00196         else if (!dcc[i].u.chat->channel)
00197           strcat(s, "(party) ");
00198         else
00199           sprintf(&s[strlen(s)], "(%5d) ", dcc[i].u.chat->channel);
00200       }
00201       strcat(s, dcc[i].host);
00202       if (atr & USER_MASTER) {
00203         if (dcc[i].u.chat->con_flags)
00204           sprintf(&s[strlen(s)], " (con:%s)",
00205                   masktype(dcc[i].u.chat->con_flags));
00206       }
00207       if (now - dcc[i].timeval > 300) {
00208         k = (now - dcc[i].timeval) / 60;
00209         if (k < 60)
00210           sprintf(&s[strlen(s)], " (idle %dm)", k);
00211         else
00212           sprintf(&s[strlen(s)], " (idle %dh%dm)", k / 60, k % 60);
00213       }
00214       dprintf(idx, "%s\n", s);
00215       if (dcc[i].u.chat->away != NULL)
00216         dprintf(idx, "      AWAY: %s\n", dcc[i].u.chat->away);
00217     }
00218     if ((atr & USER_MASTER) && (dcc[i].type->flags & DCT_SHOWWHO) &&
00219         (dcc[i].type != &DCC_CHAT)) {
00220       if (!ok) {
00221         ok = 1;
00222         dprintf(idx, "Other people on the bot:\n");
00223       }
00224       if (atr & USER_OWNER) {
00225         egg_snprintf(format, sizeof format, "  [%%.2lu]  %%c%%-%us (files) %%s",
00226                      nicklen);
00227         sprintf(s, format,
00228                 dcc[i].sock, dcc[i].status & STAT_CHAT ? '+' : ' ',
00229                 dcc[i].nick, dcc[i].host);
00230       } else {
00231         egg_snprintf(format, sizeof format, "  %%c%%-%us (files) %%s", nicklen);
00232         sprintf(s, format,
00233                 dcc[i].status & STAT_CHAT ? '+' : ' ',
00234                 dcc[i].nick, dcc[i].host);
00235       }
00236       dprintf(idx, "%s\n", s);
00237     }
00238   }
00239 }

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

int backgrd

Definition at line 106 of file main.c.

char botnetnick[]

Definition at line 45 of file botnet.c.

Definition at line 2760 of file cmds.c.

struct chanset_t* chanset

Definition at line 60 of file chanprog.c.

int conmask

Definition at line 66 of file misc.c.

struct dcc_t* dcc

Definition at line 46 of file dcc.c.

int dcc_total

Definition at line 47 of file dcc.c.

Definition at line 132 of file main.c.

unsigned long itraffic_bn

Definition at line 153 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long itraffic_bn_today

Definition at line 154 of file main.c.

Referenced by cmd_traffic(), event_resettraffic(), and mainloop().

unsigned long itraffic_dcc

Definition at line 155 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long itraffic_dcc_today

Definition at line 156 of file main.c.

Referenced by cmd_traffic(), event_resettraffic(), and mainloop().

unsigned long itraffic_irc

Definition at line 151 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long itraffic_irc_today

Definition at line 152 of file main.c.

Referenced by cmd_traffic(), event_resettraffic(), and mainloop().

unsigned long itraffic_trans

Definition at line 157 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long itraffic_trans_today

Definition at line 158 of file main.c.

Referenced by cmd_traffic(), event_resettraffic(), and mainloop().

unsigned long itraffic_unknown

Definition at line 159 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long itraffic_unknown_today

Definition at line 160 of file main.c.

Referenced by cmd_traffic(), event_resettraffic(), and mainloop().

Definition at line 122 of file main.c.

Definition at line 186 of file modules.c.

char network[]

Definition at line 56 of file dcc.c.

Definition at line 88 of file main.c.

Definition at line 120 of file main.c.

char origbotname[]

Definition at line 62 of file chanprog.c.

unsigned long otraffic_bn

Definition at line 141 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long otraffic_bn_today

Definition at line 142 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long otraffic_dcc

Definition at line 143 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long otraffic_dcc_today

Definition at line 144 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long otraffic_irc

Definition at line 139 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long otraffic_irc_today

Definition at line 140 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long otraffic_trans

Definition at line 147 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long otraffic_trans_today

Definition at line 148 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long otraffic_unknown

Definition at line 149 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

unsigned long otraffic_unknown_today

Definition at line 150 of file main.c.

Referenced by cmd_traffic(), and event_resettraffic().

char owner[]

Definition at line 123 of file main.c.

char quit_msg[]

Definition at line 136 of file main.c.

Definition at line 76 of file tcl.c.

int require_p

Definition at line 50 of file dcc.c.

Definition at line 60 of file tcl.c.

Referenced by add_bot_hostmask(), and cmd_adduser().

Definition at line 56 of file chanprog.c.

char traffictxt[20] [static]

Definition at line 2717 of file cmds.c.

Referenced by btos().

struct userrec* userlist

Definition at line 57 of file chanprog.c.

char ver[]

Definition at line 129 of file main.c.


Generated on 7 Sep 2016 for Eggdrop by  doxygen 1.6.1