source: protocols/bee.h @ 25f6151

Last change on this file since 25f6151 was 345577b, checked in by dequis <dx@…>, at 2015-10-30T10:27:20Z

IRC self-message support (messages sent by yourself from other clients)

This adds an OPT_SELFMESSAGE flag that can be passed to imcb_buddy_msg()
or imcb_chat_msg() to indicate that the protocol knows that the message
being sent is a self message.

This needs to be explicit since the old behavior is to silently drop
these messages, which also removed server echoes.

This commit doesn't break API/ABI, the flags parameters that were added
are all internal (between protocols and UI code)

On the irc protocol side, the situation isn't very nice, since some
clients put these messages in the wrong window. Irssi, hexchat and mirc
get this wrong. Irssi 0.8.18 has a fix for it, and the others have
scripts to patch it.

But meanwhile, there's a "self_messages" global setting that lets users
disable this, or get them as normal messages / notices with a "->"
prefix, which loosely imitates the workaround used by the ZNC
"privmsg_prefix" module.

  • Property mode set to 100644
File size: 8.7 KB
Line 
1/********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2010 Wilmer van der Gaast and others                *
5  \********************************************************************/
6
7/* Stuff to handle, save and search buddies                             */
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 __BEE_H__
27#define __BEE_H__
28
29struct bee_ui_funcs;
30struct groupchat;
31
32typedef struct bee {
33        /* Settings. See set.h for how these work. The UI can add its
34           own settings here. */
35        struct set *set;
36
37        GSList *users;  /* struct bee_user */
38        GSList *groups; /* struct bee_group */
39        struct account *accounts; /* TODO(wilmer): Use GSList here too? */
40
41        /* Symbolic, to refer to the local user (who has no real bee_user
42           object). Not to be used by anything except so far imcb_chat_add/
43           remove_buddy(). */
44        struct bee_user *user;
45
46        /* Fill in the callbacks for events you care about. */
47        const struct bee_ui_funcs *ui;
48
49        /* And this one will be passed to every callback for any state the
50           UI may want to keep. */
51        void *ui_data;
52} bee_t;
53
54bee_t *bee_new();
55void bee_free(bee_t *b);
56
57/* TODO(wilmer): Kill at least the OPT_ flags that have an equivalent here. */
58typedef enum {
59        BEE_USER_ONLINE = 1,    /* Compatibility with old OPT_LOGGED_IN flag */
60        BEE_USER_AWAY = 4,      /* Compatibility with old OPT_AWAY flag */
61        BEE_USER_MOBILE = 8,    /* Compatibility with old OPT_MOBILE flag */
62        BEE_USER_LOCAL = 256,   /* Locally-added contacts (not in real contact list) */
63        BEE_USER_SPECIAL = 512, /* Denotes a user as being special */
64        BEE_USER_NOOTR = 4096,  /* Per-user version of OPT_NOOTR */
65} bee_user_flags_t;
66
67typedef struct bee_user {
68        struct im_connection *ic;
69        char *handle;
70        char *fullname;
71        char *nick;
72        struct bee_group *group;
73
74        bee_user_flags_t flags;
75        char *status;     /* NULL means available, anything else is an away state. */
76        char *status_msg; /* Status and/or away message. */
77
78        /* Set using imcb_buddy_times(). */
79        time_t login_time, idle_time;
80
81        bee_t *bee;
82        void *ui_data;
83        void *data; /* Can be used by the IM module. */
84} bee_user_t;
85
86/* This one's mostly used so save space and make it easier (cheaper) to
87   compare groups of contacts, etc. */
88typedef struct bee_group {
89        char *key;  /* Lower case version of the name. */
90        char *name;
91} bee_group_t;
92
93typedef struct bee_ui_funcs {
94        void (*imc_connected)(struct im_connection *ic);
95        void (*imc_disconnected)(struct im_connection *ic);
96
97        gboolean (*user_new)(bee_t *bee, struct bee_user *bu);
98        gboolean (*user_free)(bee_t *bee, struct bee_user *bu);
99        /* Set the fullname first, then call this one to notify the UI. */
100        gboolean (*user_fullname)(bee_t *bee, bee_user_t *bu);
101        gboolean (*user_nick_hint)(bee_t *bee, bee_user_t *bu, const char *hint);
102        /* Notify the UI when an existing user is moved between groups. */
103        gboolean (*user_group)(bee_t *bee, bee_user_t *bu);
104        /* State info is already updated, old is provided in case the UI needs a diff. */
105        gboolean (*user_status)(bee_t *bee, struct bee_user *bu, struct bee_user *old);
106        /* On every incoming message. sent_at = 0 means unknown. */
107        gboolean (*user_msg)(bee_t *bee, bee_user_t *bu, const char *msg, guint32 flags, time_t sent_at);
108        /* Flags currently defined (OPT_TYPING/THINKING) in nogaim.h. */
109        gboolean (*user_typing)(bee_t *bee, bee_user_t *bu, guint32 flags);
110        /* CTCP-like stuff (buddy action) response */
111        gboolean (*user_action_response)(bee_t *bee, bee_user_t *bu, const char *action, char * const args[],
112                                         void *data);
113
114        /* Called at creation time. Don't show to the user until s/he is
115           added using chat_add_user().  UI state can be stored via c->data. */
116        gboolean (*chat_new)(bee_t *bee, struct groupchat *c);
117        gboolean (*chat_free)(bee_t *bee, struct groupchat *c);
118        /* System messages of any kind. */
119        gboolean (*chat_log)(bee_t *bee, struct groupchat *c, const char *text);
120        gboolean (*chat_msg)(bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *msg, guint32 flags, time_t sent_at);
121        gboolean (*chat_add_user)(bee_t *bee, struct groupchat *c, bee_user_t *bu);
122        gboolean (*chat_remove_user)(bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *reason);
123        gboolean (*chat_topic)(bee_t *bee, struct groupchat *c, const char *new_topic, bee_user_t *bu);
124        gboolean (*chat_name_hint)(bee_t *bee, struct groupchat *c, const char *name);
125        gboolean (*chat_invite)(bee_t *bee, bee_user_t *bu, const char *name, const char *msg);
126
127        struct file_transfer* (*ft_in_start)(bee_t * bee, bee_user_t * bu, const char *file_name, size_t file_size);
128        gboolean (*ft_out_start)(struct im_connection *ic, struct file_transfer *ft);
129        void (*ft_close)(struct im_connection *ic, struct file_transfer *ft);
130        void (*ft_finished)(struct im_connection *ic, struct file_transfer *ft);
131} bee_ui_funcs_t;
132
133
134/* bee.c */
135bee_t *bee_new();
136void bee_free(bee_t *b);
137
138/* bee_user.c */
139bee_user_t *bee_user_new(bee_t *bee, struct im_connection *ic, const char *handle, bee_user_flags_t flags);
140int bee_user_free(bee_t *bee, bee_user_t *bu);
141bee_user_t *bee_user_by_handle(bee_t *bee, struct im_connection *ic, const char *handle);
142int bee_user_msg(bee_t *bee, bee_user_t *bu, const char *msg, int flags);
143bee_group_t *bee_group_by_name(bee_t *bee, const char *name, gboolean creat);
144void bee_group_free(bee_t *bee);
145
146/* Callbacks from IM modules to core: */
147/* Buddy activity */
148/* To manipulate the status of a handle.
149 * - flags can be |='d with OPT_* constants. You will need at least:
150 *   OPT_LOGGED_IN and OPT_AWAY.
151 * - 'state' and 'message' can be NULL */
152G_MODULE_EXPORT void imcb_buddy_status(struct im_connection *ic, const char *handle, int flags, const char *state,
153                                       const char *message);
154G_MODULE_EXPORT void imcb_buddy_status_msg(struct im_connection *ic, const char *handle, const char *message);
155G_MODULE_EXPORT void imcb_buddy_times(struct im_connection *ic, const char *handle, time_t login, time_t idle);
156/* Call when a handle says something. 'flags' and 'sent_at may be just 0. */
157G_MODULE_EXPORT void imcb_buddy_msg(struct im_connection *ic, const char *handle, const char *msg, guint32 flags,
158                                    time_t sent_at);
159G_MODULE_EXPORT void imcb_notify_email(struct im_connection *ic, char *format, ...) G_GNUC_PRINTF(2, 3);
160
161/* bee_chat.c */
162/* These two functions are to create a group chat.
163 * - imcb_chat_new(): the 'handle' parameter identifies the chat, like the
164 *   channel name on IRC.
165 * - After you have a groupchat pointer, you should add the handles, finally
166 *   the user her/himself. At that point the group chat will be visible to the
167 *   user, too. */
168G_MODULE_EXPORT struct groupchat *imcb_chat_new(struct im_connection *ic, const char *handle);
169G_MODULE_EXPORT void imcb_chat_name_hint(struct groupchat *c, const char *name);
170G_MODULE_EXPORT void imcb_chat_free(struct groupchat *c);
171/* To tell BitlBee 'who' said 'msg' in 'c'. 'flags' and 'sent_at' can be 0. */
172G_MODULE_EXPORT void imcb_chat_msg(struct groupchat *c, const char *who, char *msg, guint32 flags, time_t sent_at);
173/* System messages specific to a groupchat, so they can be displayed in the right context. */
174G_MODULE_EXPORT void imcb_chat_log(struct groupchat *c, char *format, ...);
175/* To tell BitlBee 'who' changed the topic of 'c' to 'topic'. */
176G_MODULE_EXPORT void imcb_chat_topic(struct groupchat *c, char *who, char *topic, time_t set_at);
177G_MODULE_EXPORT void imcb_chat_add_buddy(struct groupchat *c, const char *handle);
178/* To remove a handle from a group chat. Reason can be NULL. */
179G_MODULE_EXPORT void imcb_chat_remove_buddy(struct groupchat *c, const char *handle, const char *reason);
180G_MODULE_EXPORT int bee_chat_msg(bee_t *bee, struct groupchat *c, const char *msg, int flags);
181G_MODULE_EXPORT struct groupchat *bee_chat_by_title(bee_t *bee, struct im_connection *ic, const char *title);
182G_MODULE_EXPORT void imcb_chat_invite(struct im_connection *ic, const char *name, const char *who, const char *msg);
183
184#endif /* __BEE_H__ */
Note: See TracBrowser for help on using the repository browser.