source: irc.h @ 295c17b

Last change on this file since 295c17b was 2dcaf9a, checked in by Wilmer van der Gaast <wilmer@…>, at 2010-09-01T22:35:06Z

Load/save code. It'd be better if the OTR module would just save its info
in BitlBee settings that automatically end up in the existing .xml files
(or whatever storage is used), but I realise this is non-trivial.

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