aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/nogaim.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/nogaim.c')
-rw-r--r--protocols/nogaim.c146
1 files changed, 142 insertions, 4 deletions
diff --git a/protocols/nogaim.c b/protocols/nogaim.c
index b9426696..6be6b9ba 100644
--- a/protocols/nogaim.c
+++ b/protocols/nogaim.c
@@ -38,6 +38,7 @@
#include "chat.h"
static int remove_chat_buddy_silent( struct groupchat *b, const char *handle );
+static char *format_timestamp( irc_t *irc, time_t msg_ts );
GSList *connections;
@@ -134,6 +135,7 @@ void nogaim_init()
extern void oscar_initmodule();
extern void byahoo_initmodule();
extern void jabber_initmodule();
+ extern void twitter_initmodule();
extern void purple_initmodule();
#ifdef WITH_MSN
@@ -151,6 +153,10 @@ void nogaim_init()
#ifdef WITH_JABBER
jabber_initmodule();
#endif
+
+#ifdef WITH_TWITTER
+ twitter_initmodule();
+#endif
#ifdef WITH_PURPLE
purple_initmodule();
@@ -725,7 +731,7 @@ 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 )
{
irc_t *irc = ic->irc;
- char *wrapped;
+ char *wrapped, *ts = NULL;
user_t *u;
u = user_findhandle( ic, handle );
@@ -767,10 +773,19 @@ void imcb_buddy_msg( struct im_connection *ic, const char *handle, char *msg, ui
if( ( g_strcasecmp( set_getstr( &ic->irc->set, "strip_html" ), "always" ) == 0 ) ||
( ( ic->flags & OPT_DOES_HTML ) && set_getbool( &ic->irc->set, "strip_html" ) ) )
strip_html( msg );
-
+
+ if( set_getbool( &ic->irc->set, "display_timestamps" ) &&
+ ( ts = format_timestamp( irc, sent_at ) ) )
+ {
+ char *new = g_strconcat( ts, msg, NULL );
+ g_free( ts );
+ ts = msg = new;
+ }
+
wrapped = word_wrap( msg, 425 );
irc_msgfrom( irc, u->nick, wrapped );
g_free( wrapped );
+ g_free( ts );
}
void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags )
@@ -814,6 +829,35 @@ struct groupchat *imcb_chat_new( struct im_connection *ic, const char *handle )
return c;
}
+void imcb_chat_name_hint( struct groupchat *c, const char *name )
+{
+ if( !c->joined )
+ {
+ struct im_connection *ic = c->ic;
+ char stripped[MAX_NICK_LENGTH+1], *full_name;
+
+ strncpy( stripped, name, MAX_NICK_LENGTH );
+ stripped[MAX_NICK_LENGTH] = '\0';
+ nick_strip( stripped );
+ if( set_getbool( &ic->irc->set, "lcnicks" ) )
+ nick_lc( stripped );
+
+ full_name = g_strdup_printf( "&%s", stripped );
+
+ if( stripped[0] &&
+ nick_cmp( stripped, ic->irc->channel + 1 ) != 0 &&
+ irc_chat_by_channel( ic->irc, full_name ) == NULL )
+ {
+ g_free( c->channel );
+ c->channel = full_name;
+ }
+ else
+ {
+ g_free( full_name );
+ }
+ }
+}
+
void imcb_chat_free( struct groupchat *c )
{
struct im_connection *ic = c->ic;
@@ -874,7 +918,11 @@ void imcb_chat_msg( struct groupchat *c, const char *who, char *msg, uint32_t fl
wrapped = word_wrap( msg, 425 );
if( c && u )
{
- irc_privmsg( ic->irc, u, "PRIVMSG", c->channel, "", wrapped );
+ char *ts = NULL;
+ if( set_getbool( &ic->irc->set, "display_timestamps" ) )
+ ts = format_timestamp( ic->irc, sent_at );
+ irc_privmsg( ic->irc, u, "PRIVMSG", c->channel, ts ? : "", wrapped );
+ g_free( ts );
}
else
{
@@ -1068,8 +1116,94 @@ char *set_eval_away_devoice( set_t *set, char *value )
return value;
}
+char *set_eval_timezone( set_t *set, char *value )
+{
+ char *s;
+
+ if( strcmp( value, "local" ) == 0 ||
+ strcmp( value, "gmt" ) == 0 || strcmp( value, "utc" ) == 0 )
+ return value;
+
+ /* Otherwise: +/- at the beginning optional, then one or more numbers,
+ possibly followed by a colon and more numbers. Don't bother bound-
+ checking them since users are free to shoot themselves in the foot. */
+ s = value;
+ if( *s == '+' || *s == '-' )
+ s ++;
+
+ /* \d+ */
+ if( !isdigit( *s ) )
+ return SET_INVALID;
+ while( *s && isdigit( *s ) ) s ++;
+
+ /* EOS? */
+ if( *s == '\0' )
+ return value;
+
+ /* Otherwise, colon */
+ if( *s != ':' )
+ return SET_INVALID;
+ s ++;
+
+ /* \d+ */
+ if( !isdigit( *s ) )
+ return SET_INVALID;
+ while( *s && isdigit( *s ) ) s ++;
+
+ /* EOS */
+ return *s == '\0' ? value : SET_INVALID;
+}
-
+static char *format_timestamp( irc_t *irc, time_t msg_ts )
+{
+ time_t now_ts = time( NULL );
+ struct tm now, msg;
+ char *set;
+
+ /* If the timestamp is <= 0 or less than a minute ago, discard it as
+ it doesn't seem to add to much useful info and/or might be noise. */
+ if( msg_ts <= 0 || msg_ts > now_ts - 60 )
+ return NULL;
+
+ set = set_getstr( &irc->set, "timezone" );
+ if( strcmp( set, "local" ) == 0 )
+ {
+ localtime_r( &now_ts, &now );
+ localtime_r( &msg_ts, &msg );
+ }
+ else
+ {
+ int hr, min = 0, sign = 60;
+
+ if( set[0] == '-' )
+ {
+ sign *= -1;
+ set ++;
+ }
+ else if( set[0] == '+' )
+ {
+ set ++;
+ }
+
+ if( sscanf( set, "%d:%d", &hr, &min ) >= 1 )
+ {
+ msg_ts += sign * ( hr * 60 + min );
+ now_ts += sign * ( hr * 60 + min );
+ }
+
+ gmtime_r( &now_ts, &now );
+ gmtime_r( &msg_ts, &msg );
+ }
+
+ if( msg.tm_year == now.tm_year && msg.tm_yday == now.tm_yday )
+ return g_strdup_printf( "\x02[\x02\x02\x02%02d:%02d:%02d\x02]\x02 ",
+ msg.tm_hour, msg.tm_min, msg.tm_sec );
+ else
+ return g_strdup_printf( "\x02[\x02\x02\x02%04d-%02d-%02d "
+ "%02d:%02d:%02d\x02]\x02 ",
+ msg.tm_year + 1900, msg.tm_mon, msg.tm_mday,
+ msg.tm_hour, msg.tm_min, msg.tm_sec );
+}
/* The plan is to not allow straight calls to prpl functions anymore, but do
them all from some wrappers. We'll start to define some down here: */
@@ -1113,6 +1247,10 @@ int imc_away_send_update( struct im_connection *ic )
{
char *away, *msg = NULL;
+ if( ic->acc->prpl->away_states == NULL ||
+ ic->acc->prpl->set_away == NULL )
+ return 0;
+
away = set_getstr( &ic->acc->set, "away" ) ?
: set_getstr( &ic->irc->set, "away" );
if( away && *away )