summaryrefslogtreecommitdiff
path: root/src/irc/core/modes.h
blob: e9326c7af741f05a322fdaf439484d5f7d6c6e28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#ifndef __MODES_H
#define __MODES_H

#include "irc-channels.h"

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, char newprefix, SERVER_REC *server);
void prefix_del(char *prefixes, 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