diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-08-31 22:06:14 +0200 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-08-31 22:06:14 +0200 |
commit | f5c0d8e4dd3ce01945a6334a5d87c89a9f43b16b (patch) | |
tree | e741ed193ad1921c695a8aec4c4ea57fe82e7fd7 | |
parent | 83586911a0aa768ed196051950ebd8ffce37d467 (diff) | |
parent | 31dbb90a2d32d6988706ae4b5c2292cd43d89595 (diff) |
Merge mainline stuff.
-rw-r--r-- | .bzrignore | 1 | ||||
-rw-r--r-- | Makefile | 7 | ||||
-rwxr-xr-x | configure | 8 | ||||
-rw-r--r-- | doc/user-guide/commands.xml | 30 | ||||
-rw-r--r-- | irc.h | 1 | ||||
-rw-r--r-- | irc_commands.c | 8 | ||||
-rw-r--r-- | irc_im.c | 62 | ||||
-rw-r--r-- | irc_send.c | 12 | ||||
-rw-r--r-- | lib/Makefile | 3 | ||||
-rw-r--r-- | protocols/Makefile | 3 | ||||
-rw-r--r-- | protocols/bee.h | 2 | ||||
-rw-r--r-- | protocols/bee_chat.c | 8 | ||||
-rw-r--r-- | protocols/jabber/Makefile | 3 | ||||
-rw-r--r-- | protocols/jabber/jabber.h | 2 | ||||
-rw-r--r-- | protocols/jabber/message.c | 29 | ||||
-rw-r--r-- | protocols/jabber/si.c | 4 | ||||
-rw-r--r-- | protocols/msn/Makefile | 3 | ||||
-rw-r--r-- | protocols/oscar/Makefile | 3 | ||||
-rw-r--r-- | protocols/oscar/oscar.c | 8 | ||||
-rw-r--r-- | protocols/purple/Makefile | 3 | ||||
-rw-r--r-- | protocols/twitter/Makefile | 3 | ||||
-rw-r--r-- | protocols/twitter/twitter.c | 2 | ||||
-rw-r--r-- | protocols/yahoo/Makefile | 3 | ||||
-rw-r--r-- | protocols/yahoo/libyahoo2.c | 19 | ||||
-rw-r--r-- | root_commands.c | 6 | ||||
-rw-r--r-- | utils/README | 29 | ||||
-rwxr-xr-x | utils/centericq2bitlbee.sh | 115 | ||||
-rw-r--r-- | utils/convert_gnomeicu.txt | 7 | ||||
-rwxr-xr-x | utils/convert_purple.py | 113 | ||||
-rwxr-xr-x | utils/create_nicksfile.pl | 210 |
30 files changed, 321 insertions, 386 deletions
@@ -19,3 +19,4 @@ tests/check coverage bitlbee.info bitlbee.exe +.depend @@ -51,8 +51,11 @@ clean: $(subdirs) $(MAKE) -C tests clean distclean: clean $(subdirs) + rm -rf .depend rm -f Makefile.settings config.h bitlbee.pc find . -name 'DEADJOE' -o -name '*.orig' -o -name '*.rej' -o -name '*~' -exec rm -f {} \; + @# May still be present in dirs of disabled protocols. + find . -name .depend | xargs -r rmdir $(MAKE) -C tests distclean check: all @@ -104,7 +107,7 @@ tar: fakeroot debian/rules clean || make distclean x=$$(basename $$(pwd)); \ cd ..; \ - tar czf $$x.tar.gz --exclude=debian --exclude=.bzr* $$x + tar czf $$x.tar.gz --exclude=debian --exclude=.bzr* --exclude=.depend $$x $(subdirs): @$(MAKE) -C $@ $(MAKECMDGOALS) @@ -130,3 +133,5 @@ ctags: # make is available. helloworld: @echo Hello World + +-include .depend/*.d @@ -594,6 +594,14 @@ EOF fi fi +case "$CC" in +*gcc* ) + echo CFLAGS+=-MD -MF .depend/\$@.d >> Makefile.settings + for i in . lib protocols protocols/*/; do + mkdir -p $i/.depend + done +esac + if [ "$msn" = 0 ]; then echo '#undef WITH_MSN' >> config.h else diff --git a/doc/user-guide/commands.xml b/doc/user-guide/commands.xml index 78e7d685..f2b8f5f8 100644 --- a/doc/user-guide/commands.xml +++ b/doc/user-guide/commands.xml @@ -72,7 +72,7 @@ </para> <para> - By default all your Twitter contacts will come from a contact called twitter_(yourusername). You can change this behaviour using the <emphasis>mode</emphasis> setting (see <emphasis>help set mode</emphasis>). + By default all your Twitter contacts will appear in a new channel called #twitter_yourusername. You can change this behaviour using the <emphasis>mode</emphasis> setting (see <emphasis>help set mode</emphasis>). </para> <para> @@ -969,19 +969,23 @@ <bitlbee-setting name="mode" type="string" scope="account"> <possible-values>one, many, chat</possible-values> - <default>one</default> + <default>chat</default> <description> <para> - By default, everything from the Twitter module will come from one nick, twitter_(yourusername). If you prefer to have individual nicks for everyone, you can set this setting to "many" instead. + By default, BitlBee will create a separate channel (called #twitter_yourusername) for all your Twitter contacts/messages. + </para> + + <para> + If you don't want an extra channel, you can set this setting to "one" (everything will come from one nick, twitter_yourusername), or to "many" (individual nicks for everyone). </para> <para> - If you prefer to have all your Twitter things in a separate channel, you can set this setting to "chat". + With modes "chat" and "many", you can send direct messages by /msg'ing your contacts directly. Note, however, that incoming DMs are not fetched yet. </para> <para> - In the last two modes, you can send direct messages by /msg'ing your contacts directly. Note, however, that incoming DMs are not fetched yet. + With modes "many" and "one", you can post tweets by /msg'ing the twitter_yourusername contact. In mode "chat", messages posted in the Twitter channel will also be posted as tweets. </para> </description> @@ -1636,44 +1640,44 @@ </description> </bitlbee-command> - <bitlbee-command name="transfers"> + <bitlbee-command name="transfer"> <short-description>Monitor, cancel, or reject file transfers</short-description> - <syntax>transfers [<cancel> id | <reject>]</syntax> + <syntax>transfer [<cancel> id | <reject>]</syntax> <description> <para> - Without parameters the currently pending file transfers and their status will be listed. Available actions are <emphasis>cancel</emphasis> and <emphasis>reject</emphasis>. See <emphasis>help transfers <action></emphasis> for more information. + Without parameters the currently pending file transfers and their status will be listed. Available actions are <emphasis>cancel</emphasis> and <emphasis>reject</emphasis>. See <emphasis>help transfer <action></emphasis> for more information. </para> <ircexample> - <ircline nick="ulim">transfers</ircline> + <ircline nick="ulim">transfer</ircline> </ircexample> </description> <bitlbee-command name="cancel"> <short-description>Cancels the file transfer with the given id</short-description> - <syntax>transfers <cancel> id</syntax> + <syntax>transfer <cancel> id</syntax> <description> <para>Cancels the file transfer with the given id</para> </description> <ircexample> - <ircline nick="ulim">transfers cancel 1</ircline> + <ircline nick="ulim">transfer cancel 1</ircline> <ircline nick="root">Canceling file transfer for test</ircline> </ircexample> </bitlbee-command> <bitlbee-command name="reject"> <short-description>Rejects all incoming transfers</short-description> - <syntax>transfers <reject></syntax> + <syntax>transfer <reject></syntax> <description> <para>Rejects all incoming (not already transferring) file transfers. Since you probably have only one incoming transfer at a time, no id is neccessary. Or is it?</para> </description> <ircexample> - <ircline nick="ulim">transfers reject</ircline> + <ircline nick="ulim">transfer reject</ircline> </ircexample> </bitlbee-command> </bitlbee-command> @@ -288,6 +288,7 @@ void irc_send_msg_f( irc_user_t *iu, const char *type, const char *dst, const ch void irc_send_nick( irc_user_t *iu, const char *new ); void irc_send_channel_user_mode_diff( irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t old, irc_channel_user_flags_t new ); +void irc_send_invite( irc_user_t *iu, irc_channel_t *ic ); /* irc_user.c */ irc_user_t *irc_user_new( irc_t *irc, const char *nick ); diff --git a/irc_commands.c b/irc_commands.c index 9730a288..def323a4 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -301,11 +301,19 @@ static void irc_cmd_who( irc_t *irc, char **cmd ) { char *channel = cmd[1]; irc_channel_t *ic; + irc_user_t *iu; if( !channel || *channel == '0' || *channel == '*' || !*channel ) irc_send_who( irc, irc->users, "**" ); else if( ( ic = irc_channel_by_name( irc, channel ) ) ) irc_send_who( irc, ic->users, channel ); + else if( ( iu = irc_user_by_name( irc, channel ) ) ) + { + /* Tiny hack! */ + GSList *l = g_slist_append( NULL, iu ); + irc_send_who( irc, l, channel ); + g_slist_free( l ); + } else irc_send_num( irc, 403, "%s :No such channel", channel ); } @@ -251,7 +251,6 @@ static gboolean bee_irc_user_nick_update( irc_user_t *iu ); static gboolean bee_irc_user_fullname( bee_t *bee, bee_user_t *bu ) { irc_user_t *iu = (irc_user_t *) bu->ui_data; - irc_t *irc = (irc_t *) bee->ui_data; char *s; if( iu->fullname != iu->nick ) @@ -265,8 +264,11 @@ static gboolean bee_irc_user_fullname( bee_t *bee, bee_user_t *bu ) if( ( bu->ic->flags & OPT_LOGGED_IN ) && set_getbool( &bee->set, "display_namechanges" ) ) { + /* People don't like this /NOTICE. Meh, let's go back to the old one. char *msg = g_strdup_printf( "<< \002BitlBee\002 - Changed name to `%s' >>", iu->fullname ); irc_send_msg( iu, "NOTICE", irc->user->nick, msg, NULL ); + */ + imcb_log( bu->ic, "User `%s' changed name to `%s'", iu->nick, iu->fullname ); } bee_irc_user_nick_update( iu ); @@ -612,6 +614,63 @@ static gboolean bee_irc_chat_name_hint( bee_t *bee, struct groupchat *c, const c return TRUE; } +static gboolean bee_irc_chat_invite( bee_t *bee, bee_user_t *bu, const char *name, const char *msg ) +{ + char *channel, *s; + irc_t *irc = bee->ui_data; + irc_user_t *iu = bu->ui_data; + irc_channel_t *chan; + + if( strchr( CTYPES, name[0] ) ) + channel = g_strdup( name ); + else + channel = g_strdup_printf( "#%s", name ); + + if( ( s = strchr( channel, '@' ) ) ) + *s = '\0'; + + if( strlen( channel ) > MAX_NICK_LENGTH ) + { + /* If the channel name is very long (like those insane GTalk + UUID names), try if we can use the inviter's nick. */ + s = g_strdup_printf( "#%s", iu->nick ); + if( irc_channel_by_name( irc, s ) == NULL ) + { + g_free( channel ); + channel = s; + } + } + + if( ( chan = irc_channel_new( irc, channel ) ) && + set_setstr( &chan->set, "type", "chat" ) && + set_setstr( &chan->set, "chat_type", "room" ) && + set_setstr( &chan->set, "account", bu->ic->acc->tag ) && + set_setstr( &chan->set, "room", (char*) name ) ) + { + /* I'm assuming that if the user didn't "chat add" the room + himself but got invited, it's temporary, so make this a + temporary mapping that is removed as soon as we /PART. */ + chan->flags |= IRC_CHANNEL_TEMP; + } + else + { + irc_channel_free( chan ); + chan = NULL; + } + g_free( channel ); + + irc_send_msg_f( iu, "PRIVMSG", irc->user->nick, "<< \002BitlBee\002 - Invitation to chatroom %s >>", name ); + if( msg ) + irc_send_msg( iu, "PRIVMSG", irc->user->nick, msg, NULL ); + if( chan ) + { + irc_send_msg_f( iu, "PRIVMSG", irc->user->nick, "To join the room, just /join %s", chan->name ); + irc_send_invite( iu, chan ); + } + + return TRUE; +} + /* IRC->IM */ static gboolean bee_irc_channel_chat_privmsg_cb( gpointer data, gint fd, b_input_condition cond ); @@ -908,6 +967,7 @@ const struct bee_ui_funcs irc_ui_funcs = { bee_irc_chat_remove_user, bee_irc_chat_topic, bee_irc_chat_name_hint, + bee_irc_chat_invite, bee_irc_ft_in_start, bee_irc_ft_out_start, @@ -263,7 +263,7 @@ void irc_send_whois( irc_user_t *iu ) void irc_send_who( irc_t *irc, GSList *l, const char *channel ) { - gboolean is_channel = strcmp( channel, "**" ) != 0; + gboolean is_channel = strchr( CTYPES, channel[0] ) != NULL; while( l ) { @@ -272,7 +272,7 @@ void irc_send_who( irc_t *irc, GSList *l, const char *channel ) iu = ((irc_channel_user_t*)iu)->iu; /* TODO(wilmer): Restore away/channel information here */ irc_send_num( irc, 352, "%s %s %s %s %s %c :0 %s", - channel ? : "*", iu->user, iu->host, irc->root->host, + is_channel ? channel : "*", iu->user, iu->host, irc->root->host, iu->nick, iu->flags & IRC_USER_AWAY ? 'G' : 'H', iu->fullname ); l = l->next; @@ -397,3 +397,11 @@ void irc_send_channel_user_mode_diff( irc_channel_t *ic, irc_user_t *iu, if( *changes ) irc_write( ic->irc, ":%s MODE %s %s", from, ic->name, changes ); } + +void irc_send_invite( irc_user_t *iu, irc_channel_t *ic ) +{ + irc_t *irc = iu->irc; + + irc_write( iu->irc, ":%s!%s@%s INVITE %s :%s", + iu->nick, iu->user, iu->host, irc->user->nick, ic->name ); +} diff --git a/lib/Makefile b/lib/Makefile index bebe3ba6..0e528014 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -29,6 +29,7 @@ clean: $(subdirs) rm -f *.o $(OUTFILE) core distclean: clean $(subdirs) + rm -rf .depend ### MAIN PROGRAM @@ -41,3 +42,5 @@ $(objects): ../Makefile.settings Makefile $(objects): %.o: $(SRCDIR)%.c @echo '*' Compiling $< @$(CC) -c $(CFLAGS) $< -o $@ + +-include .depend/*.d diff --git a/protocols/Makefile b/protocols/Makefile index 1c7816bc..9e8d3fb9 100644 --- a/protocols/Makefile +++ b/protocols/Makefile @@ -39,6 +39,7 @@ clean: $(subdirs) rm -f *.o $(OUTFILE) core distclean: clean $(subdirs) + rm -rf .depend $(subdirs): @$(MAKE) -C $@ $(MAKECMDGOALS) @@ -54,3 +55,5 @@ $(objects): ../Makefile.settings Makefile $(objects): %.o: $(SRCDIR)%.c @echo '*' Compiling $< @$(CC) -c $(CFLAGS) $< -o $@ + +-include .depend/*.d diff --git a/protocols/bee.h b/protocols/bee.h index 2fd3562e..b99c8de7 100644 --- a/protocols/bee.h +++ b/protocols/bee.h @@ -122,6 +122,7 @@ typedef struct bee_ui_funcs gboolean (*chat_remove_user)( bee_t *bee, struct groupchat *c, bee_user_t *bu ); gboolean (*chat_topic)( bee_t *bee, struct groupchat *c, const char *new, bee_user_t *bu ); gboolean (*chat_name_hint)( bee_t *bee, struct groupchat *c, const char *name ); + gboolean (*chat_invite)( bee_t *bee, bee_user_t *bu, const char *name, const char *msg ); struct file_transfer* (*ft_in_start)( bee_t *bee, bee_user_t *bu, const char *file_name, size_t file_size ); gboolean (*ft_out_start)( struct im_connection *ic, struct file_transfer *ft ); @@ -174,5 +175,6 @@ G_MODULE_EXPORT void imcb_chat_add_buddy( struct groupchat *c, const char *handl G_MODULE_EXPORT void imcb_chat_remove_buddy( struct groupchat *c, const char *handle, const char *reason ); G_MODULE_EXPORT int bee_chat_msg( bee_t *bee, struct groupchat *c, const char *msg, int flags ); G_MODULE_EXPORT struct groupchat *bee_chat_by_title( bee_t *bee, struct im_connection *ic, const char *title ); +G_MODULE_EXPORT void imcb_chat_invite( struct im_connection *ic, const char *name, const char *who, const char *msg ); #endif /* __BEE_H__ */ diff --git a/protocols/bee_chat.c b/protocols/bee_chat.c index 3be6f189..0314cae5 100644 --- a/protocols/bee_chat.c +++ b/protocols/bee_chat.c @@ -232,3 +232,11 @@ struct groupchat *bee_chat_by_title( bee_t *bee, struct im_connection *ic, const return NULL; } + +void imcb_chat_invite( struct im_connection *ic, const char *name, const char *who, const char *msg ) +{ + bee_user_t *bu = bee_user_by_handle( ic->bee, ic, who ); + + if( bu && ic->bee->ui->chat_invite ) + ic->bee->ui->chat_invite( ic->bee, bu, name, msg ); +} diff --git a/protocols/jabber/Makefile b/protocols/jabber/Makefile index efbd81fb..32946b18 100644 --- a/protocols/jabber/Makefile +++ b/protocols/jabber/Makefile @@ -29,6 +29,7 @@ clean: rm -f *.o core distclean: clean + rm -rf .depend ### MAIN PROGRAM @@ -41,3 +42,5 @@ $(objects): %.o: $(SRCDIR)%.c jabber_mod.o: $(objects) @echo '*' Linking jabber_mod.o @$(LD) $(LFLAGS) $(objects) -o jabber_mod.o + +-include .depend/*.d diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h index 45a1c5c1..1523e096 100644 --- a/protocols/jabber/jabber.h +++ b/protocols/jabber/jabber.h @@ -58,6 +58,8 @@ typedef enum groupchat state info too. */ JBFLAG_IS_ANONYMOUS = 8, /* For anonymous chatrooms, when we don't have have a real JID. */ + JBFLAG_HIDE_SUBJECT = 16, /* Hide the subject field since we probably + showed it already. */ } jabber_buddy_flags_t; /* Stores a streamhost's (a.k.a. proxy) data */ diff --git a/protocols/jabber/message.c b/protocols/jabber/message.c index ce5017fb..85c71c9d 100644 --- a/protocols/jabber/message.c +++ b/protocols/jabber/message.c @@ -30,7 +30,7 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer data ) char *type = xt_find_attr( node, "type" ); struct xt_node *body = xt_find_node( node->children, "body" ), *c; struct jabber_buddy *bud = NULL; - char *s; + char *s, *room = NULL, *reason = NULL; if( !from ) return XT_HANDLED; /* Consider this packet corrupted. */ @@ -51,19 +51,19 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer data ) for( c = node->children; ( c = xt_find_node( c, "x" ) ); c = c->next ) { - char *ns = xt_find_attr( c, "xmlns" ), *room; - struct xt_node *inv, *reason; + char *ns = xt_find_attr( c, "xmlns" ); + struct xt_node *inv; if( ns && strcmp( ns, XMLNS_MUC_USER ) == 0 && ( inv = xt_find_node( c->children, "invite" ) ) ) { + /* This is an invitation. Set some vars which + will be passed to imcb_chat_invite() below. */ room = from; if( ( from = xt_find_attr( inv, "from" ) ) == NULL ) from = room; - - g_string_append_printf( fullmsg, "<< \002BitlBee\002 - Invitation to chatroom %s >>\n", room ); - if( ( reason = xt_find_node( inv->children, "reason" ) ) && reason->text_len > 0 ) - g_string_append( fullmsg, reason->text ); + if( ( inv = xt_find_node( inv->children, "reason" ) ) && inv->text_len > 0 ) + reason = inv->text; } } @@ -92,9 +92,20 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer data ) g_string_append_printf( fullmsg, "URL: %s\n", url->text ); } } - else if( ( c = xt_find_node( node->children, "subject" ) ) && c->text_len > 0 ) + else if( ( c = xt_find_node( node->children, "subject" ) ) && c->text_len > 0 && + ( !bud || !( bud->flags & JBFLAG_HIDE_SUBJECT ) ) ) { g_string_append_printf( fullmsg, "<< \002BitlBee\002 - Message with subject: %s >>\n", c->text ); + if( bud ) + bud->flags |= JBFLAG_HIDE_SUBJECT; + } + else if( bud && !c ) + { + /* Yeah, possibly we're hiding changes to this field now. But nobody uses + this for anything useful anyway, except GMail when people reply to an + e-mail via chat, repeating the same subject all the time. I don't want + to have to remember full subject strings for everyone. */ + bud->flags &= ~JBFLAG_HIDE_SUBJECT; } if( body && body->text_len > 0 ) /* Could be just a typing notification. */ @@ -103,6 +114,8 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer data ) if( fullmsg->len > 0 ) imcb_buddy_msg( ic, from, fullmsg->str, 0, jabber_get_timestamp( node ) ); + if( room ) + imcb_chat_invite( ic, room, from, reason ); g_string_free( fullmsg, TRUE ); diff --git a/protocols/jabber/si.c b/protocols/jabber/si.c index 454d56b9..4b0e57c4 100644 --- a/protocols/jabber/si.c +++ b/protocols/jabber/si.c @@ -261,6 +261,10 @@ int jabber_si_handle_request( struct im_connection *ic, struct xt_node *node, st requestok = TRUE; break; } + else + { + c = c->next; + } if ( !requestok ) imcb_log( ic, "WARNING: Unsupported file transfer request from %s", ini_jid); diff --git a/protocols/msn/Makefile b/protocols/msn/Makefile index 781482f5..068d7e98 100644 --- a/protocols/msn/Makefile +++ b/protocols/msn/Makefile @@ -29,6 +29,7 @@ clean: rm -f *.o core distclean: clean + rm -rf .depend ### MAIN PROGRAM @@ -41,5 +42,5 @@ $(objects): %.o: $(SRCDIR)%.c msn_mod.o: $(objects) @echo '*' Linking msn_mod.o @$(LD) $(LFLAGS) $(objects) -o msn_mod.o - +-include .depend/*.d diff --git a/protocols/oscar/Makefile b/protocols/oscar/Makefile index c1a966ad..a83830df 100644 --- a/protocols/oscar/Makefile +++ b/protocols/oscar/Makefile @@ -30,6 +30,7 @@ clean: rm -f *.o core distclean: clean + rm -rf .depend ### MAIN PROGRAM @@ -42,3 +43,5 @@ $(objects): %.o: $(SRCDIR)%.c oscar_mod.o: $(objects) @echo '*' Linking oscar_mod.o @$(LD) $(LFLAGS) $(objects) -o oscar_mod.o + +-include .depend/*.d diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c index aba08c1f..3eea5825 100644 --- a/protocols/oscar/oscar.c +++ b/protocols/oscar/oscar.c @@ -516,6 +516,14 @@ static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) { case 0x05: /* Incorrect nick/password */ imcb_error(ic, _("Incorrect nickname or password.")); + { + int max = od->icq ? 8 : 16; + if (strlen(ic->acc->pass) > max) + imcb_log(ic, "Note that the maximum password " + "length supported by this protocol is " + "%d characters, try logging in using " + "a shorter password.", max); + } // plugin_event(event_error, (void *)980, 0, 0, 0); break; case 0x11: diff --git a/protocols/purple/Makefile b/protocols/purple/Makefile index 97a5bb6a..62115abf 100644 --- a/protocols/purple/Makefile +++ b/protocols/purple/Makefile @@ -30,6 +30,7 @@ clean: rm -f *.o core distclean: clean + rm -rf .depend ### MAIN PROGRAM @@ -42,3 +43,5 @@ $(objects): %.o: $(SRCDIR)%.c purple_mod.o: $(objects) @echo '*' Linking purple_mod.o $(LD) $(LFLAGS) $(objects) -o purple_mod.o + +-include .depend/*.d diff --git a/protocols/twitter/Makefile b/protocols/twitter/Makefile index 3fa9b61e..74f0ea11 100644 --- a/protocols/twitter/Makefile +++ b/protocols/twitter/Makefile @@ -29,6 +29,7 @@ clean: rm -f *.o core distclean: clean + rm -rf .depend ### MAIN PROGRAM @@ -42,4 +43,4 @@ twitter_mod.o: $(objects) @echo '*' Linking twitter_mod.o @$(LD) $(LFLAGS) $(objects) -o twitter_mod.o - +-include .depend/*.d diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c index 16b069ee..1bc596eb 100644 --- a/protocols/twitter/twitter.c +++ b/protocols/twitter/twitter.c @@ -194,7 +194,7 @@ static void twitter_init( account_t *acc ) s = set_add( &acc->set, "message_length", "140", set_eval_int, acc ); - s = set_add( &acc->set, "mode", "one", set_eval_mode, acc ); + s = set_add( &acc->set, "mode", "chat", set_eval_mode, acc ); s->flags |= ACC_SET_OFFLINE_ONLY; s = set_add( &acc->set, "oauth", def_oauth, set_eval_bool, acc ); diff --git a/protocols/yahoo/Makefile b/protocols/yahoo/Makefile index a8021ffb..7908b773 100644 --- a/protocols/yahoo/Makefile +++ b/protocols/yahoo/Makefile @@ -30,6 +30,7 @@ clean: rm -f *.o core distclean: clean + rm -rf .depend ### MAIN PROGRAM @@ -42,3 +43,5 @@ $(objects): %.o: $(SRCDIR)%.c yahoo_mod.o: $(objects) @echo '*' Linking yahoo_mod.o @$(LD) $(LFLAGS) $(objects) -o yahoo_mod.o + +-include .depend/*.d diff --git a/protocols/yahoo/libyahoo2.c b/protocols/yahoo/libyahoo2.c index b062e7f9..07689809 100644 --- a/protocols/yahoo/libyahoo2.c +++ b/protocols/yahoo/libyahoo2.c @@ -2168,6 +2168,18 @@ static void yahoo_process_buddyadd(struct yahoo_input_data *yid, yd->buddies = y_list_append(yd->buddies, bud); +#if 0 + /* BitlBee: This seems to be wrong in my experience. I think: + status = 0: Success + status = 2: Already on list + status = 3: Doesn't exist + status = 42: Invalid handle (possibly banned/reserved, I get it for + handles like joe or jjjjjj) + Haven't seen others yet. But whenever the add is successful, there + will be a separate "went online" packet when the auth. request is + accepted. Couldn't find any test account that doesn't require auth. + unfortunately (if there is even such a thing?) */ + /* A non-zero status (i've seen 2) seems to mean the buddy is already * added and is online */ if (status) { @@ -2176,6 +2188,13 @@ static void yahoo_process_buddyadd(struct yahoo_input_data *yid, YAHOO_CALLBACK(ext_yahoo_status_changed) (yd->client_id, who, YAHOO_STATUS_AVAILABLE, NULL, 0, 0, 0); } +#endif + /* BitlBee: Need ACK of added buddy, if it was successful. */ + if (status == 0) { + YList *tmp = y_list_append(NULL, bud); + YAHOO_CALLBACK(ext_yahoo_got_buddies) (yd->client_id, tmp); + y_list_free(tmp); + } } static void yahoo_process_buddydel(struct yahoo_input_data *yid, diff --git a/root_commands.c b/root_commands.c index 3cc96c2d..ba018937 100644 --- a/root_commands.c +++ b/root_commands.c @@ -1283,6 +1283,11 @@ static void cmd_transfer( irc_t *irc, char **cmd ) } } +static void cmd_nick( irc_t *irc, char **cmd ) +{ + irc_usermsg( irc, "This command is deprecated. Try: account %s set display_name", cmd[1] ); +} + /* Maybe this should be a stand-alone command as well? */ static void bitlbee_whatsnew( irc_t *irc ) { @@ -1337,6 +1342,7 @@ command_t root_commands[] = { { "help", 0, cmd_help, 0 }, { "identify", 1, cmd_identify, 0 }, { "info", 1, cmd_info, 0 }, + { "nick", 1, cmd_nick, 0 }, { "no", 0, cmd_yesno, 0 }, { "qlist", 0, cmd_qlist, 0 }, { "register", 1, cmd_register, 0 }, diff --git a/utils/README b/utils/README index 8cbbfede..7e875af9 100644 --- a/utils/README +++ b/utils/README @@ -17,33 +17,10 @@ at once. Of course this program can be used for other programs too, not just BitlBee. -* create_nicksfile.pl (Christian Friedl <christian.friedl@chello.at>) +* convert_purple.py -This program reads your ~/.licq/ configuration data and convert it to a -correct .nicks file. This program can be extended to read other contact -list file formats as well. - - -* centericq2bitlbee.sh (geno <geno@xenyon.com>) - -Converter script for CenterICQ ICQ contact lists. See the documentation -for more information. - - -* convert_gnomeicu.txt - -Not a program, but this one contains a regex which should correctly -convert GnomeICU configuration files into the BitlBee format. - - -* Dynamic MOTD for BitlBee (Geert Hauwaerts <geert@hauwaerts.be>) - -Originally, I wanted to put this program here, but Geert put it online -on his own server, with docs and stuff, so I guess it's better to put -a link here. dmotd is a little script which generates a motd with some -nice statistics, especially nice for servers with many people on it. - -See http://dmotd.hauwaerts.be/ for more information. +Converts libpurple configs into something BitlBee can use, so you don't +have to re-add all your accounts by hand. * BitlBee-specific Irssi scripts for: tab completion, typing notifica- diff --git a/utils/centericq2bitlbee.sh b/utils/centericq2bitlbee.sh deleted file mode 100755 index b8c134e8..00000000 --- a/utils/centericq2bitlbee.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash -# -# Author geno, <geno@xenyon.com> -# Date 2004-04-24 -# Version 0.1c -# - -show_help() -{ -cat << _EOF_ - -This script converts your CenterICQ contacts (AIM/ICQ) to BitlBee's contacts. -The use of this script is on you own risk. You agree by using this script. :-) - -SYNTAX: `basename $0` <protoname> [<add_proto_tag>] - - protoname - Choose the protocol you want to get your contacts from - by using "aim" or "icq" here. - - add_proto_tag - This is optional and adds a suffix to each nickname. - For an AIM contact it will look like this: geno|aim - For an ICQ contact it will be |icq , WOW! :-D - To enable this option use "on". - -NOTE: - After the conversion of one protocol is done you will find a file - called bitlbee_[protoname] in ~/.centericq . Append the content of - this file to /var/lib/bitlbee/[username].nicks . - - [username] is your username you use to talk to the BitlBee Server. - You will have to be root to edit this file! - -CREDITS: - This script was written by geno (geno@xenyon.com). - I hope it will help you to make the switch to BitlBee a bit easier. :-) - -_EOF_ -exit 0 -} - -case $1 in - "") show_help ;; - "icq") - nick_protocol="[1-9]*/" - protocol_const="3" - ;; - - "aim") - nick_protocol="a*/" - protocol_const="1" - ;; - - *) show_help ;; -esac - -# can we see CenterICQ's directory ? -if [ ! -d ~/.centericq ]; then - echo "The directory of CenterICQ (~/.centericq) was not found!" - echo "Maybe you are logged in with the wrong username." - exit 1 -fi - -# change to the center of all evil ;) -cd ~/.centericq - -# get the listing of all nicks -nick_listing=`ls -d $nick_protocol | sed 's/\ /_DuMmY_/g' | sed 's/\/_DuMmY_/\/ /g'` - -echo -e "\nConverting ...\n" - -# remove old conversion -rm -f ~/.centericq/bitlbee_$1 - -for nick_accountname in $nick_listing; do - # get rid of the slash and replace _DuMmY_ with space - nick_accountname=`echo "$nick_accountname" | sed 's/\/$//' | sed 's/_DuMmY_/\ /g'` - - # find centericq alias - nick_cicq_alias=`cat "$nick_accountname/info" | sed '46!d'` - - # if the centericq alias is the same as the account's name then - # it's not a real alias; search for account nickname - if [ "$nick_accountname" == "$nick_cicq_alias" ]; then - nick_accountalias=`cat "$nick_accountname/info" | sed '1!d'` - fi - - # save the best nickname for conversion - if [ "x$nick_accountalias" == "x" ]; then - nick="$nick_cicq_alias" - else - nick="$nick_accountalias" - fi - - # cut off the prefix 'a' of the accountname - if [ "$1" == "aim" ]; then - nick_accountname=`echo "$nick_accountname" | sed 's/^a//'` - fi - - # replace each space with an underscore (spaces are not allowed in irc nicknames) - nick=`echo "$nick" | sed 's/\ /_/g'` - - # if tags are wanted we will add them here - if [ "$2" == "on" ]; then - nick=`echo "$nick"\|$1` - fi - - # print output to std - echo "Found '$nick_accountname' with alias '$nick'" - # save output to file - echo "$nick_accountname" $protocol_const "$nick" >> ~/.centericq/bitlbee_$1 -done - -echo -e "\nYou can find this list as a file in ~/.centericq/bitlbee_$1." -echo -e "See help if you don't know what you have to do next.\n" - diff --git a/utils/convert_gnomeicu.txt b/utils/convert_gnomeicu.txt deleted file mode 100644 index e2bd1377..00000000 --- a/utils/convert_gnomeicu.txt +++ /dev/null @@ -1,7 +0,0 @@ -15:03:38 zoo| wilmer: watch this: -15:03:40 zoo| cat ~/.icq/contacts.xml | sed "s/<\/user>/\n/g" | - sed "s/^.*<uin>//g" | sed "s/<\/nick>//" | sed "s/ /_/g" | - sed "s/<\/uin><nick>/ 3 /g" | grep -v -e "^<" -15:04:23 zoo| it does output your gnomeicu nicks to stdout - -Thanks to Claas Langbehn. Use this at your own risk, it's not tested by us. diff --git a/utils/convert_purple.py b/utils/convert_purple.py new file mode 100755 index 00000000..85433119 --- /dev/null +++ b/utils/convert_purple.py @@ -0,0 +1,113 @@ +#!/usr/bin/python +# +# Part of BitlBee. Reads a libpurple accounts.xml file and generates some +# commands/XML that BitlBee understands. For easy migration from Pidgin/ +# Finch/whatever to BitlBee, be it a public server or your own. +# +# Licensed under the GPL2 like the rest of BitlBee. +# +# Copyright 2010 Wilmer van der Gaast <wilmer@gaast.net> +# + +import getopt +import getpass +import os +import subprocess +import sys + +import xml.dom.minidom + +BITLBEE = '/usr/sbin/bitlbee' + +def parse_purple(f): + protomap = { + 'msn-pecan': 'msn', + 'aim': 'oscar', + 'icq': 'oscar', + } + supported = ('msn', 'jabber', 'oscar', 'yahoo', 'twitter') + accs = list() + + if os.path.isdir(f): + f = f + '/accounts.xml' + xt = xml.dom.minidom.parse(f) + for acc in xt.getElementsByTagName('account')[1:]: + protocol = acc.getElementsByTagName('protocol')[0].firstChild.wholeText + name = acc.getElementsByTagName('name')[0].firstChild.wholeText + password = acc.getElementsByTagName('password')[0].firstChild.wholeText + if protocol.startswith('prpl-'): + protocol = protocol[5:] + if name.endswith('/'): + name = name[:-1] + if protocol in protomap: + protocol = protomap[protocol] + if protocol not in supported: + print 'Warning: protocol probably not supported by BitlBee: ' + protocol + accs.append((protocol, name, password)) + + return accs + +def print_commands(accs): + print 'To copy all your Pidgin accounts to BitlBee, just copy-paste the following' + print 'commands into your &bitlbee channel:' + print + for acc in accs: + print 'account add %s %s %s' % acc + +def bitlbee_x(*args): + bb = subprocess.Popen([BITLBEE, '-x'] + list(args), stdout=subprocess.PIPE) + return bb.stdout.read().strip() + +def print_xml(accs): + try: + bitlbee_x('hash', 'blaataap') + except: + print "Can't find/use BitlBee binary. It has to be a 1.2.5 binary or higher." + print + usage() + + print 'BitlBee .xml files are encrypted using the identify password. Please type your' + print 'preferred identify password.' + user = getpass.getuser() + pwd = getpass.getpass() + + root = xml.dom.minidom.Element('user') + root.setAttribute('nick', user) + root.setAttribute('password', bitlbee_x('hash', pwd)) + root.setAttribute('version', '1') + for acc in accs: + accx = xml.dom.minidom.Element('account') + accx.setAttribute('protocol', acc[0]) + accx.setAttribute('handle', acc[1]) + accx.setAttribute('password', bitlbee_x('enc', pwd, acc[2])) + accx.setAttribute('autoconnect', '1') + root.appendChild(accx) + + print + print 'Write the following XML data to a file called %s.xml (rename it if' + print 'you want to use a different nickname). It should be in the directory where' + print 'your BitlBee account files are stored (most likely /var/lib/bitlbee).' + print + print root.toprettyxml() + +def usage(): + print 'Usage: %s [-f <purple accounts file>] [-b <bitlbee executable>] [-x]' % sys.argv[0] + print + print 'Generates "account add" commands by default. -x generates a .xml file instead.' + print 'The accounts file can normally be found in ~/.purple/.' + sys.exit(os.EX_USAGE) + +try: + flags = dict(getopt.getopt(sys.argv[1:], 'f:b:x')[0]) +except getopt.GetoptError: + usage() +if '-f' not in flags: + usage() +if '-b' in flags: + BITLBEE = flags['-b'] + +parsed = parse_purple(flags['-f']) +if '-x' in flags: + print_xml(parsed) +else: + print_commands(parsed) diff --git a/utils/create_nicksfile.pl b/utils/create_nicksfile.pl deleted file mode 100755 index abd6d3d2..00000000 --- a/utils/create_nicksfile.pl +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/perl -use strict; -use Getopt::Long; - - -my $conn = undef; -my %readline_funcs = ( 'licq' => \&import_readline_licq ); -my %open_funcs = ( 'licq' => \&import_open_licq ); -my %close_funcs = ( 'licq' => \&import_close_licq ); -my $funcname = undef; -my $dirname = undef; -my $filename = undef; -my $imported = 0; -my $not_imported = 0; -my $debug = 0; - -main(); -exit(0); - - -sub main { - my ($server,$port,$nick,$pass,$func,$dir,$file,$outfile); - my $dirfile; - if (($dirfile=pop @ARGV) =~ /^\-/ || !$dirfile) { - tell_usage(); - exit(0); - } - if ($dirfile =~ m|/|) { - $dirfile =~ m|^(.*)(/.+)$|; - $dir=$1; - $file=$2; - } else { - $dir=undef; - $file = $dirfile; - } - GetOptions( - 'from=s', => \$func, - 'of=s', => \$outfile, - 'debug', => \$debug - ); - if (!import_start($func,$dir,$file,$outfile,$debug)) { - tell_usage(); - } -} - -sub tell_usage { - print "Usage: create_nicksfile.pl [--from=FROM] [--of=OUTPUTFILE] [--debug] FILENAME\n"; - print " FROM defines which application we import from.\n", - print " Note that currently the only valid value for FROM is licq.\n"; - print " For further information, you might want to do perldoc create_nicksfile.pl\n"; -} - -sub import_start { - $funcname = (shift) || 'licq'; - $dirname = shift; - $filename = shift; - my $outfile = shift || 'bitlbee.nicks'; - $debug = shift; - my ($alias,$protocol,$name,$found); - open(OUT,'>'.$outfile) || die "unable to open $outfile"; - if (defined $open_funcs{$funcname}) { - if (&{$open_funcs{$funcname}}($dirname,$filename)) { - do { - ($alias,$protocol,$name,$found)=&{$readline_funcs{$funcname}}(); - print OUT "$alias $protocol $name\n" if $found; - } while ($found); - } else { - import_err('Unable to open '.$filename); - return 0; - } - } else { - import_err($funcname.' is no defined import function.'); - return 0; - } - close OUT; - &{$close_funcs{$funcname}}(); - return 1; -} - -sub import_err { - my $msg=shift; - print "\nError: $msg\n"; -} - -sub import_open_licq { - my ($dir,$name)=@_; - return open(IN,'<'.$dir.'/users.conf'); -} -sub import_close_licq { - close IN; -} -sub import_readline_licq { - my ($uin,$alias); - my $line; -GETLINE: - $line=<IN>; - if ($line) { - while ($line && $line !~ /^User\d+/) { - $line=<IN>; - } - if ($line) { - if ($line =~ /^User\d+\s*=\s*(\d+)(\.Licq)?$/) { # getting UIN - $uin=$1; - open(ALIAS,'<'.$dirname.'/users/'.$uin.'.Licq') || - open(ALIAS,'<'.$dirname.'/users/'.$uin.'.uin') || do { - warn "unable to open userfile for $uin"; - return (undef,undef,0); - }; - while (<ALIAS>) { - if (/^Alias\s*=\s*(.*)$/) { - $alias=$1; - $alias =~ s/\s+/_/g; - last; - } - } - close ALIAS; - $imported++; - return ($uin,3,$alias,1); - } else { - warn('Unknown line format: '.$line); - $not_imported++; - goto GETLINE; #### grrrr, sometimes there are negative uins in licq files... - } - } else { - return (undef,undef,0); - } - } else { - return undef; - } -} - -__END__ - -=head1 NAME - -create_nicksfile.pl - Create a valid bitlbee .nicks file - -=head1 SYNOPSIS - -create_nicksfile.pl [--from=FROM] [--of=OUTPUTFILE] [--debug] FILENAME - - FROM defines which application we import from. - Note that currently the only valid value for FROM - is licq. - - If of is missing, we write to bitlbee.nicks. - -=head1 DESCRIPTION - -We run thru the -files where the contacts reside and create -a bitlbee .nicks-file from them. - -=head1 DEPENDENCIES - -On the perlside, we need Getopt::Long. - -=head1 CAVEATS - -=head1 TODO - -&import_readline_... should take a filehandle as argument. - -Add more import functions. If you are interested, -to do so, you need to write the following functions: - -=over - -=item * - -import_open_<WHATEVER>(DIR,FILENAME) - -=item * - -import_close_<WHATEVER>() - -=item * - -import_readline_<WHATEVER>() - -=back - -and add them to the hashes - -=over - -=item * - -%readline_funcs - -=item * - -%open_funcs - -=item * - -%close_funcs - -=back - -at the top of this script. - - -=head1 AUTHORS - -Christian Friedl <vijeno@chello.at> - -Updated for the new Licq list firmat by Hugo Buddelmeijer <kmail@hugo.doemaarwat.nl> - -=cut |