]>
jfr.im git - solanum.git/blob - src/tgchange.c
2 * charybdis: an advanced Internet Relay Chat Daemon(ircd).
3 * tgchange.c - code for restricting private messages
5 * Copyright (C) 2004-2005 Lee Hardy <lee@leeh.co.uk>
6 * Copyright (C) 2005-2010 Jilles Tjoelker <jilles@stack.nl>
7 * Copyright (C) 2004-2005 ircd-ratbox development team
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
31 #include "s_newconf.h"
34 find_allowing_channel(struct Client
*source_p
, struct Client
*target_p
)
37 struct membership
*msptr
;
39 RB_DLINK_FOREACH(ptr
, source_p
->user
->channel
.head
)
42 if (is_chanop_voiced(msptr
) && IsMember(target_p
, msptr
->chptr
))
49 add_target(struct Client
*source_p
, struct Client
*target_p
)
55 /* can msg themselves or services without using any target slots */
56 if(source_p
== target_p
|| IsService(target_p
))
59 /* special condition for those who have had PRIVMSG crippled to allow them
60 * to talk to IRCops still.
62 * XXX: is this controversial?
64 if(source_p
->localClient
->target_last
> rb_current_time() && IsOper(target_p
))
67 hashv
= fnv_hash_upper((const unsigned char *)use_id(target_p
), 32);
68 targets
= source_p
->localClient
->targets
;
70 /* check for existing target, and move it to the head */
71 for(i
= 0; i
< TGCHANGE_NUM
+ TGCHANGE_REPLY
; i
++)
73 if(targets
[i
] == hashv
)
75 for(j
= i
; j
> 0; j
--)
76 targets
[j
] = targets
[j
- 1];
82 if(source_p
->localClient
->targets_free
< TGCHANGE_NUM
)
84 /* first message after connect, we may only start clearing
85 * slots after this message --anfl
87 if(!IsTGChange(source_p
))
89 SetTGChange(source_p
);
90 source_p
->localClient
->target_last
= rb_current_time();
92 /* clear as many targets as we can */
93 else if((i
= (rb_current_time() - source_p
->localClient
->target_last
) / 60))
95 if(i
+ source_p
->localClient
->targets_free
> TGCHANGE_NUM
)
96 source_p
->localClient
->targets_free
= TGCHANGE_NUM
;
98 source_p
->localClient
->targets_free
+= i
;
100 source_p
->localClient
->target_last
= rb_current_time();
102 /* cant clear any, full target list */
103 else if(source_p
->localClient
->targets_free
== 0)
105 ServerStats
.is_tgch
++;
106 add_tgchange(source_p
->sockhost
);
110 /* no targets in use, reset their target_last so that they cant
111 * abuse a long idle to get targets back more quickly
115 source_p
->localClient
->target_last
= rb_current_time();
116 SetTGChange(source_p
);
119 for(i
= TGCHANGE_NUM
+ TGCHANGE_REPLY
- 1; i
> 0; i
--)
120 targets
[i
] = targets
[i
- 1];
122 source_p
->localClient
->targets_free
--;
127 add_reply_target(struct Client
*source_p
, struct Client
*target_p
)
133 /* can msg themselves or services without using any target slots */
134 if(source_p
== target_p
|| IsService(target_p
))
137 hashv
= fnv_hash_upper((const unsigned char *)use_id(target_p
), 32);
138 targets
= source_p
->localClient
->targets
;
140 /* check for existing target, and move it to the first reply slot
141 * if it is in a reply slot
143 for(i
= 0; i
< TGCHANGE_NUM
+ TGCHANGE_REPLY
; i
++)
145 if(targets
[i
] == hashv
)
149 for(j
= i
; j
> TGCHANGE_NUM
; j
--)
150 targets
[j
] = targets
[j
- 1];
151 targets
[TGCHANGE_NUM
] = hashv
;
156 for(i
= TGCHANGE_NUM
+ TGCHANGE_REPLY
- 1; i
> TGCHANGE_NUM
; i
--)
157 targets
[i
] = targets
[i
- 1];
158 targets
[TGCHANGE_NUM
] = hashv
;