lib/eggdrop/partymember.c File Reference

#include <eggdrop/eggdrop.h>

Go to the source code of this file.

Functions

static int partymember_cleanup (void *client_data)
static int on_udelete (user_t *u)
int partymember_init (void)
int partymember_shutdown (void)
static void partymember_really_delete (partymember_t *p)
partymember_tpartymember_get_head ()
partymember_tpartymember_get_local_head ()
static int partymember_get_id (botnet_bot_t *bot)
partymember_tpartymember_new (int id, user_t *user, botnet_bot_t *bot, const char *nick, const char *ident, const char *host, partyline_event_t *handler, void *client_data, event_owner_t *owner)
int partymember_delete_by_owner (struct egg_module *module, void *script)
 Deletes all partymembers with a given owner.
int partymember_delete (partymember_t *p, const botnet_bot_t *lost_bot, const char *text)
int partymember_set_nick (partymember_t *p, const char *nick)
int partymember_update_info (partymember_t *p, const char *ident, const char *host)
int partymember_who (int **ids, int *len)
partymember_tpartymember_lookup (const char *full_name, botnet_bot_t *bot, int id)
int partymember_write (partymember_t *p, const char *text, int len)
int partymember_msg (partymember_t *p, botnet_entity_t *src, const char *text, int len)
int partymember_local_broadcast (botnet_entity_t *src, const char *text, int len)
int partymember_printf (partymember_t *p, const char *fmt,...)
int partymember_msgf (partymember_t *p, botnet_entity_t *src, const char *fmt,...)
int partymember_count_by_bot (const struct botnet_bot *bot)
 Counts the number of users on a bot.
int partymember_delete_by_bot (const botnet_bot_t *bot, const botnet_bot_t *lost_bot, const char *reason)
 Deletes all users on a bot.

Variables

static const char rcsid [] = "$Id: partymember.c,v 1.31 2007-09-13 22:20:55 sven Exp $"
static partymember_tparty_head = NULL
static partymember_tlocal_party_head = NULL
static int npartymembers = 0
static bind_list_t partymember_udelete_binds []
static bind_table_tBT_nick = NULL
static bind_table_tBT_new = NULL
static bind_table_tBT_quit = NULL


Function Documentation

static int on_udelete ( user_t u  )  [static]

Definition at line 418 of file partymember.c.

References partymember::next_on_bot, NULL, partymember_delete(), and partymember::user.

00419 {
00420   partymember_t *p;
00421 
00422   for (p = local_party_head; p; p = p->next_on_bot) {
00423     if (p->user == u) partymember_delete(p, NULL, "User deleted!");
00424   }
00425   return(0);
00426 }

static int partymember_cleanup ( void *  client_data  )  [static]

Definition at line 91 of file partymember.c.

References partymember::flags, partymember::next, botnet_bot::next, PARTY_DELETED, and partymember_really_delete().

Referenced by partymember_delete().

00092 {
00093   partymember_t *p, *next;
00094 
00095   for (p = party_head; p; p = next) {
00096     next = p->next;
00097     if (p->flags & PARTY_DELETED) partymember_really_delete(p);
00098   }
00099   return(0);
00100 }

int partymember_count_by_bot ( const struct botnet_bot bot  ) 

Counts the number of users on a bot.

Counts the number of users on any channels on a bot.

Parameters:
bot The bot the users are on or NULL for the number of users on this bot.
Returns:
The number of users.

Definition at line 438 of file partymember.c.

References partymember::flags, partymember::next_on_bot, PARTY_DELETED, and botnet_bot::partys.

Referenced by botnet_count_subtree().

00439 {
00440   int ret = 0;
00441   partymember_t *p;
00442 
00443   for (p = bot ? bot->partys : local_party_head; p; p = p->next_on_bot) {
00444     if (p->flags & PARTY_DELETED) continue;
00445     ++ret;
00446   }
00447   return ret;
00448 }

int partymember_delete ( partymember_t p,
const botnet_bot_t lost_bot,
const char *  text 
)

Definition at line 191 of file partymember.c.

References bind_check(), partymember::bot, botnet_member_quit(), BT_quit, partymember::channels, partymember::client_data, partymember::flags, garbage_add(), GARBAGE_ONCE, partymember::handler, partymember_common::len, partymember_common::members, partymember::nchannels, partymember::nick, npartymembers, NULL, event_owner_b::on_delete, partyline_event::on_quit, partymember::owner, PARTY_DELETED, partychan_free_common(), partychan_get_common(), partychan_part(), and partymember_cleanup().

Referenced by dcc_on_delete(), dcc_on_eof(), get_entity(), got_join(), got_part(), got_quit(), got_versions(), irc_on_delete(), irc_on_eof(), on_udelete(), party_quit(), partymember_delete_by_bot(), partymember_delete_by_owner(), partymember_shutdown(), telnet_on_delete(), telnet_on_eof(), and terminal_shutdown().

00192 {
00193   int i, len;
00194   partymember_common_t *common;
00195   partymember_t *mem;
00196 
00197   if (p->flags & PARTY_DELETED) return(-1);
00198 
00199   len = strlen(text);
00200 
00201   if (!lost_bot && p->nchannels) botnet_member_quit(p, text, len);
00202 
00203   bind_check(BT_quit, NULL, p->nick, p, text);
00204 
00205   /* Mark it as deleted so it doesn't get reused before it's free. */
00206   p->flags |= PARTY_DELETED;
00207   garbage_add(partymember_cleanup, NULL, GARBAGE_ONCE);
00208   npartymembers--;
00209 
00210   common = partychan_get_common(p);
00211   if (common) {
00212     for (i = 0; i < common->len; i++) {
00213       mem = common->members[i];
00214       if (mem->flags & PARTY_DELETED) continue;
00215       if (mem->handler->on_quit) (mem->handler->on_quit)(mem->client_data, p, lost_bot, text, len);
00216     }
00217     partychan_free_common(common);
00218   }
00219 
00220   /* Remove from any stray channels. */
00221   for (i = 0; i < p->nchannels; i++) {
00222     partychan_part(p->channels[i], p, text);
00223   }
00224   p->nchannels = 0;
00225 
00226   if (p->handler && p->handler->on_quit) {
00227     (p->handler->on_quit)(p->client_data, p, lost_bot, text, strlen(text));
00228   }
00229   if (p->owner && p->owner->on_delete) p->owner->on_delete(p->owner, p->client_data);
00230   p->bot = NULL;
00231   return(0);
00232 }

int partymember_delete_by_bot ( const botnet_bot_t bot,
const botnet_bot_t lost_bot,
const char *  reason 
)

Deletes all users on a bot.

Deletes all partymembers on a certain bot.

Parameters:
bot The bot the users are on or NULL for all users on this bot.
lost_bot The bot that was really unlinked to cause this.
reason Some kind of explanation why it happened.
Returns:
The number of users deleted.

Definition at line 462 of file partymember.c.

References partymember::flags, partymember::next_on_bot, PARTY_DELETED, partymember_delete(), and botnet_bot::partys.

Referenced by botnet_recursive_delete().

00463 {
00464   int ret = 0;
00465   partymember_t *p;
00466 
00467   for (p = bot ? bot->partys : local_party_head; p; p = p->next_on_bot) {
00468     if (p->flags & PARTY_DELETED) continue;
00469     partymember_delete(p, lost_bot, reason);
00470     ++ret;
00471   }
00472   return ret;
00473 }

int partymember_delete_by_owner ( struct egg_module module,
void *  script 
)

Deletes all partymembers with a given owner.

Calls partymember_delete() for every partymember with a given owner.

Parameters:
module The module whose partymembers should be deleted.
script The script whose partymembers should be deleted. NULL matches everything.
Returns:
The number of deleted partymembers.

Definition at line 175 of file partymember.c.

References event_owner_b::client_data, partymember::flags, event_owner_b::module, partymember::next, NULL, partymember::owner, PARTY_DELETED, and partymember_delete().

Referenced by script_remove_events_by_owner().

00176 {
00177   int ret = 0;
00178   partymember_t *p;
00179 
00180   for (p = party_head; p; p = p->next) {
00181     if (p->flags & PARTY_DELETED) continue;
00182     if (p->owner && p->owner->module == module && (!script || p->owner->client_data == script)) {
00183       partymember_delete(p, NULL, "Module unloaded");
00184       ++ret;
00185     }
00186   }
00187 
00188   return ret;
00189 }

partymember_t* partymember_get_head ( void   ) 

Definition at line 102 of file partymember.c.

Referenced by botnet_set_name().

00103 {
00104   return party_head;
00105 }

static int partymember_get_id ( botnet_bot_t bot  )  [static]

Definition at line 112 of file partymember.c.

References NULL, and partymember_lookup().

Referenced by partymember_new().

00113 {
00114   int id;
00115 
00116   for (id = 1; partymember_lookup(NULL, bot, id); id++) {
00117     ;
00118   }
00119   return(id);
00120 }

partymember_t* partymember_get_local_head ( void   ) 

Definition at line 107 of file partymember.c.

Referenced by botnet_recursive_replay_net().

00108 {
00109   return local_party_head;
00110 }

int partymember_init ( void   ) 

int partymember_local_broadcast ( botnet_entity_t src,
const char *  text,
int  len 
)

Definition at line 358 of file partymember.c.

References partymember::flags, partymember::next_on_bot, PARTY_DELETED, and partymember_msg().

Referenced by botnet_broadcast().

00359 {
00360   partymember_t *p;
00361 
00362   if (len < 0) len = strlen(text);
00363   for (p = local_party_head; p; p = p->next_on_bot) {
00364     if (p->flags & PARTY_DELETED) continue;
00365     partymember_msg(p, src, text, len);
00366   }
00367   return 0;
00368 }

partymember_t* partymember_lookup ( const char *  full_name,
botnet_bot_t bot,
int  id 
)

Definition at line 287 of file partymember.c.

References botnet_get_name(), botnet_lookup(), partymember::flags, partymember::id, botnet_bot::name, partymember::next_on_bot, partymember::nick, NULL, PARTY_DELETED, and botnet_bot::partys.

Referenced by get_entity(), got_actchan(), got_away(), got_chat(), got_join(), got_nickchange(), got_part(), got_privmsg(), got_versions(), on_putlog(), party_whisper(), party_who(), partymember_get_id(), perl_to_c_var(), tcl_to_c_var(), and user_change_handle().

00288 {
00289   int i = id;
00290   char *name = NULL;
00291   const char *ptr, *nick = full_name;
00292   botnet_bot_t *b = bot;
00293   partymember_t *p;
00294 
00295   if (!full_name && id == -1) return NULL;
00296 
00297   if (full_name) {
00298     ptr = strchr(full_name, '@');
00299     if (ptr) {
00300       bot = botnet_lookup(ptr + 1);
00301       if (!bot && strcmp(ptr + 1, botnet_get_name())) return NULL;
00302       if (b && bot != b) return NULL;
00303       name = strdup(full_name);
00304       name[ptr - full_name] = 0;
00305       nick = name;
00306     }
00307 
00308     ptr = strchr(nick, ':');
00309     if (ptr) {
00310       id = atoi(nick);
00311       if (i != -1 && i != id) {
00312         if (name) free(name);
00313         return NULL;
00314       }
00315       nick = ptr + 1;
00316     }
00317   }
00318 
00319   for (p = bot ? bot->partys : local_party_head; p; p = p->next_on_bot) {
00320     if (p->flags & PARTY_DELETED) continue;
00321     if (id != -1) {
00322       if (p->id == id) break;
00323     } else {
00324       if (!strcmp(p->nick, nick)) break;
00325     }
00326   }
00327 
00328   if (p && id != -1 && nick && strcmp(p->nick, nick)) p = NULL;
00329   if (name) free(name);
00330   return p;
00331 }

int partymember_msg ( partymember_t p,
botnet_entity_t src,
const char *  text,
int  len 
)

Definition at line 346 of file partymember.c.

References partymember::bot, botnet_bot::client_data, partymember::client_data, botnet_bot::direction, partymember::flags, botnet_bot::handler, partymember::handler, botnet_handler_t::on_privmsg, partyline_event::on_privmsg, and PARTY_DELETED.

Referenced by botnet_link(), got_privmsg(), party_whisper(), partymember_local_broadcast(), partymember_msgf(), and partymember_write().

00347 {
00348   if (!p || p->flags & PARTY_DELETED) return(-1);
00349 
00350   if (len < 0) len = strlen(text);
00351   if (p->handler && p->handler->on_privmsg)
00352     p->handler->on_privmsg(p->client_data, p, src, text, len);
00353   else if (p->bot && p->bot->direction->handler && p->bot->direction->handler->on_privmsg)
00354     p->bot->direction->handler->on_privmsg(p->bot->direction->client_data, src, p, text, len);
00355   return 0;
00356 }

int partymember_msgf ( partymember_t p,
botnet_entity_t src,
const char *  fmt,
  ... 
)

Definition at line 402 of file partymember.c.

References egg_mvsprintf(), and partymember_msg().

Referenced by botnet_unlink().

00403 {
00404   va_list args;
00405   char *ptr, buf[1024];
00406   int len;
00407 
00408   va_start(args, fmt);
00409   ptr = egg_mvsprintf(buf, sizeof(buf), &len, fmt, args);
00410   va_end(args);
00411 
00412   partymember_msg(p, src, ptr, len);
00413 
00414   if (ptr != buf) free(ptr);
00415   return(0);
00416 }

partymember_t* partymember_new ( int  id,
user_t user,
botnet_bot_t bot,
const char *  nick,
const char *  ident,
const char *  host,
partyline_event_t handler,
void *  client_data,
event_owner_t owner 
)

Definition at line 122 of file partymember.c.

References b64enc_int(), bind_check(), partymember::bot, botnet_announce_login(), botnet_get_name(), BT_new, partymember::client_data, partymember::common_name, egg_mprintf(), user::flags, partymember::full_id_name, partymember::full_name, partymember::handler, partymember::host, partymember::id, partymember::ident, botnet_bot::name, partymember::net_name, partymember::next, partymember::next_on_bot, partymember::nick, npartymembers, NULL, partymember::owner, partymember_get_id(), botnet_bot::partys, partymember::prev, partymember::prev_on_bot, partymember::user, and USER_BOT.

Referenced by dcc_on_read(), get_entity(), got_join(), got_login(), got_versions(), irc_on_read(), telnet_on_read(), and terminal_init().

00123 {
00124   partymember_t *mem;
00125 
00126   if (user && user->flags & USER_BOT) return NULL;
00127   mem = calloc(1, sizeof(*mem));
00128   if (id == -1) id = partymember_get_id(bot);
00129   mem->id = id;
00130   mem->user = user;
00131   mem->bot = bot;
00132   mem->nick = strdup(nick);
00133   mem->ident = strdup(ident);
00134   mem->host = strdup(host);
00135   mem->net_name = egg_mprintf("%s@%s", b64enc_int(id), bot ? bot->name : botnet_get_name());
00136   mem->full_id_name = egg_mprintf("%d:%s@%s", id, nick, bot ? bot->name : botnet_get_name());
00137   mem->full_name = strchr(mem->full_id_name, ':') + 1;
00138   mem->common_name = bot ? mem->full_name : mem->nick;
00139   mem->handler = handler;
00140   mem->client_data = client_data;
00141   mem->owner = owner;
00142 
00143   mem->next = party_head;
00144   if (party_head) party_head->prev = mem;
00145   party_head = mem;
00146 
00147   mem->prev_on_bot = NULL;
00148   if (bot) {
00149     mem->next_on_bot = bot->partys;
00150     if (bot->partys) bot->partys->prev_on_bot = mem;
00151     bot->partys = mem;
00152   } else {
00153     mem->next_on_bot = local_party_head;
00154     if (local_party_head) local_party_head->prev_on_bot = mem;
00155     local_party_head = mem;
00156   }
00157 
00158   npartymembers++;
00159   botnet_announce_login(mem);
00160   bind_check(BT_new, NULL, nick, mem);
00161   return(mem);
00162 }

int partymember_printf ( partymember_t p,
const char *  fmt,
  ... 
)

static void partymember_really_delete ( partymember_t p  )  [static]

Definition at line 65 of file partymember.c.

References partymember::bot, partymember::channels, partymember::full_id_name, partymember::host, partymember::ident, partymember::net_name, partymember::next, partymember::next_on_bot, partymember::nick, botnet_bot::partys, partymember::prev, and partymember::prev_on_bot.

Referenced by partymember_cleanup().

00066 {
00067   /* Get rid of it from the main list and the local list. */
00068   if (p->prev) p->prev->next = p->next;
00069   else party_head = p->next;
00070   if (p->next) p->next->prev = p->prev;
00071 
00072   if (p->prev_on_bot) p->prev_on_bot->next_on_bot = p->next_on_bot;
00073   else if (p->bot) p->bot->partys = p->next_on_bot;
00074   else if (local_party_head == p) local_party_head = p->next_on_bot;
00075   if (p->next_on_bot) p->next_on_bot->prev_on_bot = p->prev_on_bot;
00076 
00077   /* Free! */
00078   free(p->nick);
00079   if (p->ident) free(p->ident);
00080   if (p->host) free(p->host);
00081   free(p->net_name);
00082   free(p->full_id_name);
00083   if (p->channels) free(p->channels);
00084 
00085   /* Zero it out in case anybody has kept a reference (bad!). */
00086   memset(p, 0, sizeof(*p));
00087 
00088   free(p);
00089 }

int partymember_set_nick ( partymember_t p,
const char *  nick 
)

Definition at line 234 of file partymember.c.

References bind_check(), botnet_set_nick(), partymember::client_data, partymember::flags, partymember::handler, partymember_common::len, partymember_common::members, partymember::nick, NULL, partyline_event::on_nick, PARTY_DELETED, PARTY_SELECTED, partychan_free_common(), and partychan_get_common().

Referenced by got_nick(), got_nickchange(), and user_change_handle().

00235 {
00236   partymember_common_t *common;
00237   partymember_t *mem;
00238   char *oldnick;
00239   int i;
00240 
00241   oldnick = p->nick;
00242   p->nick = strdup(nick);
00243   if (p->handler && p->handler->on_nick)
00244     (p->handler->on_nick)(p->client_data, p, oldnick, nick);
00245   botnet_set_nick(p, oldnick);
00246   p->flags |= PARTY_SELECTED;
00247   common = partychan_get_common(p);
00248   if (common) {
00249     for (i = 0; i < common->len; i++) {
00250       mem = common->members[i];
00251       if (mem->flags & PARTY_DELETED) continue;
00252       if (mem->handler->on_nick) (mem->handler->on_nick)(mem->client_data, p, oldnick, nick);
00253     }
00254     partychan_free_common(common);
00255   }
00256   bind_check(BT_nick, NULL, NULL, p, oldnick, p->nick);
00257   if (oldnick) free(oldnick);
00258   p->flags &= ~PARTY_SELECTED;
00259   return(0);
00260 }

int partymember_shutdown ( void   ) 

Definition at line 49 of file partymember.c.

References _, bind_rem_list(), bind_table_del(), BT_new, BT_quit, BTN_USER_DELETE, garbage_run(), NULL, and partymember_delete().

Referenced by partyline_shutdown().

00050 {
00051   while (party_head) partymember_delete(party_head, NULL, _("Bot shutdown"));
00052   bind_rem_list(BTN_USER_DELETE, partymember_udelete_binds);
00053   bind_table_del(BT_nick);
00054   bind_table_del(BT_new);
00055   bind_table_del(BT_quit);
00056 
00057   /* force a garbage run since we might have some partymembers 
00058    * marked as deleted and w/o a garbage_run we may not destroy
00059    * our hashtable */
00060   garbage_run();
00061 
00062   return (0);
00063 }

int partymember_update_info ( partymember_t p,
const char *  ident,
const char *  host 
)

Definition at line 262 of file partymember.c.

References partymember::host, partymember::ident, and str_redup().

00263 {
00264   if (!p) return(-1);
00265   if (ident) str_redup(&p->ident, ident);
00266   if (host) str_redup(&p->host, host);
00267   return(0);
00268 }

int partymember_who ( int **  ids,
int *  len 
)

Definition at line 270 of file partymember.c.

References partymember::flags, partymember::id, partymember::next_on_bot, npartymembers, and PARTY_DELETED.

Referenced by party_who().

00271 {
00272   int i;
00273   partymember_t *p;
00274 
00275   *ids = malloc(sizeof(int) * (npartymembers+1));
00276   i = 0;
00277   for (p = local_party_head; p; p = p->next_on_bot) {
00278     if (p->flags & PARTY_DELETED) continue;
00279     (*ids)[i] = p->id;
00280     i++;
00281   }
00282   (*ids)[i] = 0;
00283   *len = i;
00284   return(0);
00285 }

int partymember_write ( partymember_t p,
const char *  text,
int  len 
)

Definition at line 341 of file partymember.c.

References NULL, and partymember_msg().

Referenced by party_perl(), party_python(), party_tcl(), and partymember_printf().

00342 {
00343   return partymember_msg(p, NULL, text, len);
00344 }


Variable Documentation

bind_table_t * BT_new = NULL [static]

Definition at line 38 of file partymember.c.

Referenced by partymember_init(), partymember_new(), and partymember_shutdown().

bind_table_t* BT_nick = NULL [static]

Definition at line 38 of file partymember.c.

bind_table_t * BT_quit = NULL [static]

Definition at line 38 of file partymember.c.

partymember_t* local_party_head = NULL [static]

Definition at line 27 of file partymember.c.

int npartymembers = 0 [static]

Definition at line 28 of file partymember.c.

Referenced by partymember_delete(), partymember_new(), and partymember_who().

partymember_t* party_head = NULL [static]

Definition at line 26 of file partymember.c.

Initial value:

 {
  {NULL, NULL, on_udelete},
  {0}
}

Definition at line 33 of file partymember.c.

const char rcsid[] = "$Id: partymember.c,v 1.31 2007-09-13 22:20:55 sven Exp $" [static]

Definition at line 21 of file partymember.c.


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