source: irc.h @ 0ca1d79

Last change on this file since 0ca1d79 was 7821ee8, checked in by jgeboski <jgeboski@…>, at 2015-01-29T19:24:17Z

irc_commands: implemented KICK support

With similar commands being supported, such as INVITE, the KICK command
should be supported as well. The key motivation behind supporting KICK
is having for having a way to remove users from group chats. As of now,
there is no way for a bitlbee user to remove a user from a group chat.
With no current KICK implementation, it made using this command a prime
candidate for the UI side of this implementation. In addition, the KICK
command has been supported in the control channel as well. This is to
keep the INVITE/KICK pair consistent.

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