فهرست منبع

* Fixed cmd_mop for *

svn: 330
Bryan Drewery 22 سال پیش
والد
کامیت
766a131aa8
1فایلهای تغییر یافته به همراه51 افزوده شده و 22 حذف شده
  1. 51 22
      src/mod/irc.mod/cmdsirc.c

+ 51 - 22
src/mod/irc.mod/cmdsirc.c

@@ -984,37 +984,66 @@ static void cmd_getkey(struct userrec *u, int idx, char *par)
 static void cmd_mop(struct userrec *u, int idx, char *par)
 static void cmd_mop(struct userrec *u, int idx, char *par)
 {
 {
   struct chanset_t *chan;
   struct chanset_t *chan;
-  memberlist *m;
   int found = 0;
   int found = 0;
+  int all = 0;
 
 
-  if (par[0] && (strchr(CHANMETA, par[0]) != NULL)) {
-    char *chname = newsplit(&par);
-    chan = get_channel(idx, chname);
-  } else
-    chan = get_channel(idx, "");
+  if (par[0] == '*' && !par[1]) {
+    all = 1;
+    chan = chanset;
+    newsplit(&par);
+  } else {
+    if (par[0] && (strchr(CHANMETA, par[0]) != NULL)) {
+      char *chname = newsplit(&par);
+      chan = get_channel(idx, chname);
+    } else
+      chan = get_channel(idx, "");
+  }
 
 
-  if (!chan || !has_op(idx, chan))
+  if (!chan && !all)
     return;
     return;
 
 
-  putlog(LOG_CMDS, "*", "#%s# (%s) mop %s", dcc[idx].nick, chan->dname, par);
-
-  get_user_flagrec(dcc[idx].user, &user, chan->dname);
+  putlog(LOG_CMDS, "*", "#%s# (%s) mop %s", dcc[idx].nick, all ? "*" : chan->dname, par);
+  while (chan) {
+    memberlist *m;
 
 
-  for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
-    if (!m->user) {
-      char s[256];
-      sprintf(s, STR("%s!%s"), m->nick, m->userhost);
-      m->user = get_user_by_host(s);
+    get_user_flagrec(dcc[idx].user, &user, chan->dname);
+    if (private(user, chan, PRIV_OP)) {
+      if (all) goto next;
+      dprintf(idx, "No such channel.\n");
+      return;
     }
     }
-    get_user_flagrec(m->user, &victim, chan->dname);
-    if (!chan_hasop(m) && !glob_bot(victim) && chk_op(victim, chan)) {
-      found++;
-      dprintf(idx, "Gave op to %s on %s\n", m->nick, chan->dname);
-      do_op(m->nick, chan, 0);
+    if (!chk_op(user, chan)) {
+      if (all) goto next;
+      dprintf(idx, "You are not a channel op on %s.\n", chan->dname);
+      return;
+    }
+
+    if (channel_active(chan) && !channel_pending(chan)) {
+      for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
+        if (!m->user) {
+          char s[256];
+          sprintf(s, STR("%s!%s"), m->nick, m->userhost);
+          m->user = get_user_by_host(s);
+        }
+        get_user_flagrec(m->user, &victim, chan->dname);
+        if (!chan_hasop(m) && !glob_bot(victim) && chk_op(victim, chan)) {
+          found++;
+          dprintf(idx, "Gave op to '%s' as '%s' on %s\n", m->user->handle, m->nick, chan->dname);
+          do_op(m->nick, chan, 0);
+        }
+      }
+    } else {
+      if (!all)
+        dprintf(idx, "Channel %s is not active or pending.\n", chan->dname);
     }
     }
+    if (!found && !all)
+      dprintf(idx, "No one to op on %s\n", chan->dname);
+    next:;
+    if (!all)
+      chan = NULL;
+    else
+      chan = chan->next;
   }
   }
-  if (!found)
-    dprintf(idx, "No one to op on %s\n", chan->dname);
 }
 }