Changeset 4022b68


Ignore:
Timestamp:
2010-08-21T22:42:01Z (9 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
fd424c8
Parents:
327af51 (diff), c00dd71 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline.

Files:
1 added
18 edited
3 moved

Legend:

Unmodified
Added
Removed
  • debian/bitlbee-common.postinst

    r327af51 r4022b68  
    6464fi
    6565
    66 if [ -n "$2" -a "$BITLBEE_UPGRADE_DONT_RESTART" != "1" ]; then
    67         if which invoke-rc.d >/dev/null 2>&1; then
     66# The official way to check if we're upgrading is to check if $2 is
     67# non-empty. However, previous versions of BitlBee didn't have a
     68# bitlbee-common package so in that case the var will also be empty.
     69# Instead, check if the port is in use (if netstat is available). This
     70# works since the debconf code will pick a free port on new installs.
     71if [ "$BITLBEE_UPGRADE_DONT_RESTART" != "1" ]; then
     72        unset IS_UPGRADE
     73        if type netstat > /dev/null 2> /dev/null; then
     74                netstat -an | grep -q :$PORT\\b.*LISTEN && IS_UPGRADE=1
     75        else
     76                [ -n "$2" ] && IS_UPGRADE=1
     77        fi
     78        if [ -n "$IS_UPGRADE" ]; then
    6879                invoke-rc.d bitlbee restart
    69         else
    70                 /etc/init.d/bitlbee restart
    7180        fi
    7281fi
     
    95104
    96105if [ -z "$2" ]; then
    97         if which invoke-rc.d >/dev/null 2>&1; then
    98                 invoke-rc.d bitlbee start
    99         else
    100                 /etc/init.d/bitlbee start
    101         fi
     106        invoke-rc.d bitlbee start
    102107fi
  • debian/bitlbee.prerm

    r327af51 r4022b68  
    11#!/bin/sh -e
    22
    3 if [ "$1" = "upgrade" ]; then
    4         ## To prevent the help function from breaking in currently running
    5         ## BitlBee processes. Have to do it like this because dpkg-reconfigure
    6         ## looks a lot like an upgrade and we don't want to lose help.txt...
    7         if [ -e /usr/share/bitlbee/help.txt ]; then
    8                 rm -f /usr/share/bitlbee/help.upgrading
    9                 mv /usr/share/bitlbee/help.txt /usr/share/bitlbee/help.upgrading
    10         fi
    11 else
    12         if which invoke-rc.d >/dev/null 2>&1; then
    13                 invoke-rc.d bitlbee stop || exit 0
    14         else
    15                 /etc/init.d/bitlbee stop || exit 0
    16         fi
     3if [ "$1" != "upgrade" ]; then
     4        invoke-rc.d bitlbee stop || exit 0
    175fi
  • debian/changelog

    r327af51 r4022b68  
    66    bitlbee-common.
    77
    8  -- Wilmer van der Gaast <wilmer@gaast.net>  Sat, 05 Jun 2010 15:16:38 +0100
     8 -- Wilmer van der Gaast <wilmer@gaast.net>  Wed, 18 Aug 2010 00:53:11 +0100
    99
    1010bitlbee (1.2.8-1) unstable; urgency=low
  • debian/rules

    r327af51 r4022b68  
    88#
    99
     10# Include the bitlbee-libpurple variant by default
     11BITLBEE_LIBPURPLE ?= 1
    1012BITLBEE_CONFIGURE_FLAGS ?=
    1113DEBUG ?= 0
     
    1416# Want to use the full package version number instead of just the release.
    1517BITLBEE_CONFIGURE_VERSION ?= BITLBEE_VERSION=\"$(shell dpkg-parsechangelog | grep ^Version: | awk '{print $$2}')\"
     18endif
     19
     20ifneq ($(BITLBEE_LIBPURPLE),1)
     21DH_OPTIONS += -Nbitlbee-libpurple
    1622endif
    1723
     
    2430        $(MAKE) -C debian/build-native
    2531
     32ifeq ($(BITLBEE_LIBPURPLE),1)
    2633        mkdir -p debian/build-libpurple
    2734        ROOT=$$PWD; cd debian/build-libpurple; $(BITLBEE_CONFIGURE_VERSION) $$ROOT/configure --debug=$(DEBUG) --prefix=/usr --etcdir=/etc/bitlbee --purple=1 $(BITLBEE_CONFIGURE_FLAGS)
    2835        $(MAKE) -C debian/build-libpurple
     36endif
    2937
    3038        $(MAKE) -C doc
     
    3745        rm -f build-stamp
    3846
    39         rm -rf build-arch-stamp debian/build-*
     47        rm -rf build-arch-stamp debian/build-* debian/bitlbee-libpurple.prerm
    4048        $(MAKE) distclean
    4149
     
    4856        dh_installdirs
    4957
    50         $(MAKE) -C debian/build-native install install-etc DESTDIR=`pwd`/debian/bitlbee
    51         $(MAKE) -C debian/build-libpurple install install-etc DESTDIR=`pwd`/debian/bitlbee-libpurple
     58        $(MAKE) -C debian/build-native install DESTDIR=`pwd`/debian/bitlbee
     59        $(MAKE) -C debian/build-native install-etc DESTDIR=`pwd`/debian/bitlbee-common
    5260        $(MAKE) -C debian/build-native install-dev DESTDIR=`pwd`/debian/bitlbee-dev
     61        patch debian/bitlbee-common/etc/bitlbee/bitlbee.conf debian/patches/bitlbee.conf.diff
    5362
    54         patch debian/bitlbee/etc/bitlbee/bitlbee.conf debian/patches/bitlbee.conf.diff
    55         patch debian/bitlbee-libpurple/etc/bitlbee/bitlbee.conf debian/patches/bitlbee.conf.diff
     63ifeq ($(BITLBEE_LIBPURPLE),1)
     64        $(MAKE) -C debian/build-libpurple install DESTDIR=`pwd`/debian/bitlbee-libpurple
     65        ln -sf debian/bitlbee.prerm debian/bitlbee-libpurple.prerm
     66endif
    5667
    5768        mkdir -p debian/bitlbee-common/usr
     
    6879        # TODO: Restore --link-doc up here and remove the hack below once
    6980        # Hardy and Lenny are deprecated.
    70         for p in bitlbee bitlbee-libpurple bitlbee-dev; do rm -rf debian/$$p/usr/share/doc/$$p; ln -s bitlbee-common debian/$$p/usr/share/doc/$$p; done
     81        for p in bitlbee bitlbee-libpurple bitlbee-dev; do rm -r debian/$$p/usr/share/doc/$$p && ln -s bitlbee-common debian/$$p/usr/share/doc/$$p; done
    7182        dh_installdebconf
    72         dh_installinit
    73 ifeq ($(DH_OPTIONS),-a)
    74         cp -a debian/bitlbee/etc debian/bitlbee-libpurple
    75 endif
     83        dh_installinit --init-script=bitlbee
    7684        dh_installman
    7785        dh_strip
     
    8088        dh_fixperms
    8189        dh_installdeb
    82 ifeq ($(DH_OPTIONS),-a)
    83         cp -a debian/bitlbee/DEBIAN/post* debian/bitlbee/DEBIAN/pre* debian/bitlbee-libpurple/DEBIAN
    84 endif
    8590        dh_shlibdeps
    8691ifdef BITLBEE_VERSION
     
    9398
    9499binary-indep: build install
    95         $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
     100        DH_OPTIONS=-i $(MAKE) -f debian/rules binary-common
    96101
    97102binary-arch: build install
    98         $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common
     103        DH_OPTIONS=-a $(MAKE) -f debian/rules binary-common
    99104
    100105binary-%: build install
    101         make -f debian/rules binary-common DH_OPTIONS=-p$*
     106        DH_OPTIONS=-p$* $(MAKE) -f debian/rules binary-common
    102107
    103108binary: binary-indep binary-arch
  • doc/user-guide/commands.xml

    r327af51 r4022b68  
    829829        </bitlbee-setting>
    830830
     831        <bitlbee-setting name="mobile_is_away" type="boolean" scope="global">
     832                <default>false</default>
     833
     834                <description>
     835                        <para>
     836                                Most IM networks have a mobile version of their client. People who use these may not be paying that much attention to messages coming in. By enabling this setting, people using mobile clients will always be shown as away.
     837                        </para>
     838                </description>
     839
     840        </bitlbee-setting>
     841
    831842        <bitlbee-setting name="nick" type="string" scope="chat">
    832843                <description>
  • doc/user-guide/misc.xml

    r327af51 r4022b68  
    234234</sect1>
    235235
     236<sect1 id="news1.3">
     237<title>New stuff in BitlBee 1.3dev</title>
     238
     239<para>
     240Most of the core of BitlBee was rewritten since the last release. This entry
     241should sum up the majority of the changes.
     242</para>
     243
     244<para>
     245First of all, you can now have as many control channels as you want. Or you
     246can have none, it's finally possible to leave &amp;bitlbee and still talk to
     247all your contacts. Or you can have a &amp;work with all your work-related
     248contacts, or a &amp;msn with all your MSN Messenger contacts. See <emphasis>help
     249channels</emphasis> for more information about this.
     250</para>
     251
     252<para>
     253Also, you can change how nicknames are generated for your contacts. Like
     254automatically adding a [fb] tag to the nicks of all your Facebook contacts.
     255See <emphasis>help nick_format</emphasis>.
     256</para>
     257
     258<para>
     259When you're already connected to a BitlBee server and you connect from
     260elsewhere, you can take over the old session.
     261</para>
     262
     263<para>
     264Instead of account numbers, accounts now also get tags. These are
     265automatically generated but can be changed (<emphasis>help set
     266tag</emphasis>). You can now use them instead of accounts numbers.
     267(Example: <emphasis>acc gtalk on</emphasis>)
     268</para>
     269
     270<para>
     271Last of all: You can finally change your nickname and
     272shorten root commands (try <emphasis>acc li</emphasis> instead
     273of <emphasis>account list</emphasis>).
     274</para>
     275
     276</sect1>
     277
    236278</chapter>
  • irc.c

    r327af51 r4022b68  
    103103        s = set_add( &b->set, "allow_takeover", "true", set_eval_bool, irc );
    104104        s = set_add( &b->set, "away_devoice", "true", set_eval_bw_compat, irc );
     105        s->flags |= SET_HIDDEN;
    105106        s = set_add( &b->set, "away_reply_timeout", "3600", set_eval_int, irc );
    106107        s = set_add( &b->set, "charset", "utf-8", set_eval_charset, irc );
     
    109110        s = set_add( &b->set, "display_timestamps", "true", set_eval_bool, irc );
    110111        s = set_add( &b->set, "handle_unknown", "add_channel", NULL, irc );
     112        s = set_add( &b->set, "last_version", NULL, NULL, irc );
     113        s->flags |= SET_HIDDEN;
    111114        s = set_add( &b->set, "lcnicks", "true", set_eval_bool, irc );
    112115        s = set_add( &b->set, "nick_format", "%-@nick", NULL, irc );
     
    122125        s = set_add( &b->set, "query_order", "lifo", NULL, irc );
    123126        s = set_add( &b->set, "root_nick", ROOT_NICK, set_eval_root_nick, irc );
     127        s->flags |= SET_HIDDEN;
    124128        s = set_add( &b->set, "show_offline", "false", set_eval_bw_compat, irc );
     129        s->flags |= SET_HIDDEN;
    125130        s = set_add( &b->set, "simulate_netsplit", "true", set_eval_bool, irc );
    126131        s = set_add( &b->set, "timezone", "local", set_eval_timezone, irc );
     
    915920                val = "online@,away+,offline";
    916921        else
    917                 return SET_INVALID;
     922                val = "online+,away";
    918923       
    919924        for( l = irc->channels; l; l = l->next )
  • irc_channel.c

    r327af51 r4022b68  
    759759        set_del( &ic->set, "group" );
    760760        set_del( &ic->set, "protocol" );
     761        set_del( &ic->set, "show_users" );
    761762       
    762763        g_free( icc );
  • irc_send.c

    r327af51 r4022b68  
    327327{
    328328        irc_write( iu->irc, ":%s!%s@%s %s %s :%s",
    329                    iu->nick, iu->user, iu->host, type, dst, msg );
     329                   iu->nick, iu->user, iu->host, type, dst, msg && *msg ? msg : " " );
    330330}
    331331
  • lib/proxy.c

    r327af51 r4022b68  
    4949char proxypass[128] = "";
    5050
     51/* Some systems don't know this one. It's not essential, so set it to 0 then. */
     52#ifndef AI_NUMERICSERV
     53#define AI_NUMERICSERV 0
     54#endif
     55
    5156struct PHB {
    5257        b_event_handler func, proxy_func;
     
    5661        int fd;
    5762        gint inpa;
     63        struct addrinfo *gai, *gai_cur;
    5864};
     65
     66static int proxy_connect_none(const char *host, unsigned short port_, struct PHB *phb);
    5967
    6068static gboolean gaim_io_connected(gpointer data, gint source, b_input_condition cond)
     
    6674       
    6775#ifndef _WIN32
    68         if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
     76        if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0 || error) {
     77                if ((phb->gai_cur = phb->gai_cur->ai_next)) {
     78                        int new_fd;
     79                        b_event_remove(phb->inpa);
     80                        if ((new_fd = proxy_connect_none(NULL, 0, phb))) {
     81                                b_event_remove(phb->inpa);
     82                                closesocket(source);
     83                                dup2(new_fd, source);
     84                                phb->inpa = b_input_add(source, B_EV_IO_WRITE, gaim_io_connected, phb);
     85                                return FALSE;
     86                        }
     87                }
     88                freeaddrinfo(phb->gai);
    6989                closesocket(source);
    7090                b_event_remove(phb->inpa);
     
    7898        }
    7999#endif
     100        freeaddrinfo(phb->gai);
    80101        sock_make_blocking(source);
    81102        b_event_remove(phb->inpa);
     
    94115        struct sockaddr_in me;
    95116        int fd = -1;
    96         int ret;
    97         char port[6];
    98         struct addrinfo hints;
    99         struct addrinfo* result;
    100 
    101         g_snprintf(port, sizeof(port), "%d", port_);
    102 
    103         memset(&hints, 0, sizeof(struct addrinfo));
    104         hints.ai_family = AF_UNSPEC;
    105         hints.ai_socktype = SOCK_STREAM;
    106         hints.ai_flags = AI_ADDRCONFIG | AI_NUMERICSERV;
    107 
    108         if (!(ret = getaddrinfo(host, port, &hints, &result)))
     117       
     118        if (phb->gai_cur == NULL)
    109119        {
    110                 struct addrinfo* rp;
    111 
    112                 for (rp = result; rp; rp = rp->ai_next)
     120                int ret;
     121                char port[6];
     122                struct addrinfo hints;
     123       
     124                g_snprintf(port, sizeof(port), "%d", port_);
     125       
     126                memset(&hints, 0, sizeof(struct addrinfo));
     127                hints.ai_family = AF_UNSPEC;
     128                hints.ai_socktype = SOCK_STREAM;
     129                hints.ai_flags = AI_ADDRCONFIG | AI_NUMERICSERV;
     130       
     131                if (!(ret = getaddrinfo(host, port, &hints, &phb->gai)))
     132                        phb->gai_cur = phb->gai;
     133                else
     134                        event_debug("gai(): %s\n", gai_strerror(ret));
     135        }
     136       
     137        for (; phb->gai_cur; phb->gai_cur = phb->gai_cur->ai_next)
     138        {
     139                if ((fd = socket(phb->gai_cur->ai_family, phb->gai_cur->ai_socktype, phb->gai_cur->ai_protocol)) < 0) {
     140                        event_debug( "socket failed: %d\n", errno);
     141                        continue;
     142                }
     143
     144                sock_make_nonblocking(fd);
     145
     146                if (global.conf->iface_out)
    113147                {
    114                         if ((fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol)) < 0) {
    115                                 event_debug( "socket failed: %d\n", errno);
    116                                 continue;
    117                         }
    118 
    119                         sock_make_nonblocking(fd);
    120 
    121                         if (global.conf->iface_out)
    122                         {
    123                                 me.sin_family = AF_INET;
    124                                 me.sin_port = 0;
    125                                 me.sin_addr.s_addr = inet_addr( global.conf->iface_out );
     148                        me.sin_family = AF_INET;
     149                        me.sin_port = 0;
     150                        me.sin_addr.s_addr = inet_addr( global.conf->iface_out );
    126151                               
    127                                 if (bind(fd, (struct sockaddr *) &me, sizeof(me)) != 0)
    128                                         event_debug("bind( %d, \"%s\" ) failure\n", fd, global.conf->iface_out);
    129                         }
    130 
    131                         event_debug("proxy_connect_none( \"%s\", %d ) = %d\n", host, port, fd);
    132        
    133                         if (connect(fd, rp->ai_addr, rp->ai_addrlen) < 0 && !sockerr_again()) {
    134                                 event_debug( "connect failed: %s\n", strerror(errno));
    135                                 closesocket(fd);
    136                                 fd = -1;
    137                                 continue;
    138                         } else {
    139                                 phb->inpa = b_input_add(fd, B_EV_IO_WRITE, gaim_io_connected, phb);
    140                                 phb->fd = fd;
    141                                
    142                                 break;
    143                         }
    144                 }
    145 
    146                 freeaddrinfo(result);
    147         }
    148         else
    149         {
    150                 event_debug("gai(): %s\n", gai_strerror(ret));
    151         }
    152        
    153         if(fd < 0)
     152                        if (bind(fd, (struct sockaddr *) &me, sizeof(me)) != 0)
     153                                event_debug("bind( %d, \"%s\" ) failure\n", fd, global.conf->iface_out);
     154                }
     155
     156                event_debug("proxy_connect_none( \"%s\", %d ) = %d\n", host, port, fd);
     157       
     158                if (connect(fd, phb->gai_cur->ai_addr, phb->gai_cur->ai_addrlen) < 0 && !sockerr_again()) {
     159                        event_debug( "connect failed: %s\n", strerror(errno));
     160                        closesocket(fd);
     161                        fd = -1;
     162                        continue;
     163                } else {
     164                        phb->inpa = b_input_add(fd, B_EV_IO_WRITE, gaim_io_connected, phb);
     165                        phb->fd = fd;
     166                       
     167                        break;
     168                }
     169        }
     170       
     171        if(fd < 0 && host)
    154172                g_free(phb);
    155173
  • protocols/bee.c

    r327af51 r4022b68  
    4040        s = set_add( &b->set, "auto_reconnect_delay", "5*3<900", set_eval_account_reconnect_delay, b );
    4141        s = set_add( &b->set, "debug", "false", set_eval_bool, b );
     42        s = set_add( &b->set, "mobile_is_away", "false", set_eval_bool, b );
    4243        s = set_add( &b->set, "save_on_quit", "true", set_eval_bool, b );
    4344        s = set_add( &b->set, "status", NULL, set_eval_away_status, b );
  • protocols/bee.h

    r327af51 r4022b68  
    5656void bee_free( bee_t *b );
    5757
     58/* TODO(wilmer): Kill at least the OPT_ flags that have an equivalent here. */
    5859typedef enum
    5960{
    6061        BEE_USER_ONLINE = 1,    /* Compatibility with old OPT_LOGGED_IN flag */
    6162        BEE_USER_AWAY = 4,      /* Compatibility with old OPT_AWAY flag */
     63        BEE_USER_MOBILE = 8,    /* Compatibility with old OPT_MOBILE flag */
    6264        BEE_USER_LOCAL = 256,   /* Locally-added contacts (not in real contact list) */
    6365} bee_user_flags_t;
  • protocols/bee_user.c

    r327af51 r4022b68  
    195195                bu->status = NULL;
    196196       
     197        if( bu->status == NULL && ( flags & OPT_MOBILE ) &&
     198            set_getbool( &bee->set, "mobile_is_away" ) )
     199        {
     200                bu->flags |= BEE_USER_AWAY;
     201                bu->status = g_strdup( "Mobile" );
     202        }
     203       
    197204        if( bee->ui->user_status )
    198205                bee->ui->user_status( bee, bu, old );
     
    268275}
    269276
    270 void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags )
     277void imcb_buddy_typing( struct im_connection *ic, const char *handle, uint32_t flags )
    271278{
    272279        bee_user_t *bu;
  • protocols/nogaim.h

    r327af51 r4022b68  
    6363#define OPT_LOGGING_OUT 0x00000002
    6464#define OPT_AWAY        0x00000004
     65#define OPT_MOBILE      0x00000008
    6566#define OPT_DOES_HTML   0x00000010
    6667#define OPT_LOCALBUDDY  0x00000020 /* For nicks local to one groupchat */
     
    312313G_MODULE_EXPORT void imcb_buddy_nick_hint( struct im_connection *ic, const char *handle, const char *nick );
    313314
    314 G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, char *handle, uint32_t flags );
     315G_MODULE_EXPORT void imcb_buddy_typing( struct im_connection *ic, const char *handle, uint32_t flags );
    315316G_MODULE_EXPORT struct bee_user *imcb_buddy_by_handle( struct im_connection *ic, const char *handle );
    316317G_MODULE_EXPORT void imcb_clean_handle( struct im_connection *ic, char *handle );
  • protocols/oscar/oscar.c

    r327af51 r4022b68  
    898898                        flags |= OPT_AWAY;
    899899        }
     900       
     901        /* Maybe this should be done just for AIM contacts, not sure. */
     902        if (info->flags & AIM_FLAG_WIRELESS)
     903                flags |= OPT_MOBILE;
    900904       
    901905        if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) {
  • protocols/purple/purple.c

    r327af51 r4022b68  
    427427{
    428428        PurpleTypingState state = PURPLE_NOT_TYPING;
    429         PurpleConversation *conv;
     429        PurpleAccount *pa = ic->proto_data;
    430430       
    431431        if( flags & OPT_TYPING )
     
    434434                state = PURPLE_TYPED;
    435435       
    436         if( ( conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM,
    437                                                             who, ic->proto_data ) ) == NULL )
    438         {
    439                 purple_conv_im_set_typing_state( purple_conversation_get_im_data( conv ), state );
    440                 return 1;
    441         }
    442         else
    443         {
    444                 return 0;
    445         }
     436        serv_send_typing( purple_account_get_connection( pa ), who, state );
     437       
     438        return 1;
    446439}
    447440
     
    807800       
    808801        imcb_buddy_msg( ic, (char*) who, (char*) message, 0, mtime );
     802}
     803
     804/* No, this is not a ui_op but a signal. */
     805static void prplcb_buddy_typing( PurpleAccount *account, const char *who, gpointer null )
     806{
     807        PurpleConversation *conv;
     808        PurpleConvIm *im;
     809        int state;
     810       
     811        if( ( conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_IM, who, account ) ) == NULL )
     812                return;
     813       
     814        im = PURPLE_CONV_IM(conv);
     815        switch( purple_conv_im_get_typing_state( im ) )
     816        {
     817        case PURPLE_TYPING:
     818                state = OPT_TYPING;
     819                break;
     820        case PURPLE_TYPED:
     821                state = OPT_THINKING;
     822                break;
     823        default:
     824                state = 0;
     825        }
     826       
     827        imcb_buddy_typing( purple_ic_by_pa( account ), who, state );
    809828}
    810829
     
    11391158        purple_prefs_load();
    11401159       
     1160        /* No, really. So far there were ui_ops for everything, but now suddenly
     1161           one needs to use signals for typing notification stuff. :-( */
     1162        purple_signal_connect( purple_conversations_get_handle(), "buddy-typing",
     1163                               &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL );
     1164        purple_signal_connect( purple_conversations_get_handle(), "buddy-typed",
     1165                               &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL );
     1166        purple_signal_connect( purple_conversations_get_handle(), "buddy-typing-stopped",
     1167                               &funcs, PURPLE_CALLBACK(prplcb_buddy_typing), NULL );
     1168       
    11411169        memset( &funcs, 0, sizeof( funcs ) );
    11421170        funcs.login = purple_login;
  • protocols/yahoo/yahoo.c

    r327af51 r4022b68  
    589589        if( away )
    590590                flags |= OPT_AWAY;
     591        if( mobile )
     592                flags |= OPT_MOBILE;
    591593       
    592594        switch (stat)
  • root_commands.c

    r327af51 r4022b68  
    100100
    101101static void cmd_account( irc_t *irc, char **cmd );
     102static void bitlbee_whatsnew( irc_t *irc );
    102103
    103104static void cmd_identify( irc_t *irc, char **cmd )
     
    155156                irc->status |= USTATUS_IDENTIFIED;
    156157                irc_umode_set( irc, "+R", 1 );
     158               
     159                bitlbee_whatsnew( irc );
    157160               
    158161                /* The following code is a bit hairy now. With takeover
     
    267270        if( ( val = set_getstr( head, key ) ) )
    268271                irc_usermsg( irc, "%s = `%s'", key, val );
     272        else if( !set_find( head, key ) )
     273        {
     274                irc_usermsg( irc, "Setting `%s' does not exist.", key );
     275                if( *head == irc->b->set )
     276                        irc_usermsg( irc, "It might be an account or channel setting. "
     277                                     "See \x02help account set\x02 and \x02help channel set\x02." );
     278        }
    269279        else
    270280                irc_usermsg( irc, "%s is empty", key );
     
    304314                        st = set_setstr( head, set_name, value );
    305315               
    306                 if( set_getstr( head, set_name ) == NULL )
     316                if( set_getstr( head, set_name ) == NULL &&
     317                    set_find( head, set_name ) )
    307318                {
    308319                        /* This happens when changing the passwd, for example.
     
    328339                while( s )
    329340                {
    330                         cmd_showset( irc, &s, s->key );
     341                        if( !( s->flags & SET_HIDDEN ) )
     342                                cmd_showset( irc, &s, s->key );
    331343                        s = s->next;
    332344                }
     
    10081020        irc_usermsg( irc, format, "Nick", "Handle/Account", "Status" );
    10091021       
    1010         if( strcmp( set_getstr( &irc->root->last_channel->set, "type" ), "control" ) != 0 )
     1022        if( irc->root->last_channel &&
     1023            strcmp( set_getstr( &irc->root->last_channel->set, "type" ), "control" ) != 0 )
    10111024                irc->root->last_channel = NULL;
    10121025       
     
    12711284}
    12721285
     1286/* Maybe this should be a stand-alone command as well? */
     1287static void bitlbee_whatsnew( irc_t *irc )
     1288{
     1289        int last = set_getint( &irc->b->set, "last_version" );
     1290        GString *msg = g_string_new( "" );
     1291        char s[16];
     1292       
     1293        if( last >= BITLBEE_VERSION_CODE )
     1294                return;
     1295       
     1296        if( last < 0x010206 ) /* 1.2.6 */
     1297        {
     1298                g_string_append( msg,
     1299                        "Twitter support. See \x02help account add twitter\x02.\n" );
     1300        }
     1301        if( last < 0x010300 ) /* 1.3dev */
     1302        {
     1303                g_string_append( msg,
     1304                        "Support for multiple configurable control channels, "
     1305                        "each with a subset of your contact list. See "
     1306                        "\x02help channels\x02 for more information.\n"
     1307                        "File transfer support for some protocols (more if "
     1308                        "you use libpurple). Just /DCC SEND stuff. Incoming "
     1309                        "files also become DCC transfers.\n"
     1310                        "Many more things, briefly described in "
     1311                        "\x02help news1.3\x02.\n" );
     1312        }
     1313       
     1314        if( msg->len > 0 )
     1315                irc_usermsg( irc, "%s: This seems to be your first time using this "
     1316                                  "this version of BitlBee. Here's a list of new "
     1317                                  "features you may like to know about:\n\n%s\n",
     1318                                  irc->user->nick, msg->str );
     1319       
     1320        g_string_free( msg, TRUE );
     1321        g_snprintf( s, sizeof( s ), "%d", BITLBEE_VERSION_CODE );
     1322        set_setstr( &irc->b->set, "last_version", s );
     1323}
     1324
    12731325/* IMPORTANT: Keep this list sorted! The short command logic needs that. */
    12741326const command_t commands[] = {
  • set.h

    r327af51 r4022b68  
    4343extern char *SET_INVALID;
    4444
    45 #define SET_NULL_OK        0x0100
     45typedef enum
     46{
     47        SET_NULL_OK = 0x0100,
     48        SET_HIDDEN = 0x0200,
     49} set_flags_t;
    4650
    4751typedef struct set
     
    6064                           set_getstr/int(). */
    6165       
    62         int flags;      /* See account.h, for example. set.c doesn't use
    63                            this (yet?). */
     66        set_flags_t flags; /* Mostly defined per user. */
    6467       
    6568        /* Eval: Returns SET_INVALID if the value is incorrect, exactly
Note: See TracChangeset for help on using the changeset viewer.