+static void check_full_rejoin(struct ChanNode *chan) {
+ struct ChanUser *chanuser;
+ char do_rejoin = 1;
+ int botcount = 0;
+ for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
+ if((chanuser->flags & CHANUSERFLAG_OPPED) || !(chanuser->user->flags & USERFLAG_ISBOT)) {
+ do_rejoin = 0;
+ break;
+ }
+ if((chanuser->user->flags & USERFLAG_ISBOT))
+ botcount++;
+ }
+ if(do_rejoin) {
+ struct ClientSocket **clients = calloc(botcount, sizeof(*clients));
+ struct ClientSocket *bot, *chanbot;
+ int i = 0;
+ for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
+ if(bot->user != chan->chanbot && isUserOnChan(bot->user, chan)) {
+ clients[i++] = bot;
+ putsock(bot, "PART %s :rejoining", chan->name);
+ } else if(bot->user == chan->chanbot)
+ chanbot = bot;
+ }
+ chan->flags |= CHANFLAG_REJOINING;
+ chan->rejoin_array = clients;
+ if(botcount == 1) {
+ //we're alone
+ putsock(chanbot, "PART %s :magic hop", chan->name);
+ putsock(chanbot, "JOIN %s", chan->name);
+ }
+ }
+}
+