summaryrefslogtreecommitdiff
path: root/src/irc/core/servers-redirect.h
blob: 0773895c0a53b65ed1d22e960b43ffe230d3c372 (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
67
68
69
70
71
72
73
74
75
76
#ifndef __SERVERS_REDIRECT_H
#define __SERVERS_REDIRECT_H

/* Register new redirection command.

   remote - Specifies if the command is by default a remote command
   (eg. sent to another server). server_redirect_event() may override this.

   timeout - If remote is TRUE, specifies how many seconds to wait for
   reply before aborting.

   ... - char *start, int argpos, char *start, int argpos, ..., NULL,
         char *stop, int argpos, char *stop, int argpos, ..., NULL
   List of events that start and stop this redirection.
   Start event list may be just NULL, but there must be at least one
   stop event. `argpos' specifies the word number in event string which
   is compared to wanted argument, -1 = don't compare, TRUE always. */
void server_redirect_register(const char *command,
			      int remote, int timeout, ...);
/* start/stop lists shouldn't be free'd after, and their strings
   should be dynamically allocated */
void server_redirect_register_list(const char *command,
				   int remote, int timeout,
				   GSList *start, GSList *stop);

/* Specify that the next command sent to server will be redirected.
   NOTE: This command MUST be called before irc_send_cmd().

   command - Specifies the registered command that should be used for this
   redirection.

   arg - The argument to be compared in event strings. You can give multiple
   arguments separated with space.

   remote - Specifies if the command is a remote command, -1 = use default.

   failure_signal - If irssi can't find the stop signal for the redirection,
   this signal is called.

   ... - char *event, char *redirect_signal, ..., NULL
   If the `event' is "", all the events belonging to the redirection but not
   specified here, will be sent there. */
void server_redirect_event(IRC_SERVER_REC *server, const char *command,
			   const char *arg, int remote,
			   const char *failure_signal, ...);
/* Signals list shouldn't be free'd after, and it's strings should be
   dynamically allocated */
void server_redirect_event_list(IRC_SERVER_REC *server, const char *command,
				const char *arg, int remote,
				const char *failure_signal, GSList *signals);

/* INTERNAL: */

/* irc_send_cmd() calls this to make sure redirecting knows
   what's sent to server */
void server_redirect_command(IRC_SERVER_REC *server, const char *command,
			     REDIRECT_REC *redirect);
/* Returns the redirection signal for specified event.
   This is the function that contains the real redirecting logic. */
const char *server_redirect_get_signal(IRC_SERVER_REC *server,
				       const char *event,
				       const char *args);
/* Returns the redirection signal for specified event.
   Doesn't change the server state in any way, so if you really wish to
   use the signal, call server_redirect_get_signal() after this. */
const char *server_redirect_peek_signal(IRC_SERVER_REC *server,
					const char *event,
					const char *args);

/* Destroy redirection record */
void server_redirect_destroy(REDIRECT_REC *rec);

void servers_redirect_init(void);
void servers_redirect_deinit(void);

#endif