aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--irc_im.c31
-rw-r--r--protocols/bee.h1
-rw-r--r--protocols/bee_user.c95
3 files changed, 45 insertions, 82 deletions
diff --git a/irc_im.c b/irc_im.c
index 9a4ce176..e13a9ab4 100644
--- a/irc_im.c
+++ b/irc_im.c
@@ -62,6 +62,9 @@ static gboolean bee_irc_user_new( bee_t *bee, bee_user_t *bu )
iu->user = g_strdup( bu->handle );
}
+ if( set_getbool( &bee->set, "private" ) )
+ iu->flags |= IRC_USER_PRIVATE;
+
iu->f = &irc_user_im_funcs;
//iu->last_typing_notice = 0;
@@ -89,10 +92,38 @@ static gboolean bee_irc_user_status( bee_t *bee, bee_user_t *bu, bee_user_t *old
return TRUE;
}
+static gboolean bee_irc_user_msg( bee_t *bee, bee_user_t *bu, const char *msg, time_t sent_at )
+{
+ irc_t *irc = bee->ui_data;
+ irc_channel_t *ic = irc->channels->data;
+ irc_user_t *iu = (irc_user_t *) bu->ui_data;
+ char *dst, *prefix = NULL;
+ char *wrapped;
+
+ if( iu->flags & IRC_USER_PRIVATE )
+ {
+ dst = irc->user->nick;
+ }
+ else
+ {
+ dst = ic->name;
+ prefix = g_strdup_printf( "%s%s", irc->user->nick, set_getstr( &bee->set, "to_char" ) );
+ }
+
+ wrapped = word_wrap( msg, 425 );
+ irc_send_msg( iu, "PRIVMSG", dst, wrapped, prefix );
+
+ g_free( wrapped );
+ g_free( prefix );
+
+ return TRUE;
+}
+
const struct bee_ui_funcs irc_ui_funcs = {
bee_irc_user_new,
bee_irc_user_free,
bee_irc_user_status,
+ bee_irc_user_msg,
};
diff --git a/protocols/bee.h b/protocols/bee.h
index 023c1644..62c73e94 100644
--- a/protocols/bee.h
+++ b/protocols/bee.h
@@ -68,6 +68,7 @@ typedef struct bee_ui_funcs
gboolean (*user_new)( bee_t *bee, struct bee_user *bu );
gboolean (*user_free)( bee_t *bee, struct bee_user *bu );
gboolean (*user_status)( bee_t *bee, struct bee_user *bu, struct bee_user *old );
+ gboolean (*user_msg)( bee_t *bee, bee_user_t *bu, const char *msg, time_t sent_at );
} bee_ui_funcs_t;
diff --git a/protocols/bee_user.c b/protocols/bee_user.c
index cbcebe33..675d37c5 100644
--- a/protocols/bee_user.c
+++ b/protocols/bee_user.c
@@ -115,11 +115,11 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,
}
else
{
- if( set_getbool( &ic->bee->set, "debug" ) || g_strcasecmp( set_getstr( &ic->bee->set, "handle_unknown" ), "ignore" ) != 0 )
+ if( g_strcasecmp( set_getstr( &ic->bee->set, "handle_unknown" ), "ignore" ) != 0 )
{
- imcb_log( ic, "imcb_buddy_status() for unknown handle %s:", handle );
- imcb_log( ic, "flags = %d, state = %s, message = %s", flags,
- state ? state : "NULL", message ? message : "NULL" );
+ imcb_log( ic, "imcb_buddy_status() for unknown handle %s:\n"
+ "flags = %d, state = %s, message = %s", handle, flags,
+ state ? state : "NULL", message ? message : "NULL" );
}
return;
@@ -141,54 +141,6 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,
g_free( old->status );
g_free( old );
#if 0
- oa = u->away != NULL;
- oo = u->online;
-
- g_free( u->away );
- g_free( u->status_msg );
- u->away = u->status_msg = NULL;
-
- if( ( flags & OPT_LOGGED_IN ) && !u->online )
- {
- irc_spawn( ic->irc, u );
- u->online = 1;
- }
- else if( !( flags & OPT_LOGGED_IN ) && u->online )
- {
- struct groupchat *c;
-
- irc_kill( ic->irc, u );
- u->online = 0;
-
- /* Remove him/her from the groupchats to prevent PART messages after he/she QUIT already */
- for( c = ic->groupchats; c; c = c->next )
- remove_chat_buddy_silent( c, handle );
- }
-
- if( flags & OPT_AWAY )
- {
- if( state && message )
- {
- u->away = g_strdup_printf( "%s (%s)", state, message );
- }
- else if( state )
- {
- u->away = g_strdup( state );
- }
- else if( message )
- {
- u->away = g_strdup( message );
- }
- else
- {
- u->away = g_strdup( "Away" );
- }
- }
- else
- {
- u->status_msg = g_strdup( message );
- }
-
/* LISPy... */
if( ( set_getbool( &ic->bee->set, "away_devoice" ) ) && /* Don't do a thing when user doesn't want it */
( u->online ) && /* Don't touch offline people */
@@ -215,53 +167,32 @@ void imcb_buddy_status( struct im_connection *ic, const char *handle, int flags,
void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, uint32_t flags, time_t sent_at )
{
-#if 0
bee_t *bee = ic->bee;
char *wrapped;
- user_t *u;
+ bee_user_t *bu;
- u = user_findhandle( ic, handle );
+ bu = bee_user_by_handle( bee, ic, handle );
- if( !u )
+ if( !bu )
{
char *h = set_getstr( &bee->set, "handle_unknown" );
if( g_strcasecmp( h, "ignore" ) == 0 )
{
- if( set_getbool( &bee->set, "debug" ) )
- imcb_log( ic, "Ignoring message from unknown handle %s", handle );
-
return;
}
else if( g_strncasecmp( h, "add", 3 ) == 0 )
{
- int private = set_getbool( &bee->set, "private" );
-
- if( h[3] )
- {
- if( g_strcasecmp( h + 3, "_private" ) == 0 )
- private = 1;
- else if( g_strcasecmp( h + 3, "_channel" ) == 0 )
- private = 0;
- }
-
- imcb_add_buddy( ic, handle, NULL );
- u = user_findhandle( ic, handle );
- u->is_private = private;
- }
- else
- {
- imcb_log( ic, "Message from unknown handle %s:", handle );
- u = user_find( irc, irc->mynick );
+ bu = bee_user_new( bee, ic, handle );
}
}
if( ( g_strcasecmp( set_getstr( &ic->bee->set, "strip_html" ), "always" ) == 0 ) ||
( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->bee->set, "strip_html" ) ) )
strip_html( msg );
-
- wrapped = word_wrap( msg, 425 );
- irc_msgfrom( irc, u->nick, wrapped );
- g_free( wrapped );
-#endif
+
+ if( bee->ui->user_msg && bu )
+ bee->ui->user_msg( bee, bu, msg, sent_at );
+ else
+ imcb_log( ic, "Message from unknown handle %s:\n%s", handle, msg );
}