source: protocols/bee.h @ b3ebb3a

Last change on this file since b3ebb3a was 830864d, checked in by dequis <dx@…>, at 2015-03-15T09:31:18Z

WIP placeholder channels with hipchat implementation

i was going to clean this up and split in two commits but uhhh...
maybe some other day, i'm tired now

not very tested and i'm not 100% happy about the design, but sucks way
less than what i had in the hip-cat branch

feedback still appreciated.

this adds channels to the channel list without creating groupchats for
them, allowing users to /join them. what the hip-cat branch did before
but with proper api and hopefully less dumb behavior

it still 'leaks' them intentionally, just like it did before, but now it
prevents saving them to the xml so yay

also slightly improved channel name generation, refactored
bee_irc_chat_name_hint into three or four functions, and so on

  • Property mode set to 100644
File size: 8.8 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_flags_t;
65
66typedef struct bee_user {
67        struct im_connection *ic;
68        char *handle;
69        char *fullname;
70        char *nick;
71        struct bee_group *group;
72
73        bee_user_flags_t flags;
74        char *status;     /* NULL means available, anything else is an away state. */
75        char *status_msg; /* Status and/or away message. */
76
77        /* Set using imcb_buddy_times(). */
78        time_t login_time, idle_time;
79
80        bee_t *bee;
81        void *ui_data;
82        void *data; /* Can be used by the IM module. */
83} bee_user_t;
84
85/* This one's mostly used so save space and make it easier (cheaper) to
86   compare groups of contacts, etc. */
87typedef struct bee_group {
88        char *key;  /* Lower case version of the name. */
89        char *name;
90} bee_group_t;
91
92typedef struct bee_ui_funcs {
93        void (*imc_connected)(struct im_connection *ic);
94        void (*imc_disconnected)(struct im_connection *ic);
95
96        gboolean (*user_new)(bee_t *bee, struct bee_user *bu);
97        gboolean (*user_free)(bee_t *bee, struct bee_user *bu);
98        /* Set the fullname first, then call this one to notify the UI. */
99        gboolean (*user_fullname)(bee_t *bee, bee_user_t *bu);
100        gboolean (*user_nick_hint)(bee_t *bee, bee_user_t *bu, const char *hint);
101        /* Notify the UI when an existing user is moved between groups. */
102        gboolean (*user_group)(bee_t *bee, bee_user_t *bu);
103        /* State info is already updated, old is provided in case the UI needs a diff. */
104        gboolean (*user_status)(bee_t *bee, struct bee_user *bu, struct bee_user *old);
105        /* On every incoming message. sent_at = 0 means unknown. */
106        gboolean (*user_msg)(bee_t *bee, bee_user_t *bu, const char *msg, time_t sent_at);
107        /* Flags currently defined (OPT_TYPING/THINKING) in nogaim.h. */
108        gboolean (*user_typing)(bee_t *bee, bee_user_t *bu, guint32 flags);
109        /* CTCP-like stuff (buddy action) response */
110        gboolean (*user_action_response)(bee_t *bee, bee_user_t *bu, const char *action, char * const args[],
111                                         void *data);
112
113        /* Called at creation time. Don't show to the user until s/he is
114           added using chat_add_user().  UI state can be stored via c->data. */
115        gboolean (*chat_new)(bee_t *bee, struct groupchat *c);
116        gboolean (*chat_free)(bee_t *bee, struct groupchat *c);
117        gboolean (*chat_placeholder_new)(bee_t *bee, struct im_connection *ic, const char *handle,
118                                         const char *name, const char *topic);
119        /* System messages of any kind. */
120        gboolean (*chat_log)(bee_t *bee, struct groupchat *c, const char *text);
121        gboolean (*chat_msg)(bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *msg, time_t sent_at);
122        gboolean (*chat_add_user)(bee_t *bee, struct groupchat *c, bee_user_t *bu);
123        gboolean (*chat_remove_user)(bee_t *bee, struct groupchat *c, bee_user_t *bu);
124        gboolean (*chat_topic)(bee_t *bee, struct groupchat *c, const char *new_topic, bee_user_t *bu);
125        gboolean (*chat_name_hint)(bee_t *bee, struct groupchat *c, const char *name);
126        gboolean (*chat_invite)(bee_t *bee, bee_user_t *bu, const char *name, const char *msg);
127
128        struct file_transfer* (*ft_in_start)(bee_t * bee, bee_user_t * bu, const char *file_name, size_t file_size);
129        gboolean (*ft_out_start)(struct im_connection *ic, struct file_transfer *ft);
130        void (*ft_close)(struct im_connection *ic, struct file_transfer *ft);
131        void (*ft_finished)(struct im_connection *ic, struct file_transfer *ft);
132} bee_ui_funcs_t;
133
134
135/* bee.c */
136bee_t *bee_new();
137void bee_free(bee_t *b);
138
139/* bee_user.c */
140bee_user_t *bee_user_new(bee_t *bee, struct im_connection *ic, const char *handle, bee_user_flags_t flags);
141int bee_user_free(bee_t *bee, bee_user_t *bu);
142bee_user_t *bee_user_by_handle(bee_t *bee, struct im_connection *ic, const char *handle);
143int bee_user_msg(bee_t *bee, bee_user_t *bu, const char *msg, int flags);
144bee_group_t *bee_group_by_name(bee_t *bee, const char *name, gboolean creat);
145void bee_group_free(bee_t *bee);
146
147/* Callbacks from IM modules to core: */
148/* Buddy activity */
149/* To manipulate the status of a handle.
150 * - flags can be |='d with OPT_* constants. You will need at least:
151 *   OPT_LOGGED_IN and OPT_AWAY.
152 * - 'state' and 'message' can be NULL */
153G_MODULE_EXPORT void imcb_buddy_status(struct im_connection *ic, const char *handle, int flags, const char *state,
154                                       const char *message);
155G_MODULE_EXPORT void imcb_buddy_status_msg(struct im_connection *ic, const char *handle, const char *message);
156G_MODULE_EXPORT void imcb_buddy_times(struct im_connection *ic, const char *handle, time_t login, time_t idle);
157/* Call when a handle says something. 'flags' and 'sent_at may be just 0. */
158G_MODULE_EXPORT void imcb_buddy_msg(struct im_connection *ic, const char *handle, const char *msg, guint32 flags,
159                                    time_t sent_at);
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_placeholder_new(struct im_connection *ic, const char *handle, const char *name,
170                                               const char *topic);
171G_MODULE_EXPORT void imcb_chat_name_hint(struct groupchat *c, const char *name);
172G_MODULE_EXPORT void imcb_chat_free(struct groupchat *c);
173/* To tell BitlBee 'who' said 'msg' in 'c'. 'flags' and 'sent_at' can be 0. */
174G_MODULE_EXPORT void imcb_chat_msg(struct groupchat *c, const char *who, char *msg, guint32 flags, time_t sent_at);
175/* System messages specific to a groupchat, so they can be displayed in the right context. */
176G_MODULE_EXPORT void imcb_chat_log(struct groupchat *c, char *format, ...);
177/* To tell BitlBee 'who' changed the topic of 'c' to 'topic'. */
178G_MODULE_EXPORT void imcb_chat_topic(struct groupchat *c, char *who, char *topic, time_t set_at);
179G_MODULE_EXPORT void imcb_chat_add_buddy(struct groupchat *c, const char *handle);
180/* To remove a handle from a group chat. Reason can be NULL. */
181G_MODULE_EXPORT void imcb_chat_remove_buddy(struct groupchat *c, const char *handle, const char *reason);
182G_MODULE_EXPORT int bee_chat_msg(bee_t *bee, struct groupchat *c, const char *msg, int flags);
183G_MODULE_EXPORT struct groupchat *bee_chat_by_title(bee_t *bee, struct im_connection *ic, const char *title);
184G_MODULE_EXPORT void imcb_chat_invite(struct im_connection *ic, const char *name, const char *who, const char *msg);
185
186#endif /* __BEE_H__ */
Note: See TracBrowser for help on using the repository browser.