source: irc.h @ d797fb4

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

CAP REQ

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