aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.bzrignore1
-rw-r--r--Makefile7
-rwxr-xr-xconfigure8
-rw-r--r--doc/user-guide/commands.xml30
-rw-r--r--irc.h1
-rw-r--r--irc_commands.c8
-rw-r--r--irc_im.c62
-rw-r--r--irc_send.c12
-rw-r--r--lib/Makefile3
-rw-r--r--protocols/Makefile3
-rw-r--r--protocols/bee.h2
-rw-r--r--protocols/bee_chat.c8
-rw-r--r--protocols/jabber/Makefile3
-rw-r--r--protocols/jabber/jabber.h2
-rw-r--r--protocols/jabber/message.c29
-rw-r--r--protocols/jabber/si.c4
-rw-r--r--protocols/msn/Makefile3
-rw-r--r--protocols/oscar/Makefile3
-rw-r--r--protocols/oscar/oscar.c8
-rw-r--r--protocols/purple/Makefile3
-rw-r--r--protocols/twitter/Makefile3
-rw-r--r--protocols/twitter/twitter.c2
-rw-r--r--protocols/yahoo/Makefile3
-rw-r--r--protocols/yahoo/libyahoo2.c19
-rw-r--r--root_commands.c6
-rw-r--r--utils/README29
-rwxr-xr-xutils/centericq2bitlbee.sh115
-rw-r--r--utils/convert_gnomeicu.txt7
-rwxr-xr-xutils/convert_purple.py113
-rwxr-xr-xutils/create_nicksfile.pl210
30 files changed, 321 insertions, 386 deletions
diff --git a/.bzrignore b/.bzrignore
index 0312b204..234dca8f 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -19,3 +19,4 @@ tests/check
coverage
bitlbee.info
bitlbee.exe
+.depend
diff --git a/Makefile b/Makefile
index c5a9c130..3754bb4b 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/configure b/configure
index 3bdc4e76..811f829e 100755
--- a/configure
+++ b/configure
@@ -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 [&lt;cancel&gt; id | &lt;reject&gt;]</syntax>
+ <syntax>transfer [&lt;cancel&gt; id | &lt;reject&gt;]</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 &lt;action&gt;</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 &lt;action&gt;</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 &lt;cancel&gt; id</syntax>
+ <syntax>transfer &lt;cancel&gt; 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 &lt;reject&gt;</syntax>
+ <syntax>transfer &lt;reject&gt;</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>
diff --git a/irc.h b/irc.h
index 8afdb50b..cd1f606e 100644
--- a/irc.h
+++ b/irc.h
@@ -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 );
}
diff --git a/irc_im.c b/irc_im.c
index 7ed2922e..662a5bf2 100644
--- a/irc_im.c
+++ b/irc_im.c
@@ -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,
diff --git a/irc_send.c b/irc_send.c
index 5f4dc350..fa4e6815 100644
--- a/irc_send.c
+++ b/irc_send.c
@@ -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