source: irc.h @ 0ef1c92

Last change on this file since 0ef1c92 was 0ef1c92, checked in by dequis <dx@…>, at 2015-09-11T02:31:10Z

Initial implementation of ircv3 capability negotiation

Mostly no-op for now. Puts registration on hold, supports the basic
commands, and NAKs everything

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