source: irc.h @ 2f73692

Last change on this file since 2f73692 was 687ec88, checked in by dequis <dx@…>, at 2015-10-08T05:25:56Z

IRCv3 multi-prefix... but mostly just adding prefixes to WHO

We can't actually have multiple prefixes internally, so the only thing
missing for multi-prefix compliance is actually having the prefix in the
WHO reply, which is a rfc1459 thing.

Note to future self: check irc logs for the implementation I threw away.
The one that actually handled multiple prefixes. I hope that's useful.

  • Property mode set to 100644
File size: 12.4 KB
Line 
1/********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2013 Wilmer van der Gaast and others                *
5  \********************************************************************/
6
7/* The IRC-based UI (for now the only one)                              */
8
9/*
10  This program is free software; you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation; either version 2 of the License, or
13  (at your option) any later version.
14
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License with
21  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
22  if not, write to the Free Software Foundation, Inc., 51 Franklin St.,
23  Fifth Floor, Boston, MA  02110-1301  USA
24*/
25
26#ifndef _IRC_H
27#define _IRC_H
28
29#define IRC_MAX_LINE 512
30#define IRC_MAX_ARGS 16
31
32#define IRC_LOGIN_TIMEOUT 60
33#define IRC_PING_STRING "PinglBee"
34
35#define UMODES "abisw"     /* Allowed umodes (although they mostly do nothing) */
36#define UMODES_PRIV "Ro"   /* Allowed, but not by user directly */
37#define UMODES_KEEP "R"    /* Don't allow unsetting using /MODE */
38#define CMODES "ntC"       /* Allowed modes */
39#define CMODE "t"          /* Default mode */
40#define UMODE "s"          /* Default mode */
41
42#define CTYPES "&#"        /* Valid channel name prefixes */
43
44typedef enum {
45        USTATUS_OFFLINE = 0,
46        USTATUS_AUTHORIZED = 1, /* Gave the correct server password (PASS). */
47        USTATUS_LOGGED_IN = 2,  /* USER+NICK(+PASS) finished. */
48        USTATUS_IDENTIFIED = 4, /* To NickServ (root). */
49        USTATUS_SHUTDOWN = 8,   /* Now used to indicate we're shutting down.
50                                   Currently just blocks irc_vawrite(). */
51        USTATUS_CAP_PENDING = 16,
52
53        /* Not really status stuff, but other kinds of flags: For slightly
54           better password security, since the only way to send passwords
55           to the IRC server securely (i.e. not echoing to screen or written
56           to logfiles) is the /OPER command, try to use that command for
57           stuff that matters. */
58        OPER_HACK_IDENTIFY = 0x100,
59        OPER_HACK_IDENTIFY_NOLOAD = 0x01100,
60        OPER_HACK_IDENTIFY_FORCE  = 0x02100,
61        OPER_HACK_REGISTER = 0x200,
62        OPER_HACK_ACCOUNT_PASSWORD = 0x400,
63        OPER_HACK_ANY = 0x3700, /* To check for them all at once. */
64
65        IRC_UTF8_NICKS = 0x10000, /* Disable ASCII restrictions on buddy nicks. */
66} irc_status_t;
67
68typedef enum {
69        CAP_MULTI_PREFIX = (1 << 1),
70} irc_cap_flag_t;
71
72struct irc_user;
73
74typedef struct irc {
75        int fd;
76        irc_status_t status;
77        double last_pong;
78        int pinging;
79        char *sendbuffer;
80        char *readbuffer;
81        GIConv iconv, oconv;
82
83        struct irc_user *root;
84        struct irc_user *user;
85
86        char *password; /* HACK: Used to save the user's password, but before
87                           logging in, this may contain a password we should
88                           send to identify after USER/NICK are received. */
89
90        char umode[8];
91
92        struct query *queries;
93        GSList *file_transfers;
94
95        GSList *users, *channels;
96        struct irc_channel *default_channel;
97        GHashTable *nick_user_hash;
98        GHashTable *watches; /* See irc_cmd_watch() */
99
100        gint r_watch_source_id;
101        gint w_watch_source_id;
102        gint ping_source_id;
103        gint login_source_id; /* To slightly delay some events at login time. */
104
105        struct otr *otr; /* OTR state and book keeping, used by the OTR plugin.
106                            TODO: Some mechanism for plugindata. */
107
108        struct bee *b;
109        guint32 caps;
110} irc_t;
111
112typedef enum {
113        /* Replaced with iu->last_channel IRC_USER_PRIVATE = 1, */
114        IRC_USER_AWAY = 2,
115
116        IRC_USER_OTR_ENCRYPTED = 0x10000,
117        IRC_USER_OTR_TRUSTED   = 0x20000,
118} irc_user_flags_t;
119
120typedef struct irc_user {
121        irc_t *irc;
122
123        char *nick;
124        char *user;
125        char *host;
126        char *fullname;
127
128        /* Nickname in lowercase for case insensitive searches */
129        char *key;
130
131        irc_user_flags_t flags;
132        struct irc_channel *last_channel;
133
134        GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
135        guint pastebuf_timer;
136        time_t away_reply_timeout; /* Only send a 301 if this time passed. */
137
138        struct bee_user *bu;
139
140        const struct irc_user_funcs *f;
141} irc_user_t;
142
143struct irc_user_funcs {
144        gboolean (*privmsg)(irc_user_t *iu, const char *msg);
145        gboolean (*ctcp)(irc_user_t *iu, char * const* ctcp);
146};
147
148extern const struct irc_user_funcs irc_user_root_funcs;
149extern const struct irc_user_funcs irc_user_self_funcs;
150
151typedef enum {
152        IRC_CHANNEL_JOINED = 1, /* The user is currently in the channel. */
153        IRC_CHANNEL_TEMP = 2,   /* Erase the channel when the user leaves,
154                                   and don't save it. */
155
156        /* Hack: Set this flag right before jumping into IM when we expect
157           a call to imcb_chat_new(). */
158        IRC_CHANNEL_CHAT_PICKME = 0x10000,
159} irc_channel_flags_t;
160
161typedef struct irc_channel {
162        irc_t *irc;
163        char *name;
164        char mode[8];
165        int flags;
166
167        char *topic;
168        char *topic_who;
169        time_t topic_time;
170
171        GSList *users; /* struct irc_channel_user */
172        struct irc_user *last_target;
173        struct set *set;
174
175        GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
176        guint pastebuf_timer;
177
178        const struct irc_channel_funcs *f;
179        void *data;
180} irc_channel_t;
181
182struct irc_channel_funcs {
183        gboolean (*privmsg)(irc_channel_t *ic, const char *msg);
184        gboolean (*join)(irc_channel_t *ic);
185        gboolean (*part)(irc_channel_t *ic, const char *msg);
186        gboolean (*topic)(irc_channel_t *ic, const char *new_topic);
187        gboolean (*invite)(irc_channel_t *ic, irc_user_t *iu);
188        void (*kick)(irc_channel_t *ic, irc_user_t *iu, const char *msg);
189
190        gboolean (*_init)(irc_channel_t *ic);
191        gboolean (*_free)(irc_channel_t *ic);
192};
193
194typedef enum {
195        IRC_CHANNEL_USER_OP = 1,
196        IRC_CHANNEL_USER_HALFOP = 2,
197        IRC_CHANNEL_USER_VOICE = 4,
198        IRC_CHANNEL_USER_NONE = 8,
199} irc_channel_user_flags_t;
200
201typedef struct irc_channel_user {
202        irc_user_t *iu;
203        int flags;
204} irc_channel_user_t;
205
206typedef enum {
207        IRC_CC_TYPE_DEFAULT  = 0x00001,
208        IRC_CC_TYPE_REST     = 0x00002, /* Still not implemented. */
209        IRC_CC_TYPE_GROUP    = 0x00004,
210        IRC_CC_TYPE_ACCOUNT  = 0x00008,
211        IRC_CC_TYPE_PROTOCOL = 0x00010,
212        IRC_CC_TYPE_MASK     = 0x000ff,
213        IRC_CC_TYPE_INVERT   = 0x00100,
214} irc_control_channel_type_t;
215
216struct irc_control_channel {
217        irc_control_channel_type_t type;
218        struct bee_group *group;
219        struct account *account;
220        struct prpl *protocol;
221        char modes[5];
222};
223
224extern const struct bee_ui_funcs irc_ui_funcs;
225
226typedef enum {
227        IRC_CDU_SILENT,
228        IRC_CDU_PART,
229        IRC_CDU_KICK,
230} irc_channel_del_user_type_t;
231
232/* These are a glued a little bit to the core/bee layer and a little bit to
233   IRC. The first user is OTR, and I guess at some point we'll get to shape
234   this a little bit more as other uses come up. */
235typedef struct irc_plugin {
236        /* Called at the end of irc_new(). Can be used to add settings, etc. */
237        gboolean (*irc_new)(irc_t *irc);
238        /* At the end of irc_free(). */
239        void (*irc_free)(irc_t *irc);
240
241        /* Problem with the following two functions is ordering if multiple
242           plugins are handling them. Let's keep fixing that problem for
243           whenever it becomes important. */
244
245        /* Called by bee_irc_user_privmsg_cb(). Return NULL if you want to
246           abort sending the msg. */
247        char* (*filter_msg_out)(irc_user_t * iu, char *msg, int flags);
248        /* Called by bee_irc_user_msg(). Return NULL if you swallowed the
249           message and don't want anything to go to the user. */
250        char* (*filter_msg_in)(irc_user_t * iu, char *msg, int flags);
251
252        /* From storage.c functions. Ideally these should not be used
253           and instead data should be stored in settings which will get
254           saved automatically. Consider these deprecated! */
255        void (*storage_load)(irc_t *irc);
256        void (*storage_save)(irc_t *irc);
257        void (*storage_remove)(const char *nick);
258} irc_plugin_t;
259
260extern GSList *irc_plugins; /* struct irc_plugin */
261
262/* irc.c */
263extern GSList *irc_connection_list;
264
265irc_t *irc_new(int fd);
266void irc_abort(irc_t *irc, int immed, char *format, ...) G_GNUC_PRINTF(3, 4);
267void irc_free(irc_t *irc);
268void irc_setpass(irc_t *irc, const char *pass);
269
270void irc_process(irc_t *irc);
271char **irc_parse_line(char *line);
272char *irc_build_line(char **cmd);
273
274void irc_write(irc_t *irc, char *format, ...) G_GNUC_PRINTF(2, 3);
275void irc_write_all(int now, char *format, ...) G_GNUC_PRINTF(2, 3);
276void irc_vawrite(irc_t *irc, char *format, va_list params);
277
278void irc_flush(irc_t *irc);
279void irc_switch_fd(irc_t *irc, int fd);
280void irc_sync(irc_t *irc);
281void irc_desync(irc_t *irc);
282
283int irc_check_login(irc_t *irc);
284
285void irc_umode_set(irc_t *irc, const char *s, gboolean allow_priv);
286
287void register_irc_plugin(const struct irc_plugin *p);
288
289/* irc_channel.c */
290irc_channel_t *irc_channel_new(irc_t *irc, const char *name);
291irc_channel_t *irc_channel_by_name(irc_t *irc, const char *name);
292irc_channel_t *irc_channel_get(irc_t *irc, char *id);
293int irc_channel_free(irc_channel_t *ic);
294void irc_channel_free_soon(irc_channel_t *ic);
295int irc_channel_add_user(irc_channel_t *ic, irc_user_t *iu);
296int irc_channel_del_user(irc_channel_t *ic, irc_user_t *iu, irc_channel_del_user_type_t type, const char *msg);
297irc_channel_user_t *irc_channel_has_user(irc_channel_t *ic, irc_user_t *iu);
298struct irc_channel *irc_channel_with_user(irc_t *irc, irc_user_t *iu);
299int irc_channel_set_topic(irc_channel_t *ic, const char *topic, const irc_user_t *who);
300void irc_channel_user_set_mode(irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t flags);
301void irc_channel_set_mode(irc_channel_t *ic, const char *s);
302void irc_channel_auto_joins(irc_t *irc, struct account *acc);
303void irc_channel_printf(irc_channel_t *ic, char *format, ...);
304gboolean irc_channel_name_ok(const char *name);
305void irc_channel_name_strip(char *name);
306int irc_channel_name_cmp(const char *a_, const char *b_);
307char *irc_channel_name_gen(irc_t *irc, const char *name);
308gboolean irc_channel_name_hint(irc_channel_t *ic, const char *name);
309void irc_channel_update_ops(irc_channel_t *ic, char *value);
310char irc_channel_user_get_prefix(irc_channel_user_t *icu);
311char *set_eval_irc_channel_ops(struct set *set, char *value);
312gboolean irc_channel_wants_user(irc_channel_t *ic, irc_user_t *iu);
313
314/* irc_commands.c */
315void irc_exec(irc_t *irc, char **cmd);
316
317/* irc_send.c */
318void irc_send_num(irc_t *irc, int code, char *format, ...) G_GNUC_PRINTF(3, 4);
319void irc_send_login(irc_t *irc);
320void irc_send_motd(irc_t *irc);
321const char *irc_user_msgdest(irc_user_t *iu);
322void irc_rootmsg(irc_t *irc, char *format, ...);
323void irc_usermsg(irc_user_t *iu, char *format, ...);
324void irc_usernotice(irc_user_t *iu, char *format, ...);
325void irc_send_join(irc_channel_t *ic, irc_user_t *iu);
326void irc_send_part(irc_channel_t *ic, irc_user_t *iu, const char *reason);
327void irc_send_quit(irc_user_t *iu, const char *reason);
328void irc_send_kick(irc_channel_t *ic, irc_user_t *iu, irc_user_t *kicker, const char *reason);
329void irc_send_names(irc_channel_t *ic);
330void irc_send_topic(irc_channel_t *ic, gboolean topic_change);
331void irc_send_whois(irc_user_t *iu);
332void irc_send_who(irc_t *irc, GSList *l, const char *channel);
333void irc_send_msg(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix);
334void irc_send_msg_raw(irc_user_t *iu, const char *type, const char *dst, const char *msg);
335void irc_send_msg_f(irc_user_t *iu, const char *type, const char *dst, const char *format, ...) G_GNUC_PRINTF(4, 5);
336void irc_send_nick(irc_user_t *iu, const char *new_nick);
337void irc_send_channel_user_mode_diff(irc_channel_t *ic, irc_user_t *iu,
338                                     irc_channel_user_flags_t old_flags, irc_channel_user_flags_t new_flags);
339void irc_send_invite(irc_user_t *iu, irc_channel_t *ic);
340void irc_send_cap(irc_t *irc, char *subcommand, char *body);
341
342/* irc_user.c */
343irc_user_t *irc_user_new(irc_t *irc, const char *nick);
344int irc_user_free(irc_t *irc, irc_user_t *iu);
345irc_user_t *irc_user_by_name(irc_t *irc, const char *nick);
346int irc_user_set_nick(irc_user_t *iu, const char *new_nick);
347gint irc_user_cmp(gconstpointer a_, gconstpointer b_);
348const char *irc_user_get_away(irc_user_t *iu);
349void irc_user_quit(irc_user_t *iu, const char *msg);
350
351/* irc_util.c */
352char *set_eval_timezone(struct set *set, char *value);
353char *irc_format_timestamp(irc_t *irc, time_t msg_ts);
354
355/* irc_im.c */
356void bee_irc_channel_update(irc_t *irc, irc_channel_t *ic, irc_user_t *iu);
357void bee_irc_user_nick_reset(irc_user_t *iu);
358
359/* irc_cap.c */
360void irc_cmd_cap(irc_t *irc, char **cmd);
361
362#endif
Note: See TracBrowser for help on using the repository browser.