Scan media entities as well, not just url entities. This should expand more
[bitlbee.git] / irc.h
blob97d56ea11f24458a75ac5d0c4c94f0a0f2f11f4c
1 /********************************************************************\
2 * BitlBee -- An IRC to other IM-networks gateway *
3 * *
4 * Copyright 2002-2010 Wilmer van der Gaast and others *
5 \********************************************************************/
7 /* The IRC-based UI (for now the only one) */
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.
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.
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
26 #ifndef _IRC_H
27 #define _IRC_H
29 #define IRC_MAX_LINE 512
30 #define IRC_MAX_ARGS 16
32 #define IRC_LOGIN_TIMEOUT 60
33 #define IRC_PING_STRING "PinglBee"
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 */
42 #define CTYPES "&#" /* Valid channel name prefixes */
44 typedef enum
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(). */
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_ADD = 0x400,
63 OPER_HACK_ANY = 0x3700, /* To check for them all at once. */
64 } irc_status_t;
66 struct irc_user;
68 typedef struct irc
70 int fd;
71 irc_status_t status;
72 double last_pong;
73 int pinging;
74 char *sendbuffer;
75 char *readbuffer;
76 GIConv iconv, oconv;
78 struct irc_user *root;
79 struct irc_user *user;
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. */
85 char umode[8];
87 struct query *queries;
88 GSList *file_transfers;
90 GSList *users, *channels;
91 struct irc_channel *default_channel;
92 GHashTable *nick_user_hash;
93 GHashTable *watches; /* See irc_cmd_watch() */
95 gint r_watch_source_id;
96 gint w_watch_source_id;
97 gint ping_source_id;
98 gint login_source_id; /* To slightly delay some events at login time. */
100 struct otr *otr; /* OTR state and book keeping, used by the OTR plugin.
101 TODO: Some mechanism for plugindata. */
103 struct bee *b;
104 } irc_t;
106 typedef enum
108 /* Replaced with iu->last_channel IRC_USER_PRIVATE = 1, */
109 IRC_USER_AWAY = 2,
111 IRC_USER_OTR_ENCRYPTED = 0x10000,
112 IRC_USER_OTR_TRUSTED = 0x20000,
113 } irc_user_flags_t;
115 typedef struct irc_user
117 irc_t *irc;
119 char *nick;
120 char *user;
121 char *host;
122 char *fullname;
124 /* Nickname in lowercase for case insensitive searches */
125 char *key;
127 irc_user_flags_t flags;
128 struct irc_channel *last_channel;
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. */
134 struct bee_user *bu;
136 const struct irc_user_funcs *f;
137 } irc_user_t;
139 struct irc_user_funcs
141 gboolean (*privmsg)( irc_user_t *iu, const char *msg );
142 gboolean (*ctcp)( irc_user_t *iu, char * const* ctcp );
145 extern const struct irc_user_funcs irc_user_root_funcs;
146 extern const struct irc_user_funcs irc_user_self_funcs;
148 typedef enum
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. */
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,
157 } irc_channel_flags_t;
159 typedef struct irc_channel
161 irc_t *irc;
162 char *name;
163 char mode[8];
164 int flags;
166 char *topic;
167 char *topic_who;
168 time_t topic_time;
170 GSList *users; /* struct irc_channel_user */
171 struct irc_user *last_target;
172 struct set *set;
174 GString *pastebuf; /* Paste buffer (combine lines into a multiline msg). */
175 guint pastebuf_timer;
177 const struct irc_channel_funcs *f;
178 void *data;
179 } irc_channel_t;
181 struct irc_channel_funcs
183 gboolean (*privmsg)( irc_channel_t *ic, const char *msg );
184 gboolean (*join)( irc_channel_t *ic );
185 gboolean (*part)( irc_channel_t *ic, const char *msg );
186 gboolean (*topic)( irc_channel_t *ic, const char *new_topic );
187 gboolean (*invite)( irc_channel_t *ic, irc_user_t *iu );
189 gboolean (*_init)( irc_channel_t *ic );
190 gboolean (*_free)( irc_channel_t *ic );
193 typedef enum
195 IRC_CHANNEL_USER_OP = 1,
196 IRC_CHANNEL_USER_HALFOP = 2,
197 IRC_CHANNEL_USER_VOICE = 4,
198 IRC_CHANNEL_USER_NONE = 8,
199 } irc_channel_user_flags_t;
201 typedef struct irc_channel_user
203 irc_user_t *iu;
204 int flags;
205 } irc_channel_user_t;
207 typedef enum
209 IRC_CC_TYPE_DEFAULT,
210 IRC_CC_TYPE_REST,
211 IRC_CC_TYPE_GROUP,
212 IRC_CC_TYPE_ACCOUNT,
213 IRC_CC_TYPE_PROTOCOL,
214 } irc_control_channel_type_t;
216 struct irc_control_channel
218 irc_control_channel_type_t type;
219 struct bee_group *group;
220 struct account *account;
221 struct prpl *protocol;
222 char modes[4];
225 extern const struct bee_ui_funcs irc_ui_funcs;
227 typedef enum
229 IRC_CDU_SILENT,
230 IRC_CDU_PART,
231 IRC_CDU_KICK,
232 } irc_channel_del_user_type_t;
234 /* These are a glued a little bit to the core/bee layer and a little bit to
235 IRC. The first user is OTR, and I guess at some point we'll get to shape
236 this a little bit more as other uses come up. */
237 typedef struct irc_plugin
239 /* Called at the end of irc_new(). Can be used to add settings, etc. */
240 gboolean (*irc_new)( irc_t *irc );
241 /* At the end of irc_free(). */
242 void (*irc_free)( irc_t *irc );
244 /* Problem with the following two functions is ordering if multiple
245 plugins are handling them. Let's keep fixing that problem for
246 whenever it becomes important. */
248 /* Called by bee_irc_user_privmsg_cb(). Return NULL if you want to
249 abort sending the msg. */
250 char* (*filter_msg_out)( irc_user_t *iu, char *msg, int flags );
251 /* Called by bee_irc_user_msg(). Return NULL if you swallowed the
252 message and don't want anything to go to the user. */
253 char* (*filter_msg_in)( irc_user_t *iu, char *msg, int flags );
255 /* From storage.c functions. Ideally these should not be used
256 and instead data should be stored in settings which will get
257 saved automatically. Consider these deprecated! */
258 void (*storage_load)( irc_t *irc );
259 void (*storage_save)( irc_t *irc );
260 void (*storage_remove)( const char *nick );
261 } irc_plugin_t;
263 extern GSList *irc_plugins; /* struct irc_plugin */
265 /* irc.c */
266 extern GSList *irc_connection_list;
268 irc_t *irc_new( int fd );
269 void irc_abort( irc_t *irc, int immed, char *format, ... ) G_GNUC_PRINTF( 3, 4 );
270 void irc_free( irc_t *irc );
271 void irc_setpass (irc_t *irc, const char *pass);
273 void irc_process( irc_t *irc );
274 char **irc_parse_line( char *line );
275 char *irc_build_line( char **cmd );
277 void irc_write( irc_t *irc, char *format, ... ) G_GNUC_PRINTF( 2, 3 );
278 void irc_write_all( int now, char *format, ... ) G_GNUC_PRINTF( 2, 3 );
279 void irc_vawrite( irc_t *irc, char *format, va_list params );
281 void irc_flush( irc_t *irc );
282 void irc_switch_fd( irc_t *irc, int fd );
283 void irc_sync( irc_t *irc );
284 void irc_desync( irc_t *irc );
286 int irc_check_login( irc_t *irc );
288 void irc_umode_set( irc_t *irc, const char *s, gboolean allow_priv );
290 void register_irc_plugin( const struct irc_plugin *p );
292 /* irc_channel.c */
293 irc_channel_t *irc_channel_new( irc_t *irc, const char *name );
294 irc_channel_t *irc_channel_by_name( irc_t *irc, const char *name );
295 irc_channel_t *irc_channel_get( irc_t *irc, char *id );
296 int irc_channel_free( irc_channel_t *ic );
297 void irc_channel_free_soon( irc_channel_t *ic );
298 int irc_channel_add_user( irc_channel_t *ic, irc_user_t *iu );
299 int irc_channel_del_user( irc_channel_t *ic, irc_user_t *iu, irc_channel_del_user_type_t type, const char *msg );
300 irc_channel_user_t *irc_channel_has_user( irc_channel_t *ic, irc_user_t *iu );
301 struct irc_channel *irc_channel_with_user( irc_t *irc, irc_user_t *iu );
302 int irc_channel_set_topic( irc_channel_t *ic, const char *topic, const irc_user_t *who );
303 void irc_channel_user_set_mode( irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t flags );
304 void irc_channel_set_mode( irc_channel_t *ic, const char *s );
305 void irc_channel_auto_joins( irc_t *irc, struct account *acc );
306 void irc_channel_printf( irc_channel_t *ic, char *format, ... );
307 gboolean irc_channel_name_ok( const char *name );
308 void irc_channel_name_strip( char *name );
309 int irc_channel_name_cmp( const char *a_, const char *b_ );
310 void irc_channel_update_ops( irc_channel_t *ic, char *value );
311 char *set_eval_irc_channel_ops( struct set *set, char *value );
312 gboolean irc_channel_wants_user( irc_channel_t *ic, irc_user_t *iu );
314 /* irc_commands.c */
315 void irc_exec( irc_t *irc, char **cmd );
317 /* irc_send.c */
318 void irc_send_num( irc_t *irc, int code, char *format, ... ) G_GNUC_PRINTF( 3, 4 );
319 void irc_send_login( irc_t *irc );
320 void irc_send_motd( irc_t *irc );
321 const char *irc_user_msgdest( irc_user_t *iu );
322 void irc_rootmsg( irc_t *irc, char *format, ... );
323 void irc_usermsg( irc_user_t *iu, char *format, ... );
324 void irc_usernotice( irc_user_t *iu, char *format, ... );
325 void irc_send_join( irc_channel_t *ic, irc_user_t *iu );
326 void irc_send_part( irc_channel_t *ic, irc_user_t *iu, const char *reason );
327 void irc_send_quit( irc_user_t *iu, const char *reason );
328 void irc_send_kick( irc_channel_t *ic, irc_user_t *iu, irc_user_t *kicker, const char *reason );
329 void irc_send_names( irc_channel_t *ic );
330 void irc_send_topic( irc_channel_t *ic, gboolean topic_change );
331 void irc_send_whois( irc_user_t *iu );
332 void irc_send_who( irc_t *irc, GSList *l, const char *channel );
333 void irc_send_msg( irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix );
334 void irc_send_msg_raw( irc_user_t *iu, const char *type, const char *dst, const char *msg );
335 void irc_send_msg_f( irc_user_t *iu, const char *type, const char *dst, const char *format, ... ) G_GNUC_PRINTF( 4, 5 );
336 void irc_send_nick( irc_user_t *iu, const char *new_nick );
337 void irc_send_channel_user_mode_diff( irc_channel_t *ic, irc_user_t *iu,
338 irc_channel_user_flags_t old_flags, irc_channel_user_flags_t new_flags );
339 void irc_send_invite( irc_user_t *iu, irc_channel_t *ic );
341 /* irc_user.c */
342 irc_user_t *irc_user_new( irc_t *irc, const char *nick );
343 int irc_user_free( irc_t *irc, irc_user_t *iu );
344 irc_user_t *irc_user_by_name( irc_t *irc, const char *nick );
345 int irc_user_set_nick( irc_user_t *iu, const char *new_nick );
346 gint irc_user_cmp( gconstpointer a_, gconstpointer b_ );
347 const char *irc_user_get_away( irc_user_t *iu );
348 void irc_user_quit( irc_user_t *iu, const char *msg );
350 /* irc_util.c */
351 char *set_eval_timezone( struct set *set, char *value );
352 char *irc_format_timestamp( irc_t *irc, time_t msg_ts );
354 /* irc_im.c */
355 void bee_irc_channel_update( irc_t *irc, irc_channel_t *ic, irc_user_t *iu );
356 void bee_irc_user_nick_reset( irc_user_t *iu );
358 #endif