Ver Fonte

* Clear out flags and force a join when confused or kicked/parted a chan

Bryan Drewery há 16 anos atrás
pai
commit
84a0d35769
4 ficheiros alterados com 10 adições e 5 exclusões
  1. 2 3
      src/mod/irc.mod/chan.c
  2. 5 0
      src/mod/irc.mod/irc.c
  3. 1 0
      src/mod/irc.mod/irc.h
  4. 2 2
      src/mod/server.mod/servmsg.c

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

@@ -199,7 +199,7 @@ void resolve_to_rbl(struct chanset_t *chan, const char *host, resolv_member *r)
 // Just got a part event (KICK, PART) on me
 static void check_rejoin(struct chanset_t* chan) {
   if (shouldjoin(chan))
-    join_chan(chan);
+    force_join_chan(chan);
   else // Out of chan, not rejoining, just clear it
     clear_channel(chan, 1);
 }
@@ -2001,8 +2001,7 @@ static int got315(char *from, char *msg)
   /* Am *I* on the channel now? if not, well d0h. */
   if (shouldjoin(chan) && !me) {
     putlog(LOG_MISC | LOG_JOIN, chan->dname, "Oops, I'm not really on %s.", chan->dname);
-    chan->ircnet_status &= ~CHAN_ACTIVE;
-    join_chan(chan);
+    force_join_chan(chan);
   } else {
     me->joined = now;				/* set this to keep the whining masses happy */
     if (me_op(chan))

+ 5 - 0
src/mod/irc.mod/irc.c

@@ -1345,6 +1345,11 @@ static void send_chan_who(int queue, struct chanset_t *chan) {
       dprintf(queue, "WHO %s\n", chan->name);
 }
 
+void force_join_chan(struct chanset_t* chan, int idx) {
+  chan->ircnet_status = 0;
+  join_chan(chan, idx);
+}
+
 void join_chan(struct chanset_t* chan, int idx) {
   if (shouldjoin(chan) && !(chan->ircnet_status & (CHAN_ACTIVE | CHAN_PEND | CHAN_JOINING))) {
     dprintf(idx, "JOIN %s %s\n",

+ 1 - 0
src/mod/irc.mod/irc.h

@@ -109,6 +109,7 @@ static void get_channel_masks(struct chanset_t* chan);
 
 #endif /* MAKING_IRC */
 
+void force_join_chan(struct chanset_t* chan, int idx = DP_MODE);
 void join_chan(struct chanset_t* chan, int idx = DP_MODE);
 
 int check_bind_authc(char *, Auth *, char *, char *);

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

@@ -205,7 +205,7 @@ join_chans()
 {
   for (register struct chanset_t *chan = chanset; chan; chan = chan->next) {
     if (shouldjoin(chan))
-      join_chan(chan, DP_SERVER);
+      force_join_chan(chan, DP_SERVER);
   }
 }
 
@@ -374,7 +374,7 @@ static int got442(char *from, char *msg)
   chan = findchan(chname);
   if (chan && shouldjoin(chan) && !channel_joining(chan)) {
     putlog(LOG_MISC, chname, "Server says I'm not on channel: %s", chname);
-    join_chan(chan);
+    force_join_chan(chan);
   }
 
   return 0;