]>
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
;
110 hchannel_user
* hchanuser
= hchan
-> channel_users
;
114 if ( counter
< 0 || counter
> 25 )
117 if (! huser_valid ( oper
) || ! huser_on_channel ( oper
, hchan
) || ( time ( NULL
) - huser_on_channel ( oper
, hchan
)-> last_activity
> HELPMOD_QUEUE_TIMEOUT
))
122 if ( hchanuser
== NULL
) /* out of users */
126 helpmod_message_channel ( hchan
, "There are no users in the queue" );
130 break ; /* we got something, print the message on channel */
132 huserchan
= huser_on_channel ( hchanuser
-> husr
, hchan
);
134 assert ( huserchan
!= NULL
);
136 if ( huserchan
-> flags
& HQUEUE_DONE
|| huser_get_level ( hchanuser
-> husr
) > H_PEON
)
138 hchanuser
= hchanuser
-> next
; /* user was not in queue, proceed to next one */
142 huserchan
-> flags
|= HQUEUE_DONE
;
146 strcat ( buffer
, huser_get_nick ( hchanuser
-> husr
));
149 if ( hchan
-> flags
& H_DO_STATS
)
150 hstat_add_queue ( hchan
, 1 );
152 if (( hchan
-> flags
& H_QUEUE_SPAMMY
) && ( oper
!= NULL
))
154 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
));
155 if (!( huser_get_account_flags ( oper
) & H_NOSPAM
))
156 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
));
159 helpmod_channick_modes ( hchanuser
-> husr
, hchan
, MC_VOICE
, HLAZY
);
160 huserchan
-> responsible_oper
= oper
;
162 hchanuser
= hchanuser
-> next
;
165 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
));
167 helpmod_message_channel ( hchan
, "user %s %s : Please state your questions on this channel" , ( nadv
- counter
== 1 )? "" : "s" , buffer
);
169 if ( hchan
-> flags
& H_QUEUE_SPAMMY
)
170 hqueue_report_positions ( hchan
);
174 void helpmod_queue_handler ( huser
* sender
, channel
* returntype
, hchannel
* hchan
, int hqueue_action
, char * ostr
, int argc
, char * argv
[])
178 helpmod_reply ( sender
, returntype
, "Can not handle queue: Channel not defined or not found" );
181 switch ( hqueue_action
) /* easy ones */
184 if ( hchan
-> flags
& H_QUEUE
)
185 helpmod_reply ( sender
, returntype
, "Can not activate queue: Queue is already active on channel %s " , hchannel_get_name ( hchan
));
188 hchan
-> flags
|= H_QUEUE
;
189 helpmod_reply ( sender
, returntype
, "Queue activated for channel %s " , hchannel_get_name ( hchan
));
190 hchannel_conf_change ( hchan
, hchan
-> flags
& ~( H_QUEUE
));
191 hchan
-> autoqueue
= 0 ;
195 if (!( hchan
-> flags
& H_QUEUE
))
196 helpmod_reply ( sender
, returntype
, "Can not deactive queue: Queue is not active on %s " , hchannel_get_name ( hchan
));
199 hchan
-> flags
&= ~ H_QUEUE
;
200 helpmod_reply ( sender
, returntype
, "Queue deactivated for channel %s " , hchannel_get_name ( hchan
));
201 hchannel_conf_change ( hchan
, hchan
-> flags
| H_QUEUE
);
202 hchan
-> autoqueue
= 0 ;
204 { /* devoice all users of level H_PEON */
205 hchannel_user
* hchanuser
;
206 huser_channel
* huserchan
;
207 for ( hchanuser
= hchan
-> channel_users
; hchanuser
!= NULL
; hchanuser
= hchanuser
-> next
)
209 huserchan
= huser_on_channel ( hchanuser
-> husr
, hchan
);
210 if ( huser_get_level ( hchanuser
-> husr
) == H_PEON
&& huserchan
-> flags
& HCUMODE_VOICE
)
211 helpmod_channick_modes ( hchanuser
-> husr
, hchan
, MC_DEVOICE
, HLAZY
);
218 if (!( hchan
-> flags
& H_QUEUE
))
220 helpmod_reply ( sender
, returntype
, "Can not handle queue: Queue not active on channel %s " , hchannel_get_name ( hchan
));
223 /* now to the real deal */
224 switch ( hqueue_action
)
231 helpmod_reply ( sender
, returntype
, "Can not advance queue: User not specified" );
234 if ( argc
> H_CMD_MAX_ARGS
)
235 argc
= H_CMD_MAX_ARGS
;
239 huser
* husr
= huser_get ( getnickbynick ( argv
[ i
]));
242 helpmod_reply ( sender
, returntype
, "Can not advance queue: User %s not found" , argv
[ i
]);
245 helpmod_channick_modes ( husr
, hchan
, MC_DEVOICE
, HLAZY
);
248 hqueue_handle_queue ( hchan
, sender
);
256 if (! sscanf ( argv
[ 0 ], " %d " , & nnext
) || nnext
<= 0 || nnext
> 25 /* magic number */ )
258 helpmod_reply ( sender
, returntype
, "Can not advance queue: Integer [1, 25] expected" );
262 hqueue_advance ( hchan
, sender
, nnext
);
270 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
));
273 if (! sscanf ( argv
[ 0 ], " %d " , & tmp
) || tmp
< 0 || tmp
> 25 )
275 helpmod_reply ( sender
, returntype
, "Can not set auto queue: Integer [0, 20] expected" );
278 hchan
-> autoqueue
= tmp
;
281 if ( hchan
-> flags
& H_QUEUE_MAINTAIN
)
283 hchan
-> flags
&= ~( H_QUEUE_MAINTAIN
);
284 helpmod_reply ( sender
, returntype
, "Autoqueue is now disabled for channel %s " , hchannel_get_name ( hchan
));
287 helpmod_reply ( sender
, returntype
, "Autoqueue is not enabled for channel %s " , hchannel_get_name ( hchan
));
289 else if (!( hchan
-> flags
& H_QUEUE_MAINTAIN
))
291 hchan
-> flags
|= H_QUEUE_MAINTAIN
;
292 helpmod_reply ( sender
, returntype
, "Autoqueue for channel %s activated and set to %d succesfully" , hchannel_get_name ( hchan
), hchan
-> autoqueue
);
295 helpmod_reply ( sender
, returntype
, "Autoqueue for channel %s set to %d succesfully" , hchannel_get_name ( hchan
), hchan
-> autoqueue
);
296 hqueue_handle_queue ( hchan
, sender
);
301 int count
= hqueue_count_in_queue ( hchan
);
302 hqueue_entry
* hqueue
= hqueue_get_next ( hchan
);
307 helpmod_reply ( sender
, returntype
, "Channel %s has following users in queue ( %d user %s total):" , hchannel_get_name ( hchan
), count
, ( count
== 1 )? "" : "s" );
309 for (; hqueue
; hqueue
= hqueue_get_next ( NULL
))
311 if ( strlen ( buffer
) >= 250 )
313 helpmod_reply ( sender
, returntype
, " %s " , buffer
);
316 if ( hqueue_on_queue ( hqueue
))
317 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
));
320 helpmod_reply ( sender
, returntype
, " %s " , buffer
);
323 case HQ_NONE
: /* if no parameters are given print the summary */
326 int count_on
= hqueue_count_in_queue ( hchan
);
327 int count_off
= hqueue_count_off_queue ( hchan
);
328 int average
= hqueue_average_time ( hchan
);
330 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
));
335 hchannel_user
* hchanuser
= hchan
-> channel_users
;
336 for (; hchanuser
; hchanuser
= hchanuser
-> next
)
338 if ( huser_get_level ( hchanuser
-> husr
) == H_PEON
)
340 huser_channel
* huserchan
= huser_on_channel ( hchanuser
-> husr
, hchan
);
341 assert ( huserchan
!= NULL
);
342 if ( huserchan
-> flags
& HCUMODE_VOICE
)
343 helpmod_channick_modes ( hchanuser
-> husr
, hchan
, MC_DEVOICE
, HLAZY
);
344 huserchan
-> flags
&= ~( HQUEUE_DONE
| H_IDLE_WARNING
);
347 if (! IsModerated ( hchan
-> real_channel
))
348 helpmod_simple_modes ( hchan
, CHANMODE_MODERATE
, 0 , 0 );
349 helpmod_message_channel ( hchan
, "Channel queue has been reset" );
350 helpmod_reply ( sender
, returntype
, "Queue for channel %s has been reset" , hchannel_get_name ( hchan
));
356 void hqueue_handle_queue ( hchannel
* hchan
, huser
* huser
)
358 if (( hchan
-> flags
& ( H_QUEUE
| H_QUEUE_MAINTAIN
)) && hchan
-> autoqueue
&& hqueue_count_in_queue ( hchan
))
360 int dif
= hchan
-> autoqueue
- hqueue_count_off_queue ( hchan
);
362 hqueue_advance ( hchan
, huser
, dif
);
367 int hqueue_get_position ( hchannel
* hchan
, huser
* target
)
370 hqueue_entry
* hqueue
= hqueue_get_next ( hchan
);
372 if ( hchannel_on_channel ( hchan
, target
) == NULL
)
375 if (!( hchan
-> flags
& H_QUEUE
))
378 for ( position
= 0 ; hqueue
; hqueue
= hqueue_get_next ( NULL
))
380 if ( hqueue_on_queue ( hqueue
))
383 if ( hqueue
-> hchanuser
-> husr
== target
)