Scan media entities as well, not just url entities. This should expand more
[bitlbee.git] / query.c
blobaa03b8b5784bab0a19d009dfecee9b01ec5b94b1
1 /********************************************************************\
2 * BitlBee -- An IRC to other IM-networks gateway *
3 * *
4 * Copyright 2002-2004 Wilmer van der Gaast and others *
5 \********************************************************************/
7 /* Questions to the user (mainly authorization requests from IM) */
9 /*
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License with
21 the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
22 if not, write to the Free Software Foundation, Inc., 59 Temple Place,
23 Suite 330, Boston, MA 02111-1307 USA
26 #define BITLBEE_CORE
27 #include "bitlbee.h"
29 static void query_display( irc_t *irc, query_t *q );
30 static query_t *query_default( irc_t *irc );
32 query_t *query_add( irc_t *irc, struct im_connection *ic, char *question,
33 query_callback yes, query_callback no, query_callback free,
34 void *data )
36 query_t *q = g_new0( query_t, 1 );
38 q->ic = ic;
39 q->question = g_strdup( question );
40 q->yes = yes;
41 q->no = no;
42 q->free = free;
43 q->data = data;
45 if( strchr( irc->umode, 'b' ) != NULL )
47 char *s;
49 /* At least for the machine-parseable version, get rid of
50 newlines to make "parsing" easier. */
51 for( s = q->question; *s; s ++ )
52 if( *s == '\r' || *s == '\n' )
53 *s = ' ';
56 if( irc->queries )
58 query_t *l = irc->queries;
60 while( l->next ) l = l->next;
61 l->next = q;
63 else
65 irc->queries = q;
68 if( g_strcasecmp( set_getstr( &irc->b->set, "query_order" ), "lifo" ) == 0 || irc->queries == q )
69 query_display( irc, q );
71 return( q );
74 void query_del( irc_t *irc, query_t *q )
76 query_t *l;
78 if( irc->queries == q )
80 irc->queries = q->next;
82 else
84 for( l = irc->queries; l; l = l->next )
86 if( l->next == q )
88 l->next = q->next;
89 break;
93 if( !l )
94 return; /* Hrmmm... */
97 g_free( q->question );
98 if( q->free && q->data )
99 q->free( q->data );
100 g_free( q );
103 void query_del_by_conn( irc_t *irc, struct im_connection *ic )
105 query_t *q, *n, *def;
106 int count = 0;
108 if( !ic )
109 return;
111 q = irc->queries;
112 def = query_default( irc );
114 while( q )
116 if( q->ic == ic )
118 n = q->next;
119 query_del( irc, q );
120 q = n;
122 count ++;
124 else
126 q = q->next;
130 if( count > 0 )
131 imcb_log( ic, "Flushed %d unanswered question(s) for this connection.", count );
133 q = query_default( irc );
134 if( q && q != def )
135 query_display( irc, q );
138 void query_answer( irc_t *irc, query_t *q, int ans )
140 int disp = 0;
142 if( !q )
144 q = query_default( irc );
145 disp = 1;
147 if( ans )
149 if( q->ic )
150 imcb_log( q->ic, "Accepted: %s", q->question );
151 else
152 irc_rootmsg( irc, "Accepted: %s", q->question );
153 if( q->yes )
154 q->yes( q->data );
156 else
158 if( q->ic )
159 imcb_log( q->ic, "Rejected: %s", q->question );
160 else
161 irc_rootmsg( irc, "Rejected: %s", q->question );
162 if( q->no )
163 q->no( q->data );
165 q->data = NULL;
167 query_del( irc, q );
169 if( disp && ( q = query_default( irc ) ) )
170 query_display( irc, q );
173 static void query_display( irc_t *irc, query_t *q )
175 if( q->ic )
177 imcb_log( q->ic, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question );
179 else
181 irc_rootmsg( irc, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question );
185 static query_t *query_default( irc_t *irc )
187 query_t *q;
189 if( g_strcasecmp( set_getstr( &irc->b->set, "query_order" ), "fifo" ) == 0 )
190 q = irc->queries;
191 else
192 for( q = irc->queries; q && q->next; q = q->next );
194 return( q );