static void handle_end_invitelist(struct irc_network_state *s, const struct irc_line *l)
{
struct irc_channel_state *c = find_channel(s, l->args[2]);
- if (c != NULL)
- c->invitelist_started = FALSE;
- else
+ if (c == NULL) {
network_state_log(LOG_WARNING, s,
"Can't end invitelist for %s: channel not found", l->args[2]);
+ return;
+ }
+
+ c->invitelist_started = FALSE;
+ channel_mode_nicklist_present(c,'I') = TRUE;
}
static void handle_exceptlist_entry(struct irc_network_state *s, const struct irc_line *l)
static void handle_end_exceptlist(struct irc_network_state *s, const struct irc_line *l)
{
struct irc_channel_state *c = find_channel(s, l->args[2]);
- if (c != NULL)
- c->exceptlist_started = FALSE;
- else
+ if (c == NULL) {
network_state_log(LOG_WARNING, s,
"Can't end exceptlist for %s: channel not found", l->args[2]);
+ return;
+ }
+ c->exceptlist_started = FALSE;
+ channel_mode_nicklist_present(c,'e') = TRUE;
}
{
struct irc_channel_state *c = find_channel(s, l->args[2]);
- if (c != NULL)
- c->banlist_started = FALSE;
- else
+ if (c == NULL) {
network_state_log(LOG_WARNING, s,
"Can't end banlist for %s: channel not found", l->args[2]);
+ return;
+ }
+
+ c->banlist_started = FALSE;
+ channel_mode_nicklist_present(c,'b') = TRUE;
}
static void handle_whoreply(struct irc_network_state *s, const struct irc_line *l)
return -1;
}
- if (set) {
- nicklist_add_entry(&channel_mode_nicklist(c, mode), opt_arg,
- by?by->nick:NULL, time(NULL));
- } else {
- if (!nicklist_remove_entry(&channel_mode_nicklist(c, mode), opt_arg)) {
- network_state_log(LOG_WARNING, s, "Unable to remove nonpresent %c MODE entry '%s' on %s", mode, opt_arg, c->name);
- return 1;
+ if (channel_mode_nicklist_present(c, mode)) {
+ if (set) {
+ nicklist_add_entry(&channel_mode_nicklist(c, mode), opt_arg,
+ by?by->nick:NULL, time(NULL));
+ } else {
+ if (!nicklist_remove_entry(&channel_mode_nicklist(c, mode), opt_arg)) {
+ network_state_log(LOG_WARNING, s, "Unable to remove nonpresent %c MODE entry '%s' on %s", mode, opt_arg, c->name);
+ return 1;
+ }
}
}
return 1;
const char *by_nick, time_t at);
gboolean nicklist_remove_entry(GList **nicklist, const char *hostmask);
#define channel_mode_nicklist(ch,mode) ((ch)->chanmode_nicklist[(unsigned char)mode])
+#define channel_mode_nicklist_present(ch,mode) ((ch)->chanmode_nicklist_present[(unsigned char)mode])
#define channel_mode_option(ch,mode) ((ch)->chanmode_option[(unsigned char)mode])
/**
struct irc_network_state *network;
GList *chanmode_nicklist[MAXMODES];
+ gboolean chanmode_nicklist_present[MAXMODES];
char *chanmode_option[MAXMODES];
};