summaryrefslogtreecommitdiffstats
path: root/src/irc/core/modes.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/irc/core/modes.h')
-rw-r--r--src/irc/core/modes.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/irc/core/modes.h b/src/irc/core/modes.h
new file mode 100644
index 0000000..f899a06
--- /dev/null
+++ b/src/irc/core/modes.h
@@ -0,0 +1,67 @@
+#ifndef IRSSI_IRC_CORE_MODES_H
+#define IRSSI_IRC_CORE_MODES_H
+
+#include <irssi/src/irc/core/irc-channels.h>
+#include <irssi/src/core/nicklist.h> /* MAX_USER_PREFIXES */
+
+typedef void mode_func_t(IRC_CHANNEL_REC *, const char *, char, char,
+ char *, GString *);
+
+struct modes_type {
+ mode_func_t *func;
+ char prefix;
+};
+
+/* modes that have argument always */
+#define HAS_MODE_ARG_ALWAYS(server, mode) \
+ (server->modes[(int)(unsigned char) mode].func == modes_type_a || \
+ server->modes[(int)(unsigned char) mode].func == modes_type_b || \
+ server->modes[(int)(unsigned char) mode].func == modes_type_prefix)
+
+/* modes that have argument when being set (+) */
+#define HAS_MODE_ARG_SET(server, mode) \
+ (HAS_MODE_ARG_ALWAYS(server, mode) || \
+ server->modes[(int)(unsigned char) mode].func == modes_type_c)
+
+/* modes that have argument when being unset (-) */
+#define HAS_MODE_ARG_UNSET(server, mode) \
+ HAS_MODE_ARG_ALWAYS(server, mode)
+
+#define HAS_MODE_ARG(server, type, mode) \
+ ((type) == '+' ? HAS_MODE_ARG_SET(server,mode) : \
+ HAS_MODE_ARG_UNSET(server, mode))
+
+#define GET_MODE_PREFIX(server, c) \
+ ((server)->modes[(int)(unsigned char)c].prefix)
+#define GET_PREFIX_MODE(server, c) \
+ ((server)->prefix[(int)(unsigned char)c])
+
+void modes_init(void);
+void modes_deinit(void);
+void modes_server_init(IRC_SERVER_REC *);
+
+/* add `mode' to `old' - return newly allocated mode.
+ `channel' specifies if we're parsing channel mode and we should try
+ to join mode arguments too. */
+char *modes_join(IRC_SERVER_REC *server, const char *old, const char *mode, int channel);
+
+int channel_mode_is_set(IRC_CHANNEL_REC *channel, char mode);
+
+void parse_channel_modes(IRC_CHANNEL_REC *channel, const char *setby,
+ const char *modestr, int update_key);
+
+void channel_set_singlemode(IRC_CHANNEL_REC *channel, const char *nicks,
+ const char *mode);
+void channel_set_mode(IRC_SERVER_REC *server, const char *channel,
+ const char *mode);
+
+void prefix_add(char prefixes[MAX_USER_PREFIXES+1], char newprefix, SERVER_REC *server);
+void prefix_del(char prefixes[MAX_USER_PREFIXES+1], char oldprefix);
+
+mode_func_t modes_type_a;
+mode_func_t modes_type_b;
+mode_func_t modes_type_c;
+mode_func_t modes_type_d;
+mode_func_t modes_type_prefix;
+
+#endif