aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--irc.h5
-rw-r--r--irc_channel.c34
-rw-r--r--irc_im.c13
3 files changed, 49 insertions, 3 deletions
diff --git a/irc.h b/irc.h
index 61859871..9f4578bb 100644
--- a/irc.h
+++ b/irc.h
@@ -130,7 +130,10 @@ extern const struct irc_user_funcs irc_user_self_funcs;
typedef enum
{
IRC_CHANNEL_JOINED = 1,
- IRC_CHANNEL_CONTACTS = 256,
+
+ /* Hack: Set this flag right before jumping into IM when we expect
+ a call to imcb_chat_new(). */
+ IRC_CHANNEL_CHAT_PICKME = 0x10000,
} irc_channel_flags_t;
typedef struct irc_channel
diff --git a/irc_channel.c b/irc_channel.c
index 2ff00068..2c6601d2 100644
--- a/irc_channel.c
+++ b/irc_channel.c
@@ -27,6 +27,7 @@
static gint irc_channel_user_cmp( gconstpointer a_, gconstpointer b_ );
static const struct irc_channel_funcs control_channel_funcs;
+static const struct irc_channel_funcs groupchat_stub_funcs;
irc_channel_t *irc_channel_new( irc_t *irc, const char *name )
{
@@ -36,7 +37,6 @@ irc_channel_t *irc_channel_new( irc_t *irc, const char *name )
return NULL;
ic = g_new0( irc_channel_t, 1 );
- ic->f = &control_channel_funcs;
ic->irc = irc;
ic->name = g_strdup( name );
strcpy( ic->mode, CMODE );
@@ -48,6 +48,11 @@ irc_channel_t *irc_channel_new( irc_t *irc, const char *name )
irc->channels = g_slist_prepend( irc->channels, ic );
+ if( name[0] == '&' )
+ ic->f = &control_channel_funcs;
+ else /* if( name[0] == '#' ) */
+ ic->f = &groupchat_stub_funcs;
+
return ic;
}
@@ -250,3 +255,30 @@ static gboolean control_channel_privmsg( irc_channel_t *ic, const char *msg )
static const struct irc_channel_funcs control_channel_funcs = {
control_channel_privmsg,
};
+
+/* Groupchat stub: Only handles /INVITE at least for now. */
+static gboolean groupchat_stub_invite( irc_channel_t *ic, irc_user_t *iu )
+{
+ bee_user_t *bu = iu->bu;
+
+ if( iu->bu->ic->acc->prpl->chat_with )
+ {
+ ic->flags |= IRC_CHANNEL_CHAT_PICKME;
+ iu->bu->ic->acc->prpl->chat_with( bu->ic, bu->handle );
+ ic->flags &= ~IRC_CHANNEL_CHAT_PICKME;
+ return TRUE;
+ }
+ else
+ {
+ irc_send_num( ic->irc, 482, "%s :IM protocol does not support room invitations", ic->name );
+ return FALSE;
+ }
+}
+
+static const struct irc_channel_funcs groupchat_stub_funcs = {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ groupchat_stub_invite,
+};
diff --git a/irc_im.c b/irc_im.c
index c5384fed..42186bc9 100644
--- a/irc_im.c
+++ b/irc_im.c
@@ -258,9 +258,20 @@ static gboolean bee_irc_chat_new( bee_t *bee, struct groupchat *c )
irc_t *irc = bee->ui_data;
irc_channel_t *ic;
char *topic;
+ GSList *l;
int i;
- for( i = 0; i <= 999; i ++ )
+ /* Try to find a channel that expects to receive a groupchat.
+ This flag is set by groupchat_stub_invite(). */
+ for( l = irc->channels; l; l = l->next )
+ {
+ ic = l->data;
+ if( ic->flags & IRC_CHANNEL_CHAT_PICKME )
+ break;
+ }
+
+ /* If we found none, just generate some stupid name. */
+ if( l == NULL ) for( i = 0; i <= 999; i ++ )
{
char name[16];
sprintf( name, "&chat_%03d", i );