Przeglądaj źródła

* No longer using USER_BOT
Now the userrec has ->bot
flag records have .bot as well, got glob_bot()
Need to rethink the flag record


svn: 1086

Bryan Drewery 22 lat temu
rodzic
commit
5e242c2a4e

+ 4 - 4
src/botnet.c

@@ -553,7 +553,7 @@ void tell_bots(int idx)
   
 /* FIXME: NEED ME! */
   for (u = userlist; u; u = u->next) {
-    if ((u->flags & USER_BOT) && (egg_strcasecmp(u->handle, conf.bot->nick))) {
+    if (u->bot && (egg_strcasecmp(u->handle, conf.bot->nick))) {
       size_t hlen = strlen(u->handle);
       int up = 0;
 
@@ -932,7 +932,7 @@ int botlink(char *linker, int idx, char *nick)
   register int i;
 
   u = get_user_by_handle(userlist, nick);
-  if (!u || !(u->flags & USER_BOT)) {
+  if (!u || !u->bot) {
     if (idx >= 0)
       dprintf(idx, "%s %s\n", nick, BOT_BOTUNKNOWN);
   } else if (!egg_strcasecmp(nick, conf.bot->nick)) {
@@ -1104,7 +1104,7 @@ void tandem_relay(int idx, char *nick, register int i)
   struct chat_info *ci = NULL;
 
   u = get_user_by_handle(userlist, nick);
-  if (!u || !(u->flags & USER_BOT)) {
+  if (!u || !u->bot) {
     dprintf(idx, "%s %s\n", nick, BOT_BOTUNKNOWN);
     return;
   }
@@ -1677,7 +1677,7 @@ static int get_role(char *bot)
     return 1;
 
   for (u = userlist; u; u = u->next) {
-    if (u->flags & USER_BOT) {
+    if (u->bot) {
       if (strcmp(u->handle, bot)) {
         ba = get_user(&USERENTRY_BOTADDR, u);
         if ((nextbot(u->handle) >= 0) && (ba) && (ba->roleid > 0) && (ba->roleid < 5))

+ 1 - 1
src/cfg.c

@@ -772,7 +772,7 @@ static struct cfg_entry *check_can_set_cfg(char *target, char *entryname)
       return 0;
     if (!(u = get_user_by_handle(userlist, target)))
       return 0;
-    if (!(u->flags & USER_BOT))
+    if (!u->bot)
       return 0;
   } else {
     if (!(entry->flags & CFGF_GLOBAL))

+ 5 - 5
src/chanprog.c

@@ -377,7 +377,7 @@ void reaffirm_owners()
       rmspace(s);
       u = get_user_by_handle(userlist, s);
       if (u)
-	u->flags = sanity_check(u->flags | USER_ADMIN);
+	u->flags = sanity_check(u->flags | USER_ADMIN, 0);
       q = p + 1;
       p = strchr(q, ',');
     }
@@ -385,7 +385,7 @@ void reaffirm_owners()
     rmspace(s);
     u = get_user_by_handle(userlist, s);
     if (u)
-      u->flags = sanity_check(u->flags | USER_ADMIN);
+      u->flags = sanity_check(u->flags | USER_ADMIN, 0);
   }
 }
 
@@ -423,7 +423,7 @@ void load_internal_users()
       case 3:
         hublevel++;		/* We must increment this even if it is already added */
 	if (!get_user_by_handle(userlist, hand)) {
-	  userlist = adduser(userlist, hand, "none", "-", USER_BOT | USER_OP);
+	  userlist = adduser(userlist, hand, "none", "-", USER_OP, 1);
 	  bi = calloc(1, sizeof(struct bot_addr));
 
           bi->address = strdup(ip);
@@ -491,7 +491,7 @@ void load_internal_users()
 	  strncat(owner, ",", 120);
 	strncat(owner, hand, 120);
 	if (!get_user_by_handle(userlist, hand)) {
-	  userlist = adduser(userlist, hand, "none", "-", USER_ADMIN | USER_OWNER | USER_MASTER | USER_OP | USER_PARTY | USER_HUBA | USER_CHUBA);
+	  userlist = adduser(userlist, hand, "none", "-", USER_ADMIN | USER_OWNER | USER_MASTER | USER_OP | USER_PARTY | USER_HUBA | USER_CHUBA, 0);
 	  u = get_user_by_handle(userlist, hand);
 	  set_user(&USERENTRY_PASS, u, pass);
 	  while (hosts) {
@@ -540,7 +540,7 @@ void chanprog()
 
   if (!(conf.bot->u = get_user_by_handle(userlist, conf.bot->nick))) {
     /* I need to be on the userlist... doh. */
-    userlist = adduser(userlist, conf.bot->nick, "none", "-", USER_BOT | USER_OP );
+    userlist = adduser(userlist, conf.bot->nick, "none", "-", USER_OP, 1);
     conf.bot->u = get_user_by_handle(userlist, conf.bot->nick);
     bi = calloc(1, sizeof(struct bot_addr));
     if (conf.bot->ip)

+ 28 - 32
src/cmds.c

@@ -364,7 +364,7 @@ static void cmd_botconfig(struct userrec *u, int idx, char *par)
     dprintf(idx, "No such user.\n");
     return;
   }
-  if (!(u2->flags & USER_BOT)) {
+  if (!u2->bot) {
     dprintf(idx, "%s isn't a bot.\n", p);
     return;
   }
@@ -704,7 +704,7 @@ static void cmd_downbots(struct userrec *u, int idx, char *par)
 
   putlog(LOG_CMDS, "*", "#%s# downbots", dcc[idx].nick);
   for (u2 = userlist; u2; u2 = u2->next) {
-    if (u2->flags & USER_BOT) {
+    if (u2->bot) {
       if (egg_strcasecmp(u2->handle, conf.bot->nick)) {
         if (nextbot(u2->handle) == -1) {
           strcat(work, u2->handle);
@@ -972,7 +972,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
   putlog(LOG_CMDS, "*", "#%s# userlist", dcc[idx].nick);
 
   for (u = userlist; u; u = u->next) {
-    if (whois_access(dcc[idx].user, u) && (u->flags & USER_BOT) && (u->flags & USER_CHANHUB)) {
+    if (whois_access(dcc[idx].user, u) && u->bot && (u->flags & USER_CHANHUB)) {
       if (cnt)
         dprintf(idx, ", ");
       else
@@ -993,7 +993,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
 
 #ifdef HUB
   for (u = userlist; u; u = u->next) {
-    if (whois_access(dcc[idx].user, u) && !(u->flags & USER_BOT) && (u->flags & USER_ADMIN)) {
+    if (whois_access(dcc[idx].user, u) && !u->bot && (u->flags & USER_ADMIN)) {
       if (cnt)
         dprintf(idx, ", ");
       else
@@ -1014,7 +1014,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
 
 
   for (u = userlist; u; u = u->next) {
-    if (whois_access(dcc[idx].user, u) && !(u->flags & (USER_BOT | USER_ADMIN)) && (u->flags & USER_OWNER)) {
+    if (whois_access(dcc[idx].user, u) && !u->bot && !(u->flags & USER_ADMIN) && (u->flags & USER_OWNER)) {
       if (cnt)
         dprintf(idx, ", ");
       else
@@ -1034,7 +1034,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
   cnt = 0;
 
   for (u = userlist; u; u = u->next) {
-    if (whois_access(dcc[idx].user, u) && !(u->flags & (USER_BOT | USER_OWNER)) && (u->flags & USER_MASTER)) {
+    if (whois_access(dcc[idx].user, u) && !u->bot && !(u->flags & USER_OWNER) && (u->flags & USER_MASTER)) {
       if (cnt)
         dprintf(idx, ", ");
       else
@@ -1056,9 +1056,9 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
   for (u = userlist; u; u = u->next) {
     if (whois_access(dcc[idx].user, u)) {
 #ifdef HUB
-      if (!(u->flags & (USER_BOT | USER_MASTER)) && (u->flags & USER_OP)) {
+      if (!u->bot && !(u->flags & USER_MASTER) && (u->flags & USER_OP)) {
 #else /* !HUB */
-      if (!(u->flags & USER_BOT) && (u->flags & USER_OP)) {
+      if (!u->bot && (u->flags & USER_OP)) {
 #endif /* HUB */
         if (cnt)
           dprintf(idx, ", ");
@@ -1079,7 +1079,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
   cnt = 0;
 
   for (u = userlist; u; u = u->next) {
-    if (whois_access(dcc[idx].user, u) && !(u->flags & (USER_BOT | USER_OP))) {
+    if (whois_access(dcc[idx].user, u) && !u->bot && !(u->flags & USER_OP)) {
       if (cnt)
         dprintf(idx, ", ");
       else
@@ -1378,17 +1378,16 @@ static void cmd_chhandle(struct userrec *u, int idx, char *par)
   else {
     u2 = get_user_by_handle(userlist, hand);
     atr2 = u2 ? u2->flags : 0;
-    if (!(atr & USER_MASTER) && !(atr2 & USER_BOT))
+    if (!(atr & USER_MASTER) && !u2->bot)
       dprintf(idx, "You can't change handles for non-bots.\n");
-    else if ((u2->flags & USER_BOT) && !(atr & USER_OWNER))
+    else if (u2->bot && !(atr & USER_OWNER))
       dprintf(idx, "You can't change a bot's nick.\n");
     else if ((atr2 & USER_OWNER) && !(atr & USER_OWNER) &&
             egg_strcasecmp(dcc[idx].nick, hand))
       dprintf(idx, "You can't change a bot owner's handle.\n");
     else if (isowner(hand) && egg_strcasecmp(dcc[idx].nick, hand))
       dprintf(idx, "You can't change a permanent bot owner's handle.\n");
-    else if (!egg_strcasecmp(newhand, conf.bot->nick) && (!(atr2 & USER_BOT) ||
-             nextbot(hand) != -1))
+    else if (!egg_strcasecmp(newhand, conf.bot->nick) && !(u2->bot || nextbot(hand) != -1))
       dprintf(idx, "Hey! That's MY name!\n");
     else if (change_handle(u2, newhand)) {
       putlog(LOG_CMDS, "*", "#%s# chhandle %s %s", dcc[idx].nick,
@@ -1451,9 +1450,9 @@ static void cmd_chpass(struct userrec *u, int idx, char *par)
     u = get_user_by_handle(userlist, handle);
     if (!u)
       dprintf(idx, "No such user.\n");
-    else if (!(atr & USER_MASTER) && !(u->flags & USER_BOT))
+    else if (!(atr & USER_MASTER) && !u->bot)
       dprintf(idx, "You can't change passwords for non-bots.\n");
-    else if ((u->flags & USER_BOT) && !(atr & USER_OWNER))
+    else if (u->bot && !(atr & USER_OWNER))
       dprintf(idx, "You can't change a bot's password.\n");
     else if ((u->flags & USER_OWNER) && !(atr & USER_OWNER) &&
 	     egg_strcasecmp(handle, dcc[idx].nick))
@@ -1506,9 +1505,9 @@ static void cmd_chsecpass(struct userrec *u, int idx, char *par)
     u = get_user_by_handle(userlist, handle);
     if (!u)
       dprintf(idx, "No such user.\n");
-    else if (!(atr & USER_MASTER) && !(u->flags & USER_BOT))
+    else if (!(atr & USER_MASTER) && !u->bot)
       dprintf(idx, "You can't change passwords for non-bots.\n");
-    else if ((u->flags & USER_BOT) && !(atr & USER_OWNER))
+    else if (u->bot && !(atr & USER_OWNER))
       dprintf(idx, "You can't change a bot's password.\n");
     else if ((u->flags & USER_OWNER) && !(atr & USER_OWNER) &&
 	     egg_strcasecmp(handle, dcc[idx].nick))
@@ -1609,7 +1608,7 @@ static void cmd_hublevel(struct userrec *u, int idx, char *par)
   handle = newsplit(&par);
   level = newsplit(&par);
   u1 = get_user_by_handle(userlist, handle);
-  if (!u1 || !(u1->flags & USER_BOT)) {
+  if (!u1 || !u1->bot) {
     dprintf(idx, "Useful only for bots.\n");
     return;
   }
@@ -1644,7 +1643,7 @@ static void cmd_uplink(struct userrec *u, int idx, char *par)
   if (!uplink)
     uplink = "";
   u1 = get_user_by_handle(userlist, handle);
-  if (!u1 || !(u1->flags & USER_BOT)) {
+  if (!u1 || !u1->bot) {
     dprintf(idx, "Useful only for bots.\n");
     return;
   }
@@ -1687,11 +1686,11 @@ static void cmd_chaddr(struct userrec *u, int idx, char *par)
   if (strlen(addr) > UHOSTMAX)
     addr[UHOSTMAX] = 0;
   u1 = get_user_by_handle(userlist, handle);
-  if (!u1 || !(u1->flags & USER_BOT)) {
+  if (!u1 || !u1->bot) {
     dprintf(idx, "This command is only useful for tandem bots.\n");
     return;
   }
-  if ((u1->flags & USER_BOT) && (!u || !u->flags & USER_OWNER)) {
+  if ((u1 && u1->bot) && (!u || !u->flags & USER_OWNER)) {
     dprintf(idx, "You can't change a bot's address.\n");
     return;
   }
@@ -2278,7 +2277,7 @@ int check_dcc_attrs(struct userrec *u, flag_t oatr)
 
   /* Make sure default owners are +a */
   if (isowner(u->handle)) {
-    u->flags = sanity_check(u->flags | USER_ADMIN);
+    u->flags = sanity_check(u->flags | USER_ADMIN, 0);
   }
 
   for (i = 0; i < dcc_total; i++) {
@@ -2532,9 +2531,6 @@ static void cmd_chattr(struct userrec *u, int idx, char *par)
 
     pls.match = user.match;
     break_down_flags(chg, &pls, &mns);
-    /* No-one can change these flags on-the-fly */
-    pls.global &= ~(USER_BOT);
-    mns.global &= ~(USER_BOT);
 
     if ((pls.global & USER_UPDATEHUB) && (bot_hublevel(u2) == 999)) {
       dprintf(idx, "Only a hub can be set as the updatehub.\n");
@@ -2599,7 +2595,7 @@ static void cmd_chattr(struct userrec *u, int idx, char *par)
     get_user_flagrec(u2, &user, par);
     if (user.match & FR_GLOBAL) {
       of = user.global;
-      user.global = sanity_check((user.global |pls.global) &~mns.global);
+      user.global = sanity_check((user.global |pls.global) &~mns.global, u2->bot);
     }
     if (chan) {
       ocf = user.chan;
@@ -3059,7 +3055,7 @@ static void cmd_su(struct userrec *u, int idx, char *par)
     dprintf(idx, "Usage: su <user>\n");
   else if (!u)
     dprintf(idx, "No such user.\n");
-  else if (u->flags & USER_BOT)
+  else if (u->bot)
     dprintf(idx, "You can't su to a bot... then again, why would you wanna?\n");
   else if (dcc[idx].u.chat->su_nick)
     dprintf(idx, "You cannot currently double .su; try .su'ing directly.\n");
@@ -3197,7 +3193,7 @@ static void cmd_newleaf(struct userrec *u, int idx, char *par)
       struct bot_addr *bi = NULL;
       char tmp[81] = "";
 
-      userlist = adduser(userlist, handle, "none", "-", USER_BOT | USER_OP);
+      userlist = adduser(userlist, handle, "none", "-", USER_OP, 1);
       u1 = get_user_by_handle(userlist, handle);
       bi = calloc(1, sizeof(struct bot_addr));
 
@@ -3237,7 +3233,7 @@ static void cmd_nopass(struct userrec *u, int idx, char *par)
   putlog(LOG_CMDS, "*", "#%s# nopass %s", dcc[idx].nick, (par && par[0]) ? par : "");
 
   for (cu = userlist; cu; cu = cu->next) {
-    if (!(cu->flags & USER_BOT)) {
+    if (!cu->bot) {
       if (u_pass_match(cu, "-")) {
         cnt++;
         users = realloc(users, strlen(users) + strlen(cu->handle) + 1 + 1);
@@ -3377,7 +3373,7 @@ static void cmd_pls_user(struct userrec *u, int idx, char *par)
     struct userrec *u2 = NULL;
     char tmp[50] = "", s[16] = "", s2[17] = "";
 
-    userlist = adduser(userlist, handle, host, "-", USER_DEFAULT);
+    userlist = adduser(userlist, handle, host, "-", USER_DEFAULT, 0);
     u2 = get_user_by_handle(userlist, handle);
     sprintf(tmp, "%li %s", now, u->handle);
     set_user(&USERENTRY_ADDED, u2, tmp);
@@ -3431,7 +3427,7 @@ static void cmd_mns_user(struct userrec *u, int idx, char *par)
     dprintf(idx, "You can't remove a bot owner!\n");
     return;
   }
-  if (u2->flags & USER_BOT) {
+  if (u2->bot) {
     if (!(u->flags & USER_OWNER)) {
         dprintf(idx, "You can't remove bots.\n");
         return;
@@ -3445,7 +3441,7 @@ static void cmd_mns_user(struct userrec *u, int idx, char *par)
       return;
     }
   }
-  if (!(u->flags & USER_MASTER) && !(u2->flags & USER_BOT)) {
+  if (!(u->flags & USER_MASTER) && !u2->bot) {
     dprintf(idx, "You can't remove users who aren't bots!\n");
     return;
   }

+ 2 - 2
src/dcc.c

@@ -759,7 +759,7 @@ static void dcc_chat_pass(int idx, char *buf, int atr)
     return;
   strip_telnet(dcc[idx].sock, buf, &atr);
   atr = dcc[idx].user ? dcc[idx].user->flags : 0;
-  if (atr & USER_BOT) {
+  if (dcc[idx].user->bot) {
     if (!egg_strcasecmp(buf, "elinkdone")) {
       free(dcc[idx].u.chat);
       dcc[idx].type = &DCC_BOT_NEW;
@@ -1867,7 +1867,7 @@ static void dcc_telnet_got_ident(int i, char *host)
 #endif /* HUB */
 /*    else if (!(u->flags & USER_PARTY))
       ok = 0; */
-    if (!ok && u && (u->flags & USER_BOT))
+    if (!ok && u && u->bot)
       ok = 1;
     if (!ok && (dcc[idx].status & LSTN_PUBLIC))
       ok = 1;

+ 1 - 1
src/debug.c

@@ -207,7 +207,7 @@ void write_debug()
     }
     putlog(LOG_MISC, "*", "* Emailed DEBUG to development team...");
 #endif /* !CYGWIN_HACKS */
-//    unlink(buf);
+    unlink(buf);
   }
 }
 #endif /* DEBUG_CONTEXT */

+ 6 - 5
src/flags.c

@@ -34,14 +34,12 @@ void init_flags()
 
 /* Some flags are mutually exclusive -- this roots them out
  */
-flag_t sanity_check(flag_t atr)
+flag_t sanity_check(flag_t atr, int bot)
 {
-  if ((atr & USER_BOT) &&
-      (atr & (USER_PARTY | USER_MASTER | USER_OWNER | USER_ADMIN | USER_HUBA | USER_CHUBA)))
+  if (bot && (atr & (USER_PARTY | USER_MASTER | USER_OWNER | USER_ADMIN | USER_HUBA | USER_CHUBA)))
     atr &= ~(USER_PARTY | USER_MASTER | USER_OWNER | USER_ADMIN | USER_HUBA | USER_CHUBA);
 /* only bots should be there: */
-  if (!(atr & USER_BOT) &&
-      (atr & (USER_DOLIMIT | USER_DOVOICE | USER_UPDATEHUB | USER_CHANHUB)))
+  if (!bot && (atr & (USER_DOLIMIT | USER_DOVOICE | USER_UPDATEHUB | USER_CHANHUB)))
     atr &= ~(USER_DOLIMIT | USER_DOVOICE | USER_UPDATEHUB | USER_CHANHUB);
   if ((atr & USER_OP) && (atr & USER_DEOP))
     atr &= ~(USER_OP | USER_DEOP);
@@ -344,10 +342,13 @@ void get_user_flagrec(struct userrec *u, struct flag_record *fr, const char *chn
 {
   struct chanuserrec *cr = NULL;
 
+  fr->bot = 0;
   if (!u) {
     fr->global = fr->chan = 0;
     return;
   }
+  if (u->bot)
+    fr->bot = 1;
   if (fr->match & FR_GLOBAL) {
     fr->global = u->flags;
   } else {

+ 5 - 3
src/flags.h

@@ -21,6 +21,7 @@ struct flag_record {
   flag_t match;
   flag_t global;
   flag_t chan;
+  char bot;
 };
 
 #define FR_GLOBAL 0x00000001
@@ -62,6 +63,7 @@ struct flag_record {
 #define CHAN_VALID (flag_t) 0xfffffffffffff
 
 #define USER_ADMIN	FLAG['a']
+/* FIXME; REMOVE AFTER 1.1.8 */
 #define USER_BOT	FLAG['b']
 #define USER_CHANHUB	FLAG['c']
 #define USER_DEOP	FLAG['d']
@@ -84,10 +86,11 @@ struct flag_record {
 #define USER_DEFAULT	0
 
 
-#define bot_hublevel(x) ( ( (x) && (x->flags & USER_BOT) && (get_user(&USERENTRY_BOTADDR, x)) ) ? \
+#define bot_hublevel(x) ( ( (x) && x->bot && (get_user(&USERENTRY_BOTADDR, x)) ) ? \
                           ( ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel ? \
                             ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel : 999) \
                          : 999)
+#define glob_bot(x)		       ((x).bot)
 
 /* Flag checking macros
  */
@@ -98,7 +101,6 @@ struct flag_record {
 #define chan_deop(x)                   ((x).chan & USER_DEOP)
 #define glob_deop(x)                   ((x).global & USER_DEOP)
 #define glob_master(x)                 ((x).global & USER_MASTER)
-#define glob_bot(x)                    ((x).global & USER_BOT)
 #define glob_owner(x)                  ((x).global & USER_OWNER)
 #define chan_master(x)                 ((x).chan & USER_MASTER)
 #define chan_owner(x)                  ((x).chan & USER_OWNER)
@@ -132,7 +134,7 @@ void break_down_flags(const char *, struct flag_record *, struct flag_record *);
 int build_flags(char *, struct flag_record *, struct flag_record *);
 int flagrec_eq(struct flag_record *, struct flag_record *);
 int flagrec_ok(struct flag_record *, struct flag_record *);
-flag_t sanity_check(flag_t);
+flag_t sanity_check(flag_t, int);
 flag_t chan_sanity_check(flag_t, flag_t);
 char geticon(int);
 

+ 1 - 1
src/main.c

@@ -875,7 +875,7 @@ int main(int argc, char **argv)
     dcc[n].user = get_user_by_handle(userlist, dcc[n].nick);
     /* Make sure there's an innocuous HQ user if needed */
     if (!dcc[n].user) {
-      userlist = adduser(userlist, dcc[n].nick, "none", "-", USER_ADMIN | USER_OWNER | USER_MASTER | USER_VOICE | USER_OP | USER_PARTY | USER_CHUBA | USER_HUBA);
+      userlist = adduser(userlist, dcc[n].nick, "none", "-", USER_ADMIN | USER_OWNER | USER_MASTER | USER_VOICE | USER_OP | USER_PARTY | USER_CHUBA | USER_HUBA, 0);
       dcc[n].user = get_user_by_handle(userlist, dcc[n].nick);
     }
     setsock(STDOUT, 0);          /* Entry in net table */

+ 2 - 2
src/mod/channels.mod/channels.c

@@ -330,7 +330,7 @@ void rebalance_roles()
   char tmp[10] = "";
 
   for (i = 0; i < (unsigned) dcc_total; i++) {
-    if (dcc[i].user && (dcc[i].user->flags & USER_BOT)) {
+    if (dcc[i].user && dcc[i].user->bot) {
       ba = get_user(&USERENTRY_BOTADDR, dcc[i].user);
       if (ba && (ba->roleid > 0) && (ba->roleid < 5))
         r[(ba->roleid - 1)]++;
@@ -352,7 +352,7 @@ void rebalance_roles()
   }
   while (r[hNdx] - r[lNdx] >= 2) {
     for (i = 0; i < (unsigned) dcc_total; i++) {
-      if (dcc[i].user && (dcc[i].user->flags & USER_BOT)) {
+      if (dcc[i].user && dcc[i].user->bot) {
         ba = get_user(&USERENTRY_BOTADDR, dcc[i].user);
         if (ba && (ba->roleid == (hNdx + 1))) {
           ba->roleid = lNdx + 1;

+ 3 - 3
src/mod/channels.mod/cmdschan.c

@@ -438,7 +438,7 @@ static void cmd_chinfo(struct userrec *u, int idx, char *par)
     }
   } else
     chname = 0;
-  if ((u1->flags & USER_BOT) && !(u->flags & USER_MASTER)) {
+  if (u1->bot && !(u->flags & USER_MASTER)) {
     dprintf(idx, "You have to be master to change bots info.\n");
     return;
   }
@@ -1017,7 +1017,7 @@ static void cmd_botjoin(struct userrec *u, int idx, char *par)
   }
   bot = newsplit(&par);
   botu = get_user_by_handle(userlist, bot);
-  if (botu && botu->flags && (botu->flags & USER_BOT)) {
+  if (botu && botu->bot) {
     pls_chan(u, idx, par, bot);
   } else {
     dprintf(idx, "Error: '%s' is not a bot.\n", bot);
@@ -1089,7 +1089,7 @@ static void cmd_botpart(struct userrec *u, int idx, char *par)
 
   bot = newsplit(&par);
   botu = get_user_by_handle(userlist, bot);
-  if (botu && botu->flags && (botu->flags & USER_BOT)) {
+  if (botu && botu->bot) {
     mns_chan(u, idx, par, bot);
   } else {
     dprintf(idx, "Error: '%s' is not a bot.\n", bot);

+ 1 - 1
src/mod/channels.mod/userchan.c

@@ -1149,7 +1149,7 @@ int expired_mask(struct chanset_t *chan, char *who)
     u = get_user_by_host(buf);
   }
   /* Do not expire masks set by bots. */
-  if (u && u->flags & USER_BOT)
+  if (u && u->bot)
     return 0;
   else
     return 1;

+ 1 - 1
src/mod/console.mod/console.c

@@ -117,7 +117,7 @@ console_set(struct userrec *u, struct user_entry *e, void *buf)
     ci = e->u.extra = buf;
   }
 
-  if (!noshare && !(u->flags & USER_BOT)) {
+  if (!noshare && !u->bot) {
     char string[501] = "";
 
     egg_snprintf(string, sizeof string, "%s %s %s %d %d %d %d %d %d %d %d", ci->channel,

+ 5 - 6
src/mod/irc.mod/chan.c

@@ -144,8 +144,7 @@ void priority_do(struct chanset_t * chan, int opsonly, int action)
       m->user = get_user_by_host(s);
     }
 
-
-    if (m->user && ((m->user->flags & (USER_BOT | USER_OP)) == (USER_BOT | USER_OP))) {
+    if (m->user && m->user->bot && (m->user->flags & USER_OP)) {
       ops++;
       if (!strcmp(m->nick, botname))
         bpos = (ops - 1);
@@ -1078,7 +1077,7 @@ do_take(struct chanset_t *chan)
   for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
     int hasop = (m->flags & CHANOP), isbot = 0;
 
-    if (m->user && (m->user->flags & USER_BOT))
+    if (m->user && m->user->bot)
       isbot++;
 
     if (rfc_casecmp(m->nick, botname)) {
@@ -1174,7 +1173,7 @@ void recheck_channel(struct chanset_t *chan, int dobans)
     int hasop = chan_hasop(m);
 
     if (m) {
-      if (m->user && m->user->flags & (USER_BOT | USER_OP)) {
+      if (m->user && m->user->bot && (m->user->flags & USER_OP)) {
         if (hasop)
           botops++;
         else
@@ -2473,11 +2472,11 @@ void check_should_cycle(struct chanset_t *chan)
     if (chan_hasop(ml)) {
       if (chan_issplit(ml)) {
         splitops++;
-        if ((ml->user) && (ml->user->flags & USER_BOT))
+        if ((ml->user) && ml->user->bot)
           splitbotops++;
       } else {
         localops++;
-        if ((ml->user) && (ml->user->flags & USER_BOT))
+        if ((ml->user) && ml->user->bot)
           localbotops++;
         if (localbotops >= 2)
           return;

+ 2 - 2
src/mod/irc.mod/cmdsirc.c

@@ -580,7 +580,7 @@ ContextNote("!mdop!");
       ContextNote(m->nick);
       if (!m->user)
 	targets[targetcount++] = m;
-      else if (((m->user->flags & (USER_BOT | USER_OP)) == (USER_BOT | USER_OP))
+      else if (m->user->bot && (m->user->flags & USER_OP) 
 	       && (strcmp(conf.bot->nick, m->user->handle))
 	       && (nextbot(m->user->handle) >= 0))
 	chanbots[chanbotcount++] = m;
@@ -1560,7 +1560,7 @@ static void cmd_adduser(struct userrec *u, int idx, char *par)
     p1[0] = '*';
   }
   if (!u) {
-    userlist = adduser(userlist, hand, p1, "-", USER_DEFAULT);
+    userlist = adduser(userlist, hand, p1, "-", USER_DEFAULT, 0);
     u = get_user_by_handle(userlist, hand);
     sprintf(tmp, "%li %s", now, dcc[idx].nick);
     set_user(&USERENTRY_ADDED, u, tmp);

+ 2 - 2
src/mod/irc.mod/irc.c

@@ -718,7 +718,7 @@ static void punish_badguy(struct chanset_t *chan, char *whobad,
         } else
           strcpy(s1, "bad1");		/* Start with '1' */
       }
-      userlist = adduser(userlist, s1, s, "-", 0);
+      userlist = adduser(userlist, s1, s, "-", 0, 0);
       fr.match = FR_CHAN;
       fr.chan = USER_DEOP;
       u = get_user_by_handle(userlist, s1);
@@ -995,7 +995,7 @@ static void check_lonely_channel(struct chanset_t *chan)
     for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
       sprintf(s, "%s!%s", m->nick, m->userhost);
       u = get_user_by_host(s);
-      if (!match_my_nick(m->nick) && (!u || !(u->flags & USER_BOT))) {
+      if (!match_my_nick(m->nick) && (!u || !u->bot)) {
 	ok = 0;
 	break;
       }

+ 8 - 6
src/mod/irc.mod/mode.c

@@ -875,7 +875,7 @@ static int gotmode(char *from, char *msg)
 
       /* check for mdop */
       if ((chan) && (deops >= 3) && me_op(chan)) {
-        if ((!ufrom) || (!(ufrom->flags & USER_BOT))) {
+        if (!ufrom || !ufrom->bot) {
           if (ROLE_KICK_MDOP) {
             m = ismember(chan, nfrom);
             if (m && !chan_sentkick(m)) {
@@ -894,7 +894,7 @@ static int gotmode(char *from, char *msg)
       /* check for mop */
       if (chan && (ops >= 3) && me_op(chan)) {
         if (channel_nomop(chan)) {
-          if ((!ufrom) || (!(ufrom->flags & USER_BOT))) {
+          if (!ufrom || !ufrom->bot) {
             if (ROLE_KICK_MDOP) {
               m = ismember(chan, nfrom);
               if (m && !chan_sentkick(m)) {
@@ -912,7 +912,7 @@ static int gotmode(char *from, char *msg)
         }
       }
 
-      if (chan && me_op(chan) && ops && (ufrom) && (ufrom->flags & USER_BOT) && !channel_fastop(chan) && !channel_take(chan)) {
+      if (chan && me_op(chan) && ops && ufrom && ufrom->bot && !channel_fastop(chan) && !channel_take(chan)) {
         int isbadop = 0;
 
         if ((modecnt != 2) || (strncmp(modes[0], "+o", 2)) || (strncmp(modes[1], "-b", 2))) {
@@ -1010,7 +1010,7 @@ static int gotmode(char *from, char *msg)
           putlog(LOG_DEBUG, "@", "Good op: %s", msg);
       }
 
-      if ((ops) && chan && me_op(chan) && !channel_manop(chan) && (ufrom) && !(ufrom->flags & USER_BOT)) {
+      if (ops && chan && me_op(chan) && !channel_manop(chan) && ufrom && !ufrom->bot) {
         char trg[NICKLEN] = "";
 
         n = i = 0;
@@ -1074,9 +1074,11 @@ static int gotmode(char *from, char *msg)
       u = get_user_by_host(from);
       get_user_flagrec(u, &user, ch);
       nick = splitnick(&from);
-      m = ismember(chan, nick);
-      if (m)
+      if ((m = ismember(chan, nick))) {
 	m->last = now;
+        if (!m->user && u)
+          m->user = u;
+      }
       if (channel_active(chan) && m && me_op(chan)) {
 	if (chan_fakeop(m)) {
 	  putlog(LOG_MODES, ch, CHAN_FAKEMODE, ch);

+ 7 - 7
src/mod/irc.mod/msgcmds.c

@@ -16,7 +16,7 @@ static int msg_pass(char *nick, char *host, struct userrec *u, char *par)
     return BIND_RET_BREAK;
   if (!u)
     return BIND_RET_BREAK;
-  if (u->flags & (USER_BOT))
+  if (u->bot)
     return BIND_RET_BREAK;
   if (!par[0]) {
     dprintf(DP_HELP, "NOTICE %s :%s\n", nick,
@@ -102,7 +102,7 @@ static int msg_ident(char *nick, char *host, struct userrec *u, char *par)
   char s[UHOSTLEN] = "", s1[UHOSTLEN] = "", *pass = NULL, who[NICKLEN] = "";
   struct userrec *u2 = NULL;
 
-  if (match_my_nick(nick) || (u && (u->flags & USER_BOT)))
+  if (match_my_nick(nick) || (u && u->bot))
     return BIND_RET_BREAK;
 
   pass = newsplit(&par);
@@ -116,7 +116,7 @@ static int msg_ident(char *nick, char *host, struct userrec *u, char *par)
   if (!u2) {
     if (u && !quiet_reject)
       dprintf(DP_HELP, IRC_MISIDENT, nick, nick, u->handle);
-  } else if (rfc_casecmp(who, origbotname) && !(u2->flags & USER_BOT)) {
+  } else if (rfc_casecmp(who, origbotname) && !u2->bot) {
     /* This could be used as detection... */
     if (u_pass_match(u2, "-")) {
       putlog(LOG_CMDS, "*", "(%s!%s) !*! IDENT %s", nick, host, who);
@@ -230,7 +230,7 @@ static int msg_authstart(char *nick, char *host, struct userrec *u, char *par)
     return 0;
   if (match_my_nick(nick))
     return BIND_RET_BREAK;
-  if (u && (u->flags & USER_BOT))
+  if (u && u->bot)
     return BIND_RET_BREAK;
 
   i = findauth(host);
@@ -271,7 +271,7 @@ static int msg_auth(char *nick, char *host, struct userrec *u, char *par)
 
   if (match_my_nick(nick))
     return BIND_RET_BREAK;
-  if (u && (u->flags & USER_BOT))
+  if (u && u->bot)
     return BIND_RET_BREAK;
 
   i = findauth(host);
@@ -309,7 +309,7 @@ static int msg_pls_auth(char *nick, char *host, struct userrec *u, char *par)
 
   if (match_my_nick(nick))
     return BIND_RET_BREAK;
-  if (u && (u->flags & USER_BOT))
+  if (u && u->bot)
     return BIND_RET_BREAK;
 
   i = findauth(host);
@@ -350,7 +350,7 @@ static int msg_unauth(char *nick, char *host, struct userrec *u, char *par)
 
   if (match_my_nick(nick))
     return BIND_RET_BREAK;
-  if (u && (u->flags & USER_BOT))
+  if (u && u->bot)
     return BIND_RET_BREAK;
 
   i = findauth(host);

+ 1 - 1
src/mod/notes.mod/notes.c

@@ -567,7 +567,7 @@ static int msg_notes(char *nick, char *host, struct userrec *u, char *par)
 
   if (!u)
     return 0;
-  if (u->flags & (USER_BOT))
+  if (u->bot)
     return 1;
   if (!par[0]) {
     dprintf(DP_HELP, "NOTICE %s :%s: NOTES <pass> INDEX\n", nick, NOTES_USAGE);

+ 1 - 1
src/mod/server.mod/servmsg.c

@@ -338,7 +338,7 @@ static int detect_flood(char *floodnick, char *floodhost, char *from, int which)
 
   u = get_user_by_host(from);
   atr = u ? u->flags : 0;
-  if ((atr & USER_BOT) || (atr & USER_NOFLOOD))
+  if ((u && u->bot) || (atr & USER_NOFLOOD))
     return 0;
 
 #ifdef S_AUTHCMDS

+ 19 - 11
src/mod/share.mod/share.c

@@ -260,7 +260,7 @@ share_chattr(int idx, char *par)
   struct chanset_t *cst = NULL;
   struct userrec *u = NULL;
   struct flag_record fr2;
-  flag_t bfl, ofl;
+  flag_t ofl;
 
   if (dcc[idx].status & STAT_SHARE) {
     hand = newsplit(&par);
@@ -292,12 +292,8 @@ share_chattr(int idx, char *par)
           get_user_flagrec(dcc[idx].user, &fr, 0);
           /* Don't let bot flags be altered */
           ofl = fr.global;
-
           break_down_flags(atr, &fr, 0);
-          bfl = u->flags & USER_BOT;
-
-          fr.global = sanity_check(fr.global |bfl);
-
+          fr.global = sanity_check(fr.global, u->bot);
           set_user_flagrec(u, &fr, 0);
           check_dcc_attrs(u, ofl);
           noshare = 0;
@@ -367,10 +363,16 @@ share_newuser(int idx, char *par)
   struct userrec *u = NULL;
 
   if (dcc[idx].status & STAT_SHARE) {
+    int isbot = 0;
+
     nick = newsplit(&par);
     host = newsplit(&par);
     pass = newsplit(&par);
-
+    
+    if (nick[0] == '-') {
+      isbot++;
+      nick++;
+    }    
     if (!(u = get_user_by_handle(userlist, nick))) {
       fr.global = 0;
 
@@ -386,7 +388,13 @@ share_newuser(int idx, char *par)
 
       fr.match = FR_GLOBAL;
       build_flags(s, &fr, 0);
-      userlist = adduser(userlist, nick, host, pass, 0);
+/* FIXME: remove after 1.1.8 */
+      if (fr.global & USER_BOT) {
+        isbot++;
+        fr.global &= ~USER_BOT;
+      }
+
+      userlist = adduser(userlist, nick, host, pass, 0, isbot);
 
       /* Support for userdefinedflag share - drummer */
       u = get_user_by_handle(userlist, nick);
@@ -452,11 +460,11 @@ share_pls_bothost(int idx, char *par)
       shareout_but(NULL, idx, "+bh %s %s\n", hand, par);
     /* Add bot to userlist if not there */
     if (u) {
-      if (!(u->flags & USER_BOT))
+      if (!u->bot)
         return;                 /* ignore */
       set_user(&USERENTRY_HOSTS, u, par);
     } else {
-      userlist = adduser(userlist, hand, par, "-", USER_BOT);
+      userlist = adduser(userlist, hand, par, "-", 0, 1);
     }
 #ifndef LEAF
     if (!(dcc[idx].status & STAT_GETTING))
@@ -512,7 +520,7 @@ share_change(int idx, char *par)
         char pass[30] = "";
 
         makepass(pass);
-        userlist = adduser(userlist, hand, "none", pass, USER_BOT);
+        userlist = adduser(userlist, hand, "none", pass, 0, 1);
         u = get_user_by_handle(userlist, hand);
       } else if (!u)
         return;

+ 2 - 3
src/shell.c

@@ -556,9 +556,8 @@ void detected(int code, char *msg)
     putlog(LOG_WARN, "*", "Setting myself +d: %s", msg);
     sprintf(tmp, "+d: %s", msg);
     set_user(&USERENTRY_COMMENT, u, tmp);
-    get_user_flagrec(u, &fr, 0);
-    fr.global = USER_DEOP | USER_BOT;
-
+    fr.global = USER_DEOP;
+    fr.bot = 1;
     set_user_flagrec(u, &fr, 0);
     sleep(1);
     break;

+ 1 - 1
src/userent.c

@@ -558,7 +558,7 @@ int pass_set(struct userrec *u, struct user_entry *e, void *buf)
 	*p = '?';
       p++;
     }
-    if ((u->flags & USER_BOT) || (pass[0] == '+'))
+    if (u->bot || (pass[0] == '+'))
       strcpy(new, pass);
     else
       encrypt_pass(pass, new);

+ 9 - 7
src/userrec.c

@@ -253,7 +253,7 @@ int u_pass_match(struct userrec *u, char *in)
     return 1;
   if (!cmp || !pass || !pass[0] || (pass[0] == '-'))
     return 0;
-  if (u->flags & USER_BOT) {
+  if (u->bot) {
     if (!strcmp(cmp, pass))
       return 1;
   } else {
@@ -277,7 +277,7 @@ int write_user(struct userrec *u, FILE * f, int idx)
 
   fr.global = u->flags;
   build_flags(s, &fr, NULL);
-  if (lfprintf(f, "%-10s - %-24s\n", u->handle, s) == EOF)
+  if (lfprintf(f, "%c%-10s - %-24s\n", u->bot ? '-' : 0, u->handle, s) == EOF)
     return 0;
   for (ch = u->chanrec; ch; ch = ch->next) {
     cst = findchan_by_dname(ch->channel);
@@ -315,7 +315,7 @@ static int sort_compare(struct userrec *a, struct userrec *b)
    * then users: +n / +m / +o / other users
    * return true if (a > b)
    */
-  if (a->flags & b->flags & USER_BOT) {
+  if (a->bot && b->bot) {
     if (bot_hublevel(a) > bot_hublevel(b))
       return 1;
     else if (bot_hublevel(a) < bot_hublevel(b))
@@ -323,9 +323,9 @@ static int sort_compare(struct userrec *a, struct userrec *b)
     else if (bot_hublevel(a) == bot_hublevel(b) && bot_hublevel(a) == 999)
       return 0;
   } else {
-    if (~a->flags & b->flags & USER_BOT)
+    if (a->bot && !b->bot)
       return 1;
-    if (a->flags & ~b->flags & USER_BOT)
+    if (!a->bot && b->bot)
       return 0;
     if (~a->flags & b->flags & USER_ADMIN)
       return 1;
@@ -458,7 +458,7 @@ int change_handle(struct userrec *u, char *newh)
   return 1;
 }
 
-struct userrec *adduser(struct userrec *bu, char *handle, char *host, char *pass, flag_t flags)
+struct userrec *adduser(struct userrec *bu, char *handle, char *host, char *pass, flag_t flags, int bot)
 {
   struct userrec *u = NULL, *x = NULL;
   int oldshare = noshare;
@@ -466,6 +466,8 @@ struct userrec *adduser(struct userrec *bu, char *handle, char *host, char *pass
   noshare = 1;
   u = (struct userrec *) calloc(1, sizeof(struct userrec));
 
+  u->bot = bot;
+
   /* u->next=bu; bu=u; */
   strncpyz(u->handle, handle, sizeof u->handle);
   u->next = NULL;
@@ -644,7 +646,7 @@ void addhost_by_handle(char *handle, char *host)
   set_user(&USERENTRY_HOSTS, u, host);
   /* u will be cached, so really no overhead, even tho this looks dumb: */
   if (!noshare) {
-    if (u->flags & USER_BOT)
+    if (u->bot)
       shareout(NULL, "+bh %s %s\n", handle, host);
     else
       shareout(NULL, "+h %s %s\n", handle, host);

+ 1 - 1
src/userrec.h

@@ -2,7 +2,7 @@
 #define _USERREC_H
 
 void deflag_user(struct userrec *, int, char *, struct chanset_t *);
-struct userrec *adduser(struct userrec *, char *, char *, char *, flag_t);
+struct userrec *adduser(struct userrec *, char *, char *, char *, flag_t, int);
 void addhost_by_handle(char *, char *);
 void clear_masks(struct maskrec *);
 void clear_userlist(struct userrec *);

+ 20 - 9
src/users.c

@@ -926,7 +926,7 @@ int readuserfile(const char *file, struct userrec **ret)
 	} else if (code[0] == '*') {
 	  lasthand[0] = 0;
 	  u = NULL;
-	} else {
+	} else {		/* its a user ! */
 	  pass = newsplit(&s);
 	  attr = newsplit(&s);
 	  rmspace(s);
@@ -935,26 +935,36 @@ int readuserfile(const char *file, struct userrec **ret)
 	    lasthand[0] = 0;
             return 0;
 	  } else {
+            int isbot = 0;
+
+            if (code[0] == '-') {
+              code++;
+              isbot++;
+            }
+
 	    u = get_user_by_handle(bu, code);
 	    if (u) {
 	      putlog(LOG_ERROR, "@", "* %s '%s'!", USERF_DUPE, code);
 	      lasthand[0] = 0;
 	      u = NULL;
-	    } else if (u) {
-	      lasthand[0] = 0;
-	      u = NULL;
 	    } else {
 	      fr.match = FR_GLOBAL;
 	      break_down_flags(attr, &fr, 0);
 	      strcpy(lasthand, code);
 	      cst = NULL;
+/* FIXME: remove after 1.1.8 */
+              if (fr.global & USER_BOT) {	/* this should pick up the old +b flag for now */
+                isbot++;
+                fr.global &= ~USER_BOT;
+              }
+              
 	      if (strlen(code) > HANDLEN)
 		code[HANDLEN] = 0;
 	      if (strlen(pass) > 20) {
 		putlog(LOG_MISC, "*", "* %s '%s'", USERF_BROKEPASS, code);
 		strcpy(pass, "-");
 	      }
-	      bu = adduser(bu, code, 0, pass, sanity_check(fr.global));
+	      bu = adduser(bu, code, 0, pass, sanity_check(fr.global, isbot), isbot);
 
 	      u = get_user_by_handle(bu, code);
 	      for (i = 0; i < dcc_total; i++)
@@ -980,8 +990,9 @@ int readuserfile(const char *file, struct userrec **ret)
   for (u = bu; u; u = u->next) {
     struct user_entry *e = NULL;
 
-    if (!(u->flags & USER_BOT) && !egg_strcasecmp (u->handle, conf.bot->nick)) {
-      putlog(LOG_MISC, "*", "(!) I have a user record, but without +b");
+    if (!u->bot && !egg_strcasecmp (u->handle, conf.bot->nick)) {
+      putlog(LOG_MISC, "*", "(!) I have a user record, but am not classified as a BOT!");
+      u->bot = 1;
       /* u->flags |= USER_BOT; */
     }
 
@@ -1017,7 +1028,7 @@ void link_pref_val(struct userrec *u, char *val)
   if (!u)
     return;
 
-  if (!(u->flags & USER_BOT))
+  if (!u->bot)
     return;
   if (!(ba = get_user(&USERENTRY_BOTADDR, u))) {
     return;
@@ -1048,7 +1059,7 @@ struct userrec *next_hub(struct userrec *current, char *lowval, char *highval)
       cur = userlist;
     if (cur == current)
       break;
-    if ((cur->flags & USER_BOT) && (strcmp(cur->handle, conf.bot->nick))) {
+    if (cur->bot && (strcmp(cur->handle, conf.bot->nick))) {
       link_pref_val(cur, thisval);
       if ((strcmp(thisval, lowval) < 0) && (strcmp(thisval, highval) > 0) &&(strcmp(thisval, bestmatchval) < 0)) {
         strcpy(bestmatchval, thisval);

+ 2 - 1
src/users.h

@@ -95,7 +95,7 @@ struct user_entry *find_user_entry(struct user_entry_type *, struct userrec *);
 void *get_user(struct user_entry_type *, struct userrec *);
 int set_user(struct user_entry_type *, struct userrec *, void *);
 
-#define is_bot(u)	((u) && ((u)->flags & USER_BOT))
+#define is_bot(u)	((u) && (u)->bot)
 
 /* Fake users used to store ignores and bans
  */
@@ -124,6 +124,7 @@ struct userrec {
   struct userrec *next;
   flag_t flags;
   char handle[HANDLEN + 1];
+  char bot;
 };
 
 struct igrec {