source: irc.h @ d63f37c

Last change on this file since d63f37c was d63f37c, checked in by dequis <dx@…>, at 2015-11-08T08:16:15Z

IRCv3 extended-join capability

Not very useful for the account features (and i won't implement
account-notify), but it has a real name field, and it's *really* easy to
implement.

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