source: irc.h @ 398a139

Last change on this file since 398a139 was 80c2f3c, checked in by dequis <dx@…>, at 2015-11-20T15:51:45Z

IRCv3 away-notify capability

Neat lightweight notifications of the awayness of contacts.

In practice, this means weechat/hexchat users can see away people in
their nick list and change show_users to 'online,special,away' to avoid
the mode spam completely.

These are also sent on online/offline changes, since offline_user_quits
can be turned off, and you'd need something when they come back.

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