diff options
Diffstat (limited to 'query.c')
-rw-r--r-- | query.c | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/query.c b/query.c new file mode 100644 index 00000000..9429f2d2 --- /dev/null +++ b/query.c @@ -0,0 +1,195 @@ + /********************************************************************\ + * BitlBee -- An IRC to other IM-networks gateway * + * * + * Copyright 2002-2004 Wilmer van der Gaast and others * + \********************************************************************/ + +/* Questions to the user (mainly authorization requests from IM) */ + +/* + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License with + the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL; + if not, write to the Free Software Foundation, Inc., 59 Temple Place, + Suite 330, Boston, MA 02111-1307 USA +*/ + +#define BITLBEE_CORE +#include "bitlbee.h" + +static void query_display( irc_t *irc, query_t *q ); +static query_t *query_default( irc_t *irc ); + +query_t *query_add( irc_t *irc, struct im_connection *ic, char *question, + query_callback yes, query_callback no, query_callback free, + void *data ) +{ + query_t *q = g_new0( query_t, 1 ); + + q->ic = ic; + q->question = g_strdup( question ); + q->yes = yes; + q->no = no; + q->free = free; + q->data = data; + + if( strchr( irc->umode, 'b' ) != NULL ) + { + char *s; + + /* At least for the machine-parseable version, get rid of + newlines to make "parsing" easier. */ + for( s = q->question; *s; s ++ ) + if( *s == '\r' || *s == '\n' ) + *s = ' '; + } + + if( irc->queries ) + { + query_t *l = irc->queries; + + while( l->next ) l = l->next; + l->next = q; + } + else + { + irc->queries = q; + } + + if( g_strcasecmp( set_getstr( &irc->b->set, "query_order" ), "lifo" ) == 0 || irc->queries == q ) + query_display( irc, q ); + + return( q ); +} + +void query_del( irc_t *irc, query_t *q ) +{ + query_t *l; + + if( irc->queries == q ) + { + irc->queries = q->next; + } + else + { + for( l = irc->queries; l; l = l->next ) + { + if( l->next == q ) + { + l->next = q->next; + break; + } + } + + if( !l ) + return; /* Hrmmm... */ + } + + g_free( q->question ); + if( q->free && q->data ) + q->free( q->data ); + g_free( q ); +} + +void query_del_by_conn( irc_t *irc, struct im_connection *ic ) +{ + query_t *q, *n, *def; + int count = 0; + + if( !ic ) + return; + + q = irc->queries; + def = query_default( irc ); + + while( q ) + { + if( q->ic == ic ) + { + n = q->next; + query_del( irc, q ); + q = n; + + count ++; + } + else + { + q = q->next; + } + } + + if( count > 0 ) + imcb_log( ic, "Flushed %d unanswered question(s) for this connection.", count ); + + q = query_default( irc ); + if( q && q != def ) + query_display( irc, q ); +} + +void query_answer( irc_t *irc, query_t *q, int ans ) +{ + int disp = 0; + + if( !q ) + { + q = query_default( irc ); + disp = 1; + } + if( ans ) + { + if( q->ic ) + imcb_log( q->ic, "Accepted: %s", q->question ); + else + irc_usermsg( irc, "Accepted: %s", q->question ); + if( q->yes ) + q->yes( q->data ); + } + else + { + if( q->ic ) + imcb_log( q->ic, "Rejected: %s", q->question ); + else + irc_usermsg( irc, "Rejected: %s", q->question ); + if( q->no ) + q->no( q->data ); + } + q->data = NULL; + + query_del( irc, q ); + + if( disp && ( q = query_default( irc ) ) ) + query_display( irc, q ); +} + +static void query_display( irc_t *irc, query_t *q ) +{ + if( q->ic ) + { + imcb_log( q->ic, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question ); + } + else + { + irc_usermsg( irc, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question ); + } +} + +static query_t *query_default( irc_t *irc ) +{ + query_t *q; + + if( g_strcasecmp( set_getstr( &irc->b->set, "query_order" ), "fifo" ) == 0 ) + q = irc->queries; + else + for( q = irc->queries; q && q->next; q = q->next ); + + return( q ); +} |