+ for(cData = channelList; cData; cData = cData->next)
+ {
+ if(IsSuspended(cData))
+ continue;
+ opt = cData->chOpts[chResync];
+ if(opt == 'n')
+ continue;
+ if((refresh_num - cData->last_resync) < (unsigned int)(1 << (opt - '1')))
+ continue;
+ resync_channel(cData->channel);
+ cData->last_resync = refresh_num;
+ }
+ timeq_add(now + chanserv_conf.refresh_period, chanserv_auto_resync, NULL);
+}
+
+static CHANSERV_FUNC(cmd_unf)
+{
+ if(channel)
+ {
+ char response[MAXLEN];
+ const char *fmt = user_find_message(user, "CSMSG_UNF_RESPONSE");
+ sprintf(response, "\ 2%s\ 2: %s", user->nick, fmt);
+ irc_privmsg(cmd->parent->bot, channel->name, response);
+ }
+ else
+ reply("CSMSG_UNF_RESPONSE");
+ return 1;
+}
+
+static CHANSERV_FUNC(cmd_ping)
+{
+ if(channel)
+ {
+ char response[MAXLEN];
+ const char *fmt = user_find_message(user, "CSMSG_PING_RESPONSE");
+ sprintf(response, "\ 2%s\ 2: %s", user->nick, fmt);
+ irc_privmsg(cmd->parent->bot, channel->name, response);
+ }
+ else
+ reply("CSMSG_PING_RESPONSE");
+ return 1;
+}
+
+static CHANSERV_FUNC(cmd_wut)
+{
+ if(channel)
+ {
+ char response[MAXLEN];
+ const char *fmt = user_find_message(user, "CSMSG_WUT_RESPONSE");
+ sprintf(response, "\ 2%s\ 2: %s", user->nick, fmt);
+ irc_privmsg(cmd->parent->bot, channel->name, response);
+ }
+ else
+ reply("CSMSG_WUT_RESPONSE");
+ return 1;
+}
+
+static CHANSERV_FUNC(cmd_roulette)
+{
+ if(channel)
+ {
+ struct chanData *cData = channel->channel_info;
+
+ if (cData)
+ {
+ if (cData->roulette_chamber)
+ {
+ DelUser(user, chanserv, 1, "BANG - Don't stuff bullets into a loaded gun");
+ return 1;
+ }
+
+ send_target_message(1, channel->name, cmd->parent->bot, "CSMSG_ROULETTE_LOADS");
+ cData->roulette_chamber = 1 + rand() % 6;
+ }
+ }
+
+ return 1;
+}
+static CHANSERV_FUNC(cmd_shoot)
+{
+ if(channel)
+ {
+ struct chanData *cData = channel->channel_info;
+
+ if (cData->roulette_chamber <= 0)
+ {
+ struct service *service;
+ if ((service = service_find(chanserv->nick)))
+ {
+ reply("CSMSG_ROULETTE_NEW", service->trigger);
+ }
+ return 1;
+ }
+
+ cData->roulette_chamber--;
+
+ if (cData->roulette_chamber == 0)
+ {
+ reply("CSMSG_ROULETTE_BANG");
+ reply("CSMSG_ROULETTE_BETTER_LUCK", user->nick);
+ DelUser(user, chanserv, 1, "BANG!!!!");
+ }
+ else
+ reply("CSMSG_ROULETTE_CLICK");
+ }
+
+ return 1;
+}
+
+static void
+chanserv_remove_abuse(void *data)
+{
+ char *remnick = data;
+ struct userNode *user;
+ /* sometimes the clone was killed and maybe even the user took their nick back
+ * (ie, an oper) so dont kill them here after all unless they are local. */
+ if( (user = GetUserH(remnick)) )
+ if(IsLocal(user) )
+ DelUser(user, NULL, 1, "");
+}
+
+int lamepart(struct userNode *nick) {
+ struct modeNode *mn;
+ unsigned int count, n;
+
+ for (n=count=0; n<nick->channels.used; n++)
+ {
+ mn = nick->channels.list[n];
+ irc_svspart(chanserv, nick, mn->channel);
+ }
+
+ return 0;
+}
+
+static CHANSERV_FUNC(cmd_spin)
+{
+ if(!channel)
+ return 1;
+
+ int type = 0, lamep = 1;
+ char *tstr;
+
+ tstr = conf_get_data("server/type", RECDB_QSTRING);
+ if(tstr) {
+ type = atoi(tstr);
+ if (type > 6)
+ lamep = 0;
+ }
+
+
+ send_target_message(1, channel->name, chanserv, "CSMSG_SPIN_WHEEL1", user->nick);
+ send_target_message(1, channel->name, chanserv, "CSMSG_SPIN_WHEEL2");
+ send_target_message(1, channel->name, chanserv, "CSMSG_SPIN_WHEEL3");
+
+ if(chanserv_conf.wheel->used < 1)
+ {
+ /* wheel actions not defined! eek */
+ return 1;
+ }
+
+ const char *wheel = chanserv_conf.wheel->list[ (int) ( (chanserv_conf.wheel->used) * (rand() / (RAND_MAX + 1.0)) ) ];
+ if(!wheel && *wheel)
+ return 1;
+
+ /* connection reset by peer */
+ if (!strcasecmp(wheel, "peer"))
+ {
+ send_target_message(1, channel->name, chanserv, "CSMSG_SPIN_PEER");
+ if (type < 7)
+ irc_kill(chanserv, user, "Connection reset by peer");
+ else
+ irc_svsquit(chanserv, user, "Connection reset by peer");
+ }
+ /* part all channels */
+ else if (!strcasecmp(wheel, "partall"))
+ {
+ send_target_message(1, channel->name, chanserv, "CSMSG_SPIN_PARTALL");
+ if (lamep)
+ lamepart(user);
+ else
+ sputsock("%s SJ %s 0 "FMT_TIME_T, self->numeric, user->numeric, now);
+ }
+ /* random time gline */
+ else if (!strcasecmp(wheel, "gline"))
+ {
+ char target[HOSTLEN + 3];
+ int wtime = 120 + rand() % 600;
+
+ strcpy(target, "*@");
+ strcat(target, user->hostname);
+ send_target_message(1, channel->name, chanserv, "CSMSG_SPIN_GLINE");
+
+ gline_add(chanserv->nick, target, wtime, "Reward for spinning the wheel of misfortune!", now, 1, 0);
+ }
+ /* random shun */
+ else if (!strcasecmp(wheel, "shun"))
+ {
+ char target[HOSTLEN + 3];
+ int wtime = 120 + rand() % 600;
+
+ strcpy(target, "*@");
+ strcat(target, user->hostname);
+ send_target_message(1, channel->name, chanserv, "CSMSG_SPIN_SHUN");
+
+ shun_add(chanserv->nick, target, wtime, "Reward for spinning the wheel of misfortune!", now, 1);
+ }
+ /* absolutely nothing */
+ else if (!strcasecmp(wheel, "nothing"))
+ {
+ send_target_message(1, channel->name, chanserv, "CSMSG_SPIN_NOTHING");
+ }
+ /* join random chans and part em several times */
+ else if (!strcasecmp(wheel, "randjoin"))
+ {
+ int complete = 0;
+ int rndchans = 0;
+ int chango = 0;
+ int roundz0r = 0;
+
+ send_target_message(1, channel->name, chanserv, "CSMSG_SPIN_RANDJOIN");
+ while(complete != 1)
+ {
+ if (rndchans != 15)
+ {
+ chango = 120 + rand() % 600;
+ sputsock("%s SJ %s #%d "FMT_TIME_T, self->numeric, user->numeric, chango, now);
+ rndchans++;
+ }
+ else
+ {
+ if (roundz0r != 1)
+ {
+ if (lamep)
+ lamepart(user);
+ else
+ sputsock("%s SJ %s 0 "FMT_TIME_T, self->numeric, user->numeric, now);
+ roundz0r = 1;
+ rndchans = 0;
+ }
+ else
+ {
+ if (lamep)
+ lamepart(user);
+ else
+ sputsock("%s SJ %s 0 "FMT_TIME_T, self->numeric, user->numeric, now);
+ complete = 1;
+ }
+ }
+ }
+ }
+ /* abuse line added to /whois */
+ else if (!strcasecmp(wheel, "abusewhois"))