5 #include "../lib/sstring.h"
6 #include "../lib/irc_string.h"
7 #include "../channel/channel.h"
8 #include "../localuser/localuserchannel.h"
9 #include "../core/schedule.h"
19 hchannel
*hchannel_add(const char *cname
)
24 cp
= findchannel((char*)cname
);
27 localcreatechannel(helpmodnick
, (char*)cname
);
28 cp
= findchannel((char*)cname
);
32 localjoinchannel(helpmodnick
, cp
);
33 localgetops(helpmodnick
, cp
);
36 hchan
= (hchannel
*)malloc(sizeof(hchannel
));
38 hchan
->welcome
[0] = '\0';
39 hchan
->real_channel
= cp
;
40 hchan
->flags
= H_CHANFLAGS_DEFAULT
;
41 hchan
->channel_users
= NULL
;
42 hchan
->channel_hterms
= NULL
;
43 hchan
->max_idle
= 5 * HDEF_m
;
45 hchan
->report_to
= NULL
;
48 hchan
->jf_control
= time(NULL
);
49 hchan
->lc_profile
= NULL
;
52 hchan
->htickets
= NULL
;
54 hchan
->stats
= get_hstat_channel();
56 hchan
->next
= hchannels
;
64 for (i
=0;i
< hchan
->real_channel
->users
->hashsize
;i
++)
66 nck
= getnickbynumeric(hchan
->real_channel
->users
->content
[i
]);
67 if (!nck
) /* it's a hash, not an array */
70 if ((husr
= huser_get(nck
)) == NULL
)
71 husr
= huser_add(nck
);
73 fprintf(hdebug_file, "%d ADD (hchannel_add) %s to %s\n", time(NULL), husr->real_user->nick, hchannel_get_name(hchan));
76 tmp
= huser_add_channel(husr
, hchan
);
77 hchannel_add_user(hchan
, husr
);
79 if (hchan
->real_channel
->users
->content
[i
] & CUMODE_OP
)
80 tmp
->flags
|= HCUMODE_OP
;
81 if (hchan
->real_channel
->users
->content
[i
] & CUMODE_VOICE
)
82 tmp
->flags
|= HCUMODE_VOICE
;
88 int hchannel_del(hchannel
*hchan
)
90 hchannel
*tmp
, **ptr
= &hchannels
;
92 for (;*ptr
;ptr
= &(*ptr
)->next
)
100 hcensor_del_all(&(hchan
->censor
));
101 hterm_del_all(&hchan
->channel_hterms
);
102 htopic_del_all(&hchan
->topic
);
103 hstat_del_channel(hchan
);
106 while (hchan
->htickets
)
107 hticket_del(hchan
->htickets
, hchan
);
109 localpartchannel(helpmodnick
, hchan
->real_channel
);
118 int hchannel_authority(hchannel
*hchan
, struct huser_struct
*husr
)
120 if ((hchan
->flags
& H_OPER_ONLY
) && (huser_get_level(husr
) < H_OPER
))
125 hchannel
*hchannel_get_by_name(const char *cname
)
127 hchannel
*tmp
= hchannels
;
128 for (;tmp
;tmp
=tmp
->next
)
129 if (!ircd_strcmp(cname
, tmp
->real_channel
->index
->name
->content
))
134 hchannel
*hchannel_get_by_channel(channel
*chan
)
142 for (;tmp
;tmp
=tmp
->next
)
143 if (tmp
->real_channel
== chan
)
148 const char *hchannel_get_state(hchannel
* hchan
, int mask
)
150 if (hchan
->flags
& mask
)
156 const char *hchannel_get_name(hchannel
*hchan
)
158 return hchan
->real_channel
->index
->name
->content
;
161 void hchannel_del_all(void)
164 hchannel_del(hchannels
);
167 hchannel_user
*hchannel_on_channel(hchannel
*hchan
, struct huser_struct
*husr
)
169 hchannel_user
*ptr
= hchan
->channel_users
;
170 for (;ptr
;ptr
= ptr
->next
)
171 if (ptr
->husr
== husr
)
176 hchannel_user
*hchannel_add_user(hchannel
*hchan
, struct huser_struct
*husr
)
178 hchannel_user
**tmp
= &(hchan
->channel_users
);
179 assert(hchannel_on_channel(hchan
, husr
) == NULL
);
181 for (;*tmp
;tmp
= &(*tmp
)->next
);
183 *tmp
= (hchannel_user
*)malloc(sizeof(hchannel_user
));
185 (*tmp
)->time_joined
= time(NULL
);
188 assert(hchannel_on_channel(hchan
, husr
) != NULL
);
193 hchannel_user
*hchannel_del_user(hchannel
*hchan
, struct huser_struct
*husr
)
195 hchannel_user
**tmp
= &(hchan
->channel_users
);
196 assert(hchannel_on_channel(hchan
, husr
) != NULL
);
198 for (;*tmp
;tmp
= &(*tmp
)->next
)
199 if ((*tmp
)->husr
== husr
)
201 hchannel_user
*ptr
= (*tmp
)->next
;
205 assert(hchannel_on_channel(hchan
, husr
) == NULL
);
211 void hchannel_remove_inactive_users(void)
213 hchannel
*hchan
= hchannels
;
215 for (;hchan
;hchan
= hchan
->next
)
217 if (hchan
->flags
& H_ANTI_IDLE
&& !(hchan
->flags
& H_PASSIVE
))
219 hchannel_user
**hchanuser
= &hchan
->channel_users
;
222 if ((huser_get_level((*hchanuser
)->husr
) == H_PEON
) && (time(NULL
) - huser_on_channel((*hchanuser
)->husr
,hchan
)->last_activity
>= hchan
->max_idle
) && !on_queue((*hchanuser
)->husr
, huser_on_channel((*hchanuser
)->husr
, hchan
)))
224 if (huser_on_channel((*hchanuser
)->husr
, hchan
)->flags
& H_IDLE_WARNING
)
226 const char *banmask
= hban_ban_string((*hchanuser
)->husr
->real_user
, HBAN_REAL_HOST
);
227 helpmod_setban(hchan
, banmask
, time(NULL
) + 10 * HDEF_m
, MCB_ADD
, HNOW
);
229 helpmod_kick(hchan
, (*hchanuser
)->husr
, "Please do not idle in %s", hchannel_get_name(hchan
));
234 helpmod_reply((*hchanuser
)->husr
, NULL
, "You are currently idle in %s. Please part the channel if you have nothing to do there", hchannel_get_name(hchan
));
235 huser_on_channel((*hchanuser
)->husr
, hchan
)->flags
|= H_IDLE_WARNING
;
238 hchanuser
= &(*hchanuser
)->next
;
241 /* Additionally, test if the channel has queue but no idle opers / staff */
242 if (hchan
->flags
& H_QUEUE
&& hchan
->flags
& H_QUEUE_TIMEOUT
)
245 for (tmp
= hchan
->channel_users
;tmp
;tmp
= tmp
->next
)
246 if (huser_get_level(tmp
->husr
) > H_PEON
)
248 huser_channel
*huserchan
= huser_on_channel(tmp
->husr
, hchan
);
249 if ((time(NULL
) - huserchan
->last_activity
< HELPMOD_QUEUE_TIMEOUT
) && (huserchan
->last_activity
!= tmp
->time_joined
))
254 hchan
->flags
&= ~H_QUEUE
;
255 if (hchan
->flags
& H_REPORT
&& hchannel_is_valid(hchan
->report_to
))
256 helpmod_message_channel(hchan
->report_to
, "%s: Channel queue deactivated because of inactivity", hchannel_get_name(hchan
));
257 hchannel_conf_change(hchan
, hchan
->flags
| H_QUEUE
);
263 void hchannel_report(void)
265 hchannel
*hchan
= hchannels
;
266 for (;hchan
;hchan
= hchan
->next
)
267 if (hchan
->flags
& H_REPORT
&& !(hchan
->flags
& H_PASSIVE
) && hchannel_is_valid(hchan
->report_to
))
269 int total
= hchannel_count_users(hchan
, H_ANY
);
270 int peons
= hchannel_count_users(hchan
, H_PEON
);
271 int services
= hchannel_count_users(hchan
, H_SERVICE
);
276 if (hchan
->flags
& H_QUEUE
)
278 int peons_queue
= hchannel_count_queue(hchan
);
279 helpmod_message_channel(hchan
->report_to
, "%s: %d user%s in queue and %d user%s currently receiving support. %d Non-user%s. Average queue time %s", hchannel_get_name(hchan
), peons_queue
, (peons_queue
==1)?"":"s", peons
- peons_queue
, (peons
- peons_queue
== 1)?"":"s", total
-peons
-services
, (total
-peons
-services
== 1)?"":"s", helpmod_strtime(hqueue_average_time(hchan
)));
282 helpmod_message_channel(hchan
->report_to
, "%s: %d user%s and %d non-user%s", hchannel_get_name(hchan
), peons
, (peons
== 1)?"":"s", total
-peons
-services
, (total
-peons
-services
== 1)?"":"s");
286 void hchannel_set_topic(hchannel
*hchan
)
288 if (hchan
->flags
& H_HANDLE_TOPIC
)
289 helpmod_set_topic(hchan
, htopic_construct(hchan
->topic
));
292 void hchannels_match_accounts(void)
294 hchannel
*hchan
= hchannels
;
295 hchannel_user
*hchanuser
;
296 for (;hchan
;hchan
= hchan
->next
)
297 for (hchanuser
= hchan
->channel_users
;hchanuser
;hchanuser
= hchanuser
->next
)
298 if (hchanuser
->husr
->account
== NULL
&& IsAccount(hchanuser
->husr
->real_user
))
299 hchanuser
->husr
->account
= haccount_get_by_name(hchanuser
->husr
->real_user
->authname
);
302 int hchannels_on_queue(huser
*husr
)
304 huser_channel
*huserchan
= husr
->hchannels
;
305 for (;huserchan
;huserchan
= huserchan
->next
)
306 if (on_queue(husr
, huserchan
))
311 int hchannels_on_desk(struct huser_struct
* husr
)
313 huser_channel
*huserchan
= husr
->hchannels
;
314 for (;huserchan
;huserchan
= huserchan
->next
)
315 if (on_desk(husr
, huserchan
))
320 void hchannels_dnmo(struct huser_struct
*husr
)
322 hchannel
*hchan
= hchannels
;
323 for (;hchan
;hchan
= hchan
->next
)
325 huser_channel
*huserchan
= huser_on_channel(husr
, hchan
);
326 /*if (on_queue(husr, huserchan) || on_desk(husr, huserchan))*/
327 if (huserchan
!= NULL
)
329 hchannel_user
*tmp
, **hchanuser
= &hchan
->channel_users
;
330 for (;*hchanuser
;hchanuser
= &(*hchanuser
)->next
)
331 if ((*hchanuser
)->husr
== husr
)
334 *hchanuser
= (*hchanuser
)->next
;
339 (*hchanuser
)->next
= NULL
;
340 if (on_desk(husr
, huserchan
))
342 helpmod_channick_modes(husr
, hchan
, MC_DEVOICE
, HLAZY
);
343 huserchan
->flags
&= ~HQUEUE_DONE
;
349 int hchannel_count_users(hchannel
*hchan
, hlevel lvl
)
352 hchannel_user
*hchanuser
= hchan
->channel_users
;
353 for (;hchanuser
;hchanuser
= hchanuser
->next
)
356 else if (huser_get_level(hchanuser
->husr
) == lvl
)
361 int hchannel_count_queue(hchannel
*hchan
)
364 hchannel_user
*hchanuser
= hchan
->channel_users
;
365 for (;hchanuser
;hchanuser
= hchanuser
->next
)
367 if (on_queue(hchanuser
->husr
, huser_on_channel(hchanuser
->husr
, hchan
)))
373 int hchannel_is_valid(hchannel
*hchan
)
375 hchannel
*ptr
= hchannels
;
376 for (;ptr
;ptr
= ptr
->next
)
382 void hchannel_mode_check(hchannel
*hchan
)
384 if (((hchan
->flags
& H_MAINTAIN_M
) || (hchan
->flags
& H_QUEUE
)) && !IsModerated(hchan
->real_channel
))
385 helpmod_simple_modes(hchan
, CHANMODE_MODERATE
, 0,0);
386 else if (!((hchan
->flags
& H_MAINTAIN_M
) || (hchan
->flags
& H_QUEUE
)) && IsModerated(hchan
->real_channel
))
387 helpmod_simple_modes(hchan
, 0, CHANMODE_MODERATE
,0);
388 if (hchan
->flags
& H_MAINTAIN_I
&& !IsInviteOnly(hchan
->real_channel
))
389 helpmod_simple_modes(hchan
, CHANMODE_INVITEONLY
, 0,0);
390 else if (!(hchan
->flags
& H_MAINTAIN_I
) && IsInviteOnly(hchan
->real_channel
))
391 helpmod_simple_modes(hchan
, 0, CHANMODE_INVITEONLY
, 0);
394 void hchannel_conf_change(hchannel
*hchan
, int old_flags
)
399 for (i
=0;i
<HCHANNEL_CONF_COUNT
;i
++)
401 if ((hchan
->flags
^ old_flags
) & (1 << i
))
403 change
= (hchan
->flags
& (1 << i
))?H_ON
:H_OFF
;
407 hchannel_mode_check(hchan
);
409 helpmod_message_channel(hchan
, "Channel queue has been activated, all users enqueued");
411 helpmod_message_channel(hchan
, "Channel queue has been deactivated");
415 hchannel_mode_check(hchan
);
422 int hchannel_count(void)
424 hchannel
*hchan
= hchannels
;
426 for (;hchan
;hchan
= hchan
->next
)
431 void hchannel_activate_join_flood(hchannel
*hchan
)
433 hchannel_user
**hchanuser
= &hchan
->channel_users
;
434 helpmod_simple_modes(hchan
, CHANMODE_REGONLY
, 0, 1);
436 /* clean the channel of the already joined clients */
438 if (((*hchanuser
)->time_joined
> (time(NULL
) - 5)) && huser_get_level((*hchanuser
)->husr
) < H_STAFF
)
439 helpmod_kick(hchan
, (*hchanuser
)->husr
, "Join flood");
441 hchanuser
= &(*hchanuser
)->next
;
443 hchan
->flags
|= H_JOIN_FLOOD
;
445 scheduleoneshot(time(NULL
) + 60, &hchannel_deactivate_join_flood
, NULL
);
447 /* goes to schedule */
448 void hchannel_deactivate_join_flood()
450 hchannel
*hchan
= hchannels
;
451 for (;hchan
;hchan
= hchan
->next
)
452 if (hchan
->flags
& H_JOIN_FLOOD
)
454 helpmod_simple_modes(hchan
, 0, CHANMODE_REGONLY
, 1);
455 hchan
->flags
&= ~H_JOIN_FLOOD
;
457 /*if (IsRegOnly(hchan->real_channel) && hchan->jf_control < time(NULL))
459 helpmod_simple_modes(hchan, 0, CHANMODE_REGONLY, 1);
463 scheduleoneshot(time(NULL) + 60, &hchannel_deactivate_join_flood, NULL);
467 const char *hchannel_get_sname(int flag
)
469 if (flag
< 0 || flag
> HCHANNEL_CONF_COUNT
)
475 return "Passive state";
477 return "Welcome message";
479 return "JoinFlood protection";
483 return "Verbose queue (requires queue)";
485 return "Auto queue (requires queue)";
487 return "Channel status reporting";
489 return "Pattern censor";
491 return "Lamer control";
493 return "Idle user removal";
495 return "Keep channel moderated";
497 return "Keep channel invite only";
499 return "Handle channel topic";
501 return "Calculate statistic";
503 return "Remove joining trojans";
505 return "Channel commands";
507 return "Oper only channel";
509 return "Disallow bold, underline, etc.";
511 return "Queue inactivity deactivation";
513 return "Require a ticket to join";
515 return "error, please contact strutsi";