]>
jfr.im git - irc/quakenet/newserv.git/blob - helpmod2/hqueue.c
11 typedef struct hqueue_entry
13 huser_channel
* huserchan
;
14 hchannel_user
* hchanuser
;
17 static hqueue_entry
* hqueue_get_next ( hchannel
* hchan
)
19 static struct hqueue_entry qentry
;
20 static hchannel
* current_hchan
= NULL
;
21 static hchannel_user
* hchanuser
= NULL
;
22 huser_channel
* huserchan
;
26 hchanuser
= hchan
-> channel_users
;
27 current_hchan
= hchan
;
30 if ( hchanuser
== NULL
)
33 huserchan
= huser_on_channel ( hchanuser
-> husr
, current_hchan
);
35 assert ( huserchan
!= NULL
);
37 qentry
. huserchan
= huserchan
;
38 qentry
. hchanuser
= hchanuser
;
40 hchanuser
= hchanuser
-> next
;
45 static int hqueue_on_queue ( hqueue_entry
* qentry
)
47 return on_queue ( qentry
-> hchanuser
-> husr
, qentry
-> huserchan
);
50 static int hqueue_count_in_queue ( hchannel
* hchan
)
53 hqueue_entry
* tmp
= hqueue_get_next ( hchan
);
55 for ( count
= 0 ; tmp
; tmp
= hqueue_get_next ( NULL
))
56 if ( hqueue_on_queue ( tmp
))
62 static int hqueue_count_off_queue ( hchannel
* hchan
)
65 hqueue_entry
* tmp
= hqueue_get_next ( hchan
);
67 for ( count
= 0 ; tmp
; tmp
= hqueue_get_next ( NULL
))
68 if ( on_desk ( tmp
-> hchanuser
-> husr
, tmp
-> huserchan
))
74 int hqueue_average_time ( hchannel
* hchan
)
77 hqueue_entry
* tmp
= hqueue_get_next ( hchan
);
79 for ( count
= 0 ; tmp
; tmp
= hqueue_get_next ( NULL
))
80 if ( hqueue_on_queue ( tmp
))
83 sum
+=( time ( NULL
) - tmp
-> hchanuser
-> time_joined
);
91 void hqueue_report_positions ( hchannel
* hchan
)
94 hqueue_entry
* tmp
= hqueue_get_next ( hchan
);
96 for ( count
= 1 ; tmp
; tmp
= hqueue_get_next ( NULL
))
98 if ( hqueue_on_queue ( tmp
) && (( count
<= 5 ) || !( count
% 5 )))
99 helpmod_reply ( tmp
-> hchanuser
-> husr
, hchan
-> real_channel
, "You now have queue position # %d for channel %s " , count
, hchannel_get_name ( hchan
));
100 if ( hqueue_on_queue ( tmp
))
105 void hqueue_advance ( hchannel
* hchan
, huser
* oper
, int nadv
)
109 huser_channel
* huserchan
;
111 if ( hchan
== NULL
) return ;
113 hchannel_user
* hchanuser
= hchan
-> channel_users
;
117 if ( counter
< 0 || counter
> 25 )
120 if (! huser_valid ( oper
) || ! huser_on_channel ( oper
, hchan
) || ( time ( NULL
) - huser_on_channel ( oper
, hchan
)-> last_activity
> HELPMOD_QUEUE_TIMEOUT
))
125 if ( hchanuser
== NULL
) /* out of users */
129 helpmod_message_channel ( hchan
, "There are no users in the queue" );
133 break ; /* we got something, print the message on channel */
135 huserchan
= huser_on_channel ( hchanuser
-> husr
, hchan
);
137 assert ( huserchan
!= NULL
);
139 if ( huserchan
-> flags
& HQUEUE_DONE
|| huser_get_level ( hchanuser
-> husr
) > H_PEON
)
141 hchanuser
= hchanuser
-> next
; /* user was not in queue, proceed to next one */
145 huserchan
-> flags
|= HQUEUE_DONE
;
149 strcat ( buffer
, huser_get_nick ( hchanuser
-> husr
));
152 if ( hchan
-> flags
& H_DO_STATS
)
153 hstat_add_queue ( hchan
, 1 );
155 if (( hchan
-> flags
& H_QUEUE_SPAMMY
) && ( oper
!= NULL
))
157 helpmod_reply ( hchanuser
-> husr
, hchan
-> real_channel
, "It is now your time to state your problem. Please do so on channel %s and direct your questions to %s %s " , hchannel_get_name ( hchan
), hlevel_title ( huser_get_level ( oper
)), huser_get_nick ( oper
));
158 if (!( huser_get_account_flags ( oper
) & H_NOSPAM
))
159 helpmod_reply ( oper
, hchan
-> real_channel
, "User %s ( %s @ %s ) is yours, he has been in queue for %s " , huser_get_nick ( hchanuser
-> husr
), huser_get_ident ( hchanuser
-> husr
), huser_get_host ( hchanuser
-> husr
), helpmod_strtime ( time ( NULL
) - hchanuser
-> time_joined
));
162 helpmod_channick_modes ( hchanuser
-> husr
, hchan
, MC_VOICE
, HLAZY
);
163 huserchan
-> responsible_oper
= oper
;
165 hchanuser
= hchanuser
-> next
;
168 helpmod_message_channel ( hchan
, "user %s %s : Please state your questions on this channel and direct them to %s %s " , ( nadv
- counter
== 1 )? "" : "s" , buffer
, hlevel_title ( huser_get_level ( oper
)), huser_get_nick ( oper
));
170 helpmod_message_channel ( hchan
, "user %s %s : Please state your questions on this channel" , ( nadv
- counter
== 1 )? "" : "s" , buffer
);
172 if ( hchan
-> flags
& H_QUEUE_SPAMMY
)
173 hqueue_report_positions ( hchan
);
177 void helpmod_queue_handler ( huser
* sender
, channel
* returntype
, hchannel
* hchan
, int hqueue_action
, char * ostr
, int argc
, char * argv
[])
181 helpmod_reply ( sender
, returntype
, "Can not handle queue: Channel not defined or not found" );
184 switch ( hqueue_action
) /* easy ones */
187 if ( hchan
-> flags
& H_QUEUE
)
188 helpmod_reply ( sender
, returntype
, "Can not activate queue: Queue is already active on channel %s " , hchannel_get_name ( hchan
));
191 hchan
-> flags
|= H_QUEUE
;
192 helpmod_reply ( sender
, returntype
, "Queue activated for channel %s " , hchannel_get_name ( hchan
));
193 hchannel_conf_change ( hchan
, hchan
-> flags
& ~( H_QUEUE
));
194 hchan
-> autoqueue
= 0 ;
198 if (!( hchan
-> flags
& H_QUEUE
))
199 helpmod_reply ( sender
, returntype
, "Can not deactive queue: Queue is not active on %s " , hchannel_get_name ( hchan
));
202 hchan
-> flags
&= ~ H_QUEUE
;
203 helpmod_reply ( sender
, returntype
, "Queue deactivated for channel %s " , hchannel_get_name ( hchan
));
204 hchannel_conf_change ( hchan
, hchan
-> flags
| H_QUEUE
);
205 hchan
-> autoqueue
= 0 ;
207 { /* devoice all users of level H_PEON */
208 hchannel_user
* hchanuser
;
209 huser_channel
* huserchan
;
210 for ( hchanuser
= hchan
-> channel_users
; hchanuser
!= NULL
; hchanuser
= hchanuser
-> next
)
212 huserchan
= huser_on_channel ( hchanuser
-> husr
, hchan
);
213 if ( huser_get_level ( hchanuser
-> husr
) == H_PEON
&& huserchan
-> flags
& HCUMODE_VOICE
)
214 helpmod_channick_modes ( hchanuser
-> husr
, hchan
, MC_DEVOICE
, HLAZY
);
221 if (!( hchan
-> flags
& H_QUEUE
))
223 helpmod_reply ( sender
, returntype
, "Can not handle queue: Queue not active on channel %s " , hchannel_get_name ( hchan
));
226 /* now to the real deal */
227 switch ( hqueue_action
)
234 helpmod_reply ( sender
, returntype
, "Can not advance queue: User not specified" );
237 if ( argc
> H_CMD_MAX_ARGS
)
238 argc
= H_CMD_MAX_ARGS
;
242 huser
* husr
= huser_get ( getnickbynick ( argv
[ i
]));
245 helpmod_reply ( sender
, returntype
, "Can not advance queue: User %s not found" , argv
[ i
]);
248 helpmod_channick_modes ( husr
, hchan
, MC_DEVOICE
, HLAZY
);
251 hqueue_handle_queue ( hchan
, sender
);
259 if (! sscanf ( argv
[ 0 ], " %d " , & nnext
) || nnext
<= 0 || nnext
> 25 /* magic number */ )
261 helpmod_reply ( sender
, returntype
, "Can not advance queue: Integer [1, 25] expected" );
265 hqueue_advance ( hchan
, sender
, nnext
);
273 helpmod_reply ( sender
, returntype
, "Autoqueue for channel %s is currently %d ( %s )" , hchannel_get_name ( hchan
), hchan
-> autoqueue
, hchannel_get_state ( hchan
, H_QUEUE_MAINTAIN
));
276 if (! sscanf ( argv
[ 0 ], " %d " , & tmp
) || tmp
< 0 || tmp
> 25 )
278 helpmod_reply ( sender
, returntype
, "Can not set auto queue: Integer [0, 20] expected" );
281 hchan
-> autoqueue
= tmp
;
284 if ( hchan
-> flags
& H_QUEUE_MAINTAIN
)
286 hchan
-> flags
&= ~( H_QUEUE_MAINTAIN
);
287 helpmod_reply ( sender
, returntype
, "Autoqueue is now disabled for channel %s " , hchannel_get_name ( hchan
));
290 helpmod_reply ( sender
, returntype
, "Autoqueue is not enabled for channel %s " , hchannel_get_name ( hchan
));
292 else if (!( hchan
-> flags
& H_QUEUE_MAINTAIN
))
294 hchan
-> flags
|= H_QUEUE_MAINTAIN
;
295 helpmod_reply ( sender
, returntype
, "Autoqueue for channel %s activated and set to %d succesfully" , hchannel_get_name ( hchan
), hchan
-> autoqueue
);
298 helpmod_reply ( sender
, returntype
, "Autoqueue for channel %s set to %d succesfully" , hchannel_get_name ( hchan
), hchan
-> autoqueue
);
299 hqueue_handle_queue ( hchan
, sender
);
304 int count
= hqueue_count_in_queue ( hchan
);
305 hqueue_entry
* hqueue
= hqueue_get_next ( hchan
);
310 helpmod_reply ( sender
, returntype
, "Channel %s has following users in queue ( %d user %s total):" , hchannel_get_name ( hchan
), count
, ( count
== 1 )? "" : "s" );
312 for (; hqueue
; hqueue
= hqueue_get_next ( NULL
))
314 if ( strlen ( buffer
) >= 250 )
316 helpmod_reply ( sender
, returntype
, " %s " , buffer
);
319 if ( hqueue_on_queue ( hqueue
))
320 sprintf ( buffer
+ strlen ( buffer
) /* :) */ , " %s ( %s @ %s ) [ %s ] " , huser_get_nick ( hqueue
-> hchanuser
-> husr
), huser_get_ident ( hqueue
-> hchanuser
-> husr
), huser_get_host ( hqueue
-> hchanuser
-> husr
), helpmod_strtime ( time ( NULL
) - hqueue
-> hchanuser
-> time_joined
));
323 helpmod_reply ( sender
, returntype
, " %s " , buffer
);
326 case HQ_NONE
: /* if no parameters are given print the summary */
329 int count_on
= hqueue_count_in_queue ( hchan
);
330 int count_off
= hqueue_count_off_queue ( hchan
);
331 int average
= hqueue_average_time ( hchan
);
333 helpmod_reply ( sender
, returntype
, "Channel %s has %d user %s in queue, %d user %s being helped, average time in queue %s " , hchannel_get_name ( hchan
), count_on
, ( count_on
== 1 )? "" : "s" , count_off
, ( count_off
== 1 )? "" : "s" , helpmod_strtime ( average
));
338 hchannel_user
* hchanuser
= hchan
-> channel_users
;
339 for (; hchanuser
; hchanuser
= hchanuser
-> next
)
341 if ( huser_get_level ( hchanuser
-> husr
) == H_PEON
)
343 huser_channel
* huserchan
= huser_on_channel ( hchanuser
-> husr
, hchan
);
344 assert ( huserchan
!= NULL
);
345 if ( huserchan
-> flags
& HCUMODE_VOICE
)
346 helpmod_channick_modes ( hchanuser
-> husr
, hchan
, MC_DEVOICE
, HLAZY
);
347 huserchan
-> flags
&= ~( HQUEUE_DONE
| H_IDLE_WARNING
);
350 if (! IsModerated ( hchan
-> real_channel
))
351 helpmod_simple_modes ( hchan
, CHANMODE_MODERATE
, 0 , 0 );
352 helpmod_message_channel ( hchan
, "Channel queue has been reset" );
353 helpmod_reply ( sender
, returntype
, "Queue for channel %s has been reset" , hchannel_get_name ( hchan
));
359 void hqueue_handle_queue ( hchannel
* hchan
, huser
* huser
)
361 if (( hchan
-> flags
& ( H_QUEUE
| H_QUEUE_MAINTAIN
)) && hchan
-> autoqueue
&& hqueue_count_in_queue ( hchan
))
363 int dif
= hchan
-> autoqueue
- hqueue_count_off_queue ( hchan
);
365 hqueue_advance ( hchan
, huser
, dif
);
370 int hqueue_get_position ( hchannel
* hchan
, huser
* target
)
373 hqueue_entry
* hqueue
= hqueue_get_next ( hchan
);
375 if ( hchannel_on_channel ( hchan
, target
) == NULL
)
378 if (!( hchan
-> flags
& H_QUEUE
))
381 for ( position
= 0 ; hqueue
; hqueue
= hqueue_get_next ( NULL
))
383 if ( hqueue_on_queue ( hqueue
))
386 if ( hqueue
-> hchanuser
-> husr
== target
)