source: query.c @ f9dbc99

Last change on this file since f9dbc99 was 7f421d6, checked in by Wilmer van der Gaast <wilmer@…>, at 2008-03-03T23:18:36Z

BitlBee <= 1.0 didn't have "account set" and allowed one to delete an account
and re-create it with new login settings if necessary, without losing custom
nicknames. Now, nicknames are connected to an account instead of just the
protocol, and they're flushed together with the account. So I added a warning
to make sure nobody accidentally loses any settings while just changing the
password. This will probably go after a few releases, since it's slightly
annoying.

  • Property mode set to 100644
File size: 4.0 KB
Line 
1  /********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2004 Wilmer van der Gaast and others                *
5  \********************************************************************/
6
7/* Questions to the user (mainly authorization requests from IM)        */
8
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.
14
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.
19
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
24*/
25
26#define BITLBEE_CORE
27#include "bitlbee.h"
28
29static void query_display( irc_t *irc, query_t *q );
30static query_t *query_default( irc_t *irc );
31
32query_t *query_add( irc_t *irc, struct im_connection *ic, char *question, void *yes, void *no, void *data )
33{
34        query_t *q = g_new0( query_t, 1 );
35       
36        q->ic = ic;
37        q->question = g_strdup( question );
38        q->yes = yes;
39        q->no = no;
40        q->data = data;
41       
42        if( strchr( irc->umode, 'b' ) != NULL )
43        {
44                char *s;
45               
46                /* At least for the machine-parseable version, get rid of
47                   newlines to make "parsing" easier. */
48                for( s = q->question; *s; s ++ )
49                        if( *s == '\r' || *s == '\n' )
50                                *s = ' ';
51        }
52       
53        if( irc->queries )
54        {
55                query_t *l = irc->queries;
56               
57                while( l->next ) l = l->next;
58                l->next = q;
59        }
60        else
61        {
62                irc->queries = q;
63        }
64       
65        if( g_strcasecmp( set_getstr( &irc->set, "query_order" ), "lifo" ) == 0 || irc->queries == q )
66                query_display( irc, q );
67       
68        return( q );
69}
70
71void query_del( irc_t *irc, query_t *q )
72{
73        query_t *l;
74       
75        if( irc->queries == q )
76        {
77                irc->queries = q->next;
78        }
79        else
80        {
81                for( l = irc->queries; l; l = l->next )
82                {
83                        if( l->next == q )
84                        {
85                                l->next = q->next;
86                                break;
87                        }
88                }
89               
90                if( !l )
91                        return; /* Hrmmm... */
92        }
93       
94        g_free( q->question );
95        if( q->data ) g_free( q->data ); /* Memory leak... */
96        g_free( q );
97}
98
99void query_del_by_conn( irc_t *irc, struct im_connection *ic )
100{
101        query_t *q, *n, *def;
102        int count = 0;
103       
104        q = irc->queries;
105        def = query_default( irc );
106       
107        while( q )
108        {
109                if( q->ic == ic )
110                {
111                        n = q->next;
112                        query_del( irc, q );
113                        q = n;
114                       
115                        count ++;
116                }
117                else
118                {
119                        q = q->next;
120                }
121        }
122       
123        if( count > 0 )
124                imcb_log( ic, "Flushed %d unanswered question(s) for this connection.", count );
125       
126        q = query_default( irc );
127        if( q && q != def )
128                query_display( irc, q );
129}
130
131void query_answer( irc_t *irc, query_t *q, int ans )
132{
133        int disp = 0;
134       
135        if( !q )
136        {
137                q = query_default( irc );
138                disp = 1;
139        }
140        if( ans )
141        {
142                if( q->ic )
143                        imcb_log( q->ic, "Accepted: %s", q->question );
144                else
145                        irc_usermsg( irc, "Accepted: %s", q->question );
146                q->yes( NULL, q->data );
147        }
148        else
149        {
150                if( q->ic )
151                        imcb_log( q->ic, "Rejected: %s", q->question );
152                else
153                        irc_usermsg( irc, "Rejected: %s", q->question );
154                q->no( NULL, q->data );
155        }
156        q->data = NULL;
157       
158        query_del( irc, q );
159       
160        if( disp && ( q = query_default( irc ) ) )
161                query_display( irc, q );
162}
163
164static void query_display( irc_t *irc, query_t *q )
165{
166        if( q->ic )
167        {
168                imcb_log( q->ic, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question );
169        }
170        else
171        {
172                irc_usermsg( irc, "New request: %s\nYou can use the \2yes\2/\2no\2 commands to accept/reject this request.", q->question );
173        }
174}
175
176static query_t *query_default( irc_t *irc )
177{
178        query_t *q;
179       
180        if( g_strcasecmp( set_getstr( &irc->set, "query_order" ), "fifo" ) == 0 )
181                q = irc->queries;
182        else
183                for( q = irc->queries; q && q->next; q = q->next );
184       
185        return( q );
186}
Note: See TracBrowser for help on using the repository browser.