source: irc.h @ b201c68

Last change on this file since b201c68 was 0e788f5, checked in by Wilmer van der Gaast <wilmer@…>, at 2013-02-21T19:15:59Z

I'm still bored on a long flight. Wrote a script to automatically update
my copyright mentions since some were getting pretty stale. Left files not
touched since before 2012 alone so that this change doesn't touch almost
EVERY source file.

  • Property mode set to 100644
File size: 12.0 KB
RevLine 
[b7d3cc34]1  /********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
[0e788f5]4  * Copyright 2002-2013 Wilmer van der Gaast and others                *
[b7d3cc34]5  \********************************************************************/
6
[3ddb7477]7/* The IRC-based UI (for now the only one)                              */
[b7d3cc34]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
[5a71d9c]30#define IRC_MAX_ARGS 16
[b7d3cc34]31
32#define IRC_LOGIN_TIMEOUT 60
33#define IRC_PING_STRING "PinglBee"
34
[b919363]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 */
[65016a6]38#define CMODES "ntC"       /* Allowed modes */
[b919363]39#define CMODE "t"          /* Default mode */
40#define UMODE "s"          /* Default mode */
41
42#define CTYPES "&#"        /* Valid channel name prefixes */
[b7d3cc34]43
44typedef enum
45{
[bd9b00f]46        USTATUS_OFFLINE = 0,
[f6f5eee]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(). */
[060d066]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,
[fda194f]59        OPER_HACK_IDENTIFY_NOLOAD = 0x01100,
60        OPER_HACK_IDENTIFY_FORCE  = 0x02100,
[060d066]61        OPER_HACK_REGISTER = 0x200,
62        OPER_HACK_ACCOUNT_ADD = 0x400,
[fda194f]63        OPER_HACK_ANY = 0x3700, /* To check for them all at once. */
[b7d3cc34]64} irc_status_t;
65
[3ddb7477]66struct irc_user;
67
[b7d3cc34]68typedef struct irc
69{
70        int fd;
71        irc_status_t status;
72        double last_pong;
73        int pinging;
74        char *sendbuffer;
75        char *readbuffer;
[f9756bd]76        GIConv iconv, oconv;
[b7d3cc34]77
[3ddb7477]78        struct irc_user *root;
79        struct irc_user *user;
[74f1cde]80       
[a199d33]81        char *password; /* HACK: Used to save the user's password, but before
82                           logging in, this may contain a password we should
83                           send to identify after USER/NICK are received. */
[b7d3cc34]84
85        char umode[8];
86       
87        struct query *queries;
[2c2df7d]88        GSList *file_transfers;
[b7d3cc34]89       
[4be8239]90        GSList *users, *channels;
[fd45e1d1]91        struct irc_channel *default_channel;
[3ddb7477]92        GHashTable *nick_user_hash;
[92c8d41]93        GHashTable *watches; /* See irc_cmd_watch() */
[b7d3cc34]94
95        gint r_watch_source_id;
96        gint w_watch_source_id;
97        gint ping_source_id;
[6c2404e]98        gint login_source_id; /* To slightly delay some events at login time. */
[3ddb7477]99       
[0c85c08]100        struct otr *otr; /* OTR state and book keeping, used by the OTR plugin.
101                            TODO: Some mechanism for plugindata. */
[be999a5]102       
[3ddb7477]103        struct bee *b;
[b7d3cc34]104} irc_t;
105
[74f1cde]106typedef enum
107{
[92c8d41]108        /* Replaced with iu->last_channel IRC_USER_PRIVATE = 1, */
[eb50495]109        IRC_USER_AWAY = 2,
[ad2d8bc]110       
111        IRC_USER_OTR_ENCRYPTED = 0x10000,
112        IRC_USER_OTR_TRUSTED   = 0x20000,
[74f1cde]113} irc_user_flags_t;
114
[3ddb7477]115typedef struct irc_user
116{
[b95932e]117        irc_t *irc;
118       
[3ddb7477]119        char *nick;
120        char *user;
121        char *host;
122        char *fullname;
123       
[2fe5eb9]124        /* Nickname in lowercase for case insensitive searches */
[3ddb7477]125        char *key;
126       
[74f1cde]127        irc_user_flags_t flags;
[92c8d41]128        struct irc_channel *last_channel;
[3ddb7477]129       
[1c8e5f7]130        GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
[619dd18]131        guint pastebuf_timer;
[1c8e5f7]132        time_t away_reply_timeout; /* Only send a 301 if this time passed. */
[3ddb7477]133       
[d860a8d]134        struct bee_user *bu;
[280c56a]135       
136        const struct irc_user_funcs *f;
[3ddb7477]137} irc_user_t;
138
[280c56a]139struct irc_user_funcs
140{
141        gboolean (*privmsg)( irc_user_t *iu, const char *msg );
[24b8bbb]142        gboolean (*ctcp)( irc_user_t *iu, char * const* ctcp );
[280c56a]143};
144
145extern const struct irc_user_funcs irc_user_root_funcs;
146extern const struct irc_user_funcs irc_user_self_funcs;
147
[4be8239]148typedef enum
149{
[1c40aa7]150        IRC_CHANNEL_JOINED = 1, /* The user is currently in the channel. */
151        IRC_CHANNEL_TEMP = 2,   /* Erase the channel when the user leaves,
152                                   and don't save it. */
[eb37735]153       
154        /* Hack: Set this flag right before jumping into IM when we expect
155           a call to imcb_chat_new(). */
156        IRC_CHANNEL_CHAT_PICKME = 0x10000,
[4be8239]157} irc_channel_flags_t;
158
159typedef struct irc_channel
160{
161        irc_t *irc;
162        char *name;
[280c56a]163        char mode[8];
164        int flags;
165       
[4be8239]166        char *topic;
[83e92bf]167        char *topic_who;
168        time_t topic_time;
[280c56a]169       
[1c8e5f7]170        GSList *users; /* struct irc_channel_user */
[f7ca587]171        struct irc_user *last_target;
[4be8239]172        struct set *set;
[280c56a]173       
[1c8e5f7]174        GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
[619dd18]175        guint pastebuf_timer;
176       
[280c56a]177        const struct irc_channel_funcs *f;
[aea8b68]178        void *data;
[4be8239]179} irc_channel_t;
180
[280c56a]181struct irc_channel_funcs
182{
[a87754b]183        gboolean (*privmsg)( irc_channel_t *ic, const char *msg );
[bfb99ee]184        gboolean (*join)( irc_channel_t *ic );
185        gboolean (*part)( irc_channel_t *ic, const char *msg );
[4efa5ce]186        gboolean (*topic)( irc_channel_t *ic, const char *new_topic );
[66b9e36a]187        gboolean (*invite)( irc_channel_t *ic, irc_user_t *iu );
[9ac3ed1]188       
189        gboolean (*_init)( irc_channel_t *ic );
190        gboolean (*_free)( irc_channel_t *ic );
[280c56a]191};
192
[e54112f]193typedef enum
194{
195        IRC_CHANNEL_USER_OP = 1,
196        IRC_CHANNEL_USER_HALFOP = 2,
197        IRC_CHANNEL_USER_VOICE = 4,
[94d5da9c]198        IRC_CHANNEL_USER_NONE = 8,
[e54112f]199} irc_channel_user_flags_t;
200
201typedef struct irc_channel_user
202{
203        irc_user_t *iu;
204        int flags;
205} irc_channel_user_t;
206
[9ac3ed1]207typedef enum
208{
[a5c6ebd]209        IRC_CC_TYPE_DEFAULT  = 0x00001,
210        IRC_CC_TYPE_REST     = 0x00002, /* Still not implemented. */
211        IRC_CC_TYPE_GROUP    = 0x00004,
212        IRC_CC_TYPE_ACCOUNT  = 0x00008,
213        IRC_CC_TYPE_PROTOCOL = 0x00010,
214        IRC_CC_TYPE_MASK     = 0x000ff,
215        IRC_CC_TYPE_INVERT   = 0x00100,
[9ac3ed1]216} irc_control_channel_type_t;
217
218struct irc_control_channel
219{
220        irc_control_channel_type_t type;
221        struct bee_group *group;
[a067771]222        struct account *account;
[7a6ba50]223        struct prpl *protocol;
[94d5da9c]224        char modes[4];
[9ac3ed1]225};
226
[d860a8d]227extern const struct bee_ui_funcs irc_ui_funcs;
228
[006a84f]229typedef enum
230{
231        IRC_CDU_SILENT,
232        IRC_CDU_PART,
233        IRC_CDU_KICK,
234} irc_channel_del_user_type_t;
235
[0c85c08]236/* These are a glued a little bit to the core/bee layer and a little bit to
237   IRC. The first user is OTR, and I guess at some point we'll get to shape
238   this a little bit more as other uses come up. */
239typedef struct irc_plugin
240{
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       
[934db064]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       
[0c85c08]250        /* Called by bee_irc_user_privmsg_cb(). Return NULL if you want to
251           abort sending the msg. */
[934db064]252        char* (*filter_msg_out)( irc_user_t *iu, char *msg, int flags );
[0c85c08]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. */
[934db064]255        char* (*filter_msg_in)( irc_user_t *iu, char *msg, int flags );
[2dcaf9a]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 );
[0c85c08]263} irc_plugin_t;
264
265extern GSList *irc_plugins; /* struct irc_plugin */
266
[3ddb7477]267/* irc.c */
[b7d3cc34]268extern GSList *irc_connection_list;
269
270irc_t *irc_new( int fd );
[a9ca7dd]271void irc_abort( irc_t *irc, int immed, char *format, ... ) G_GNUC_PRINTF( 3, 4 );
[b7d3cc34]272void irc_free( irc_t *irc );
[1f92a58]273void irc_setpass (irc_t *irc, const char *pass);
[b7d3cc34]274
[f73b969]275void irc_process( irc_t *irc );
[0431ea1]276char **irc_parse_line( char *line );
[74c119d]277char *irc_build_line( char **cmd );
[b7d3cc34]278
[a9ca7dd]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 );
[3ddb7477]281void irc_vawrite( irc_t *irc, char *format, va_list params );
[b7d3cc34]282
[f1c2b21]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
[edf9657]288int irc_check_login( irc_t *irc );
[3ddb7477]289
[b919363]290void irc_umode_set( irc_t *irc, const char *s, gboolean allow_priv );
291
[0c85c08]292void register_irc_plugin( const struct irc_plugin *p );
293
[4be8239]294/* irc_channel.c */
295irc_channel_t *irc_channel_new( irc_t *irc, const char *name );
[b9e020a]296irc_channel_t *irc_channel_by_name( irc_t *irc, const char *name );
[36562b0]297irc_channel_t *irc_channel_get( irc_t *irc, char *id );
[83e92bf]298int irc_channel_free( irc_channel_t *ic );
[ab6006c]299void irc_channel_free_soon( irc_channel_t *ic );
[4be8239]300int irc_channel_add_user( irc_channel_t *ic, irc_user_t *iu );
[006a84f]301int irc_channel_del_user( irc_channel_t *ic, irc_user_t *iu, irc_channel_del_user_type_t type, const char *msg );
[e54112f]302irc_channel_user_t *irc_channel_has_user( irc_channel_t *ic, irc_user_t *iu );
[bb151f7]303struct irc_channel *irc_channel_with_user( irc_t *irc, irc_user_t *iu );
[83e92bf]304int irc_channel_set_topic( irc_channel_t *ic, const char *topic, const irc_user_t *who );
[6a9d068]305void irc_channel_user_set_mode( irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t flags );
[65016a6]306void irc_channel_set_mode( irc_channel_t *ic, const char *s );
[c8eeadd]307void irc_channel_auto_joins( irc_t *irc, struct account *acc );
[9893da3]308void irc_channel_printf( irc_channel_t *ic, char *format, ... );
[b919363]309gboolean irc_channel_name_ok( const char *name );
[134a02c]310void irc_channel_name_strip( char *name );
[6b90431]311int irc_channel_name_cmp( const char *a_, const char *b_ );
[c5aefa4]312void irc_channel_update_ops( irc_channel_t *ic, char *value );
313char *set_eval_irc_channel_ops( struct set *set, char *value );
[ac2717b]314gboolean irc_channel_wants_user( irc_channel_t *ic, irc_user_t *iu );
[4be8239]315
[3ddb7477]316/* irc_commands.c */
317void irc_exec( irc_t *irc, char **cmd );
318
319/* irc_send.c */
320void irc_send_num( irc_t *irc, int code, char *format, ... ) G_GNUC_PRINTF( 3, 4 );
321void irc_send_login( irc_t *irc );
322void irc_send_motd( irc_t *irc );
[e67e513]323const char *irc_user_msgdest( irc_user_t *iu );
324void irc_rootmsg( irc_t *irc, char *format, ... );
325void irc_usermsg( irc_user_t *iu, char *format, ... );
326void irc_usernotice( irc_user_t *iu, char *format, ... );
[4be8239]327void irc_send_join( irc_channel_t *ic, irc_user_t *iu );
328void irc_send_part( irc_channel_t *ic, irc_user_t *iu, const char *reason );
[1f0224c]329void irc_send_quit( irc_user_t *iu, const char *reason );
[006a84f]330void irc_send_kick( irc_channel_t *ic, irc_user_t *iu, irc_user_t *kicker, const char *reason );
[4be8239]331void irc_send_names( irc_channel_t *ic );
[83e92bf]332void irc_send_topic( irc_channel_t *ic, gboolean topic_change );
[b95932e]333void irc_send_whois( irc_user_t *iu );
[2f53ada]334void irc_send_who( irc_t *irc, GSList *l, const char *channel );
[6761a40]335void irc_send_msg( irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix );
336void irc_send_msg_raw( irc_user_t *iu, const char *type, const char *dst, const char *msg );
[7b59872]337void irc_send_msg_f( irc_user_t *iu, const char *type, const char *dst, const char *format, ... ) G_GNUC_PRINTF( 4, 5 );
[4efa5ce]338void irc_send_nick( irc_user_t *iu, const char *new_nick );
[6a9d068]339void irc_send_channel_user_mode_diff( irc_channel_t *ic, irc_user_t *iu,
[4efa5ce]340                                      irc_channel_user_flags_t old_flags, irc_channel_user_flags_t new_flags );
[1aa74f55]341void irc_send_invite( irc_user_t *iu, irc_channel_t *ic );
[3ddb7477]342
343/* irc_user.c */
344irc_user_t *irc_user_new( irc_t *irc, const char *nick );
[eabc9d2]345int irc_user_free( irc_t *irc, irc_user_t *iu );
[280c56a]346irc_user_t *irc_user_by_name( irc_t *irc, const char *nick );
[4efa5ce]347int irc_user_set_nick( irc_user_t *iu, const char *new_nick );
[ebaebfe]348gint irc_user_cmp( gconstpointer a_, gconstpointer b_ );
[003a12b]349const char *irc_user_get_away( irc_user_t *iu );
[0bd948e]350void irc_user_quit( irc_user_t *iu, const char *msg );
[b7d3cc34]351
[21c87a7]352/* irc_util.c */
353char *set_eval_timezone( struct set *set, char *value );
354char *irc_format_timestamp( irc_t *irc, time_t msg_ts );
[b7d3cc34]355
[13c1a9f]356/* irc_im.c */
357void bee_irc_channel_update( irc_t *irc, irc_channel_t *ic, irc_user_t *iu );
[a429907]358void bee_irc_user_nick_reset( irc_user_t *iu );
[13c1a9f]359
[b7d3cc34]360#endif
Note: See TracBrowser for help on using the repository browser.