From f29f50ec080cf6b1f4298465faf5e0348386e9be Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 22 Aug 2010 12:37:49 +0100 Subject: Cleaning up utils directory, those scripts generate old-style files no longer supported by BitlBee. Adding a script that converts libpurple configs (generated by stuff like Pidgin, Finch, possibly Adium, maybe other programs that are not BitlBee) into formats understood by BitlBee. --- utils/README | 29 +------ utils/centericq2bitlbee.sh | 115 ------------------------- utils/convert_gnomeicu.txt | 7 -- utils/convert_purple.py | 113 ++++++++++++++++++++++++ utils/create_nicksfile.pl | 210 --------------------------------------------- 5 files changed, 116 insertions(+), 358 deletions(-) delete mode 100755 utils/centericq2bitlbee.sh delete mode 100644 utils/convert_gnomeicu.txt create mode 100755 utils/convert_purple.py delete mode 100755 utils/create_nicksfile.pl 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 ) +* 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 ) - -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 ) - -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, -# 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 - 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/^.*//g" | sed "s/<\/nick>//" | sed "s/ /_/g" | - sed "s/<\/uin>/ 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 +# + +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 ] [-b ] [-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=; - if ($line) { - while ($line && $line !~ /^User\d+/) { - $line=; - } - 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 () { - 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_(DIR,FILENAME) - -=item * - -import_close_() - -=item * - -import_readline_() - -=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 - -Updated for the new Licq list firmat by Hugo Buddelmeijer - -=cut -- cgit v1.2.3 From 1bb1e012f1d62db84d331a484abf9cb4c191e8e0 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 22 Aug 2010 13:15:53 +0100 Subject: Fixed a misuse of xt_find_node() that could get into an infinite loop. --- protocols/jabber/si.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/protocols/jabber/si.c b/protocols/jabber/si.c index 58c0e17f..cd937c4a 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); -- cgit v1.2.3 From 241f9f6d9135048578ad603485740b73402edd8a Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 22 Aug 2010 14:31:53 +0100 Subject: Better handling of yahoo add responses: libyahoo2 seems to (IMHO) wrongly assume that a non-0 status means the contact is on the list already and on-line. This causes ugly "imcb_buddy_status() for unknown handle" msgs. --- protocols/yahoo/libyahoo2.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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, -- cgit v1.2.3 From 1aa74f559af18e06195f34b721d65d69c29fcc0f Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 23 Aug 2010 11:34:36 +0100 Subject: Process incoming XMPP groupchat invites in a saner way: Create a temporary channel the user can easily /join. --- irc.h | 1 + irc_im.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++ irc_send.c | 8 +++++++ protocols/bee.h | 2 ++ protocols/bee_chat.c | 8 +++++++ protocols/jabber/message.c | 16 +++++++------ 6 files changed, 86 insertions(+), 7 deletions(-) diff --git a/irc.h b/irc.h index 58ca19c9..36667662 100644 --- a/irc.h +++ b/irc.h @@ -281,6 +281,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_im.c b/irc_im.c index 7ed2922e..6ddcb432 100644 --- a/irc_im.c +++ b/irc_im.c @@ -612,6 +612,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 +965,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..76b54dd1 100644 --- a/irc_send.c +++ b/irc_send.c @@ -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/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/message.c b/protocols/jabber/message.c index ce5017fb..6e40e521 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; } } @@ -103,6 +103,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 ); -- cgit v1.2.3 From bd599b9aeabee36ac6fdb379ca09aec27cce13a4 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 22 Aug 2010 09:07:48 +0100 Subject: Fix two compiler warnings. --- protocols/jabber/si.c | 2 +- protocols/twitter/twitter_lib.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/protocols/jabber/si.c b/protocols/jabber/si.c index cd937c4a..4b0e57c4 100644 --- a/protocols/jabber/si.c +++ b/protocols/jabber/si.c @@ -376,7 +376,7 @@ void jabber_si_answer_request( file_transfer_t *ft ) { static xt_status jabber_si_handle_response(struct im_connection *ic, struct xt_node *node, struct xt_node *orig ) { struct xt_node *c, *d; - char *ini_jid, *tgt_jid, *iq_id, *cmp; + char *ini_jid = NULL, *tgt_jid, *iq_id, *cmp; GSList *tflist; struct jabber_transfer *tf=NULL; struct jabber_data *jd = ic->proto_data; diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 22d2a3bd..f86e1f15 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -372,7 +372,7 @@ static xt_status twitter_xt_get_user_list( struct xt_node *node, struct twitter_ */ static xt_status twitter_xt_get_status( struct xt_node *node, struct twitter_xml_status *txs ) { - struct xt_node *child, *rt; + struct xt_node *child, *rt = NULL; gboolean truncated = FALSE; // Walk over the nodes children. -- cgit v1.2.3 From a72af0dc9b76451f5aa57ac9443267a97c794f95 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 25 Aug 2010 01:18:27 +0100 Subject: Fix /WHO on single nicks. --- irc_commands.c | 8 ++++++++ irc_send.c | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/irc_commands.c b/irc_commands.c index 4b1bc741..7874f519 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_send.c b/irc_send.c index 76b54dd1..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; -- cgit v1.2.3 From 3cd4016e8580b82bebac59e9a23c8de96330ac64 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 25 Aug 2010 22:35:49 +0100 Subject: I guess the nick command was never deprecated clearly, so let's do that now. --- root_commands.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/root_commands.c b/root_commands.c index 280c93a2..94d22933 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 @@ const command_t 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 }, -- cgit v1.2.3 From 3f10fad9408844802fcfa3caf3e65e248185f5af Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 25 Aug 2010 22:37:57 +0100 Subject: The "transfers" command was renamed to "transfer" but this wasn't reflected in the docs so far. --- doc/user-guide/commands.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/user-guide/commands.xml b/doc/user-guide/commands.xml index 989fc392..a1554645 100644 --- a/doc/user-guide/commands.xml +++ b/doc/user-guide/commands.xml @@ -1463,44 +1463,44 @@ - + Monitor, cancel, or reject file transfers - transfers [<cancel> id | <reject>] + transfer [<cancel> id | <reject>] - Without parameters the currently pending file transfers and their status will be listed. Available actions are cancel and reject. See help transfers <action> for more information. + Without parameters the currently pending file transfers and their status will be listed. Available actions are cancel and reject. See help transfer <action> for more information. - transfers + transfer Cancels the file transfer with the given id - transfers <cancel> id + transfer <cancel> id Cancels the file transfer with the given id - transfers cancel 1 + transfer cancel 1 Canceling file transfer for test Rejects all incoming transfers - transfers <reject> + transfer <reject> 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? - transfers reject + transfer reject -- cgit v1.2.3 From b0a89cc6e5ffff050ddecd09e9af8eb6723f9ba6 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Fri, 27 Aug 2010 09:48:18 +0100 Subject: Use nifty gcc -MD feature to automatically track .h dependencies of all C files, this finally gives proper dependencies, which means the end of getting broken binaries around headerfile changes, etc. Sure, this may not work on obscurux with superawesomeincompatiblecc while autoconf does, but at least BitlBee's configure script still runs in <1s. :-) --- .bzrignore | 1 + Makefile | 7 ++++++- configure | 8 ++++++++ lib/Makefile | 3 +++ protocols/Makefile | 3 +++ protocols/jabber/Makefile | 3 +++ protocols/msn/Makefile | 3 ++- protocols/oscar/Makefile | 3 +++ protocols/purple/Makefile | 3 +++ protocols/twitter/Makefile | 3 ++- protocols/yahoo/Makefile | 3 +++ 11 files changed, 37 insertions(+), 3 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 efbffe0a..0511ad83 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 9b77604c..c0d79bdd 100755 --- a/configure +++ b/configure @@ -570,6 +570,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/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/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/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/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/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 -- cgit v1.2.3 From df61c35ad36e18965b3b0fdccf0fa830b0768108 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 30 Aug 2010 21:24:28 +0200 Subject: Warn the user when his/her AIM/ICQ password seems to be too long. For some people with long passwords the removal of old ICQ-only authentication introduced login issues since the extra chars in the password upset the server. --- protocols/oscar/oscar.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c index db6a28f4..9283628a 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: -- cgit v1.2.3 From c55701ecf0b0a9e0c0cb9a4514c90bf426aa5d92 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 30 Aug 2010 21:58:33 +0200 Subject: Due to popular demand, now using mode=chat by default. --- doc/user-guide/commands.xml | 14 +++++++++----- protocols/twitter/twitter.c | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/user-guide/commands.xml b/doc/user-guide/commands.xml index a1554645..609ee6fe 100644 --- a/doc/user-guide/commands.xml +++ b/doc/user-guide/commands.xml @@ -72,7 +72,7 @@ - By default all your Twitter contacts will come from a contact called twitter_(yourusername). You can change this behaviour using the mode setting (see help set mode). + By default all your Twitter contacts will appear in a new channel called #twitter_yourusername. You can change this behaviour using the mode setting (see help set mode). @@ -810,19 +810,23 @@ one, many, chat - one + chat - 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. + + + + 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). - 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. - 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. diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c index d5b71bc3..d5127415 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 ); -- cgit v1.2.3 From fda55fa31f4e5bbf040c712c22f744916c01fca1 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Mon, 30 Aug 2010 22:12:34 +0200 Subject: Revert to the old control channel messages for fullname changes, the /notices were probably just a bad idea. --- irc_im.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/irc_im.c b/irc_im.c index 6ddcb432..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 ); -- cgit v1.2.3 From 31dbb90a2d32d6988706ae4b5c2292cd43d89595 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Tue, 31 Aug 2010 00:02:46 +0200 Subject: Suppress subjects in Jabber conversations after showing them once. --- protocols/jabber/jabber.h | 2 ++ protocols/jabber/message.c | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) 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 6e40e521..85c71c9d 100644 --- a/protocols/jabber/message.c +++ b/protocols/jabber/message.c @@ -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. */ -- cgit v1.2.3