modules/chanserv/chanserv.h File Reference

#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_tchanserv_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_tserver


Define Documentation

#define CHANSERV_CLEANUP_TIME   120

Definition at line 29 of file chanserv.h.

Referenced by cleanup_old_members().

#define CHANSERV_CLEANUP_TIMER   60

Definition at line 30 of file chanserv.h.

Referenced by chanserv_init().


Typedef Documentation


Enumeration Type Documentation

anonymous enum

Enumerator:
CHANSERV_STAT_JOIN 
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 

Definition at line 32 of file chanserv.h.


Function Documentation

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 }


Variable Documentation

Definition at line 28 of file chanserv.c.

Definition at line 29 of file chanserv.c.


Generated on Sun Nov 30 18:43:35 2008 for eggdrop1.9 by  doxygen 1.5.6