source: irc.h @ 5ebff60

Last change on this file since 5ebff60 was 5ebff60, checked in by dequis <dx@…>, at 2015-02-20T22:50:54Z

Reindent everything to K&R style with tabs

Used uncrustify, with the configuration file in ./doc/uncrustify.cfg

Commit author set to "Indent <please@…>" so that it's easier to
skip while doing git blame.

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