source: irc.h @ 1239d05

Last change on this file since 1239d05 was c54bb11, checked in by dequis <dx@…>, at 2015-12-06T02:34:12Z

IRCv3 userhost-in-names capability

Easiest part of ircv3.2

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