modules/server/channel_events.c File Reference

#include "server.h"

Go to the source code of this file.

Functions

static void clear_masklist (channel_mask_list_t *l)
static int got_list_item (void *client_data, char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int got_list_end (void *client_data, char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static void clear_masklists (channel_t *chan)
void channel_events_init ()
static void free_member (channel_member_t *m)
void channel_free_online (channel_t *chan)
void channel_events_destroy ()
static channel_member_tchannel_add_member (channel_t *chan, const char *nick, const char *uhost)
channel_member_tchannel_lookup_member (channel_t *chan, const char *nick)
void channel_on_connect ()
void channel_on_join (const char *chan_name, const char *nick, const char *uhost)
void channel_on_leave (const char *chan_name, const char *nick, const char *uhost, user_t *u)
void channel_on_quit (const char *nick, const char *uhost, user_t *u)
void channel_on_nick (const char *old_nick, const char *new_nick)
static int got352 (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int got315 (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int got353 (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int got366 (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int gottopic (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int got331 (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int got332 (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int got333 (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int gotjoin (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int gotpart (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int gotquit (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int gotkick (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int gotnick (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static void parse_chan_mode (char *from_nick, char *from_uhost, user_t *u, int nargs, char *args[], int trigger_bind)
static int got324 (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])
static int gotmode (char *from_nick, char *from_uhost, user_t *u, char *cmd, int nargs, char *args[])

Variables

static const char rcsid [] = "$Id: channel_events.c,v 1.6 2008-10-17 15:57:43 sven Exp $"
static bind_list_t channel_raw_binds []


Function Documentation

static channel_member_t* channel_add_member ( channel_t chan,
const char *  nick,
const char *  uhost 
) [static]

Definition at line 119 of file channel_events.c.

References current_server, channel_member::join_time, channel::member_head, channel_member::next, channel_member::nick, channel::nmembers, timer_get_now_sec(), channel_member::uhost, and uhost_cache_addref.

Referenced by channel_on_join(), got352(), and got353().

00120 {
00121   channel_member_t *m;
00122 
00123   /* See if this member is already added. */
00124   for (m = chan->member_head; m; m = m->next) {
00125     if (!(current_server.strcmp)(m->nick, nick)) break;
00126   }
00127 
00128   /* Do we need to create a new member? */
00129   if (!m) {
00130     m = calloc(1, sizeof(*m));
00131     m->nick = strdup(nick);
00132     timer_get_now_sec(&m->join_time);
00133     m->next = chan->member_head;
00134     chan->member_head = m;
00135     chan->nmembers++;
00136   }
00137 
00138   /* Do we need to fill in the uhost? */
00139   if (uhost && !m->uhost) {
00140     m->uhost = strdup(uhost);
00141   }
00142 
00143   uhost_cache_addref(nick, uhost);
00144 
00145   return(m);
00146 }

void channel_events_destroy (  ) 

Definition at line 114 of file channel_events.c.

References bind_rem_list().

00115 {
00116   bind_rem_list("raw", channel_raw_binds);
00117 }

void channel_events_init (  ) 

Definition at line 34 of file channel_events.c.

References bind_add_list(), bind_entry_add(), bind_table_lookup_or_fake(), BIND_WANTS_CD, got_list_end(), got_list_item(), and NULL.

00035 {
00036   bind_table_t *table;
00037 
00038   bind_add_list("raw", channel_raw_binds);
00039   table = bind_table_lookup_or_fake("raw");
00040   if (!table) return;
00041 
00042   /* FIXME Putting these here for now... but they should probably be
00043    * configurable or moved to an addon module/script. */
00044   bind_entry_add(table, NULL, "367", "banlistitem", BIND_WANTS_CD, got_list_item, (void *)'b', NULL);
00045   bind_entry_add(table, NULL, "346", "invitelistitem", BIND_WANTS_CD, got_list_item, (void *)'I', NULL);
00046   bind_entry_add(table, NULL, "348", "exceptlistitem", BIND_WANTS_CD, got_list_item, (void *)'e', NULL);
00047   bind_entry_add(table, NULL, "368", "banlistend", BIND_WANTS_CD, got_list_end, (void *)'b', NULL);
00048   bind_entry_add(table, NULL, "347", "invitelistend", BIND_WANTS_CD, got_list_end, (void *)'I', NULL);
00049   bind_entry_add(table, NULL, "349", "exceptlistend", BIND_WANTS_CD, got_list_end, (void *)'e', NULL);
00050 }

void channel_free_online ( channel_t chan  ) 

Definition at line 85 of file channel_events.c.

References channel::args, clear_masklists(), free_member(), channel::key, channel::limit, channel::member_head, channel::nargs, channel_member::next, channel_member::nick, channel::nmembers, NULL, channel::status, channel::topic, channel::topic_nick, uhost_cache_decref, and channel_mode_arg::value.

00086 {
00087   channel_member_t *m, *next_mem;
00088   int i;
00089 
00090   for (m = chan->member_head; m; m = next_mem) {
00091     next_mem = m->next;
00092     uhost_cache_decref(m->nick);
00093     free_member(m);
00094   }
00095 
00096   if (chan->topic) free(chan->topic);
00097   if (chan->topic_nick) free(chan->topic_nick);
00098   if (chan->key) free(chan->key);
00099 
00100   clear_masklists(chan);
00101 
00102   for (i = 0; i < chan->nargs; i++) {
00103     if (chan->args[i].value) free(chan->args[i].value);
00104   }
00105   if (chan->args) free(chan->args);
00106 
00107   chan->topic = chan->topic_nick = chan->key = NULL;
00108   chan->args = NULL;
00109   chan->member_head = NULL;
00110   chan->status = chan->nargs = chan->nmembers = 0;
00111   chan->limit = -1;
00112 }

channel_member_t* channel_lookup_member ( channel_t chan,
const char *  nick 
)

Definition at line 148 of file channel_events.c.

References current_server, channel::member_head, channel_member::next, and channel_member::nick.

00149 {
00150   channel_member_t *m;
00151 
00152   for (m = chan->member_head; m; m = m->next) {
00153     if (!(current_server.strcmp)(m->nick, nick)) break;
00154   }
00155   return(m);
00156 }

void channel_on_connect (  ) 

Definition at line 159 of file channel_events.c.

References channel_get, channel_get_int, channel_head, channel::name, channel::next, NULL, printserv, and SERVER_NORMAL.

00160 {
00161   channel_t *chan;
00162   char *key;
00163   int inactive;
00164 
00165   for (chan = channel_head; chan; chan = chan->next) {
00166     channel_get_int(chan, &inactive, "inactive", 0, NULL);
00167     if (inactive) continue;
00168     channel_get(chan, &key, "key", 0, NULL);
00169     if (key && strlen(key)) printserv(SERVER_NORMAL, "JOIN %s %s", chan->name, key);
00170     else printserv(SERVER_NORMAL, "JOIN %s", chan->name);
00171   }
00172 }

void channel_on_join ( const char *  chan_name,
const char *  nick,
const char *  uhost 
)

Definition at line 174 of file channel_events.c.

References channel::bot, channel_add_member(), CHANNEL_JOINED, channel_probe, CHANNEL_WHOLIST, current_server, channel::lists, channel_mask_list::loading, match_my_nick, channel::nlists, printserv, SERVER_NORMAL, and channel::status.

00175 {
00176   channel_t *chan;
00177   channel_member_t *m;
00178 
00179   /* Lookup channel or create. */
00180   chan = channel_probe(chan_name, 1);
00181   if (!chan) return;
00182 
00183   /* Add a new member. */
00184   m = channel_add_member(chan, nick, uhost);
00185 
00186   /* Is it me? If so, request channel lists. */
00187   if (match_my_nick(nick)) {
00188     int i;
00189     chan->bot = m;
00190     chan->status |= (CHANNEL_WHOLIST | CHANNEL_JOINED);
00191     printserv(SERVER_NORMAL, "WHO %s\r\n", chan_name);
00192     printserv(SERVER_NORMAL, "MODE %s\r\n", chan_name);
00193     for (i = 0; i < chan->nlists; i++) {
00194       chan->lists[i]->loading = 1;
00195     }
00196     printserv(SERVER_NORMAL, "MODE %s %s\r\n", chan_name, current_server.type1modes);
00197   }
00198 }

void channel_on_leave ( const char *  chan_name,
const char *  nick,
const char *  uhost,
user_t u 
)

Definition at line 200 of file channel_events.c.

References bind_check(), BT_leave, channel_free, channel_free_online, channel_probe, CHANNEL_STATIC, current_server, channel::flags, user_setting_t::flags, free_member(), match_my_nick, channel::member_head, channel_member::next, channel::nmembers, NULL, script_net_info::prev, user::settings, and uhost_cache_decref.

00201 {
00202   channel_t *chan;
00203   channel_member_t *prev = NULL, *m;
00204 
00205   chan = channel_probe(chan_name, 0);
00206   if (!chan) return;
00207 
00208   uhost_cache_decref(nick);
00209   for (m = chan->member_head; m; m = m->next) {
00210     if (!(current_server.strcmp)(m->nick, nick)) break;
00211     prev = m;
00212   }
00213   if (!m) return;
00214 
00215   if (prev) prev->next = m->next;
00216   else chan->member_head = m->next;
00217   free_member(m);
00218   chan->nmembers--;
00219 
00220   bind_check(BT_leave, u ? &u->settings[0].flags : NULL, chan_name, nick, uhost, u, chan_name);
00221 
00222   /* Are we the ones leaving? */
00223   if (match_my_nick(nick)) {
00224     if (chan->flags & CHANNEL_STATIC) channel_free_online(chan);
00225     else channel_free(chan);
00226   }
00227 }

void channel_on_nick ( const char *  old_nick,
const char *  new_nick 
)

Definition at line 238 of file channel_events.c.

References channel_head, current_server, channel::member_head, channel_member::next, channel::next, channel_member::nick, str_redup(), and uhost_cache_swap.

00239 {
00240   channel_t *chan;
00241   channel_member_t *m;
00242 
00243   uhost_cache_swap(old_nick, new_nick);
00244 
00245   for (chan = channel_head; chan; chan = chan->next) {
00246     for (m = chan->member_head; m; m = m->next) {
00247       if (!(current_server.strcmp)(m->nick, old_nick)) {
00248         str_redup(&m->nick, new_nick);
00249         break;
00250       }
00251     }
00252   }
00253 }

void channel_on_quit ( const char *  nick,
const char *  uhost,
user_t u 
)

Definition at line 229 of file channel_events.c.

References channel_head, channel_on_leave, channel::name, and channel::next.

00230 {
00231   channel_t *chan;
00232 
00233   for (chan = channel_head; chan; chan = chan->next) {
00234     channel_on_leave(chan->name, nick, uhost, u);
00235   }
00236 }

static void clear_masklist ( channel_mask_list_t l  )  [static]

Definition at line 71 of file channel_events.c.

References channel_mask_list::head, channel_mask::mask, channel_mask::next, script_net_info::next, and channel_mask::set_by.

00072 {
00073   channel_mask_t *m, *next;
00074 
00075   for (m = l->head; m; m = next) {
00076     next = m->next;
00077     if (m->mask) free(m->mask);
00078     if (m->set_by) free(m->set_by);
00079     free(m);
00080   }
00081   memset(l, 0, sizeof(l));
00082 }

static void clear_masklists ( channel_t chan  )  [static]

Definition at line 59 of file channel_events.c.

References clear_masklist(), channel::lists, channel::nlists, and NULL.

Referenced by channel_free_online().

00060 {
00061   int i;
00062 
00063   for (i = 0; i < chan->nlists; i++) {
00064     clear_masklist(chan->lists[i]);
00065   }
00066   if (chan->lists) free(chan->lists);
00067   chan->nlists = 0;
00068   chan->lists = NULL;
00069 }

static void free_member ( channel_member_t m  )  [inline, static]

Definition at line 52 of file channel_events.c.

References channel_member::nick, and channel_member::uhost.

Referenced by channel_free_online(), and channel_on_leave().

00053 {
00054   if (m->nick) free(m->nick);
00055   if (m->uhost) free(m->uhost);
00056   free(m);
00057 }

static int got315 ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 286 of file channel_events.c.

References channel_probe, CHANNEL_WHOLIST, NULL, and channel::status.

00287 {
00288   char *chan_name = args[1];
00289   channel_t *chan = NULL;
00290 
00291   channel_probe(chan_name, 0);
00292   if (chan) chan->status &= ~CHANNEL_WHOLIST;
00293   return(0);
00294 }

static int got324 ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 630 of file channel_events.c.

References parse_chan_mode().

00631 {
00632   parse_chan_mode(from_nick, from_uhost, u, nargs-1, args+1, 0);
00633   return(0);
00634 }

static int got331 ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 368 of file channel_events.c.

References channel_probe, NULL, str_redup(), and channel::topic.

00369 {
00370   char *chan_name = args[1];
00371   channel_t *chan = NULL;
00372 
00373   chan = channel_probe(chan_name, 0);
00374   if (!chan) return(0);
00375 
00376   str_redup(&chan->topic, "");
00377   return(0);
00378 }

static int got332 ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 381 of file channel_events.c.

References channel_probe, NULL, str_redup(), and channel::topic.

00382 {
00383   char *chan_name = args[1];
00384   char *topic = args[2];
00385   channel_t *chan = NULL;
00386 
00387   chan = channel_probe(chan_name, 0);
00388   if (!chan) return(0);
00389 
00390   str_redup(&chan->topic, topic);
00391   return(0);
00392 }

static int got333 ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 395 of file channel_events.c.

References channel_probe, NULL, str_redup(), channel::topic_nick, and channel::topic_time.

00396 {
00397   char *chan_name = args[1];
00398   char *nick = args[2];
00399   char *time = args[3];
00400   channel_t *chan = NULL;
00401 
00402   chan = channel_probe(chan_name, 0);
00403   if (!chan) return(0);
00404 
00405   str_redup(&chan->topic_nick, nick);
00406   chan->topic_time = atoi(time);
00407   return(0);
00408 }

static int got352 ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 256 of file channel_events.c.

References channel_add_member(), channel_probe, current_server, egg_mprintf(), flag_merge_str(), channel_member::mode, and NULL.

00257 {
00258   char *chan_name, *nick, *uhost, *flags, *ptr, changestr[3];
00259   int i;
00260   channel_member_t *m;
00261   channel_t *chan = NULL;
00262   chan_name = args[1];
00263   chan = channel_probe(chan_name, 0);
00264   if (!chan) return(0);
00265   nick = args[5];
00266   flags = args[6];
00267   uhost = egg_mprintf("%s@%s", args[2], args[3]);
00268   m = channel_add_member(chan, nick, uhost);
00269   changestr[0] = '+';
00270   changestr[2] = 0;
00271   flags++;
00272   while (*flags) {
00273     ptr = strchr(current_server.whoprefix, *flags);
00274     if (ptr) {
00275       i = ptr - current_server.whoprefix;
00276       changestr[1] = current_server.modeprefix[i];
00277       flag_merge_str(&m->mode, changestr);
00278     }
00279     flags++;
00280   }
00281   free(uhost);
00282   return(0);
00283 }

static int got353 ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 297 of file channel_events.c.

References channel_add_member(), channel_probe, current_server, flag_merge_str(), channel_member::mode, and NULL.

00298 {
00299   char *chan_name, *nick, *nicks, *flags, *ptr, *prefixptr, changestr[3];
00300   int i;
00301   channel_member_t *m;
00302   channel_t *chan = NULL;
00303 
00304   chan_name = args[2];
00305   chan = channel_probe(chan_name, 0);
00306   if (!chan) return(0);
00307 
00308   nicks = strdup(args[3]);
00309   ptr = nicks;
00310   changestr[0] = '+';
00311   changestr[2] = 0;
00312   while (ptr && *ptr) {
00313     while (isspace(*ptr)) ptr++;
00314     flags = ptr;
00315     while (strchr(current_server.whoprefix, *ptr)) ptr++;
00316     nick = ptr;
00317     while (*ptr && !isspace(*ptr)) ptr++;
00318     if (*ptr) *ptr = 0;
00319     else ptr = NULL;
00320     m = channel_add_member(chan, nick, NULL);
00321     *nick = 0;
00322     while (*flags) {
00323       prefixptr = strchr(current_server.whoprefix, *flags);
00324       if (prefixptr) {
00325         i = prefixptr - current_server.whoprefix;
00326         changestr[1] = current_server.modeprefix[i];
00327         flag_merge_str(&m->mode, changestr);
00328       }
00329       flags++;
00330     }
00331     if (ptr) ptr++;
00332   }
00333   free(nicks);
00334   return(0);
00335 }

static int got366 ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 338 of file channel_events.c.

References CHANNEL_NAMESLIST, channel_probe, NULL, and channel::status.

00339 {
00340   char *chan_name = args[1];
00341   channel_t *chan = NULL;
00342 
00343   chan = channel_probe(chan_name, 0);
00344   if (chan) chan->status &= ~CHANNEL_NAMESLIST;
00345   return(0);
00346 }

static int got_list_end ( void *  client_data,
char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 432 of file channel_events.c.

References channel_get_mask_list, channel_probe, and channel_mask_list::loading.

Referenced by channel_events_init().

00433 {
00434   char *chan_name = args[1];
00435   char type = (char) (int) client_data;
00436   channel_t *chan;
00437   channel_mask_list_t *l;
00438 
00439   chan = channel_probe(chan_name, 0);
00440   if (!chan) return(0);
00441   l = channel_get_mask_list(chan, type);
00442   if (l) l->loading = 0;
00443 /* FIXME - See if we need to set any modes */
00444   return(0);
00445 }

static int got_list_item ( void *  client_data,
char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 413 of file channel_events.c.

References channel_add_mask, channel_get_mask_list, channel_probe, channel_mask_list::loading, and NULL.

Referenced by channel_events_init().

00414 {
00415   char *chan_name = args[1];
00416   char *ban = args[2];
00417   char type = (char) (int) client_data;
00418   channel_t *chan;
00419   channel_mask_list_t *l;
00420 
00421   chan = channel_probe(chan_name, 0);
00422   if (!chan) return(0);
00423   l = channel_get_mask_list(chan, type);
00424   if (!l || !(l->loading)) return(0);
00425   channel_add_mask(chan, type, ban, (nargs > 3) ? args[3] : NULL, (nargs > 4) ? atoi(args[4]) : -1);
00426   return(0);
00427 }

static int gotjoin ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 452 of file channel_events.c.

References bind_check(), BT_join, channel_on_join, user_setting_t::flags, NULL, and user::settings.

00453 {
00454   char *chan = args[0];
00455 
00456   channel_on_join(chan, from_nick, from_uhost);
00457   bind_check(BT_join, u ? &u->settings[0].flags : NULL, chan, from_nick, from_uhost, u, chan);
00458   return(0);
00459 }

static int gotkick ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 484 of file channel_events.c.

References bind_check(), BT_kick, channel_on_leave, user_setting_t::flags, NULL, user::settings, uhost_cache_lookup, and victim.

00485 {
00486   char *chan = args[0];
00487   char *victim = args[1];
00488   char *text = args[2];
00489   char *uhost;
00490 
00491   if (!text) text = "";
00492   uhost = uhost_cache_lookup(victim);
00493   if (!uhost) uhost = "";
00494 
00495   channel_on_leave(chan, victim, uhost, u);
00496   bind_check(BT_kick, u ? &u->settings[0].flags : NULL, from_nick, from_nick, from_uhost, u, chan, victim, text);
00497 
00498   return(0);
00499 }

static int gotmode ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 637 of file channel_events.c.

References bind_check(), BT_mode, current_server, user_setting_t::flags, NULL, parse_chan_mode(), and user::settings.

00638 {
00639   char *dest = args[0];
00640   char *change = args[1];
00641   char changestr[3];
00642 
00643   changestr[0] = '+';
00644   changestr[2] = 0;
00645 
00646   /* Is it a user mode? */
00647   if (!strchr(current_server.chantypes, *dest)) {
00648     while (*change) {
00649       /* Direction? */
00650       if (*change == '+' || *change == '-') {
00651         changestr[0] = *change;
00652         change++;
00653         continue;
00654       }
00655 
00656       changestr[1] = *change;
00657       bind_check(BT_mode, u ? &u->settings[0].flags : NULL, changestr, from_nick, from_uhost, u, dest, changestr, NULL);
00658       change++;
00659     }
00660     return(0);
00661   }
00662 
00663   parse_chan_mode(from_nick, from_uhost, u, nargs, args, 1);
00664   return(0);
00665 }

static int gotnick ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 502 of file channel_events.c.

References bind_check(), BT_nick, channel_on_nick, current_server, user_setting_t::flags, match_my_nick, NULL, user::settings, and str_redup().

00503 {
00504   char *newnick = args[0];
00505 
00506   channel_on_nick(from_nick, newnick);
00507   bind_check(BT_nick, u ? &u->settings[0].flags : NULL, from_nick, from_nick, from_uhost, u, newnick);
00508 
00509   /* Is it our nick that's changing? */
00510   if (match_my_nick(from_nick)) str_redup(&current_server.nick, newnick);
00511 
00512   return(0);
00513 }

static int gotpart ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 462 of file channel_events.c.

References bind_check(), BT_part, channel_on_leave, user_setting_t::flags, NULL, and user::settings.

00463 {
00464   char *chan = args[0];
00465   char *text = args[1];
00466 
00467   channel_on_leave(chan, from_nick, from_uhost, u);
00468   bind_check(BT_part, u ? &u->settings[0].flags : NULL, chan, from_nick, from_uhost, u, chan, text);
00469   return(0);
00470 }

static int gotquit ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 473 of file channel_events.c.

References bind_check(), BT_quit, channel_on_quit, user_setting_t::flags, NULL, and user::settings.

00474 {
00475   char *text = args[0];
00476 
00477   channel_on_quit(from_nick, from_uhost, u);
00478   bind_check(BT_quit, u ? &u->settings[0].flags : NULL, from_nick, from_nick, from_uhost, u, text);
00479 
00480   return(0);
00481 }

static int gottopic ( char *  from_nick,
char *  from_uhost,
user_t u,
char *  cmd,
int  nargs,
char *  args[] 
) [static]

Definition at line 349 of file channel_events.c.

References channel_probe, egg_mprintf(), NULL, str_redup(), timer_get_now_sec(), channel::topic, channel::topic_nick, and channel::topic_time.

00350 {
00351   char *chan_name = args[0];
00352   char *topic = args[1];
00353   channel_t *chan = NULL;
00354 
00355   chan = channel_probe(chan_name, 0);
00356   if (!chan) return(0);
00357 
00358   str_redup(&chan->topic, topic);
00359   if (chan->topic_nick) free(chan->topic_nick);
00360   if (from_uhost) chan->topic_nick = egg_mprintf("%s!%s", from_nick, from_uhost);
00361   else chan->topic_nick = strdup(from_nick);
00362   timer_get_now_sec(&chan->topic_time);
00363 
00364   return(0);
00365 }

static void parse_chan_mode ( char *  from_nick,
char *  from_uhost,
user_t u,
int  nargs,
char *  args[],
int  trigger_bind 
) [static]

Definition at line 519 of file channel_events.c.

References bind_check(), BT_mode, channel_add_mask, channel_del_mask, channel_get_arg, channel_lookup_member, channel_probe, current_server, flag_merge_str(), user_setting_t::flags, channel::key, channel::limit, channel::mode, channel_member::mode, NULL, user::settings, str_redup(), timer_get_now_sec(), and channel_mode_arg::value.

Referenced by got324(), and gotmode().

00520 {
00521   int hasarg, curarg, modify_member, modify_channel, modify_list;
00522   channel_member_t *m;
00523   char changestr[3];
00524   char *dest;
00525   char *change;
00526   channel_t *chan;
00527   const char *arg;
00528 
00529   if (nargs < 2) return;
00530 
00531   dest = args[0];
00532   change = args[1];
00533 
00534   chan = channel_probe(dest, 0);
00535   if (!chan) return;
00536 
00537   changestr[0] = '+';
00538   changestr[2] = 0;
00539 
00540   curarg = 2;
00541   while (*change) {
00542     /* Direction? */
00543     if (*change == '+' || *change == '-') {
00544       changestr[0] = *change;
00545       change++;
00546       continue;
00547     }
00548 
00549     /* Figure out what kind of change it is and if it takes an
00550      * argument. */
00551     modify_member = modify_channel = modify_list = 0;
00552     if (strchr(current_server.modeprefix, *change)) {
00553       hasarg = 1;
00554       modify_member = 1;
00555     }
00556     else if (strchr(current_server.type1modes, *change)) {
00557       hasarg = 1;
00558       modify_list = 1;
00559     }
00560     else if (strchr(current_server.type2modes, *change)) {
00561       hasarg = 1;
00562     }
00563     else if (strchr(current_server.type3modes, *change)) {
00564       if (changestr[0] == '+') hasarg = 1;
00565     }
00566     else {
00567       modify_channel = 1;
00568       hasarg = 0;
00569     }
00570 
00571     if (hasarg) {
00572       if (curarg >= nargs) arg = "";
00573       else arg = args[curarg++];
00574     }
00575     else arg = NULL;
00576 
00577     changestr[1] = *change;
00578 
00579     if (modify_member) {
00580       /* Find the person it modifies and apply. */
00581       m = channel_lookup_member(chan, arg);
00582       flag_merge_str(&m->mode, changestr);
00583     }
00584     else if (modify_channel) {
00585       /* Simple flag change for channel. */
00586       flag_merge_str(&chan->mode, changestr);
00587     }
00588     else if (modify_list) {
00589       /* Add/remove an address from a list. */
00590       if (changestr[0] == '+') channel_add_mask(chan, *change, arg, from_nick, timer_get_now_sec(NULL));
00591       else channel_del_mask(chan, *change, arg);
00592     }
00593     else if (changestr[0] == '+') {
00594       channel_mode_arg_t *modearg = channel_get_arg(chan, *change);
00595       if (modearg) str_redup(&modearg->value, arg);
00596 
00597       /* + flag change that requires special handling. */
00598       switch (*change) {
00599         case 'k':
00600           str_redup(&chan->key, arg);
00601           break;
00602         case 'l':
00603           chan->limit = atoi(arg);
00604           break;
00605       }
00606     }
00607     else {
00608       channel_mode_arg_t *modearg = channel_get_arg(chan, *change);
00609       if (modearg) str_redup(&modearg->value, NULL);
00610 
00611       /* - flag change that requires special handling. */
00612       switch (*change) {
00613         case 'k':
00614           if (chan->key) free(chan->key);
00615           chan->key = NULL;
00616           break;
00617         case 'l':
00618           chan->limit = -1;
00619           break;
00620       }
00621     }
00622 
00623     /* Now trigger the mode bind. */
00624     if (trigger_bind) bind_check(BT_mode, u ? &u->settings[0].flags : NULL, changestr, from_nick, from_uhost, u, dest, changestr, arg);
00625     change++;
00626   }
00627 }


Variable Documentation

static bind_list_t channel_raw_binds [static]

Initial value:

 {
  
  {NULL, "352", got352}, 
  {NULL, "315", got315}, 

  
  {NULL, "353", got353}, 
  {NULL, "366", got366}, 

  
  {NULL, "TOPIC", gottopic},
  {NULL, "331", got331},
  {NULL, "332", got332},
  {NULL, "333", got333},

  
  {NULL, "JOIN", gotjoin},
  {NULL, "PART", gotpart},
  {NULL, "QUIT", gotquit},
  {NULL, "KICK", gotkick},
  {NULL, "NICK", gotnick},

  
  {NULL, "324", got324},
  {NULL, "MODE", gotmode},

  {NULL, NULL, NULL}
}

Definition at line 26 of file channel_events.c.

const char rcsid[] = "$Id: channel_events.c,v 1.6 2008-10-17 15:57:43 sven Exp $" [static]

Definition at line 21 of file channel_events.c.


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