#include <modules/server/egg_server_api.h>
#include "egg_chanserv_internal.h"
#include "events.h"
Go to the source code of this file.
Data Structures | |
struct | chanserv_member_stats_t |
struct | chanserv_channel_stats |
struct | chanserv_config_t |
Defines | |
#define | CHANSERV_CLEANUP_TIME 120 |
#define | CHANSERV_CLEANUP_TIMER 60 |
Typedefs | |
typedef struct chanserv_channel_stats | chanserv_channel_stats_t |
Enumerations | |
enum | { CHANSERV_STAT_JOIN = 0, CHANSERV_STAT_PART, CHANSERV_STAT_QUIT, CHANSERV_STAT_CYCLE, CHANSERV_STAT_LEAVE, CHANSERV_STAT_CTCP, CHANSERV_STAT_MSG, CHANSERV_STAT_NOTICE, CHANSERV_STAT_LINE, CHANSERV_STAT_NICK, CHANSERV_STAT_KICK, CHANSERV_STAT_MODE, CHANSERV_STAT_MODEFIGHT, CHANSERV_STAT_TOPIC, CHANSERV_STAT_LEN } |
Functions | |
int | chanserv_lookup_config (const char *chan, int stat, int *limit, int *period) |
chanserv_channel_stats_t * | chanserv_probe_chan (const char *chan, int create) |
int | chanserv_update_stats (int stat, const char *chan, const char *nick, const char *uhost) |
Variables | |
chanserv_config_t | chanserv_config |
egg_server_api_t * | server |
#define CHANSERV_CLEANUP_TIME 120 |
#define CHANSERV_CLEANUP_TIMER 60 |
typedef struct chanserv_channel_stats chanserv_channel_stats_t |
anonymous enum |
Definition at line 32 of file chanserv.h.
00032 { 00033 CHANSERV_STAT_JOIN = 0, 00034 CHANSERV_STAT_PART, 00035 CHANSERV_STAT_QUIT, 00036 CHANSERV_STAT_CYCLE, 00037 CHANSERV_STAT_LEAVE, 00038 CHANSERV_STAT_CTCP, 00039 CHANSERV_STAT_MSG, 00040 CHANSERV_STAT_NOTICE, 00041 CHANSERV_STAT_LINE, 00042 CHANSERV_STAT_NICK, 00043 CHANSERV_STAT_KICK, 00044 CHANSERV_STAT_MODE, 00045 CHANSERV_STAT_MODEFIGHT, 00046 CHANSERV_STAT_TOPIC, 00047 CHANSERV_STAT_LEN 00048 };
int chanserv_lookup_config | ( | const char * | chan, | |
int | stat, | |||
int * | limit, | |||
int * | period | |||
) |
Definition at line 195 of file chanserv.c.
References chanserv_config_t::channel_limits, chanserv_config_t::channel_periods, chanserv_probe_chan, chanserv_channel_stats::limits, and chanserv_channel_stats::periods.
00196 { 00197 chanserv_channel_stats_t *chanstats; 00198 00199 chanstats = chanserv_probe_chan(chan, 1); 00200 if (limit) { 00201 *limit = chanstats->limits[stat]; 00202 if (*limit < 0) *limit = chanserv_config.channel_limits[stat]; 00203 } 00204 if (period) { 00205 *period = chanstats->periods[stat]; 00206 if (*period < 0) *period = chanserv_config.channel_periods[stat]; 00207 } 00208 return(0); 00209 }
chanserv_channel_stats_t* chanserv_probe_chan | ( | const char * | chan, | |
int | create | |||
) |
Definition at line 147 of file chanserv.c.
References chanserv_refresh_channel_config, chanserv_channel_stats::name, chanserv_channel_stats::next, NULL, and chanserv_channel_stats::prev.
00148 { 00149 chanserv_channel_stats_t *chanstats, *prev; 00150 00151 prev = NULL; 00152 for (chanstats = chanstats_head; chanstats; chanstats = chanstats->next) { 00153 if (!strcasecmp(chanstats->name, chan)) return(chanstats); 00154 prev = chanstats; 00155 } 00156 if (!create) return(NULL); 00157 00158 /* Create new channel. */ 00159 chanstats = calloc(1, sizeof(*chanstats)); 00160 chanstats->name = strdup(chan); 00161 chanserv_refresh_channel_config(chanstats); 00162 00163 if (prev) prev->next = chanstats; 00164 else chanstats_head = chanstats; 00165 chanstats->prev = prev; 00166 return(chanstats); 00167 }
int chanserv_update_stats | ( | int | stat, | |
const char * | chan, | |||
const char * | nick, | |||
const char * | uhost | |||
) |
Definition at line 211 of file chanserv.c.
References bind_check(), channel_config_names, chanserv_config_t::channel_limits, chanserv_config_t::channel_periods, chanserv_probe_chan, chanserv_probe_member, CHANSERV_STAT_CYCLE, CHANSERV_STAT_JOIN, CHANSERV_STAT_LEAVE, CHANSERV_STAT_LEN, chanserv_update_stats, chanserv_config_t::cycle_time, chanserv_member_stats_t::last_event, chanserv_member_stats_t::last_event_time, chanserv_channel_stats::last_event_time, chanserv_channel_stats::limits, now, NULL, chanserv_channel_stats::periods, chanserv_member_stats_t::stats, chanserv_channel_stats::stats, and timer_get_now_sec().
00212 { 00213 chanserv_channel_stats_t *chanstats = NULL; 00214 chanserv_member_stats_t *m = NULL; 00215 int period, limit; 00216 time_t now; 00217 int diff; 00218 00219 if (stat < 0 || stat >= CHANSERV_STAT_LEN) return(-1); 00220 if (!nick || !uhost) return(-1); 00221 00222 if (chan) chanstats = chanserv_probe_chan(chan, 1); 00223 m = chanserv_probe_member(chanstats, nick, uhost, 1); 00224 if (!m) return(-1); 00225 00226 /* Take care of channel stats first. */ 00227 00228 now = timer_get_now_sec(NULL); 00229 00230 if (chanstats) { 00231 /* Figure out the period and limit for this stat. */ 00232 period = chanstats->periods[stat]; 00233 if (period < 0) period = chanserv_config.channel_periods[stat]; 00234 if (period > 0) { 00235 limit = chanstats->limits[stat]; 00236 if (limit < 0) limit = chanserv_config.channel_limits[stat]; 00237 00238 /* Adjust stats for time difference of this event 00239 * relative to the last one. */ 00240 diff = now - chanstats->last_event_time[stat]; 00241 if (diff > period) { 00242 chanstats->last_event_time[stat] = now; 00243 chanstats->stats[stat] = 0; 00244 diff = 0; 00245 } 00246 chanstats->stats[stat]++; 00247 00248 if (chanstats->stats[stat] > limit) { 00249 bind_check(BT_chanflood, NULL, channel_config_names[stat], channel_config_names[stat], chan, limit, period, diff); 00250 chanstats->last_event_time[stat] = now; 00251 chanstats->stats[stat] = 0; 00252 } 00253 } 00254 } 00255 00256 /* Now update member stats. */ 00257 if (m) { 00258 m->last_event = now; 00259 /* Figure out the period and limit for this stat. */ 00260 period = global_chan.periods[stat]; 00261 if (period > 0) { 00262 limit = global_chan.limits[stat]; 00263 00264 /* Adjust stats for time difference of this event 00265 * relative to the last one. */ 00266 diff = now - m->last_event_time[stat]; 00267 if (diff > period) { 00268 m->last_event_time[stat] = now; 00269 m->stats[stat] = 0; 00270 diff = 0; 00271 } 00272 m->stats[stat]++; 00273 00274 if (m->stats[stat] > limit) { 00275 bind_check(BT_memflood, NULL, channel_config_names[stat], channel_config_names[stat], chan, nick, uhost, limit, period, diff); 00276 m->last_event_time[stat] = now; 00277 m->stats[stat] = 0; 00278 } 00279 } 00280 00281 switch (stat) { 00282 case CHANSERV_STAT_LEAVE: 00283 if (now - m->last_event_time[CHANSERV_STAT_JOIN] < chanserv_config.cycle_time) { 00284 chanserv_update_stats(CHANSERV_STAT_CYCLE, chan, nick, uhost); 00285 } 00286 break; 00287 } 00288 } 00289 return(0); 00290 }
Definition at line 28 of file chanserv.c.
Definition at line 29 of file chanserv.c.